[
  {
    "path": ".gitignore",
    "content": "pointnet2/build/\npointnet2/dist/\npointnet2/pointnet2.egg-info/\n__pycache__/\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 Shaoshuai Shi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Pointnet2.PyTorch\n\n* PyTorch implementation of [PointNet++](https://arxiv.org/abs/1706.02413) based on [erikwijmans/Pointnet2_PyTorch](https://github.com/erikwijmans/Pointnet2_PyTorch).\n* Faster than the original codes by re-implementing the CUDA operations. \n\n## Installation\n### Requirements\n* Linux (tested on Ubuntu 14.04/16.04)\n* Python 3.6+\n* PyTorch 1.0\n\n### Install \nInstall this library by running the following command:\n\n```shell\ncd pointnet2\npython setup.py install\ncd ../\n```\n\n## Examples\nHere I provide a simple example to use this library in the task of KITTI ourdoor foreground point cloud segmentation, and you could refer to the paper [PointRCNN](https://arxiv.org/abs/1812.04244) for the details of task description and foreground label generation.\n\n1. Download the training data from [KITTI 3D object detection](http://www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark=3d) website and organize the downloaded files as follows:\n```\nPointnet2.PyTorch\n├── pointnet2\n├── tools\n│   ├──data\n│   │  ├── KITTI\n│   │  │   ├── ImageSets\n│   │  │   ├── object\n│   │  │   │   ├──training\n│   │  │   │      ├──calib & velodyne & label_2 & image_2\n│   │  train_and_eval.py\n```\n\n2. Run the following command to train and evaluate:\n```shell\ncd tools\npython train_and_eval.py --batch_size 8 --epochs 100 --ckpt_save_interval 2 \n```\n\n\n\n## Project using this repo:\n* [PointRCNN](https://github.com/sshaoshuai/PointRCNN): 3D object detector from raw point cloud.\n\n## Acknowledgement\n* [charlesq34/pointnet2](https://github.com/charlesq34/pointnet2): Paper author and official code repo.\n* [erikwijmans/Pointnet2_PyTorch](https://github.com/erikwijmans/Pointnet2_PyTorch): Initial work of PyTorch implementation of PointNet++. \n"
  },
  {
    "path": "pointnet2/pointnet2_modules.py",
    "content": "import torch\nimport torch.nn as nn\nimport torch.nn.functional as F\n\nfrom . import pointnet2_utils\nfrom . import pytorch_utils as pt_utils\nfrom typing import List\n\n\nclass _PointnetSAModuleBase(nn.Module):\n\n    def __init__(self):\n        super().__init__()\n        self.npoint = None\n        self.groupers = None\n        self.mlps = None\n        self.pool_method = 'max_pool'\n\n    def forward(self, xyz: torch.Tensor, features: torch.Tensor = None, new_xyz=None) -> (torch.Tensor, torch.Tensor):\n        \"\"\"\n        :param xyz: (B, N, 3) tensor of the xyz coordinates of the features\n        :param features: (B, N, C) tensor of the descriptors of the the features\n        :param new_xyz:\n        :return:\n            new_xyz: (B, npoint, 3) tensor of the new features' xyz\n            new_features: (B, npoint, \\sum_k(mlps[k][-1])) tensor of the new_features descriptors\n        \"\"\"\n        new_features_list = []\n\n        xyz_flipped = xyz.transpose(1, 2).contiguous()\n        if new_xyz is None:\n            new_xyz = pointnet2_utils.gather_operation(\n                xyz_flipped,\n                pointnet2_utils.furthest_point_sample(xyz, self.npoint)\n            ).transpose(1, 2).contiguous() if self.npoint is not None else None\n\n        for i in range(len(self.groupers)):\n            new_features = self.groupers[i](xyz, new_xyz, features)  # (B, C, npoint, nsample)\n\n            new_features = self.mlps[i](new_features)  # (B, mlp[-1], npoint, nsample)\n            if self.pool_method == 'max_pool':\n                new_features = F.max_pool2d(\n                    new_features, kernel_size=[1, new_features.size(3)]\n                )  # (B, mlp[-1], npoint, 1)\n            elif self.pool_method == 'avg_pool':\n                new_features = F.avg_pool2d(\n                    new_features, kernel_size=[1, new_features.size(3)]\n                )  # (B, mlp[-1], npoint, 1)\n            else:\n                raise NotImplementedError\n\n            new_features = new_features.squeeze(-1)  # (B, mlp[-1], npoint)\n            new_features_list.append(new_features)\n\n        return new_xyz, torch.cat(new_features_list, dim=1)\n\n\nclass PointnetSAModuleMSG(_PointnetSAModuleBase):\n    \"\"\"Pointnet set abstraction layer with multiscale grouping\"\"\"\n\n    def __init__(self, *, npoint: int, radii: List[float], nsamples: List[int], mlps: List[List[int]], bn: bool = True,\n                 use_xyz: bool = True, pool_method='max_pool', instance_norm=False):\n        \"\"\"\n        :param npoint: int\n        :param radii: list of float, list of radii to group with\n        :param nsamples: list of int, number of samples in each ball query\n        :param mlps: list of list of int, spec of the pointnet before the global pooling for each scale\n        :param bn: whether to use batchnorm\n        :param use_xyz:\n        :param pool_method: max_pool / avg_pool\n        :param instance_norm: whether to use instance_norm\n        \"\"\"\n        super().__init__()\n\n        assert len(radii) == len(nsamples) == len(mlps)\n\n        self.npoint = npoint\n        self.groupers = nn.ModuleList()\n        self.mlps = nn.ModuleList()\n        for i in range(len(radii)):\n            radius = radii[i]\n            nsample = nsamples[i]\n            self.groupers.append(\n                pointnet2_utils.QueryAndGroup(radius, nsample, use_xyz=use_xyz)\n                if npoint is not None else pointnet2_utils.GroupAll(use_xyz)\n            )\n            mlp_spec = mlps[i]\n            if use_xyz:\n                mlp_spec[0] += 3\n\n            self.mlps.append(pt_utils.SharedMLP(mlp_spec, bn=bn, instance_norm=instance_norm))\n        self.pool_method = pool_method\n\n\nclass PointnetSAModule(PointnetSAModuleMSG):\n    \"\"\"Pointnet set abstraction layer\"\"\"\n\n    def __init__(self, *, mlp: List[int], npoint: int = None, radius: float = None, nsample: int = None,\n                 bn: bool = True, use_xyz: bool = True, pool_method='max_pool', instance_norm=False):\n        \"\"\"\n        :param mlp: list of int, spec of the pointnet before the global max_pool\n        :param npoint: int, number of features\n        :param radius: float, radius of ball\n        :param nsample: int, number of samples in the ball query\n        :param bn: whether to use batchnorm\n        :param use_xyz:\n        :param pool_method: max_pool / avg_pool\n        :param instance_norm: whether to use instance_norm\n        \"\"\"\n        super().__init__(\n            mlps=[mlp], npoint=npoint, radii=[radius], nsamples=[nsample], bn=bn, use_xyz=use_xyz,\n            pool_method=pool_method, instance_norm=instance_norm\n        )\n\n\nclass PointnetFPModule(nn.Module):\n    r\"\"\"Propigates the features of one set to another\"\"\"\n\n    def __init__(self, *, mlp: List[int], bn: bool = True):\n        \"\"\"\n        :param mlp: list of int\n        :param bn: whether to use batchnorm\n        \"\"\"\n        super().__init__()\n        self.mlp = pt_utils.SharedMLP(mlp, bn=bn)\n\n    def forward(\n            self, unknown: torch.Tensor, known: torch.Tensor, unknow_feats: torch.Tensor, known_feats: torch.Tensor\n    ) -> torch.Tensor:\n        \"\"\"\n        :param unknown: (B, n, 3) tensor of the xyz positions of the unknown features\n        :param known: (B, m, 3) tensor of the xyz positions of the known features\n        :param unknow_feats: (B, C1, n) tensor of the features to be propigated to\n        :param known_feats: (B, C2, m) tensor of features to be propigated\n        :return:\n            new_features: (B, mlp[-1], n) tensor of the features of the unknown features\n        \"\"\"\n        if known is not None:\n            dist, idx = pointnet2_utils.three_nn(unknown, known)\n            dist_recip = 1.0 / (dist + 1e-8)\n            norm = torch.sum(dist_recip, dim=2, keepdim=True)\n            weight = dist_recip / norm\n\n            interpolated_feats = pointnet2_utils.three_interpolate(known_feats, idx, weight)\n        else:\n            interpolated_feats = known_feats.expand(*known_feats.size()[0:2], unknown.size(1))\n\n        if unknow_feats is not None:\n            new_features = torch.cat([interpolated_feats, unknow_feats], dim=1)  # (B, C2 + C1, n)\n        else:\n            new_features = interpolated_feats\n\n        new_features = new_features.unsqueeze(-1)\n        new_features = self.mlp(new_features)\n\n        return new_features.squeeze(-1)\n\n\nif __name__ == \"__main__\":\n    pass\n"
  },
  {
    "path": "pointnet2/pointnet2_utils.py",
    "content": "import torch\nfrom torch.autograd import Variable\nfrom torch.autograd import Function\nimport torch.nn as nn\nfrom typing import Tuple\n\nimport pointnet2_cuda as pointnet2\n\n\nclass FurthestPointSampling(Function):\n    @staticmethod\n    def forward(ctx, xyz: torch.Tensor, npoint: int) -> torch.Tensor:\n        \"\"\"\n        Uses iterative furthest point sampling to select a set of npoint features that have the largest\n        minimum distance\n        :param ctx:\n        :param xyz: (B, N, 3) where N > npoint\n        :param npoint: int, number of features in the sampled set\n        :return:\n             output: (B, npoint) tensor containing the set\n        \"\"\"\n        assert xyz.is_contiguous()\n\n        B, N, _ = xyz.size()\n        output = torch.cuda.IntTensor(B, npoint)\n        temp = torch.cuda.FloatTensor(B, N).fill_(1e10)\n\n        pointnet2.furthest_point_sampling_wrapper(B, N, npoint, xyz, temp, output)\n        return output\n\n    @staticmethod\n    def backward(xyz, a=None):\n        return None, None\n\n\nfurthest_point_sample = FurthestPointSampling.apply\n\n\nclass GatherOperation(Function):\n\n    @staticmethod\n    def forward(ctx, features: torch.Tensor, idx: torch.Tensor) -> torch.Tensor:\n        \"\"\"\n        :param ctx:\n        :param features: (B, C, N)\n        :param idx: (B, npoint) index tensor of the features to gather\n        :return:\n            output: (B, C, npoint)\n        \"\"\"\n        assert features.is_contiguous()\n        assert idx.is_contiguous()\n\n        B, npoint = idx.size()\n        _, C, N = features.size()\n        output = torch.cuda.FloatTensor(B, C, npoint)\n\n        pointnet2.gather_points_wrapper(B, C, N, npoint, features, idx, output)\n\n        ctx.for_backwards = (idx, C, N)\n        return output\n\n    @staticmethod\n    def backward(ctx, grad_out):\n        idx, C, N = ctx.for_backwards\n        B, npoint = idx.size()\n\n        grad_features = Variable(torch.cuda.FloatTensor(B, C, N).zero_())\n        grad_out_data = grad_out.data.contiguous()\n        pointnet2.gather_points_grad_wrapper(B, C, N, npoint, grad_out_data, idx, grad_features.data)\n        return grad_features, None\n\n\ngather_operation = GatherOperation.apply\n\n\nclass ThreeNN(Function):\n\n    @staticmethod\n    def forward(ctx, unknown: torch.Tensor, known: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]:\n        \"\"\"\n        Find the three nearest neighbors of unknown in known\n        :param ctx:\n        :param unknown: (B, N, 3)\n        :param known: (B, M, 3)\n        :return:\n            dist: (B, N, 3) l2 distance to the three nearest neighbors\n            idx: (B, N, 3) index of 3 nearest neighbors\n        \"\"\"\n        assert unknown.is_contiguous()\n        assert known.is_contiguous()\n\n        B, N, _ = unknown.size()\n        m = known.size(1)\n        dist2 = torch.cuda.FloatTensor(B, N, 3)\n        idx = torch.cuda.IntTensor(B, N, 3)\n\n        pointnet2.three_nn_wrapper(B, N, m, unknown, known, dist2, idx)\n        return torch.sqrt(dist2), idx\n\n    @staticmethod\n    def backward(ctx, a=None, b=None):\n        return None, None\n\n\nthree_nn = ThreeNN.apply\n\n\nclass ThreeInterpolate(Function):\n\n    @staticmethod\n    def forward(ctx, features: torch.Tensor, idx: torch.Tensor, weight: torch.Tensor) -> torch.Tensor:\n        \"\"\"\n        Performs weight linear interpolation on 3 features\n        :param ctx:\n        :param features: (B, C, M) Features descriptors to be interpolated from\n        :param idx: (B, n, 3) three nearest neighbors of the target features in features\n        :param weight: (B, n, 3) weights\n        :return:\n            output: (B, C, N) tensor of the interpolated features\n        \"\"\"\n        assert features.is_contiguous()\n        assert idx.is_contiguous()\n        assert weight.is_contiguous()\n\n        B, c, m = features.size()\n        n = idx.size(1)\n        ctx.three_interpolate_for_backward = (idx, weight, m)\n        output = torch.cuda.FloatTensor(B, c, n)\n\n        pointnet2.three_interpolate_wrapper(B, c, m, n, features, idx, weight, output)\n        return output\n\n    @staticmethod\n    def backward(ctx, grad_out: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]:\n        \"\"\"\n        :param ctx:\n        :param grad_out: (B, C, N) tensor with gradients of outputs\n        :return:\n            grad_features: (B, C, M) tensor with gradients of features\n            None:\n            None:\n        \"\"\"\n        idx, weight, m = ctx.three_interpolate_for_backward\n        B, c, n = grad_out.size()\n\n        grad_features = Variable(torch.cuda.FloatTensor(B, c, m).zero_())\n        grad_out_data = grad_out.data.contiguous()\n\n        pointnet2.three_interpolate_grad_wrapper(B, c, n, m, grad_out_data, idx, weight, grad_features.data)\n        return grad_features, None, None\n\n\nthree_interpolate = ThreeInterpolate.apply\n\n\nclass GroupingOperation(Function):\n\n    @staticmethod\n    def forward(ctx, features: torch.Tensor, idx: torch.Tensor) -> torch.Tensor:\n        \"\"\"\n        :param ctx:\n        :param features: (B, C, N) tensor of features to group\n        :param idx: (B, npoint, nsample) tensor containing the indicies of features to group with\n        :return:\n            output: (B, C, npoint, nsample) tensor\n        \"\"\"\n        assert features.is_contiguous()\n        assert idx.is_contiguous()\n\n        B, nfeatures, nsample = idx.size()\n        _, C, N = features.size()\n        output = torch.cuda.FloatTensor(B, C, nfeatures, nsample)\n\n        pointnet2.group_points_wrapper(B, C, N, nfeatures, nsample, features, idx, output)\n\n        ctx.for_backwards = (idx, N)\n        return output\n\n    @staticmethod\n    def backward(ctx, grad_out: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]:\n        \"\"\"\n        :param ctx:\n        :param grad_out: (B, C, npoint, nsample) tensor of the gradients of the output from forward\n        :return:\n            grad_features: (B, C, N) gradient of the features\n        \"\"\"\n        idx, N = ctx.for_backwards\n\n        B, C, npoint, nsample = grad_out.size()\n        grad_features = Variable(torch.cuda.FloatTensor(B, C, N).zero_())\n\n        grad_out_data = grad_out.data.contiguous()\n        pointnet2.group_points_grad_wrapper(B, C, N, npoint, nsample, grad_out_data, idx, grad_features.data)\n        return grad_features, None\n\n\ngrouping_operation = GroupingOperation.apply\n\n\nclass BallQuery(Function):\n\n    @staticmethod\n    def forward(ctx, radius: float, nsample: int, xyz: torch.Tensor, new_xyz: torch.Tensor) -> torch.Tensor:\n        \"\"\"\n        :param ctx:\n        :param radius: float, radius of the balls\n        :param nsample: int, maximum number of features in the balls\n        :param xyz: (B, N, 3) xyz coordinates of the features\n        :param new_xyz: (B, npoint, 3) centers of the ball query\n        :return:\n            idx: (B, npoint, nsample) tensor with the indicies of the features that form the query balls\n        \"\"\"\n        assert new_xyz.is_contiguous()\n        assert xyz.is_contiguous()\n\n        B, N, _ = xyz.size()\n        npoint = new_xyz.size(1)\n        idx = torch.cuda.IntTensor(B, npoint, nsample).zero_()\n\n        pointnet2.ball_query_wrapper(B, N, npoint, radius, nsample, new_xyz, xyz, idx)\n        return idx\n\n    @staticmethod\n    def backward(ctx, a=None):\n        return None, None, None, None\n\n\nball_query = BallQuery.apply\n\n\nclass QueryAndGroup(nn.Module):\n    def __init__(self, radius: float, nsample: int, use_xyz: bool = True):\n        \"\"\"\n        :param radius: float, radius of ball\n        :param nsample: int, maximum number of features to gather in the ball\n        :param use_xyz:\n        \"\"\"\n        super().__init__()\n        self.radius, self.nsample, self.use_xyz = radius, nsample, use_xyz\n\n    def forward(self, xyz: torch.Tensor, new_xyz: torch.Tensor, features: torch.Tensor = None) -> Tuple[torch.Tensor]:\n        \"\"\"\n        :param xyz: (B, N, 3) xyz coordinates of the features\n        :param new_xyz: (B, npoint, 3) centroids\n        :param features: (B, C, N) descriptors of the features\n        :return:\n            new_features: (B, 3 + C, npoint, nsample)\n        \"\"\"\n        idx = ball_query(self.radius, self.nsample, xyz, new_xyz)\n        xyz_trans = xyz.transpose(1, 2).contiguous()\n        grouped_xyz = grouping_operation(xyz_trans, idx)  # (B, 3, npoint, nsample)\n        grouped_xyz -= new_xyz.transpose(1, 2).unsqueeze(-1)\n\n        if features is not None:\n            grouped_features = grouping_operation(features, idx)\n            if self.use_xyz:\n                new_features = torch.cat([grouped_xyz, grouped_features], dim=1)  # (B, C + 3, npoint, nsample)\n            else:\n                new_features = grouped_features\n        else:\n            assert self.use_xyz, \"Cannot have not features and not use xyz as a feature!\"\n            new_features = grouped_xyz\n\n        return new_features\n\n\nclass GroupAll(nn.Module):\n    def __init__(self, use_xyz: bool = True):\n        super().__init__()\n        self.use_xyz = use_xyz\n\n    def forward(self, xyz: torch.Tensor, new_xyz: torch.Tensor, features: torch.Tensor = None):\n        \"\"\"\n        :param xyz: (B, N, 3) xyz coordinates of the features\n        :param new_xyz: ignored\n        :param features: (B, C, N) descriptors of the features\n        :return:\n            new_features: (B, C + 3, 1, N)\n        \"\"\"\n        grouped_xyz = xyz.transpose(1, 2).unsqueeze(2)\n        if features is not None:\n            grouped_features = features.unsqueeze(2)\n            if self.use_xyz:\n                new_features = torch.cat([grouped_xyz, grouped_features], dim=1)  # (B, 3 + C, 1, N)\n            else:\n                new_features = grouped_features\n        else:\n            new_features = grouped_xyz\n\n        return new_features\n"
  },
  {
    "path": "pointnet2/pytorch_utils.py",
    "content": "import torch.nn as nn\nfrom typing import List, Tuple\n\n\nclass SharedMLP(nn.Sequential):\n\n    def __init__(\n            self,\n            args: List[int],\n            *,\n            bn: bool = False,\n            activation=nn.ReLU(inplace=True),\n            preact: bool = False,\n            first: bool = False,\n            name: str = \"\",\n            instance_norm: bool = False,\n    ):\n        super().__init__()\n\n        for i in range(len(args) - 1):\n            self.add_module(\n                name + 'layer{}'.format(i),\n                Conv2d(\n                    args[i],\n                    args[i + 1],\n                    bn=(not first or not preact or (i != 0)) and bn,\n                    activation=activation\n                    if (not first or not preact or (i != 0)) else None,\n                    preact=preact,\n                    instance_norm=instance_norm\n                )\n            )\n\n\nclass _ConvBase(nn.Sequential):\n\n    def __init__(\n            self,\n            in_size,\n            out_size,\n            kernel_size,\n            stride,\n            padding,\n            activation,\n            bn,\n            init,\n            conv=None,\n            batch_norm=None,\n            bias=True,\n            preact=False,\n            name=\"\",\n            instance_norm=False,\n            instance_norm_func=None\n    ):\n        super().__init__()\n\n        bias = bias and (not bn)\n        conv_unit = conv(\n            in_size,\n            out_size,\n            kernel_size=kernel_size,\n            stride=stride,\n            padding=padding,\n            bias=bias\n        )\n        init(conv_unit.weight)\n        if bias:\n            nn.init.constant_(conv_unit.bias, 0)\n\n        if bn:\n            if not preact:\n                bn_unit = batch_norm(out_size)\n            else:\n                bn_unit = batch_norm(in_size)\n        if instance_norm:\n            if not preact:\n                in_unit = instance_norm_func(out_size, affine=False, track_running_stats=False)\n            else:\n                in_unit = instance_norm_func(in_size, affine=False, track_running_stats=False)\n\n        if preact:\n            if bn:\n                self.add_module(name + 'bn', bn_unit)\n\n            if activation is not None:\n                self.add_module(name + 'activation', activation)\n\n            if not bn and instance_norm:\n                self.add_module(name + 'in', in_unit)\n\n        self.add_module(name + 'conv', conv_unit)\n\n        if not preact:\n            if bn:\n                self.add_module(name + 'bn', bn_unit)\n\n            if activation is not None:\n                self.add_module(name + 'activation', activation)\n\n            if not bn and instance_norm:\n                self.add_module(name + 'in', in_unit)\n\n\nclass _BNBase(nn.Sequential):\n\n    def __init__(self, in_size, batch_norm=None, name=\"\"):\n        super().__init__()\n        self.add_module(name + \"bn\", batch_norm(in_size))\n\n        nn.init.constant_(self[0].weight, 1.0)\n        nn.init.constant_(self[0].bias, 0)\n\n\nclass BatchNorm1d(_BNBase):\n\n    def __init__(self, in_size: int, *, name: str = \"\"):\n        super().__init__(in_size, batch_norm=nn.BatchNorm1d, name=name)\n\n\nclass BatchNorm2d(_BNBase):\n\n    def __init__(self, in_size: int, name: str = \"\"):\n        super().__init__(in_size, batch_norm=nn.BatchNorm2d, name=name)\n\n\nclass Conv1d(_ConvBase):\n\n    def __init__(\n            self,\n            in_size: int,\n            out_size: int,\n            *,\n            kernel_size: int = 1,\n            stride: int = 1,\n            padding: int = 0,\n            activation=nn.ReLU(inplace=True),\n            bn: bool = False,\n            init=nn.init.kaiming_normal_,\n            bias: bool = True,\n            preact: bool = False,\n            name: str = \"\",\n            instance_norm=False\n    ):\n        super().__init__(\n            in_size,\n            out_size,\n            kernel_size,\n            stride,\n            padding,\n            activation,\n            bn,\n            init,\n            conv=nn.Conv1d,\n            batch_norm=BatchNorm1d,\n            bias=bias,\n            preact=preact,\n            name=name,\n            instance_norm=instance_norm,\n            instance_norm_func=nn.InstanceNorm1d\n        )\n\n\nclass Conv2d(_ConvBase):\n\n    def __init__(\n            self,\n            in_size: int,\n            out_size: int,\n            *,\n            kernel_size: Tuple[int, int] = (1, 1),\n            stride: Tuple[int, int] = (1, 1),\n            padding: Tuple[int, int] = (0, 0),\n            activation=nn.ReLU(inplace=True),\n            bn: bool = False,\n            init=nn.init.kaiming_normal_,\n            bias: bool = True,\n            preact: bool = False,\n            name: str = \"\",\n            instance_norm=False\n    ):\n        super().__init__(\n            in_size,\n            out_size,\n            kernel_size,\n            stride,\n            padding,\n            activation,\n            bn,\n            init,\n            conv=nn.Conv2d,\n            batch_norm=BatchNorm2d,\n            bias=bias,\n            preact=preact,\n            name=name,\n            instance_norm=instance_norm,\n            instance_norm_func=nn.InstanceNorm2d\n        )\n\n\nclass FC(nn.Sequential):\n\n    def __init__(\n            self,\n            in_size: int,\n            out_size: int,\n            *,\n            activation=nn.ReLU(inplace=True),\n            bn: bool = False,\n            init=None,\n            preact: bool = False,\n            name: str = \"\"\n    ):\n        super().__init__()\n\n        fc = nn.Linear(in_size, out_size, bias=not bn)\n        if init is not None:\n            init(fc.weight)\n        if not bn:\n            nn.init.constant(fc.bias, 0)\n\n        if preact:\n            if bn:\n                self.add_module(name + 'bn', BatchNorm1d(in_size))\n\n            if activation is not None:\n                self.add_module(name + 'activation', activation)\n\n        self.add_module(name + 'fc', fc)\n\n        if not preact:\n            if bn:\n                self.add_module(name + 'bn', BatchNorm1d(out_size))\n\n            if activation is not None:\n                self.add_module(name + 'activation', activation)\n\n"
  },
  {
    "path": "pointnet2/setup.py",
    "content": "from setuptools import setup\nfrom torch.utils.cpp_extension import BuildExtension, CUDAExtension\n\nsetup(\n    name='pointnet2',\n    ext_modules=[\n        CUDAExtension('pointnet2_cuda', [\n            'src/pointnet2_api.cpp',\n            \n            'src/ball_query.cpp', \n            'src/ball_query_gpu.cu',\n            'src/group_points.cpp', \n            'src/group_points_gpu.cu',\n            'src/interpolate.cpp', \n            'src/interpolate_gpu.cu',\n            'src/sampling.cpp', \n            'src/sampling_gpu.cu',\n        ],\n        extra_compile_args={'cxx': ['-g'],\n                            'nvcc': ['-O2']})\n    ],\n    cmdclass={'build_ext': BuildExtension}\n)\n"
  },
  {
    "path": "pointnet2/src/ball_query.cpp",
    "content": "#include <torch/serialize/tensor.h>\n#include <vector>\n#include <THC/THC.h>\n#include <cuda.h>\n#include <cuda_runtime_api.h>\n#include \"ball_query_gpu.h\"\n\nextern THCState *state;\n\n#define CHECK_CUDA(x) AT_CHECK(x.type().is_cuda(), #x, \" must be a CUDAtensor \")\n#define CHECK_CONTIGUOUS(x) AT_CHECK(x.is_contiguous(), #x, \" must be contiguous \")\n#define CHECK_INPUT(x) CHECK_CUDA(x);CHECK_CONTIGUOUS(x)\n\nint ball_query_wrapper_fast(int b, int n, int m, float radius, int nsample, \n    at::Tensor new_xyz_tensor, at::Tensor xyz_tensor, at::Tensor idx_tensor) {\n    CHECK_INPUT(new_xyz_tensor);\n    CHECK_INPUT(xyz_tensor);\n    const float *new_xyz = new_xyz_tensor.data<float>();\n    const float *xyz = xyz_tensor.data<float>();\n    int *idx = idx_tensor.data<int>();\n    \n    cudaStream_t stream = THCState_getCurrentStream(state);\n    ball_query_kernel_launcher_fast(b, n, m, radius, nsample, new_xyz, xyz, idx, stream);\n    return 1;\n}"
  },
  {
    "path": "pointnet2/src/ball_query_gpu.cu",
    "content": "#include <math.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n#include \"ball_query_gpu.h\"\n#include \"cuda_utils.h\"\n\n\n__global__ void ball_query_kernel_fast(int b, int n, int m, float radius, int nsample, \n    const float *__restrict__ new_xyz, const float *__restrict__ xyz, int *__restrict__ idx) {\n    // new_xyz: (B, M, 3)\n    // xyz: (B, N, 3)\n    // output:\n    //      idx: (B, M, nsample)\n    int bs_idx = blockIdx.y;\n    int pt_idx = blockIdx.x * blockDim.x + threadIdx.x;\n    if (bs_idx >= b || pt_idx >= m) return;\n\n    new_xyz += bs_idx * m * 3 + pt_idx * 3;\n    xyz += bs_idx * n * 3;\n    idx += bs_idx * m * nsample + pt_idx * nsample;\n\n    float radius2 = radius * radius;\n    float new_x = new_xyz[0];\n    float new_y = new_xyz[1];\n    float new_z = new_xyz[2];\n\n    int cnt = 0;\n    for (int k = 0; k < n; ++k) {\n        float x = xyz[k * 3 + 0];\n        float y = xyz[k * 3 + 1];\n        float z = xyz[k * 3 + 2];\n        float d2 = (new_x - x) * (new_x - x) + (new_y - y) * (new_y - y) + (new_z - z) * (new_z - z);\n        if (d2 < radius2){\n            if (cnt == 0){\n                for (int l = 0; l < nsample; ++l) {\n                    idx[l] = k;\n                }\n            }\n            idx[cnt] = k;\n            ++cnt;\n            if (cnt >= nsample) break;\n        }\n    }\n}\n\n\nvoid ball_query_kernel_launcher_fast(int b, int n, int m, float radius, int nsample, \\\n    const float *new_xyz, const float *xyz, int *idx, cudaStream_t stream) {\n    // new_xyz: (B, M, 3)\n    // xyz: (B, N, 3)\n    // output:\n    //      idx: (B, M, nsample)\n\n    cudaError_t err;\n\n    dim3 blocks(DIVUP(m, THREADS_PER_BLOCK), b);  // blockIdx.x(col), blockIdx.y(row)\n    dim3 threads(THREADS_PER_BLOCK);\n\n    ball_query_kernel_fast<<<blocks, threads, 0, stream>>>(b, n, m, radius, nsample, new_xyz, xyz, idx);\n    // cudaDeviceSynchronize();  // for using printf in kernel function\n    err = cudaGetLastError();\n    if (cudaSuccess != err) {\n        fprintf(stderr, \"CUDA kernel failed : %s\\n\", cudaGetErrorString(err));\n        exit(-1);\n    }\n}"
  },
  {
    "path": "pointnet2/src/ball_query_gpu.h",
    "content": "#ifndef _BALL_QUERY_GPU_H\n#define _BALL_QUERY_GPU_H\n\n#include <torch/serialize/tensor.h>\n#include <vector>\n#include <cuda.h>\n#include <cuda_runtime_api.h>\n\nint ball_query_wrapper_fast(int b, int n, int m, float radius, int nsample, \n\tat::Tensor new_xyz_tensor, at::Tensor xyz_tensor, at::Tensor idx_tensor);\n\nvoid ball_query_kernel_launcher_fast(int b, int n, int m, float radius, int nsample, \n\tconst float *xyz, const float *new_xyz, int *idx, cudaStream_t stream);\n\n#endif\n"
  },
  {
    "path": "pointnet2/src/cuda_utils.h",
    "content": "#ifndef _CUDA_UTILS_H\n#define _CUDA_UTILS_H\n\n#include <cmath>\n\n#define TOTAL_THREADS 1024\n#define THREADS_PER_BLOCK 256\n#define DIVUP(m,n) ((m) / (n) + ((m) % (n) > 0))\n\ninline int opt_n_threads(int work_size) {\n    const int pow_2 = std::log(static_cast<double>(work_size)) / std::log(2.0);\n\n    return max(min(1 << pow_2, TOTAL_THREADS), 1);\n}\n#endif\n"
  },
  {
    "path": "pointnet2/src/group_points.cpp",
    "content": "#include <torch/serialize/tensor.h>\n#include <cuda.h>\n#include <cuda_runtime_api.h>\n#include <vector>\n#include <THC/THC.h>\n#include \"group_points_gpu.h\"\n\nextern THCState *state;\n\n\nint group_points_grad_wrapper_fast(int b, int c, int n, int npoints, int nsample, \n    at::Tensor grad_out_tensor, at::Tensor idx_tensor, at::Tensor grad_points_tensor) {\n\n    float *grad_points = grad_points_tensor.data<float>();\n    const int *idx = idx_tensor.data<int>();\n    const float *grad_out = grad_out_tensor.data<float>();\n\n    cudaStream_t stream = THCState_getCurrentStream(state);\n\n    group_points_grad_kernel_launcher_fast(b, c, n, npoints, nsample, grad_out, idx, grad_points, stream);\n    return 1;\n}\n\n\nint group_points_wrapper_fast(int b, int c, int n, int npoints, int nsample, \n    at::Tensor points_tensor, at::Tensor idx_tensor, at::Tensor out_tensor) {\n\n    const float *points = points_tensor.data<float>();\n    const int *idx = idx_tensor.data<int>();\n    float *out = out_tensor.data<float>();\n\n    cudaStream_t stream = THCState_getCurrentStream(state);\n\n    group_points_kernel_launcher_fast(b, c, n, npoints, nsample, points, idx, out, stream);\n    return 1;\n}"
  },
  {
    "path": "pointnet2/src/group_points_gpu.cu",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n\n#include \"cuda_utils.h\"\n#include \"group_points_gpu.h\"\n\n\n__global__ void group_points_grad_kernel_fast(int b, int c, int n, int npoints, int nsample, \n    const float *__restrict__ grad_out, const int *__restrict__ idx, float *__restrict__ grad_points) {\n    // grad_out: (B, C, npoints, nsample)\n    // idx: (B, npoints, nsample)\n    // output:\n    //      grad_points: (B, C, N)\n    int bs_idx = blockIdx.z;\n    int c_idx = blockIdx.y;\n    int index = blockIdx.x * blockDim.x + threadIdx.x;\n    int pt_idx = index / nsample;\n    if (bs_idx >= b || c_idx >= c || pt_idx >= npoints) return;\n\n    int sample_idx = index % nsample;\n    grad_out += bs_idx * c * npoints * nsample + c_idx * npoints * nsample + pt_idx * nsample + sample_idx;\n    idx += bs_idx * npoints * nsample + pt_idx * nsample + sample_idx; \n    \n    atomicAdd(grad_points + bs_idx * c * n + c_idx * n + idx[0] , grad_out[0]);\n}\n\nvoid group_points_grad_kernel_launcher_fast(int b, int c, int n, int npoints, int nsample, \n    const float *grad_out, const int *idx, float *grad_points, cudaStream_t stream) {\n    // grad_out: (B, C, npoints, nsample)\n    // idx: (B, npoints, nsample)\n    // output:\n    //      grad_points: (B, C, N)\n    cudaError_t err;\n    dim3 blocks(DIVUP(npoints * nsample, THREADS_PER_BLOCK), c, b);  // blockIdx.x(col), blockIdx.y(row)\n    dim3 threads(THREADS_PER_BLOCK);\n\n    group_points_grad_kernel_fast<<<blocks, threads, 0, stream>>>(b, c, n, npoints, nsample, grad_out, idx, grad_points);\n\n    err = cudaGetLastError();\n    if (cudaSuccess != err) {\n        fprintf(stderr, \"CUDA kernel failed : %s\\n\", cudaGetErrorString(err));\n        exit(-1);\n    }\n}\n\n\n__global__ void group_points_kernel_fast(int b, int c, int n, int npoints, int nsample, \n    const float *__restrict__ points, const int *__restrict__ idx, float *__restrict__ out) {\n    // points: (B, C, N)\n    // idx: (B, npoints, nsample)\n    // output:\n    //      out: (B, C, npoints, nsample)\n    int bs_idx = blockIdx.z;\n    int c_idx = blockIdx.y;\n    int index = blockIdx.x * blockDim.x + threadIdx.x;\n    int pt_idx = index / nsample;\n    if (bs_idx >= b || c_idx >= c || pt_idx >= npoints) return;\n\n    int sample_idx = index % nsample;\n\n    idx += bs_idx * npoints * nsample + pt_idx * nsample + sample_idx; \n    int in_idx = bs_idx * c * n + c_idx * n + idx[0];\n    int out_idx = bs_idx * c * npoints * nsample + c_idx * npoints * nsample + pt_idx * nsample + sample_idx;\n\n    out[out_idx] = points[in_idx];\n}\n\n\nvoid group_points_kernel_launcher_fast(int b, int c, int n, int npoints, int nsample, \n    const float *points, const int *idx, float *out, cudaStream_t stream) {\n    // points: (B, C, N)\n    // idx: (B, npoints, nsample)\n    // output:\n    //      out: (B, C, npoints, nsample)\n    cudaError_t err;\n    dim3 blocks(DIVUP(npoints * nsample, THREADS_PER_BLOCK), c, b);  // blockIdx.x(col), blockIdx.y(row)\n    dim3 threads(THREADS_PER_BLOCK);\n\n    group_points_kernel_fast<<<blocks, threads, 0, stream>>>(b, c, n, npoints, nsample, points, idx, out);\n    // cudaDeviceSynchronize();  // for using printf in kernel function\n    err = cudaGetLastError();\n    if (cudaSuccess != err) {\n        fprintf(stderr, \"CUDA kernel failed : %s\\n\", cudaGetErrorString(err));\n        exit(-1);\n    }\n}\n"
  },
  {
    "path": "pointnet2/src/group_points_gpu.h",
    "content": "#ifndef _GROUP_POINTS_GPU_H\n#define _GROUP_POINTS_GPU_H\n\n#include <torch/serialize/tensor.h>\n#include <cuda.h>\n#include <cuda_runtime_api.h>\n#include <vector>\n\n\nint group_points_wrapper_fast(int b, int c, int n, int npoints, int nsample, \n    at::Tensor points_tensor, at::Tensor idx_tensor, at::Tensor out_tensor);\n\nvoid group_points_kernel_launcher_fast(int b, int c, int n, int npoints, int nsample, \n    const float *points, const int *idx, float *out, cudaStream_t stream);\n\nint group_points_grad_wrapper_fast(int b, int c, int n, int npoints, int nsample, \n    at::Tensor grad_out_tensor, at::Tensor idx_tensor, at::Tensor grad_points_tensor);\n\nvoid group_points_grad_kernel_launcher_fast(int b, int c, int n, int npoints, int nsample, \n    const float *grad_out, const int *idx, float *grad_points, cudaStream_t stream);\n\n#endif\n"
  },
  {
    "path": "pointnet2/src/interpolate.cpp",
    "content": "#include <torch/serialize/tensor.h>\n#include <vector>\n#include <THC/THC.h>\n#include <math.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <cuda.h>\n#include <cuda_runtime_api.h>\n#include \"interpolate_gpu.h\"\n\nextern THCState *state;\n\n\nvoid three_nn_wrapper_fast(int b, int n, int m, at::Tensor unknown_tensor, \n    at::Tensor known_tensor, at::Tensor dist2_tensor, at::Tensor idx_tensor) {\n    const float *unknown = unknown_tensor.data<float>();\n    const float *known = known_tensor.data<float>();\n    float *dist2 = dist2_tensor.data<float>();\n    int *idx = idx_tensor.data<int>();\n\n    cudaStream_t stream = THCState_getCurrentStream(state);\n    three_nn_kernel_launcher_fast(b, n, m, unknown, known, dist2, idx, stream);\n}\n\n\nvoid three_interpolate_wrapper_fast(int b, int c, int m, int n,\n                         at::Tensor points_tensor,\n                         at::Tensor idx_tensor,\n                         at::Tensor weight_tensor,\n                         at::Tensor out_tensor) {\n\n    const float *points = points_tensor.data<float>();\n    const float *weight = weight_tensor.data<float>();\n    float *out = out_tensor.data<float>();\n    const int *idx = idx_tensor.data<int>();\n\n    cudaStream_t stream = THCState_getCurrentStream(state);\n    three_interpolate_kernel_launcher_fast(b, c, m, n, points, idx, weight, out, stream);\n}\n\nvoid three_interpolate_grad_wrapper_fast(int b, int c, int n, int m,\n                            at::Tensor grad_out_tensor,\n                            at::Tensor idx_tensor,\n                            at::Tensor weight_tensor,\n                            at::Tensor grad_points_tensor) {\n\n    const float *grad_out = grad_out_tensor.data<float>();\n    const float *weight = weight_tensor.data<float>();\n    float *grad_points = grad_points_tensor.data<float>();\n    const int *idx = idx_tensor.data<int>();\n\n    cudaStream_t stream = THCState_getCurrentStream(state);\n    three_interpolate_grad_kernel_launcher_fast(b, c, n, m, grad_out, idx, weight, grad_points, stream);\n}"
  },
  {
    "path": "pointnet2/src/interpolate_gpu.cu",
    "content": "#include <math.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n#include \"cuda_utils.h\"\n#include \"interpolate_gpu.h\"\n\n\n__global__ void three_nn_kernel_fast(int b, int n, int m, const float *__restrict__ unknown, \n    const float *__restrict__ known, float *__restrict__ dist2, int *__restrict__ idx) {\n    // unknown: (B, N, 3)\n    // known: (B, M, 3)\n    // output: \n    //      dist2: (B, N, 3)\n    //      idx: (B, N, 3)\n    \n    int bs_idx = blockIdx.y;\n    int pt_idx = blockIdx.x * blockDim.x + threadIdx.x;\n    if (bs_idx >= b || pt_idx >= n) return;\n\n    unknown += bs_idx * n * 3 + pt_idx * 3;\n    known += bs_idx * m * 3;\n    dist2 += bs_idx * n * 3 + pt_idx * 3;\n    idx += bs_idx * n * 3 + pt_idx * 3;\n\n    float ux = unknown[0];\n    float uy = unknown[1];\n    float uz = unknown[2];\n\n    double best1 = 1e40, best2 = 1e40, best3 = 1e40;\n    int besti1 = 0, besti2 = 0, besti3 = 0;\n    for (int k = 0; k < m; ++k) {\n        float x = known[k * 3 + 0];\n        float y = known[k * 3 + 1];\n        float z = known[k * 3 + 2];\n        float d = (ux - x) * (ux - x) + (uy - y) * (uy - y) + (uz - z) * (uz - z);\n        if (d < best1) {\n            best3 = best2; besti3 = besti2;\n            best2 = best1; besti2 = besti1;\n            best1 = d; besti1 = k;\n        } \n        else if (d < best2) {\n            best3 = best2; besti3 = besti2;\n            best2 = d; besti2 = k;\n        } \n        else if (d < best3) {\n            best3 = d; besti3 = k;\n        }\n    }\n    dist2[0] = best1; dist2[1] = best2; dist2[2] = best3;\n    idx[0] = besti1; idx[1] = besti2; idx[2] = besti3;\n}\n\n\nvoid three_nn_kernel_launcher_fast(int b, int n, int m, const float *unknown, \n    const float *known, float *dist2, int *idx, cudaStream_t stream) {\n    // unknown: (B, N, 3)\n    // known: (B, M, 3)\n    // output: \n    //      dist2: (B, N, 3)\n    //      idx: (B, N, 3)\n\n    cudaError_t err;\n    dim3 blocks(DIVUP(n, THREADS_PER_BLOCK), b);  // blockIdx.x(col), blockIdx.y(row)\n    dim3 threads(THREADS_PER_BLOCK);\n\n    three_nn_kernel_fast<<<blocks, threads, 0, stream>>>(b, n, m, unknown, known, dist2, idx);\n\n    err = cudaGetLastError();\n    if (cudaSuccess != err) {\n        fprintf(stderr, \"CUDA kernel failed : %s\\n\", cudaGetErrorString(err));\n        exit(-1);\n    }\n}\n\n\n__global__ void three_interpolate_kernel_fast(int b, int c, int m, int n, const float *__restrict__ points, \n    const int *__restrict__ idx, const float *__restrict__ weight, float *__restrict__ out) {\n    // points: (B, C, M)\n    // idx: (B, N, 3)\n    // weight: (B, N, 3)\n    // output:\n    //      out: (B, C, N)\n\n    int bs_idx = blockIdx.z;\n    int c_idx = blockIdx.y;\n    int pt_idx = blockIdx.x * blockDim.x + threadIdx.x;\n\n    if (bs_idx >= b || c_idx >= c || pt_idx >= n) return;\n\n    weight += bs_idx * n * 3 + pt_idx * 3;\n    points += bs_idx * c * m + c_idx * m;\n    idx += bs_idx * n * 3 + pt_idx * 3;\n    out += bs_idx * c * n + c_idx * n;\n\n    out[pt_idx] = weight[0] * points[idx[0]] + weight[1] * points[idx[1]] + weight[2] * points[idx[2]];\n}\n\nvoid three_interpolate_kernel_launcher_fast(int b, int c, int m, int n, \n    const float *points, const int *idx, const float *weight, float *out, cudaStream_t stream) {\n    // points: (B, C, M)\n    // idx: (B, N, 3)\n    // weight: (B, N, 3)\n    // output:\n    //      out: (B, C, N)\n\n    cudaError_t err;\n    dim3 blocks(DIVUP(n, THREADS_PER_BLOCK), c, b);  // blockIdx.x(col), blockIdx.y(row)\n    dim3 threads(THREADS_PER_BLOCK);\n    three_interpolate_kernel_fast<<<blocks, threads, 0, stream>>>(b, c, m, n, points, idx, weight, out);\n\n    err = cudaGetLastError();\n    if (cudaSuccess != err) {\n        fprintf(stderr, \"CUDA kernel failed : %s\\n\", cudaGetErrorString(err));\n        exit(-1);\n    }\n}\n\n\n__global__ void three_interpolate_grad_kernel_fast(int b, int c, int n, int m, const float *__restrict__ grad_out, \n    const int *__restrict__ idx, const float *__restrict__ weight, float *__restrict__ grad_points) {\n    // grad_out: (B, C, N)\n    // weight: (B, N, 3)\n    // output:\n    //      grad_points: (B, C, M)\n\n    int bs_idx = blockIdx.z;\n    int c_idx = blockIdx.y;\n    int pt_idx = blockIdx.x * blockDim.x + threadIdx.x;\n\n    if (bs_idx >= b || c_idx >= c || pt_idx >= n) return;\n    \n    grad_out += bs_idx * c * n + c_idx * n + pt_idx;\n    weight += bs_idx * n * 3 + pt_idx * 3;\n    grad_points += bs_idx * c * m + c_idx * m;\n    idx += bs_idx * n * 3 + pt_idx * 3;\n\n\n    atomicAdd(grad_points + idx[0], grad_out[0] * weight[0]);\n    atomicAdd(grad_points + idx[1], grad_out[0] * weight[1]);\n    atomicAdd(grad_points + idx[2], grad_out[0] * weight[2]);\n}\n\nvoid three_interpolate_grad_kernel_launcher_fast(int b, int c, int n, int m, const float *grad_out, \n    const int *idx, const float *weight, float *grad_points, cudaStream_t stream) {\n    // grad_out: (B, C, N)\n    // weight: (B, N, 3)\n    // output:\n    //      grad_points: (B, C, M)\n\n    cudaError_t err;\n    dim3 blocks(DIVUP(n, THREADS_PER_BLOCK), c, b);  // blockIdx.x(col), blockIdx.y(row)\n    dim3 threads(THREADS_PER_BLOCK);\n    three_interpolate_grad_kernel_fast<<<blocks, threads, 0, stream>>>(b, c, n, m, grad_out, idx, weight, grad_points);\n\n    err = cudaGetLastError();\n    if (cudaSuccess != err) {\n        fprintf(stderr, \"CUDA kernel failed : %s\\n\", cudaGetErrorString(err));\n        exit(-1);\n    }\n}"
  },
  {
    "path": "pointnet2/src/interpolate_gpu.h",
    "content": "#ifndef _INTERPOLATE_GPU_H\n#define _INTERPOLATE_GPU_H\n\n#include <torch/serialize/tensor.h>\n#include<vector>\n#include <cuda.h>\n#include <cuda_runtime_api.h>\n\n\nvoid three_nn_wrapper_fast(int b, int n, int m, at::Tensor unknown_tensor, \n  at::Tensor known_tensor, at::Tensor dist2_tensor, at::Tensor idx_tensor);\n\nvoid three_nn_kernel_launcher_fast(int b, int n, int m, const float *unknown,\n\tconst float *known, float *dist2, int *idx, cudaStream_t stream);\n\n\nvoid three_interpolate_wrapper_fast(int b, int c, int m, int n, at::Tensor points_tensor, \n    at::Tensor idx_tensor, at::Tensor weight_tensor, at::Tensor out_tensor);\n\nvoid three_interpolate_kernel_launcher_fast(int b, int c, int m, int n, \n    const float *points, const int *idx, const float *weight, float *out, cudaStream_t stream);\n\n\nvoid three_interpolate_grad_wrapper_fast(int b, int c, int n, int m, at::Tensor grad_out_tensor, \n    at::Tensor idx_tensor, at::Tensor weight_tensor, at::Tensor grad_points_tensor);\n\nvoid three_interpolate_grad_kernel_launcher_fast(int b, int c, int n, int m, const float *grad_out, \n    const int *idx, const float *weight, float *grad_points, cudaStream_t stream);\n\n#endif\n"
  },
  {
    "path": "pointnet2/src/pointnet2_api.cpp",
    "content": "#include <torch/serialize/tensor.h>\n#include <torch/extension.h>\n\n#include \"ball_query_gpu.h\"\n#include \"group_points_gpu.h\"\n#include \"sampling_gpu.h\"\n#include \"interpolate_gpu.h\"\n\n\nPYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {\n    m.def(\"ball_query_wrapper\", &ball_query_wrapper_fast, \"ball_query_wrapper_fast\");\n\n    m.def(\"group_points_wrapper\", &group_points_wrapper_fast, \"group_points_wrapper_fast\");\n    m.def(\"group_points_grad_wrapper\", &group_points_grad_wrapper_fast, \"group_points_grad_wrapper_fast\");\n\n    m.def(\"gather_points_wrapper\", &gather_points_wrapper_fast, \"gather_points_wrapper_fast\");\n    m.def(\"gather_points_grad_wrapper\", &gather_points_grad_wrapper_fast, \"gather_points_grad_wrapper_fast\");\n\n    m.def(\"furthest_point_sampling_wrapper\", &furthest_point_sampling_wrapper, \"furthest_point_sampling_wrapper\");\n    \n    m.def(\"three_nn_wrapper\", &three_nn_wrapper_fast, \"three_nn_wrapper_fast\");\n    m.def(\"three_interpolate_wrapper\", &three_interpolate_wrapper_fast, \"three_interpolate_wrapper_fast\");\n    m.def(\"three_interpolate_grad_wrapper\", &three_interpolate_grad_wrapper_fast, \"three_interpolate_grad_wrapper_fast\");\n}\n"
  },
  {
    "path": "pointnet2/src/sampling.cpp",
    "content": "#include <torch/serialize/tensor.h>\n#include <ATen/cuda/CUDAContext.h>\n#include <vector>\n#include <THC/THC.h>\n\n#include \"sampling_gpu.h\"\n\nextern THCState *state;\n\n\nint gather_points_wrapper_fast(int b, int c, int n, int npoints, \n    at::Tensor points_tensor, at::Tensor idx_tensor, at::Tensor out_tensor){\n    const float *points = points_tensor.data<float>();\n    const int *idx = idx_tensor.data<int>();\n    float *out = out_tensor.data<float>();\n\n    cudaStream_t stream = THCState_getCurrentStream(state);\n    gather_points_kernel_launcher_fast(b, c, n, npoints, points, idx, out, stream);\n    return 1;\n}\n\n\nint gather_points_grad_wrapper_fast(int b, int c, int n, int npoints, \n    at::Tensor grad_out_tensor, at::Tensor idx_tensor, at::Tensor grad_points_tensor) {\n\n    const float *grad_out = grad_out_tensor.data<float>();\n    const int *idx = idx_tensor.data<int>();\n    float *grad_points = grad_points_tensor.data<float>();\n\n    cudaStream_t stream = THCState_getCurrentStream(state);\n    gather_points_grad_kernel_launcher_fast(b, c, n, npoints, grad_out, idx, grad_points, stream);\n    return 1;\n}\n\n\nint furthest_point_sampling_wrapper(int b, int n, int m, \n    at::Tensor points_tensor, at::Tensor temp_tensor, at::Tensor idx_tensor) {\n\n    const float *points = points_tensor.data<float>();\n    float *temp = temp_tensor.data<float>();\n    int *idx = idx_tensor.data<int>();\n\n    cudaStream_t stream = THCState_getCurrentStream(state);\n    furthest_point_sampling_kernel_launcher(b, n, m, points, temp, idx, stream);\n    return 1;\n}\n"
  },
  {
    "path": "pointnet2/src/sampling_gpu.cu",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n\n#include \"cuda_utils.h\"\n#include \"sampling_gpu.h\"\n\n\n__global__ void gather_points_kernel_fast(int b, int c, int n, int m, \n    const float *__restrict__ points, const int *__restrict__ idx, float *__restrict__ out) {\n    // points: (B, C, N)\n    // idx: (B, M)\n    // output:\n    //      out: (B, C, M)\n\n    int bs_idx = blockIdx.z;\n    int c_idx = blockIdx.y;\n    int pt_idx = blockIdx.x * blockDim.x + threadIdx.x;\n    if (bs_idx >= b || c_idx >= c || pt_idx >= m) return;\n\n    out += bs_idx * c * m + c_idx * m + pt_idx;\n    idx += bs_idx * m + pt_idx;\n    points += bs_idx * c * n + c_idx * n;\n    out[0] = points[idx[0]];\n}\n\nvoid gather_points_kernel_launcher_fast(int b, int c, int n, int npoints, \n    const float *points, const int *idx, float *out, cudaStream_t stream) {\n    // points: (B, C, N)\n    // idx: (B, npoints)\n    // output:\n    //      out: (B, C, npoints)\n\n    cudaError_t err;\n    dim3 blocks(DIVUP(npoints, THREADS_PER_BLOCK), c, b);  // blockIdx.x(col), blockIdx.y(row)\n    dim3 threads(THREADS_PER_BLOCK);\n\n    gather_points_kernel_fast<<<blocks, threads, 0, stream>>>(b, c, n, npoints, points, idx, out);\n\n    err = cudaGetLastError();\n    if (cudaSuccess != err) {\n        fprintf(stderr, \"CUDA kernel failed : %s\\n\", cudaGetErrorString(err));\n        exit(-1);\n    }\n}\n\n__global__ void gather_points_grad_kernel_fast(int b, int c, int n, int m, const float *__restrict__ grad_out, \n    const int *__restrict__ idx, float *__restrict__ grad_points) {\n    // grad_out: (B, C, M)\n    // idx: (B, M)\n    // output:\n    //      grad_points: (B, C, N)\n\n    int bs_idx = blockIdx.z;\n    int c_idx = blockIdx.y;\n    int pt_idx = blockIdx.x * blockDim.x + threadIdx.x;\n    if (bs_idx >= b || c_idx >= c || pt_idx >= m) return;\n\n    grad_out += bs_idx * c * m + c_idx * m + pt_idx;\n    idx += bs_idx * m + pt_idx;\n    grad_points += bs_idx * c * n + c_idx * n;\n\n    atomicAdd(grad_points + idx[0], grad_out[0]);\n}\n\nvoid gather_points_grad_kernel_launcher_fast(int b, int c, int n, int npoints, \n    const float *grad_out, const int *idx, float *grad_points, cudaStream_t stream) {\n    // grad_out: (B, C, npoints)\n    // idx: (B, npoints)\n    // output:\n    //      grad_points: (B, C, N)\n\n    cudaError_t err;\n    dim3 blocks(DIVUP(npoints, THREADS_PER_BLOCK), c, b);  // blockIdx.x(col), blockIdx.y(row)\n    dim3 threads(THREADS_PER_BLOCK);\n\n    gather_points_grad_kernel_fast<<<blocks, threads, 0, stream>>>(b, c, n, npoints, grad_out, idx, grad_points);\n\n    err = cudaGetLastError();\n    if (cudaSuccess != err) {\n        fprintf(stderr, \"CUDA kernel failed : %s\\n\", cudaGetErrorString(err));\n        exit(-1);\n    }\n}\n\n\n__device__ void __update(float *__restrict__ dists, int *__restrict__ dists_i, int idx1, int idx2){\n    const float v1 = dists[idx1], v2 = dists[idx2];\n    const int i1 = dists_i[idx1], i2 = dists_i[idx2];\n    dists[idx1] = max(v1, v2);\n    dists_i[idx1] = v2 > v1 ? i2 : i1;\n}\n\ntemplate <unsigned int block_size>\n__global__ void furthest_point_sampling_kernel(int b, int n, int m, \n    const float *__restrict__ dataset, float *__restrict__ temp, int *__restrict__ idxs) {\n    // dataset: (B, N, 3)\n    // tmp: (B, N)\n    // output:\n    //      idx: (B, M)\n\n    if (m <= 0) return;\n    __shared__ float dists[block_size];\n    __shared__ int dists_i[block_size];\n\n    int batch_index = blockIdx.x;\n    dataset += batch_index * n * 3;\n    temp += batch_index * n;\n    idxs += batch_index * m;\n\n    int tid = threadIdx.x;\n    const int stride = block_size;\n\n    int old = 0;\n    if (threadIdx.x == 0)\n    idxs[0] = old;\n\n    __syncthreads();\n    for (int j = 1; j < m; j++) {\n    int besti = 0;\n    float best = -1;\n    float x1 = dataset[old * 3 + 0];\n    float y1 = dataset[old * 3 + 1];\n    float z1 = dataset[old * 3 + 2];\n    for (int k = tid; k < n; k += stride) {\n        float x2, y2, z2;\n        x2 = dataset[k * 3 + 0];\n        y2 = dataset[k * 3 + 1];\n        z2 = dataset[k * 3 + 2];\n        // float mag = (x2 * x2) + (y2 * y2) + (z2 * z2);\n        // if (mag <= 1e-3)\n        // continue;\n\n        float d = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) + (z2 - z1) * (z2 - z1);\n        float d2 = min(d, temp[k]);\n        temp[k] = d2;\n        besti = d2 > best ? k : besti;\n        best = d2 > best ? d2 : best;\n    }\n    dists[tid] = best;\n    dists_i[tid] = besti;\n    __syncthreads();\n\n    if (block_size >= 1024) {\n        if (tid < 512) {\n            __update(dists, dists_i, tid, tid + 512);\n        }\n        __syncthreads();\n    }\n\n    if (block_size >= 512) {\n        if (tid < 256) {\n            __update(dists, dists_i, tid, tid + 256);\n        }\n        __syncthreads();\n    }\n    if (block_size >= 256) {\n        if (tid < 128) {\n            __update(dists, dists_i, tid, tid + 128);\n        }\n        __syncthreads();\n    }\n    if (block_size >= 128) {\n        if (tid < 64) {\n            __update(dists, dists_i, tid, tid + 64);\n        }\n        __syncthreads();\n    }\n    if (block_size >= 64) {\n        if (tid < 32) {\n            __update(dists, dists_i, tid, tid + 32);\n        }\n        __syncthreads();\n    }\n    if (block_size >= 32) {\n        if (tid < 16) {\n            __update(dists, dists_i, tid, tid + 16);\n        }\n        __syncthreads();\n    }\n    if (block_size >= 16) {\n        if (tid < 8) {\n            __update(dists, dists_i, tid, tid + 8);\n        }\n        __syncthreads();\n    }\n    if (block_size >= 8) {\n        if (tid < 4) {\n            __update(dists, dists_i, tid, tid + 4);\n        }\n        __syncthreads();\n    }\n    if (block_size >= 4) {\n        if (tid < 2) {\n            __update(dists, dists_i, tid, tid + 2);\n        }\n        __syncthreads();\n    }\n    if (block_size >= 2) {\n        if (tid < 1) {\n            __update(dists, dists_i, tid, tid + 1);\n        }\n        __syncthreads();\n    }\n\n    old = dists_i[0];\n    if (tid == 0)\n        idxs[j] = old;\n    }\n}\n\nvoid furthest_point_sampling_kernel_launcher(int b, int n, int m, \n    const float *dataset, float *temp, int *idxs, cudaStream_t stream) {\n    // dataset: (B, N, 3)\n    // tmp: (B, N)\n    // output:\n    //      idx: (B, M)\n\n    cudaError_t err;\n    unsigned int n_threads = opt_n_threads(n);\n\n    switch (n_threads) {\n        case 1024:\n        furthest_point_sampling_kernel<1024><<<b, n_threads, 0, stream>>>(b, n, m, dataset, temp, idxs); break;\n        case 512:\n        furthest_point_sampling_kernel<512><<<b, n_threads, 0, stream>>>(b, n, m, dataset, temp, idxs); break;\n        case 256:\n        furthest_point_sampling_kernel<256><<<b, n_threads, 0, stream>>>(b, n, m, dataset, temp, idxs); break;\n        case 128:\n        furthest_point_sampling_kernel<128><<<b, n_threads, 0, stream>>>(b, n, m, dataset, temp, idxs); break;\n        case 64:\n        furthest_point_sampling_kernel<64><<<b, n_threads, 0, stream>>>(b, n, m, dataset, temp, idxs); break;\n        case 32:\n        furthest_point_sampling_kernel<32><<<b, n_threads, 0, stream>>>(b, n, m, dataset, temp, idxs); break;\n        case 16:\n        furthest_point_sampling_kernel<16><<<b, n_threads, 0, stream>>>(b, n, m, dataset, temp, idxs); break;\n        case 8:\n        furthest_point_sampling_kernel<8><<<b, n_threads, 0, stream>>>(b, n, m, dataset, temp, idxs); break;\n        case 4:\n        furthest_point_sampling_kernel<4><<<b, n_threads, 0, stream>>>(b, n, m, dataset, temp, idxs); break;\n        case 2:\n        furthest_point_sampling_kernel<2><<<b, n_threads, 0, stream>>>(b, n, m, dataset, temp, idxs); break;\n        case 1:\n        furthest_point_sampling_kernel<1><<<b, n_threads, 0, stream>>>(b, n, m, dataset, temp, idxs); break;\n        default:\n        furthest_point_sampling_kernel<512><<<b, n_threads, 0, stream>>>(b, n, m, dataset, temp, idxs);\n    }\n\n    err = cudaGetLastError();\n    if (cudaSuccess != err) {\n        fprintf(stderr, \"CUDA kernel failed : %s\\n\", cudaGetErrorString(err));\n        exit(-1);\n    }\n}\n"
  },
  {
    "path": "pointnet2/src/sampling_gpu.h",
    "content": "#ifndef _SAMPLING_GPU_H\n#define _SAMPLING_GPU_H\n\n#include <torch/serialize/tensor.h>\n#include <ATen/cuda/CUDAContext.h>\n#include<vector>\n\n\nint gather_points_wrapper_fast(int b, int c, int n, int npoints, \n    at::Tensor points_tensor, at::Tensor idx_tensor, at::Tensor out_tensor);\n\nvoid gather_points_kernel_launcher_fast(int b, int c, int n, int npoints, \n    const float *points, const int *idx, float *out, cudaStream_t stream);\n\n\nint gather_points_grad_wrapper_fast(int b, int c, int n, int npoints, \n    at::Tensor grad_out_tensor, at::Tensor idx_tensor, at::Tensor grad_points_tensor);\n\nvoid gather_points_grad_kernel_launcher_fast(int b, int c, int n, int npoints, \n    const float *grad_out, const int *idx, float *grad_points, cudaStream_t stream);\n\n\nint furthest_point_sampling_wrapper(int b, int n, int m, \n    at::Tensor points_tensor, at::Tensor temp_tensor, at::Tensor idx_tensor);\n\nvoid furthest_point_sampling_kernel_launcher(int b, int n, int m, \n    const float *dataset, float *temp, int *idxs, cudaStream_t stream);\n\n#endif\n"
  },
  {
    "path": "tools/_init_path.py",
    "content": "import os, sys\nsys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), '../'))\n"
  },
  {
    "path": "tools/data/KITTI/ImageSets/test.txt",
    "content": "000000\n000001\n000002\n000003\n000004\n000005\n000006\n000007\n000008\n000009\n000010\n000011\n000012\n000013\n000014\n000015\n000016\n000017\n000018\n000019\n000020\n000021\n000022\n000023\n000024\n000025\n000026\n000027\n000028\n000029\n000030\n000031\n000032\n000033\n000034\n000035\n000036\n000037\n000038\n000039\n000040\n000041\n000042\n000043\n000044\n000045\n000046\n000047\n000048\n000049\n000050\n000051\n000052\n000053\n000054\n000055\n000056\n000057\n000058\n000059\n000060\n000061\n000062\n000063\n000064\n000065\n000066\n000067\n000068\n000069\n000070\n000071\n000072\n000073\n000074\n000075\n000076\n000077\n000078\n000079\n000080\n000081\n000082\n000083\n000084\n000085\n000086\n000087\n000088\n000089\n000090\n000091\n000092\n000093\n000094\n000095\n000096\n000097\n000098\n000099\n000100\n000101\n000102\n000103\n000104\n000105\n000106\n000107\n000108\n000109\n000110\n000111\n000112\n000113\n000114\n000115\n000116\n000117\n000118\n000119\n000120\n000121\n000122\n000123\n000124\n000125\n000126\n000127\n000128\n000129\n000130\n000131\n000132\n000133\n000134\n000135\n000136\n000137\n000138\n000139\n000140\n000141\n000142\n000143\n000144\n000145\n000146\n000147\n000148\n000149\n000150\n000151\n000152\n000153\n000154\n000155\n000156\n000157\n000158\n000159\n000160\n000161\n000162\n000163\n000164\n000165\n000166\n000167\n000168\n000169\n000170\n000171\n000172\n000173\n000174\n000175\n000176\n000177\n000178\n000179\n000180\n000181\n000182\n000183\n000184\n000185\n000186\n000187\n000188\n000189\n000190\n000191\n000192\n000193\n000194\n000195\n000196\n000197\n000198\n000199\n000200\n000201\n000202\n000203\n000204\n000205\n000206\n000207\n000208\n000209\n000210\n000211\n000212\n000213\n000214\n000215\n000216\n000217\n000218\n000219\n000220\n000221\n000222\n000223\n000224\n000225\n000226\n000227\n000228\n000229\n000230\n000231\n000232\n000233\n000234\n000235\n000236\n000237\n000238\n000239\n000240\n000241\n000242\n000243\n000244\n000245\n000246\n000247\n000248\n000249\n000250\n000251\n000252\n000253\n000254\n000255\n000256\n000257\n000258\n000259\n000260\n000261\n000262\n000263\n000264\n000265\n000266\n000267\n000268\n000269\n000270\n000271\n000272\n000273\n000274\n000275\n000276\n000277\n000278\n000279\n000280\n000281\n000282\n000283\n000284\n000285\n000286\n000287\n000288\n000289\n000290\n000291\n000292\n000293\n000294\n000295\n000296\n000297\n000298\n000299\n000300\n000301\n000302\n000303\n000304\n000305\n000306\n000307\n000308\n000309\n000310\n000311\n000312\n000313\n000314\n000315\n000316\n000317\n000318\n000319\n000320\n000321\n000322\n000323\n000324\n000325\n000326\n000327\n000328\n000329\n000330\n000331\n000332\n000333\n000334\n000335\n000336\n000337\n000338\n000339\n000340\n000341\n000342\n000343\n000344\n000345\n000346\n000347\n000348\n000349\n000350\n000351\n000352\n000353\n000354\n000355\n000356\n000357\n000358\n000359\n000360\n000361\n000362\n000363\n000364\n000365\n000366\n000367\n000368\n000369\n000370\n000371\n000372\n000373\n000374\n000375\n000376\n000377\n000378\n000379\n000380\n000381\n000382\n000383\n000384\n000385\n000386\n000387\n000388\n000389\n000390\n000391\n000392\n000393\n000394\n000395\n000396\n000397\n000398\n000399\n000400\n000401\n000402\n000403\n000404\n000405\n000406\n000407\n000408\n000409\n000410\n000411\n000412\n000413\n000414\n000415\n000416\n000417\n000418\n000419\n000420\n000421\n000422\n000423\n000424\n000425\n000426\n000427\n000428\n000429\n000430\n000431\n000432\n000433\n000434\n000435\n000436\n000437\n000438\n000439\n000440\n000441\n000442\n000443\n000444\n000445\n000446\n000447\n000448\n000449\n000450\n000451\n000452\n000453\n000454\n000455\n000456\n000457\n000458\n000459\n000460\n000461\n000462\n000463\n000464\n000465\n000466\n000467\n000468\n000469\n000470\n000471\n000472\n000473\n000474\n000475\n000476\n000477\n000478\n000479\n000480\n000481\n000482\n000483\n000484\n000485\n000486\n000487\n000488\n000489\n000490\n000491\n000492\n000493\n000494\n000495\n000496\n000497\n000498\n000499\n000500\n000501\n000502\n000503\n000504\n000505\n000506\n000507\n000508\n000509\n000510\n000511\n000512\n000513\n000514\n000515\n000516\n000517\n000518\n000519\n000520\n000521\n000522\n000523\n000524\n000525\n000526\n000527\n000528\n000529\n000530\n000531\n000532\n000533\n000534\n000535\n000536\n000537\n000538\n000539\n000540\n000541\n000542\n000543\n000544\n000545\n000546\n000547\n000548\n000549\n000550\n000551\n000552\n000553\n000554\n000555\n000556\n000557\n000558\n000559\n000560\n000561\n000562\n000563\n000564\n000565\n000566\n000567\n000568\n000569\n000570\n000571\n000572\n000573\n000574\n000575\n000576\n000577\n000578\n000579\n000580\n000581\n000582\n000583\n000584\n000585\n000586\n000587\n000588\n000589\n000590\n000591\n000592\n000593\n000594\n000595\n000596\n000597\n000598\n000599\n000600\n000601\n000602\n000603\n000604\n000605\n000606\n000607\n000608\n000609\n000610\n000611\n000612\n000613\n000614\n000615\n000616\n000617\n000618\n000619\n000620\n000621\n000622\n000623\n000624\n000625\n000626\n000627\n000628\n000629\n000630\n000631\n000632\n000633\n000634\n000635\n000636\n000637\n000638\n000639\n000640\n000641\n000642\n000643\n000644\n000645\n000646\n000647\n000648\n000649\n000650\n000651\n000652\n000653\n000654\n000655\n000656\n000657\n000658\n000659\n000660\n000661\n000662\n000663\n000664\n000665\n000666\n000667\n000668\n000669\n000670\n000671\n000672\n000673\n000674\n000675\n000676\n000677\n000678\n000679\n000680\n000681\n000682\n000683\n000684\n000685\n000686\n000687\n000688\n000689\n000690\n000691\n000692\n000693\n000694\n000695\n000696\n000697\n000698\n000699\n000700\n000701\n000702\n000703\n000704\n000705\n000706\n000707\n000708\n000709\n000710\n000711\n000712\n000713\n000714\n000715\n000716\n000717\n000718\n000719\n000720\n000721\n000722\n000723\n000724\n000725\n000726\n000727\n000728\n000729\n000730\n000731\n000732\n000733\n000734\n000735\n000736\n000737\n000738\n000739\n000740\n000741\n000742\n000743\n000744\n000745\n000746\n000747\n000748\n000749\n000750\n000751\n000752\n000753\n000754\n000755\n000756\n000757\n000758\n000759\n000760\n000761\n000762\n000763\n000764\n000765\n000766\n000767\n000768\n000769\n000770\n000771\n000772\n000773\n000774\n000775\n000776\n000777\n000778\n000779\n000780\n000781\n000782\n000783\n000784\n000785\n000786\n000787\n000788\n000789\n000790\n000791\n000792\n000793\n000794\n000795\n000796\n000797\n000798\n000799\n000800\n000801\n000802\n000803\n000804\n000805\n000806\n000807\n000808\n000809\n000810\n000811\n000812\n000813\n000814\n000815\n000816\n000817\n000818\n000819\n000820\n000821\n000822\n000823\n000824\n000825\n000826\n000827\n000828\n000829\n000830\n000831\n000832\n000833\n000834\n000835\n000836\n000837\n000838\n000839\n000840\n000841\n000842\n000843\n000844\n000845\n000846\n000847\n000848\n000849\n000850\n000851\n000852\n000853\n000854\n000855\n000856\n000857\n000858\n000859\n000860\n000861\n000862\n000863\n000864\n000865\n000866\n000867\n000868\n000869\n000870\n000871\n000872\n000873\n000874\n000875\n000876\n000877\n000878\n000879\n000880\n000881\n000882\n000883\n000884\n000885\n000886\n000887\n000888\n000889\n000890\n000891\n000892\n000893\n000894\n000895\n000896\n000897\n000898\n000899\n000900\n000901\n000902\n000903\n000904\n000905\n000906\n000907\n000908\n000909\n000910\n000911\n000912\n000913\n000914\n000915\n000916\n000917\n000918\n000919\n000920\n000921\n000922\n000923\n000924\n000925\n000926\n000927\n000928\n000929\n000930\n000931\n000932\n000933\n000934\n000935\n000936\n000937\n000938\n000939\n000940\n000941\n000942\n000943\n000944\n000945\n000946\n000947\n000948\n000949\n000950\n000951\n000952\n000953\n000954\n000955\n000956\n000957\n000958\n000959\n000960\n000961\n000962\n000963\n000964\n000965\n000966\n000967\n000968\n000969\n000970\n000971\n000972\n000973\n000974\n000975\n000976\n000977\n000978\n000979\n000980\n000981\n000982\n000983\n000984\n000985\n000986\n000987\n000988\n000989\n000990\n000991\n000992\n000993\n000994\n000995\n000996\n000997\n000998\n000999\n001000\n001001\n001002\n001003\n001004\n001005\n001006\n001007\n001008\n001009\n001010\n001011\n001012\n001013\n001014\n001015\n001016\n001017\n001018\n001019\n001020\n001021\n001022\n001023\n001024\n001025\n001026\n001027\n001028\n001029\n001030\n001031\n001032\n001033\n001034\n001035\n001036\n001037\n001038\n001039\n001040\n001041\n001042\n001043\n001044\n001045\n001046\n001047\n001048\n001049\n001050\n001051\n001052\n001053\n001054\n001055\n001056\n001057\n001058\n001059\n001060\n001061\n001062\n001063\n001064\n001065\n001066\n001067\n001068\n001069\n001070\n001071\n001072\n001073\n001074\n001075\n001076\n001077\n001078\n001079\n001080\n001081\n001082\n001083\n001084\n001085\n001086\n001087\n001088\n001089\n001090\n001091\n001092\n001093\n001094\n001095\n001096\n001097\n001098\n001099\n001100\n001101\n001102\n001103\n001104\n001105\n001106\n001107\n001108\n001109\n001110\n001111\n001112\n001113\n001114\n001115\n001116\n001117\n001118\n001119\n001120\n001121\n001122\n001123\n001124\n001125\n001126\n001127\n001128\n001129\n001130\n001131\n001132\n001133\n001134\n001135\n001136\n001137\n001138\n001139\n001140\n001141\n001142\n001143\n001144\n001145\n001146\n001147\n001148\n001149\n001150\n001151\n001152\n001153\n001154\n001155\n001156\n001157\n001158\n001159\n001160\n001161\n001162\n001163\n001164\n001165\n001166\n001167\n001168\n001169\n001170\n001171\n001172\n001173\n001174\n001175\n001176\n001177\n001178\n001179\n001180\n001181\n001182\n001183\n001184\n001185\n001186\n001187\n001188\n001189\n001190\n001191\n001192\n001193\n001194\n001195\n001196\n001197\n001198\n001199\n001200\n001201\n001202\n001203\n001204\n001205\n001206\n001207\n001208\n001209\n001210\n001211\n001212\n001213\n001214\n001215\n001216\n001217\n001218\n001219\n001220\n001221\n001222\n001223\n001224\n001225\n001226\n001227\n001228\n001229\n001230\n001231\n001232\n001233\n001234\n001235\n001236\n001237\n001238\n001239\n001240\n001241\n001242\n001243\n001244\n001245\n001246\n001247\n001248\n001249\n001250\n001251\n001252\n001253\n001254\n001255\n001256\n001257\n001258\n001259\n001260\n001261\n001262\n001263\n001264\n001265\n001266\n001267\n001268\n001269\n001270\n001271\n001272\n001273\n001274\n001275\n001276\n001277\n001278\n001279\n001280\n001281\n001282\n001283\n001284\n001285\n001286\n001287\n001288\n001289\n001290\n001291\n001292\n001293\n001294\n001295\n001296\n001297\n001298\n001299\n001300\n001301\n001302\n001303\n001304\n001305\n001306\n001307\n001308\n001309\n001310\n001311\n001312\n001313\n001314\n001315\n001316\n001317\n001318\n001319\n001320\n001321\n001322\n001323\n001324\n001325\n001326\n001327\n001328\n001329\n001330\n001331\n001332\n001333\n001334\n001335\n001336\n001337\n001338\n001339\n001340\n001341\n001342\n001343\n001344\n001345\n001346\n001347\n001348\n001349\n001350\n001351\n001352\n001353\n001354\n001355\n001356\n001357\n001358\n001359\n001360\n001361\n001362\n001363\n001364\n001365\n001366\n001367\n001368\n001369\n001370\n001371\n001372\n001373\n001374\n001375\n001376\n001377\n001378\n001379\n001380\n001381\n001382\n001383\n001384\n001385\n001386\n001387\n001388\n001389\n001390\n001391\n001392\n001393\n001394\n001395\n001396\n001397\n001398\n001399\n001400\n001401\n001402\n001403\n001404\n001405\n001406\n001407\n001408\n001409\n001410\n001411\n001412\n001413\n001414\n001415\n001416\n001417\n001418\n001419\n001420\n001421\n001422\n001423\n001424\n001425\n001426\n001427\n001428\n001429\n001430\n001431\n001432\n001433\n001434\n001435\n001436\n001437\n001438\n001439\n001440\n001441\n001442\n001443\n001444\n001445\n001446\n001447\n001448\n001449\n001450\n001451\n001452\n001453\n001454\n001455\n001456\n001457\n001458\n001459\n001460\n001461\n001462\n001463\n001464\n001465\n001466\n001467\n001468\n001469\n001470\n001471\n001472\n001473\n001474\n001475\n001476\n001477\n001478\n001479\n001480\n001481\n001482\n001483\n001484\n001485\n001486\n001487\n001488\n001489\n001490\n001491\n001492\n001493\n001494\n001495\n001496\n001497\n001498\n001499\n001500\n001501\n001502\n001503\n001504\n001505\n001506\n001507\n001508\n001509\n001510\n001511\n001512\n001513\n001514\n001515\n001516\n001517\n001518\n001519\n001520\n001521\n001522\n001523\n001524\n001525\n001526\n001527\n001528\n001529\n001530\n001531\n001532\n001533\n001534\n001535\n001536\n001537\n001538\n001539\n001540\n001541\n001542\n001543\n001544\n001545\n001546\n001547\n001548\n001549\n001550\n001551\n001552\n001553\n001554\n001555\n001556\n001557\n001558\n001559\n001560\n001561\n001562\n001563\n001564\n001565\n001566\n001567\n001568\n001569\n001570\n001571\n001572\n001573\n001574\n001575\n001576\n001577\n001578\n001579\n001580\n001581\n001582\n001583\n001584\n001585\n001586\n001587\n001588\n001589\n001590\n001591\n001592\n001593\n001594\n001595\n001596\n001597\n001598\n001599\n001600\n001601\n001602\n001603\n001604\n001605\n001606\n001607\n001608\n001609\n001610\n001611\n001612\n001613\n001614\n001615\n001616\n001617\n001618\n001619\n001620\n001621\n001622\n001623\n001624\n001625\n001626\n001627\n001628\n001629\n001630\n001631\n001632\n001633\n001634\n001635\n001636\n001637\n001638\n001639\n001640\n001641\n001642\n001643\n001644\n001645\n001646\n001647\n001648\n001649\n001650\n001651\n001652\n001653\n001654\n001655\n001656\n001657\n001658\n001659\n001660\n001661\n001662\n001663\n001664\n001665\n001666\n001667\n001668\n001669\n001670\n001671\n001672\n001673\n001674\n001675\n001676\n001677\n001678\n001679\n001680\n001681\n001682\n001683\n001684\n001685\n001686\n001687\n001688\n001689\n001690\n001691\n001692\n001693\n001694\n001695\n001696\n001697\n001698\n001699\n001700\n001701\n001702\n001703\n001704\n001705\n001706\n001707\n001708\n001709\n001710\n001711\n001712\n001713\n001714\n001715\n001716\n001717\n001718\n001719\n001720\n001721\n001722\n001723\n001724\n001725\n001726\n001727\n001728\n001729\n001730\n001731\n001732\n001733\n001734\n001735\n001736\n001737\n001738\n001739\n001740\n001741\n001742\n001743\n001744\n001745\n001746\n001747\n001748\n001749\n001750\n001751\n001752\n001753\n001754\n001755\n001756\n001757\n001758\n001759\n001760\n001761\n001762\n001763\n001764\n001765\n001766\n001767\n001768\n001769\n001770\n001771\n001772\n001773\n001774\n001775\n001776\n001777\n001778\n001779\n001780\n001781\n001782\n001783\n001784\n001785\n001786\n001787\n001788\n001789\n001790\n001791\n001792\n001793\n001794\n001795\n001796\n001797\n001798\n001799\n001800\n001801\n001802\n001803\n001804\n001805\n001806\n001807\n001808\n001809\n001810\n001811\n001812\n001813\n001814\n001815\n001816\n001817\n001818\n001819\n001820\n001821\n001822\n001823\n001824\n001825\n001826\n001827\n001828\n001829\n001830\n001831\n001832\n001833\n001834\n001835\n001836\n001837\n001838\n001839\n001840\n001841\n001842\n001843\n001844\n001845\n001846\n001847\n001848\n001849\n001850\n001851\n001852\n001853\n001854\n001855\n001856\n001857\n001858\n001859\n001860\n001861\n001862\n001863\n001864\n001865\n001866\n001867\n001868\n001869\n001870\n001871\n001872\n001873\n001874\n001875\n001876\n001877\n001878\n001879\n001880\n001881\n001882\n001883\n001884\n001885\n001886\n001887\n001888\n001889\n001890\n001891\n001892\n001893\n001894\n001895\n001896\n001897\n001898\n001899\n001900\n001901\n001902\n001903\n001904\n001905\n001906\n001907\n001908\n001909\n001910\n001911\n001912\n001913\n001914\n001915\n001916\n001917\n001918\n001919\n001920\n001921\n001922\n001923\n001924\n001925\n001926\n001927\n001928\n001929\n001930\n001931\n001932\n001933\n001934\n001935\n001936\n001937\n001938\n001939\n001940\n001941\n001942\n001943\n001944\n001945\n001946\n001947\n001948\n001949\n001950\n001951\n001952\n001953\n001954\n001955\n001956\n001957\n001958\n001959\n001960\n001961\n001962\n001963\n001964\n001965\n001966\n001967\n001968\n001969\n001970\n001971\n001972\n001973\n001974\n001975\n001976\n001977\n001978\n001979\n001980\n001981\n001982\n001983\n001984\n001985\n001986\n001987\n001988\n001989\n001990\n001991\n001992\n001993\n001994\n001995\n001996\n001997\n001998\n001999\n002000\n002001\n002002\n002003\n002004\n002005\n002006\n002007\n002008\n002009\n002010\n002011\n002012\n002013\n002014\n002015\n002016\n002017\n002018\n002019\n002020\n002021\n002022\n002023\n002024\n002025\n002026\n002027\n002028\n002029\n002030\n002031\n002032\n002033\n002034\n002035\n002036\n002037\n002038\n002039\n002040\n002041\n002042\n002043\n002044\n002045\n002046\n002047\n002048\n002049\n002050\n002051\n002052\n002053\n002054\n002055\n002056\n002057\n002058\n002059\n002060\n002061\n002062\n002063\n002064\n002065\n002066\n002067\n002068\n002069\n002070\n002071\n002072\n002073\n002074\n002075\n002076\n002077\n002078\n002079\n002080\n002081\n002082\n002083\n002084\n002085\n002086\n002087\n002088\n002089\n002090\n002091\n002092\n002093\n002094\n002095\n002096\n002097\n002098\n002099\n002100\n002101\n002102\n002103\n002104\n002105\n002106\n002107\n002108\n002109\n002110\n002111\n002112\n002113\n002114\n002115\n002116\n002117\n002118\n002119\n002120\n002121\n002122\n002123\n002124\n002125\n002126\n002127\n002128\n002129\n002130\n002131\n002132\n002133\n002134\n002135\n002136\n002137\n002138\n002139\n002140\n002141\n002142\n002143\n002144\n002145\n002146\n002147\n002148\n002149\n002150\n002151\n002152\n002153\n002154\n002155\n002156\n002157\n002158\n002159\n002160\n002161\n002162\n002163\n002164\n002165\n002166\n002167\n002168\n002169\n002170\n002171\n002172\n002173\n002174\n002175\n002176\n002177\n002178\n002179\n002180\n002181\n002182\n002183\n002184\n002185\n002186\n002187\n002188\n002189\n002190\n002191\n002192\n002193\n002194\n002195\n002196\n002197\n002198\n002199\n002200\n002201\n002202\n002203\n002204\n002205\n002206\n002207\n002208\n002209\n002210\n002211\n002212\n002213\n002214\n002215\n002216\n002217\n002218\n002219\n002220\n002221\n002222\n002223\n002224\n002225\n002226\n002227\n002228\n002229\n002230\n002231\n002232\n002233\n002234\n002235\n002236\n002237\n002238\n002239\n002240\n002241\n002242\n002243\n002244\n002245\n002246\n002247\n002248\n002249\n002250\n002251\n002252\n002253\n002254\n002255\n002256\n002257\n002258\n002259\n002260\n002261\n002262\n002263\n002264\n002265\n002266\n002267\n002268\n002269\n002270\n002271\n002272\n002273\n002274\n002275\n002276\n002277\n002278\n002279\n002280\n002281\n002282\n002283\n002284\n002285\n002286\n002287\n002288\n002289\n002290\n002291\n002292\n002293\n002294\n002295\n002296\n002297\n002298\n002299\n002300\n002301\n002302\n002303\n002304\n002305\n002306\n002307\n002308\n002309\n002310\n002311\n002312\n002313\n002314\n002315\n002316\n002317\n002318\n002319\n002320\n002321\n002322\n002323\n002324\n002325\n002326\n002327\n002328\n002329\n002330\n002331\n002332\n002333\n002334\n002335\n002336\n002337\n002338\n002339\n002340\n002341\n002342\n002343\n002344\n002345\n002346\n002347\n002348\n002349\n002350\n002351\n002352\n002353\n002354\n002355\n002356\n002357\n002358\n002359\n002360\n002361\n002362\n002363\n002364\n002365\n002366\n002367\n002368\n002369\n002370\n002371\n002372\n002373\n002374\n002375\n002376\n002377\n002378\n002379\n002380\n002381\n002382\n002383\n002384\n002385\n002386\n002387\n002388\n002389\n002390\n002391\n002392\n002393\n002394\n002395\n002396\n002397\n002398\n002399\n002400\n002401\n002402\n002403\n002404\n002405\n002406\n002407\n002408\n002409\n002410\n002411\n002412\n002413\n002414\n002415\n002416\n002417\n002418\n002419\n002420\n002421\n002422\n002423\n002424\n002425\n002426\n002427\n002428\n002429\n002430\n002431\n002432\n002433\n002434\n002435\n002436\n002437\n002438\n002439\n002440\n002441\n002442\n002443\n002444\n002445\n002446\n002447\n002448\n002449\n002450\n002451\n002452\n002453\n002454\n002455\n002456\n002457\n002458\n002459\n002460\n002461\n002462\n002463\n002464\n002465\n002466\n002467\n002468\n002469\n002470\n002471\n002472\n002473\n002474\n002475\n002476\n002477\n002478\n002479\n002480\n002481\n002482\n002483\n002484\n002485\n002486\n002487\n002488\n002489\n002490\n002491\n002492\n002493\n002494\n002495\n002496\n002497\n002498\n002499\n002500\n002501\n002502\n002503\n002504\n002505\n002506\n002507\n002508\n002509\n002510\n002511\n002512\n002513\n002514\n002515\n002516\n002517\n002518\n002519\n002520\n002521\n002522\n002523\n002524\n002525\n002526\n002527\n002528\n002529\n002530\n002531\n002532\n002533\n002534\n002535\n002536\n002537\n002538\n002539\n002540\n002541\n002542\n002543\n002544\n002545\n002546\n002547\n002548\n002549\n002550\n002551\n002552\n002553\n002554\n002555\n002556\n002557\n002558\n002559\n002560\n002561\n002562\n002563\n002564\n002565\n002566\n002567\n002568\n002569\n002570\n002571\n002572\n002573\n002574\n002575\n002576\n002577\n002578\n002579\n002580\n002581\n002582\n002583\n002584\n002585\n002586\n002587\n002588\n002589\n002590\n002591\n002592\n002593\n002594\n002595\n002596\n002597\n002598\n002599\n002600\n002601\n002602\n002603\n002604\n002605\n002606\n002607\n002608\n002609\n002610\n002611\n002612\n002613\n002614\n002615\n002616\n002617\n002618\n002619\n002620\n002621\n002622\n002623\n002624\n002625\n002626\n002627\n002628\n002629\n002630\n002631\n002632\n002633\n002634\n002635\n002636\n002637\n002638\n002639\n002640\n002641\n002642\n002643\n002644\n002645\n002646\n002647\n002648\n002649\n002650\n002651\n002652\n002653\n002654\n002655\n002656\n002657\n002658\n002659\n002660\n002661\n002662\n002663\n002664\n002665\n002666\n002667\n002668\n002669\n002670\n002671\n002672\n002673\n002674\n002675\n002676\n002677\n002678\n002679\n002680\n002681\n002682\n002683\n002684\n002685\n002686\n002687\n002688\n002689\n002690\n002691\n002692\n002693\n002694\n002695\n002696\n002697\n002698\n002699\n002700\n002701\n002702\n002703\n002704\n002705\n002706\n002707\n002708\n002709\n002710\n002711\n002712\n002713\n002714\n002715\n002716\n002717\n002718\n002719\n002720\n002721\n002722\n002723\n002724\n002725\n002726\n002727\n002728\n002729\n002730\n002731\n002732\n002733\n002734\n002735\n002736\n002737\n002738\n002739\n002740\n002741\n002742\n002743\n002744\n002745\n002746\n002747\n002748\n002749\n002750\n002751\n002752\n002753\n002754\n002755\n002756\n002757\n002758\n002759\n002760\n002761\n002762\n002763\n002764\n002765\n002766\n002767\n002768\n002769\n002770\n002771\n002772\n002773\n002774\n002775\n002776\n002777\n002778\n002779\n002780\n002781\n002782\n002783\n002784\n002785\n002786\n002787\n002788\n002789\n002790\n002791\n002792\n002793\n002794\n002795\n002796\n002797\n002798\n002799\n002800\n002801\n002802\n002803\n002804\n002805\n002806\n002807\n002808\n002809\n002810\n002811\n002812\n002813\n002814\n002815\n002816\n002817\n002818\n002819\n002820\n002821\n002822\n002823\n002824\n002825\n002826\n002827\n002828\n002829\n002830\n002831\n002832\n002833\n002834\n002835\n002836\n002837\n002838\n002839\n002840\n002841\n002842\n002843\n002844\n002845\n002846\n002847\n002848\n002849\n002850\n002851\n002852\n002853\n002854\n002855\n002856\n002857\n002858\n002859\n002860\n002861\n002862\n002863\n002864\n002865\n002866\n002867\n002868\n002869\n002870\n002871\n002872\n002873\n002874\n002875\n002876\n002877\n002878\n002879\n002880\n002881\n002882\n002883\n002884\n002885\n002886\n002887\n002888\n002889\n002890\n002891\n002892\n002893\n002894\n002895\n002896\n002897\n002898\n002899\n002900\n002901\n002902\n002903\n002904\n002905\n002906\n002907\n002908\n002909\n002910\n002911\n002912\n002913\n002914\n002915\n002916\n002917\n002918\n002919\n002920\n002921\n002922\n002923\n002924\n002925\n002926\n002927\n002928\n002929\n002930\n002931\n002932\n002933\n002934\n002935\n002936\n002937\n002938\n002939\n002940\n002941\n002942\n002943\n002944\n002945\n002946\n002947\n002948\n002949\n002950\n002951\n002952\n002953\n002954\n002955\n002956\n002957\n002958\n002959\n002960\n002961\n002962\n002963\n002964\n002965\n002966\n002967\n002968\n002969\n002970\n002971\n002972\n002973\n002974\n002975\n002976\n002977\n002978\n002979\n002980\n002981\n002982\n002983\n002984\n002985\n002986\n002987\n002988\n002989\n002990\n002991\n002992\n002993\n002994\n002995\n002996\n002997\n002998\n002999\n003000\n003001\n003002\n003003\n003004\n003005\n003006\n003007\n003008\n003009\n003010\n003011\n003012\n003013\n003014\n003015\n003016\n003017\n003018\n003019\n003020\n003021\n003022\n003023\n003024\n003025\n003026\n003027\n003028\n003029\n003030\n003031\n003032\n003033\n003034\n003035\n003036\n003037\n003038\n003039\n003040\n003041\n003042\n003043\n003044\n003045\n003046\n003047\n003048\n003049\n003050\n003051\n003052\n003053\n003054\n003055\n003056\n003057\n003058\n003059\n003060\n003061\n003062\n003063\n003064\n003065\n003066\n003067\n003068\n003069\n003070\n003071\n003072\n003073\n003074\n003075\n003076\n003077\n003078\n003079\n003080\n003081\n003082\n003083\n003084\n003085\n003086\n003087\n003088\n003089\n003090\n003091\n003092\n003093\n003094\n003095\n003096\n003097\n003098\n003099\n003100\n003101\n003102\n003103\n003104\n003105\n003106\n003107\n003108\n003109\n003110\n003111\n003112\n003113\n003114\n003115\n003116\n003117\n003118\n003119\n003120\n003121\n003122\n003123\n003124\n003125\n003126\n003127\n003128\n003129\n003130\n003131\n003132\n003133\n003134\n003135\n003136\n003137\n003138\n003139\n003140\n003141\n003142\n003143\n003144\n003145\n003146\n003147\n003148\n003149\n003150\n003151\n003152\n003153\n003154\n003155\n003156\n003157\n003158\n003159\n003160\n003161\n003162\n003163\n003164\n003165\n003166\n003167\n003168\n003169\n003170\n003171\n003172\n003173\n003174\n003175\n003176\n003177\n003178\n003179\n003180\n003181\n003182\n003183\n003184\n003185\n003186\n003187\n003188\n003189\n003190\n003191\n003192\n003193\n003194\n003195\n003196\n003197\n003198\n003199\n003200\n003201\n003202\n003203\n003204\n003205\n003206\n003207\n003208\n003209\n003210\n003211\n003212\n003213\n003214\n003215\n003216\n003217\n003218\n003219\n003220\n003221\n003222\n003223\n003224\n003225\n003226\n003227\n003228\n003229\n003230\n003231\n003232\n003233\n003234\n003235\n003236\n003237\n003238\n003239\n003240\n003241\n003242\n003243\n003244\n003245\n003246\n003247\n003248\n003249\n003250\n003251\n003252\n003253\n003254\n003255\n003256\n003257\n003258\n003259\n003260\n003261\n003262\n003263\n003264\n003265\n003266\n003267\n003268\n003269\n003270\n003271\n003272\n003273\n003274\n003275\n003276\n003277\n003278\n003279\n003280\n003281\n003282\n003283\n003284\n003285\n003286\n003287\n003288\n003289\n003290\n003291\n003292\n003293\n003294\n003295\n003296\n003297\n003298\n003299\n003300\n003301\n003302\n003303\n003304\n003305\n003306\n003307\n003308\n003309\n003310\n003311\n003312\n003313\n003314\n003315\n003316\n003317\n003318\n003319\n003320\n003321\n003322\n003323\n003324\n003325\n003326\n003327\n003328\n003329\n003330\n003331\n003332\n003333\n003334\n003335\n003336\n003337\n003338\n003339\n003340\n003341\n003342\n003343\n003344\n003345\n003346\n003347\n003348\n003349\n003350\n003351\n003352\n003353\n003354\n003355\n003356\n003357\n003358\n003359\n003360\n003361\n003362\n003363\n003364\n003365\n003366\n003367\n003368\n003369\n003370\n003371\n003372\n003373\n003374\n003375\n003376\n003377\n003378\n003379\n003380\n003381\n003382\n003383\n003384\n003385\n003386\n003387\n003388\n003389\n003390\n003391\n003392\n003393\n003394\n003395\n003396\n003397\n003398\n003399\n003400\n003401\n003402\n003403\n003404\n003405\n003406\n003407\n003408\n003409\n003410\n003411\n003412\n003413\n003414\n003415\n003416\n003417\n003418\n003419\n003420\n003421\n003422\n003423\n003424\n003425\n003426\n003427\n003428\n003429\n003430\n003431\n003432\n003433\n003434\n003435\n003436\n003437\n003438\n003439\n003440\n003441\n003442\n003443\n003444\n003445\n003446\n003447\n003448\n003449\n003450\n003451\n003452\n003453\n003454\n003455\n003456\n003457\n003458\n003459\n003460\n003461\n003462\n003463\n003464\n003465\n003466\n003467\n003468\n003469\n003470\n003471\n003472\n003473\n003474\n003475\n003476\n003477\n003478\n003479\n003480\n003481\n003482\n003483\n003484\n003485\n003486\n003487\n003488\n003489\n003490\n003491\n003492\n003493\n003494\n003495\n003496\n003497\n003498\n003499\n003500\n003501\n003502\n003503\n003504\n003505\n003506\n003507\n003508\n003509\n003510\n003511\n003512\n003513\n003514\n003515\n003516\n003517\n003518\n003519\n003520\n003521\n003522\n003523\n003524\n003525\n003526\n003527\n003528\n003529\n003530\n003531\n003532\n003533\n003534\n003535\n003536\n003537\n003538\n003539\n003540\n003541\n003542\n003543\n003544\n003545\n003546\n003547\n003548\n003549\n003550\n003551\n003552\n003553\n003554\n003555\n003556\n003557\n003558\n003559\n003560\n003561\n003562\n003563\n003564\n003565\n003566\n003567\n003568\n003569\n003570\n003571\n003572\n003573\n003574\n003575\n003576\n003577\n003578\n003579\n003580\n003581\n003582\n003583\n003584\n003585\n003586\n003587\n003588\n003589\n003590\n003591\n003592\n003593\n003594\n003595\n003596\n003597\n003598\n003599\n003600\n003601\n003602\n003603\n003604\n003605\n003606\n003607\n003608\n003609\n003610\n003611\n003612\n003613\n003614\n003615\n003616\n003617\n003618\n003619\n003620\n003621\n003622\n003623\n003624\n003625\n003626\n003627\n003628\n003629\n003630\n003631\n003632\n003633\n003634\n003635\n003636\n003637\n003638\n003639\n003640\n003641\n003642\n003643\n003644\n003645\n003646\n003647\n003648\n003649\n003650\n003651\n003652\n003653\n003654\n003655\n003656\n003657\n003658\n003659\n003660\n003661\n003662\n003663\n003664\n003665\n003666\n003667\n003668\n003669\n003670\n003671\n003672\n003673\n003674\n003675\n003676\n003677\n003678\n003679\n003680\n003681\n003682\n003683\n003684\n003685\n003686\n003687\n003688\n003689\n003690\n003691\n003692\n003693\n003694\n003695\n003696\n003697\n003698\n003699\n003700\n003701\n003702\n003703\n003704\n003705\n003706\n003707\n003708\n003709\n003710\n003711\n003712\n003713\n003714\n003715\n003716\n003717\n003718\n003719\n003720\n003721\n003722\n003723\n003724\n003725\n003726\n003727\n003728\n003729\n003730\n003731\n003732\n003733\n003734\n003735\n003736\n003737\n003738\n003739\n003740\n003741\n003742\n003743\n003744\n003745\n003746\n003747\n003748\n003749\n003750\n003751\n003752\n003753\n003754\n003755\n003756\n003757\n003758\n003759\n003760\n003761\n003762\n003763\n003764\n003765\n003766\n003767\n003768\n003769\n003770\n003771\n003772\n003773\n003774\n003775\n003776\n003777\n003778\n003779\n003780\n003781\n003782\n003783\n003784\n003785\n003786\n003787\n003788\n003789\n003790\n003791\n003792\n003793\n003794\n003795\n003796\n003797\n003798\n003799\n003800\n003801\n003802\n003803\n003804\n003805\n003806\n003807\n003808\n003809\n003810\n003811\n003812\n003813\n003814\n003815\n003816\n003817\n003818\n003819\n003820\n003821\n003822\n003823\n003824\n003825\n003826\n003827\n003828\n003829\n003830\n003831\n003832\n003833\n003834\n003835\n003836\n003837\n003838\n003839\n003840\n003841\n003842\n003843\n003844\n003845\n003846\n003847\n003848\n003849\n003850\n003851\n003852\n003853\n003854\n003855\n003856\n003857\n003858\n003859\n003860\n003861\n003862\n003863\n003864\n003865\n003866\n003867\n003868\n003869\n003870\n003871\n003872\n003873\n003874\n003875\n003876\n003877\n003878\n003879\n003880\n003881\n003882\n003883\n003884\n003885\n003886\n003887\n003888\n003889\n003890\n003891\n003892\n003893\n003894\n003895\n003896\n003897\n003898\n003899\n003900\n003901\n003902\n003903\n003904\n003905\n003906\n003907\n003908\n003909\n003910\n003911\n003912\n003913\n003914\n003915\n003916\n003917\n003918\n003919\n003920\n003921\n003922\n003923\n003924\n003925\n003926\n003927\n003928\n003929\n003930\n003931\n003932\n003933\n003934\n003935\n003936\n003937\n003938\n003939\n003940\n003941\n003942\n003943\n003944\n003945\n003946\n003947\n003948\n003949\n003950\n003951\n003952\n003953\n003954\n003955\n003956\n003957\n003958\n003959\n003960\n003961\n003962\n003963\n003964\n003965\n003966\n003967\n003968\n003969\n003970\n003971\n003972\n003973\n003974\n003975\n003976\n003977\n003978\n003979\n003980\n003981\n003982\n003983\n003984\n003985\n003986\n003987\n003988\n003989\n003990\n003991\n003992\n003993\n003994\n003995\n003996\n003997\n003998\n003999\n004000\n004001\n004002\n004003\n004004\n004005\n004006\n004007\n004008\n004009\n004010\n004011\n004012\n004013\n004014\n004015\n004016\n004017\n004018\n004019\n004020\n004021\n004022\n004023\n004024\n004025\n004026\n004027\n004028\n004029\n004030\n004031\n004032\n004033\n004034\n004035\n004036\n004037\n004038\n004039\n004040\n004041\n004042\n004043\n004044\n004045\n004046\n004047\n004048\n004049\n004050\n004051\n004052\n004053\n004054\n004055\n004056\n004057\n004058\n004059\n004060\n004061\n004062\n004063\n004064\n004065\n004066\n004067\n004068\n004069\n004070\n004071\n004072\n004073\n004074\n004075\n004076\n004077\n004078\n004079\n004080\n004081\n004082\n004083\n004084\n004085\n004086\n004087\n004088\n004089\n004090\n004091\n004092\n004093\n004094\n004095\n004096\n004097\n004098\n004099\n004100\n004101\n004102\n004103\n004104\n004105\n004106\n004107\n004108\n004109\n004110\n004111\n004112\n004113\n004114\n004115\n004116\n004117\n004118\n004119\n004120\n004121\n004122\n004123\n004124\n004125\n004126\n004127\n004128\n004129\n004130\n004131\n004132\n004133\n004134\n004135\n004136\n004137\n004138\n004139\n004140\n004141\n004142\n004143\n004144\n004145\n004146\n004147\n004148\n004149\n004150\n004151\n004152\n004153\n004154\n004155\n004156\n004157\n004158\n004159\n004160\n004161\n004162\n004163\n004164\n004165\n004166\n004167\n004168\n004169\n004170\n004171\n004172\n004173\n004174\n004175\n004176\n004177\n004178\n004179\n004180\n004181\n004182\n004183\n004184\n004185\n004186\n004187\n004188\n004189\n004190\n004191\n004192\n004193\n004194\n004195\n004196\n004197\n004198\n004199\n004200\n004201\n004202\n004203\n004204\n004205\n004206\n004207\n004208\n004209\n004210\n004211\n004212\n004213\n004214\n004215\n004216\n004217\n004218\n004219\n004220\n004221\n004222\n004223\n004224\n004225\n004226\n004227\n004228\n004229\n004230\n004231\n004232\n004233\n004234\n004235\n004236\n004237\n004238\n004239\n004240\n004241\n004242\n004243\n004244\n004245\n004246\n004247\n004248\n004249\n004250\n004251\n004252\n004253\n004254\n004255\n004256\n004257\n004258\n004259\n004260\n004261\n004262\n004263\n004264\n004265\n004266\n004267\n004268\n004269\n004270\n004271\n004272\n004273\n004274\n004275\n004276\n004277\n004278\n004279\n004280\n004281\n004282\n004283\n004284\n004285\n004286\n004287\n004288\n004289\n004290\n004291\n004292\n004293\n004294\n004295\n004296\n004297\n004298\n004299\n004300\n004301\n004302\n004303\n004304\n004305\n004306\n004307\n004308\n004309\n004310\n004311\n004312\n004313\n004314\n004315\n004316\n004317\n004318\n004319\n004320\n004321\n004322\n004323\n004324\n004325\n004326\n004327\n004328\n004329\n004330\n004331\n004332\n004333\n004334\n004335\n004336\n004337\n004338\n004339\n004340\n004341\n004342\n004343\n004344\n004345\n004346\n004347\n004348\n004349\n004350\n004351\n004352\n004353\n004354\n004355\n004356\n004357\n004358\n004359\n004360\n004361\n004362\n004363\n004364\n004365\n004366\n004367\n004368\n004369\n004370\n004371\n004372\n004373\n004374\n004375\n004376\n004377\n004378\n004379\n004380\n004381\n004382\n004383\n004384\n004385\n004386\n004387\n004388\n004389\n004390\n004391\n004392\n004393\n004394\n004395\n004396\n004397\n004398\n004399\n004400\n004401\n004402\n004403\n004404\n004405\n004406\n004407\n004408\n004409\n004410\n004411\n004412\n004413\n004414\n004415\n004416\n004417\n004418\n004419\n004420\n004421\n004422\n004423\n004424\n004425\n004426\n004427\n004428\n004429\n004430\n004431\n004432\n004433\n004434\n004435\n004436\n004437\n004438\n004439\n004440\n004441\n004442\n004443\n004444\n004445\n004446\n004447\n004448\n004449\n004450\n004451\n004452\n004453\n004454\n004455\n004456\n004457\n004458\n004459\n004460\n004461\n004462\n004463\n004464\n004465\n004466\n004467\n004468\n004469\n004470\n004471\n004472\n004473\n004474\n004475\n004476\n004477\n004478\n004479\n004480\n004481\n004482\n004483\n004484\n004485\n004486\n004487\n004488\n004489\n004490\n004491\n004492\n004493\n004494\n004495\n004496\n004497\n004498\n004499\n004500\n004501\n004502\n004503\n004504\n004505\n004506\n004507\n004508\n004509\n004510\n004511\n004512\n004513\n004514\n004515\n004516\n004517\n004518\n004519\n004520\n004521\n004522\n004523\n004524\n004525\n004526\n004527\n004528\n004529\n004530\n004531\n004532\n004533\n004534\n004535\n004536\n004537\n004538\n004539\n004540\n004541\n004542\n004543\n004544\n004545\n004546\n004547\n004548\n004549\n004550\n004551\n004552\n004553\n004554\n004555\n004556\n004557\n004558\n004559\n004560\n004561\n004562\n004563\n004564\n004565\n004566\n004567\n004568\n004569\n004570\n004571\n004572\n004573\n004574\n004575\n004576\n004577\n004578\n004579\n004580\n004581\n004582\n004583\n004584\n004585\n004586\n004587\n004588\n004589\n004590\n004591\n004592\n004593\n004594\n004595\n004596\n004597\n004598\n004599\n004600\n004601\n004602\n004603\n004604\n004605\n004606\n004607\n004608\n004609\n004610\n004611\n004612\n004613\n004614\n004615\n004616\n004617\n004618\n004619\n004620\n004621\n004622\n004623\n004624\n004625\n004626\n004627\n004628\n004629\n004630\n004631\n004632\n004633\n004634\n004635\n004636\n004637\n004638\n004639\n004640\n004641\n004642\n004643\n004644\n004645\n004646\n004647\n004648\n004649\n004650\n004651\n004652\n004653\n004654\n004655\n004656\n004657\n004658\n004659\n004660\n004661\n004662\n004663\n004664\n004665\n004666\n004667\n004668\n004669\n004670\n004671\n004672\n004673\n004674\n004675\n004676\n004677\n004678\n004679\n004680\n004681\n004682\n004683\n004684\n004685\n004686\n004687\n004688\n004689\n004690\n004691\n004692\n004693\n004694\n004695\n004696\n004697\n004698\n004699\n004700\n004701\n004702\n004703\n004704\n004705\n004706\n004707\n004708\n004709\n004710\n004711\n004712\n004713\n004714\n004715\n004716\n004717\n004718\n004719\n004720\n004721\n004722\n004723\n004724\n004725\n004726\n004727\n004728\n004729\n004730\n004731\n004732\n004733\n004734\n004735\n004736\n004737\n004738\n004739\n004740\n004741\n004742\n004743\n004744\n004745\n004746\n004747\n004748\n004749\n004750\n004751\n004752\n004753\n004754\n004755\n004756\n004757\n004758\n004759\n004760\n004761\n004762\n004763\n004764\n004765\n004766\n004767\n004768\n004769\n004770\n004771\n004772\n004773\n004774\n004775\n004776\n004777\n004778\n004779\n004780\n004781\n004782\n004783\n004784\n004785\n004786\n004787\n004788\n004789\n004790\n004791\n004792\n004793\n004794\n004795\n004796\n004797\n004798\n004799\n004800\n004801\n004802\n004803\n004804\n004805\n004806\n004807\n004808\n004809\n004810\n004811\n004812\n004813\n004814\n004815\n004816\n004817\n004818\n004819\n004820\n004821\n004822\n004823\n004824\n004825\n004826\n004827\n004828\n004829\n004830\n004831\n004832\n004833\n004834\n004835\n004836\n004837\n004838\n004839\n004840\n004841\n004842\n004843\n004844\n004845\n004846\n004847\n004848\n004849\n004850\n004851\n004852\n004853\n004854\n004855\n004856\n004857\n004858\n004859\n004860\n004861\n004862\n004863\n004864\n004865\n004866\n004867\n004868\n004869\n004870\n004871\n004872\n004873\n004874\n004875\n004876\n004877\n004878\n004879\n004880\n004881\n004882\n004883\n004884\n004885\n004886\n004887\n004888\n004889\n004890\n004891\n004892\n004893\n004894\n004895\n004896\n004897\n004898\n004899\n004900\n004901\n004902\n004903\n004904\n004905\n004906\n004907\n004908\n004909\n004910\n004911\n004912\n004913\n004914\n004915\n004916\n004917\n004918\n004919\n004920\n004921\n004922\n004923\n004924\n004925\n004926\n004927\n004928\n004929\n004930\n004931\n004932\n004933\n004934\n004935\n004936\n004937\n004938\n004939\n004940\n004941\n004942\n004943\n004944\n004945\n004946\n004947\n004948\n004949\n004950\n004951\n004952\n004953\n004954\n004955\n004956\n004957\n004958\n004959\n004960\n004961\n004962\n004963\n004964\n004965\n004966\n004967\n004968\n004969\n004970\n004971\n004972\n004973\n004974\n004975\n004976\n004977\n004978\n004979\n004980\n004981\n004982\n004983\n004984\n004985\n004986\n004987\n004988\n004989\n004990\n004991\n004992\n004993\n004994\n004995\n004996\n004997\n004998\n004999\n005000\n005001\n005002\n005003\n005004\n005005\n005006\n005007\n005008\n005009\n005010\n005011\n005012\n005013\n005014\n005015\n005016\n005017\n005018\n005019\n005020\n005021\n005022\n005023\n005024\n005025\n005026\n005027\n005028\n005029\n005030\n005031\n005032\n005033\n005034\n005035\n005036\n005037\n005038\n005039\n005040\n005041\n005042\n005043\n005044\n005045\n005046\n005047\n005048\n005049\n005050\n005051\n005052\n005053\n005054\n005055\n005056\n005057\n005058\n005059\n005060\n005061\n005062\n005063\n005064\n005065\n005066\n005067\n005068\n005069\n005070\n005071\n005072\n005073\n005074\n005075\n005076\n005077\n005078\n005079\n005080\n005081\n005082\n005083\n005084\n005085\n005086\n005087\n005088\n005089\n005090\n005091\n005092\n005093\n005094\n005095\n005096\n005097\n005098\n005099\n005100\n005101\n005102\n005103\n005104\n005105\n005106\n005107\n005108\n005109\n005110\n005111\n005112\n005113\n005114\n005115\n005116\n005117\n005118\n005119\n005120\n005121\n005122\n005123\n005124\n005125\n005126\n005127\n005128\n005129\n005130\n005131\n005132\n005133\n005134\n005135\n005136\n005137\n005138\n005139\n005140\n005141\n005142\n005143\n005144\n005145\n005146\n005147\n005148\n005149\n005150\n005151\n005152\n005153\n005154\n005155\n005156\n005157\n005158\n005159\n005160\n005161\n005162\n005163\n005164\n005165\n005166\n005167\n005168\n005169\n005170\n005171\n005172\n005173\n005174\n005175\n005176\n005177\n005178\n005179\n005180\n005181\n005182\n005183\n005184\n005185\n005186\n005187\n005188\n005189\n005190\n005191\n005192\n005193\n005194\n005195\n005196\n005197\n005198\n005199\n005200\n005201\n005202\n005203\n005204\n005205\n005206\n005207\n005208\n005209\n005210\n005211\n005212\n005213\n005214\n005215\n005216\n005217\n005218\n005219\n005220\n005221\n005222\n005223\n005224\n005225\n005226\n005227\n005228\n005229\n005230\n005231\n005232\n005233\n005234\n005235\n005236\n005237\n005238\n005239\n005240\n005241\n005242\n005243\n005244\n005245\n005246\n005247\n005248\n005249\n005250\n005251\n005252\n005253\n005254\n005255\n005256\n005257\n005258\n005259\n005260\n005261\n005262\n005263\n005264\n005265\n005266\n005267\n005268\n005269\n005270\n005271\n005272\n005273\n005274\n005275\n005276\n005277\n005278\n005279\n005280\n005281\n005282\n005283\n005284\n005285\n005286\n005287\n005288\n005289\n005290\n005291\n005292\n005293\n005294\n005295\n005296\n005297\n005298\n005299\n005300\n005301\n005302\n005303\n005304\n005305\n005306\n005307\n005308\n005309\n005310\n005311\n005312\n005313\n005314\n005315\n005316\n005317\n005318\n005319\n005320\n005321\n005322\n005323\n005324\n005325\n005326\n005327\n005328\n005329\n005330\n005331\n005332\n005333\n005334\n005335\n005336\n005337\n005338\n005339\n005340\n005341\n005342\n005343\n005344\n005345\n005346\n005347\n005348\n005349\n005350\n005351\n005352\n005353\n005354\n005355\n005356\n005357\n005358\n005359\n005360\n005361\n005362\n005363\n005364\n005365\n005366\n005367\n005368\n005369\n005370\n005371\n005372\n005373\n005374\n005375\n005376\n005377\n005378\n005379\n005380\n005381\n005382\n005383\n005384\n005385\n005386\n005387\n005388\n005389\n005390\n005391\n005392\n005393\n005394\n005395\n005396\n005397\n005398\n005399\n005400\n005401\n005402\n005403\n005404\n005405\n005406\n005407\n005408\n005409\n005410\n005411\n005412\n005413\n005414\n005415\n005416\n005417\n005418\n005419\n005420\n005421\n005422\n005423\n005424\n005425\n005426\n005427\n005428\n005429\n005430\n005431\n005432\n005433\n005434\n005435\n005436\n005437\n005438\n005439\n005440\n005441\n005442\n005443\n005444\n005445\n005446\n005447\n005448\n005449\n005450\n005451\n005452\n005453\n005454\n005455\n005456\n005457\n005458\n005459\n005460\n005461\n005462\n005463\n005464\n005465\n005466\n005467\n005468\n005469\n005470\n005471\n005472\n005473\n005474\n005475\n005476\n005477\n005478\n005479\n005480\n005481\n005482\n005483\n005484\n005485\n005486\n005487\n005488\n005489\n005490\n005491\n005492\n005493\n005494\n005495\n005496\n005497\n005498\n005499\n005500\n005501\n005502\n005503\n005504\n005505\n005506\n005507\n005508\n005509\n005510\n005511\n005512\n005513\n005514\n005515\n005516\n005517\n005518\n005519\n005520\n005521\n005522\n005523\n005524\n005525\n005526\n005527\n005528\n005529\n005530\n005531\n005532\n005533\n005534\n005535\n005536\n005537\n005538\n005539\n005540\n005541\n005542\n005543\n005544\n005545\n005546\n005547\n005548\n005549\n005550\n005551\n005552\n005553\n005554\n005555\n005556\n005557\n005558\n005559\n005560\n005561\n005562\n005563\n005564\n005565\n005566\n005567\n005568\n005569\n005570\n005571\n005572\n005573\n005574\n005575\n005576\n005577\n005578\n005579\n005580\n005581\n005582\n005583\n005584\n005585\n005586\n005587\n005588\n005589\n005590\n005591\n005592\n005593\n005594\n005595\n005596\n005597\n005598\n005599\n005600\n005601\n005602\n005603\n005604\n005605\n005606\n005607\n005608\n005609\n005610\n005611\n005612\n005613\n005614\n005615\n005616\n005617\n005618\n005619\n005620\n005621\n005622\n005623\n005624\n005625\n005626\n005627\n005628\n005629\n005630\n005631\n005632\n005633\n005634\n005635\n005636\n005637\n005638\n005639\n005640\n005641\n005642\n005643\n005644\n005645\n005646\n005647\n005648\n005649\n005650\n005651\n005652\n005653\n005654\n005655\n005656\n005657\n005658\n005659\n005660\n005661\n005662\n005663\n005664\n005665\n005666\n005667\n005668\n005669\n005670\n005671\n005672\n005673\n005674\n005675\n005676\n005677\n005678\n005679\n005680\n005681\n005682\n005683\n005684\n005685\n005686\n005687\n005688\n005689\n005690\n005691\n005692\n005693\n005694\n005695\n005696\n005697\n005698\n005699\n005700\n005701\n005702\n005703\n005704\n005705\n005706\n005707\n005708\n005709\n005710\n005711\n005712\n005713\n005714\n005715\n005716\n005717\n005718\n005719\n005720\n005721\n005722\n005723\n005724\n005725\n005726\n005727\n005728\n005729\n005730\n005731\n005732\n005733\n005734\n005735\n005736\n005737\n005738\n005739\n005740\n005741\n005742\n005743\n005744\n005745\n005746\n005747\n005748\n005749\n005750\n005751\n005752\n005753\n005754\n005755\n005756\n005757\n005758\n005759\n005760\n005761\n005762\n005763\n005764\n005765\n005766\n005767\n005768\n005769\n005770\n005771\n005772\n005773\n005774\n005775\n005776\n005777\n005778\n005779\n005780\n005781\n005782\n005783\n005784\n005785\n005786\n005787\n005788\n005789\n005790\n005791\n005792\n005793\n005794\n005795\n005796\n005797\n005798\n005799\n005800\n005801\n005802\n005803\n005804\n005805\n005806\n005807\n005808\n005809\n005810\n005811\n005812\n005813\n005814\n005815\n005816\n005817\n005818\n005819\n005820\n005821\n005822\n005823\n005824\n005825\n005826\n005827\n005828\n005829\n005830\n005831\n005832\n005833\n005834\n005835\n005836\n005837\n005838\n005839\n005840\n005841\n005842\n005843\n005844\n005845\n005846\n005847\n005848\n005849\n005850\n005851\n005852\n005853\n005854\n005855\n005856\n005857\n005858\n005859\n005860\n005861\n005862\n005863\n005864\n005865\n005866\n005867\n005868\n005869\n005870\n005871\n005872\n005873\n005874\n005875\n005876\n005877\n005878\n005879\n005880\n005881\n005882\n005883\n005884\n005885\n005886\n005887\n005888\n005889\n005890\n005891\n005892\n005893\n005894\n005895\n005896\n005897\n005898\n005899\n005900\n005901\n005902\n005903\n005904\n005905\n005906\n005907\n005908\n005909\n005910\n005911\n005912\n005913\n005914\n005915\n005916\n005917\n005918\n005919\n005920\n005921\n005922\n005923\n005924\n005925\n005926\n005927\n005928\n005929\n005930\n005931\n005932\n005933\n005934\n005935\n005936\n005937\n005938\n005939\n005940\n005941\n005942\n005943\n005944\n005945\n005946\n005947\n005948\n005949\n005950\n005951\n005952\n005953\n005954\n005955\n005956\n005957\n005958\n005959\n005960\n005961\n005962\n005963\n005964\n005965\n005966\n005967\n005968\n005969\n005970\n005971\n005972\n005973\n005974\n005975\n005976\n005977\n005978\n005979\n005980\n005981\n005982\n005983\n005984\n005985\n005986\n005987\n005988\n005989\n005990\n005991\n005992\n005993\n005994\n005995\n005996\n005997\n005998\n005999\n006000\n006001\n006002\n006003\n006004\n006005\n006006\n006007\n006008\n006009\n006010\n006011\n006012\n006013\n006014\n006015\n006016\n006017\n006018\n006019\n006020\n006021\n006022\n006023\n006024\n006025\n006026\n006027\n006028\n006029\n006030\n006031\n006032\n006033\n006034\n006035\n006036\n006037\n006038\n006039\n006040\n006041\n006042\n006043\n006044\n006045\n006046\n006047\n006048\n006049\n006050\n006051\n006052\n006053\n006054\n006055\n006056\n006057\n006058\n006059\n006060\n006061\n006062\n006063\n006064\n006065\n006066\n006067\n006068\n006069\n006070\n006071\n006072\n006073\n006074\n006075\n006076\n006077\n006078\n006079\n006080\n006081\n006082\n006083\n006084\n006085\n006086\n006087\n006088\n006089\n006090\n006091\n006092\n006093\n006094\n006095\n006096\n006097\n006098\n006099\n006100\n006101\n006102\n006103\n006104\n006105\n006106\n006107\n006108\n006109\n006110\n006111\n006112\n006113\n006114\n006115\n006116\n006117\n006118\n006119\n006120\n006121\n006122\n006123\n006124\n006125\n006126\n006127\n006128\n006129\n006130\n006131\n006132\n006133\n006134\n006135\n006136\n006137\n006138\n006139\n006140\n006141\n006142\n006143\n006144\n006145\n006146\n006147\n006148\n006149\n006150\n006151\n006152\n006153\n006154\n006155\n006156\n006157\n006158\n006159\n006160\n006161\n006162\n006163\n006164\n006165\n006166\n006167\n006168\n006169\n006170\n006171\n006172\n006173\n006174\n006175\n006176\n006177\n006178\n006179\n006180\n006181\n006182\n006183\n006184\n006185\n006186\n006187\n006188\n006189\n006190\n006191\n006192\n006193\n006194\n006195\n006196\n006197\n006198\n006199\n006200\n006201\n006202\n006203\n006204\n006205\n006206\n006207\n006208\n006209\n006210\n006211\n006212\n006213\n006214\n006215\n006216\n006217\n006218\n006219\n006220\n006221\n006222\n006223\n006224\n006225\n006226\n006227\n006228\n006229\n006230\n006231\n006232\n006233\n006234\n006235\n006236\n006237\n006238\n006239\n006240\n006241\n006242\n006243\n006244\n006245\n006246\n006247\n006248\n006249\n006250\n006251\n006252\n006253\n006254\n006255\n006256\n006257\n006258\n006259\n006260\n006261\n006262\n006263\n006264\n006265\n006266\n006267\n006268\n006269\n006270\n006271\n006272\n006273\n006274\n006275\n006276\n006277\n006278\n006279\n006280\n006281\n006282\n006283\n006284\n006285\n006286\n006287\n006288\n006289\n006290\n006291\n006292\n006293\n006294\n006295\n006296\n006297\n006298\n006299\n006300\n006301\n006302\n006303\n006304\n006305\n006306\n006307\n006308\n006309\n006310\n006311\n006312\n006313\n006314\n006315\n006316\n006317\n006318\n006319\n006320\n006321\n006322\n006323\n006324\n006325\n006326\n006327\n006328\n006329\n006330\n006331\n006332\n006333\n006334\n006335\n006336\n006337\n006338\n006339\n006340\n006341\n006342\n006343\n006344\n006345\n006346\n006347\n006348\n006349\n006350\n006351\n006352\n006353\n006354\n006355\n006356\n006357\n006358\n006359\n006360\n006361\n006362\n006363\n006364\n006365\n006366\n006367\n006368\n006369\n006370\n006371\n006372\n006373\n006374\n006375\n006376\n006377\n006378\n006379\n006380\n006381\n006382\n006383\n006384\n006385\n006386\n006387\n006388\n006389\n006390\n006391\n006392\n006393\n006394\n006395\n006396\n006397\n006398\n006399\n006400\n006401\n006402\n006403\n006404\n006405\n006406\n006407\n006408\n006409\n006410\n006411\n006412\n006413\n006414\n006415\n006416\n006417\n006418\n006419\n006420\n006421\n006422\n006423\n006424\n006425\n006426\n006427\n006428\n006429\n006430\n006431\n006432\n006433\n006434\n006435\n006436\n006437\n006438\n006439\n006440\n006441\n006442\n006443\n006444\n006445\n006446\n006447\n006448\n006449\n006450\n006451\n006452\n006453\n006454\n006455\n006456\n006457\n006458\n006459\n006460\n006461\n006462\n006463\n006464\n006465\n006466\n006467\n006468\n006469\n006470\n006471\n006472\n006473\n006474\n006475\n006476\n006477\n006478\n006479\n006480\n006481\n006482\n006483\n006484\n006485\n006486\n006487\n006488\n006489\n006490\n006491\n006492\n006493\n006494\n006495\n006496\n006497\n006498\n006499\n006500\n006501\n006502\n006503\n006504\n006505\n006506\n006507\n006508\n006509\n006510\n006511\n006512\n006513\n006514\n006515\n006516\n006517\n006518\n006519\n006520\n006521\n006522\n006523\n006524\n006525\n006526\n006527\n006528\n006529\n006530\n006531\n006532\n006533\n006534\n006535\n006536\n006537\n006538\n006539\n006540\n006541\n006542\n006543\n006544\n006545\n006546\n006547\n006548\n006549\n006550\n006551\n006552\n006553\n006554\n006555\n006556\n006557\n006558\n006559\n006560\n006561\n006562\n006563\n006564\n006565\n006566\n006567\n006568\n006569\n006570\n006571\n006572\n006573\n006574\n006575\n006576\n006577\n006578\n006579\n006580\n006581\n006582\n006583\n006584\n006585\n006586\n006587\n006588\n006589\n006590\n006591\n006592\n006593\n006594\n006595\n006596\n006597\n006598\n006599\n006600\n006601\n006602\n006603\n006604\n006605\n006606\n006607\n006608\n006609\n006610\n006611\n006612\n006613\n006614\n006615\n006616\n006617\n006618\n006619\n006620\n006621\n006622\n006623\n006624\n006625\n006626\n006627\n006628\n006629\n006630\n006631\n006632\n006633\n006634\n006635\n006636\n006637\n006638\n006639\n006640\n006641\n006642\n006643\n006644\n006645\n006646\n006647\n006648\n006649\n006650\n006651\n006652\n006653\n006654\n006655\n006656\n006657\n006658\n006659\n006660\n006661\n006662\n006663\n006664\n006665\n006666\n006667\n006668\n006669\n006670\n006671\n006672\n006673\n006674\n006675\n006676\n006677\n006678\n006679\n006680\n006681\n006682\n006683\n006684\n006685\n006686\n006687\n006688\n006689\n006690\n006691\n006692\n006693\n006694\n006695\n006696\n006697\n006698\n006699\n006700\n006701\n006702\n006703\n006704\n006705\n006706\n006707\n006708\n006709\n006710\n006711\n006712\n006713\n006714\n006715\n006716\n006717\n006718\n006719\n006720\n006721\n006722\n006723\n006724\n006725\n006726\n006727\n006728\n006729\n006730\n006731\n006732\n006733\n006734\n006735\n006736\n006737\n006738\n006739\n006740\n006741\n006742\n006743\n006744\n006745\n006746\n006747\n006748\n006749\n006750\n006751\n006752\n006753\n006754\n006755\n006756\n006757\n006758\n006759\n006760\n006761\n006762\n006763\n006764\n006765\n006766\n006767\n006768\n006769\n006770\n006771\n006772\n006773\n006774\n006775\n006776\n006777\n006778\n006779\n006780\n006781\n006782\n006783\n006784\n006785\n006786\n006787\n006788\n006789\n006790\n006791\n006792\n006793\n006794\n006795\n006796\n006797\n006798\n006799\n006800\n006801\n006802\n006803\n006804\n006805\n006806\n006807\n006808\n006809\n006810\n006811\n006812\n006813\n006814\n006815\n006816\n006817\n006818\n006819\n006820\n006821\n006822\n006823\n006824\n006825\n006826\n006827\n006828\n006829\n006830\n006831\n006832\n006833\n006834\n006835\n006836\n006837\n006838\n006839\n006840\n006841\n006842\n006843\n006844\n006845\n006846\n006847\n006848\n006849\n006850\n006851\n006852\n006853\n006854\n006855\n006856\n006857\n006858\n006859\n006860\n006861\n006862\n006863\n006864\n006865\n006866\n006867\n006868\n006869\n006870\n006871\n006872\n006873\n006874\n006875\n006876\n006877\n006878\n006879\n006880\n006881\n006882\n006883\n006884\n006885\n006886\n006887\n006888\n006889\n006890\n006891\n006892\n006893\n006894\n006895\n006896\n006897\n006898\n006899\n006900\n006901\n006902\n006903\n006904\n006905\n006906\n006907\n006908\n006909\n006910\n006911\n006912\n006913\n006914\n006915\n006916\n006917\n006918\n006919\n006920\n006921\n006922\n006923\n006924\n006925\n006926\n006927\n006928\n006929\n006930\n006931\n006932\n006933\n006934\n006935\n006936\n006937\n006938\n006939\n006940\n006941\n006942\n006943\n006944\n006945\n006946\n006947\n006948\n006949\n006950\n006951\n006952\n006953\n006954\n006955\n006956\n006957\n006958\n006959\n006960\n006961\n006962\n006963\n006964\n006965\n006966\n006967\n006968\n006969\n006970\n006971\n006972\n006973\n006974\n006975\n006976\n006977\n006978\n006979\n006980\n006981\n006982\n006983\n006984\n006985\n006986\n006987\n006988\n006989\n006990\n006991\n006992\n006993\n006994\n006995\n006996\n006997\n006998\n006999\n007000\n007001\n007002\n007003\n007004\n007005\n007006\n007007\n007008\n007009\n007010\n007011\n007012\n007013\n007014\n007015\n007016\n007017\n007018\n007019\n007020\n007021\n007022\n007023\n007024\n007025\n007026\n007027\n007028\n007029\n007030\n007031\n007032\n007033\n007034\n007035\n007036\n007037\n007038\n007039\n007040\n007041\n007042\n007043\n007044\n007045\n007046\n007047\n007048\n007049\n007050\n007051\n007052\n007053\n007054\n007055\n007056\n007057\n007058\n007059\n007060\n007061\n007062\n007063\n007064\n007065\n007066\n007067\n007068\n007069\n007070\n007071\n007072\n007073\n007074\n007075\n007076\n007077\n007078\n007079\n007080\n007081\n007082\n007083\n007084\n007085\n007086\n007087\n007088\n007089\n007090\n007091\n007092\n007093\n007094\n007095\n007096\n007097\n007098\n007099\n007100\n007101\n007102\n007103\n007104\n007105\n007106\n007107\n007108\n007109\n007110\n007111\n007112\n007113\n007114\n007115\n007116\n007117\n007118\n007119\n007120\n007121\n007122\n007123\n007124\n007125\n007126\n007127\n007128\n007129\n007130\n007131\n007132\n007133\n007134\n007135\n007136\n007137\n007138\n007139\n007140\n007141\n007142\n007143\n007144\n007145\n007146\n007147\n007148\n007149\n007150\n007151\n007152\n007153\n007154\n007155\n007156\n007157\n007158\n007159\n007160\n007161\n007162\n007163\n007164\n007165\n007166\n007167\n007168\n007169\n007170\n007171\n007172\n007173\n007174\n007175\n007176\n007177\n007178\n007179\n007180\n007181\n007182\n007183\n007184\n007185\n007186\n007187\n007188\n007189\n007190\n007191\n007192\n007193\n007194\n007195\n007196\n007197\n007198\n007199\n007200\n007201\n007202\n007203\n007204\n007205\n007206\n007207\n007208\n007209\n007210\n007211\n007212\n007213\n007214\n007215\n007216\n007217\n007218\n007219\n007220\n007221\n007222\n007223\n007224\n007225\n007226\n007227\n007228\n007229\n007230\n007231\n007232\n007233\n007234\n007235\n007236\n007237\n007238\n007239\n007240\n007241\n007242\n007243\n007244\n007245\n007246\n007247\n007248\n007249\n007250\n007251\n007252\n007253\n007254\n007255\n007256\n007257\n007258\n007259\n007260\n007261\n007262\n007263\n007264\n007265\n007266\n007267\n007268\n007269\n007270\n007271\n007272\n007273\n007274\n007275\n007276\n007277\n007278\n007279\n007280\n007281\n007282\n007283\n007284\n007285\n007286\n007287\n007288\n007289\n007290\n007291\n007292\n007293\n007294\n007295\n007296\n007297\n007298\n007299\n007300\n007301\n007302\n007303\n007304\n007305\n007306\n007307\n007308\n007309\n007310\n007311\n007312\n007313\n007314\n007315\n007316\n007317\n007318\n007319\n007320\n007321\n007322\n007323\n007324\n007325\n007326\n007327\n007328\n007329\n007330\n007331\n007332\n007333\n007334\n007335\n007336\n007337\n007338\n007339\n007340\n007341\n007342\n007343\n007344\n007345\n007346\n007347\n007348\n007349\n007350\n007351\n007352\n007353\n007354\n007355\n007356\n007357\n007358\n007359\n007360\n007361\n007362\n007363\n007364\n007365\n007366\n007367\n007368\n007369\n007370\n007371\n007372\n007373\n007374\n007375\n007376\n007377\n007378\n007379\n007380\n007381\n007382\n007383\n007384\n007385\n007386\n007387\n007388\n007389\n007390\n007391\n007392\n007393\n007394\n007395\n007396\n007397\n007398\n007399\n007400\n007401\n007402\n007403\n007404\n007405\n007406\n007407\n007408\n007409\n007410\n007411\n007412\n007413\n007414\n007415\n007416\n007417\n007418\n007419\n007420\n007421\n007422\n007423\n007424\n007425\n007426\n007427\n007428\n007429\n007430\n007431\n007432\n007433\n007434\n007435\n007436\n007437\n007438\n007439\n007440\n007441\n007442\n007443\n007444\n007445\n007446\n007447\n007448\n007449\n007450\n007451\n007452\n007453\n007454\n007455\n007456\n007457\n007458\n007459\n007460\n007461\n007462\n007463\n007464\n007465\n007466\n007467\n007468\n007469\n007470\n007471\n007472\n007473\n007474\n007475\n007476\n007477\n007478\n007479\n007480\n007481\n007482\n007483\n007484\n007485\n007486\n007487\n007488\n007489\n007490\n007491\n007492\n007493\n007494\n007495\n007496\n007497\n007498\n007499\n007500\n007501\n007502\n007503\n007504\n007505\n007506\n007507\n007508\n007509\n007510\n007511\n007512\n007513\n007514\n007515\n007516\n007517"
  },
  {
    "path": "tools/data/KITTI/ImageSets/train.txt",
    "content": "000000\n000003\n000007\n000009\n000010\n000011\n000012\n000013\n000014\n000016\n000017\n000018\n000022\n000026\n000029\n000030\n000032\n000034\n000036\n000038\n000041\n000043\n000044\n000045\n000046\n000049\n000051\n000054\n000055\n000056\n000057\n000060\n000064\n000067\n000068\n000069\n000070\n000071\n000072\n000073\n000074\n000075\n000079\n000080\n000082\n000083\n000084\n000085\n000086\n000087\n000088\n000091\n000092\n000095\n000096\n000097\n000099\n000100\n000101\n000103\n000105\n000109\n000110\n000111\n000112\n000113\n000114\n000115\n000119\n000120\n000121\n000123\n000125\n000127\n000129\n000130\n000131\n000133\n000136\n000138\n000141\n000142\n000144\n000145\n000146\n000148\n000149\n000150\n000154\n000155\n000157\n000158\n000160\n000162\n000163\n000164\n000165\n000166\n000171\n000172\n000176\n000177\n000178\n000179\n000180\n000184\n000185\n000189\n000193\n000198\n000200\n000202\n000205\n000206\n000208\n000209\n000210\n000214\n000215\n000217\n000219\n000220\n000221\n000222\n000225\n000227\n000228\n000232\n000233\n000238\n000240\n000241\n000243\n000244\n000245\n000253\n000254\n000255\n000256\n000257\n000258\n000259\n000261\n000264\n000267\n000271\n000274\n000275\n000276\n000277\n000280\n000282\n000285\n000286\n000287\n000288\n000292\n000294\n000295\n000296\n000298\n000299\n000300\n000303\n000304\n000306\n000310\n000313\n000316\n000317\n000318\n000322\n000325\n000326\n000330\n000331\n000334\n000337\n000338\n000339\n000342\n000344\n000348\n000349\n000353\n000358\n000363\n000364\n000367\n000368\n000371\n000374\n000375\n000380\n000384\n000387\n000389\n000390\n000400\n000405\n000406\n000410\n000411\n000412\n000416\n000417\n000418\n000421\n000423\n000424\n000425\n000426\n000431\n000432\n000433\n000434\n000435\n000438\n000439\n000441\n000442\n000444\n000445\n000447\n000449\n000456\n000458\n000460\n000461\n000462\n000464\n000465\n000466\n000467\n000470\n000471\n000474\n000482\n000483\n000484\n000487\n000488\n000490\n000497\n000500\n000501\n000502\n000505\n000507\n000511\n000513\n000514\n000516\n000518\n000520\n000522\n000523\n000525\n000526\n000529\n000531\n000532\n000534\n000535\n000537\n000538\n000539\n000540\n000544\n000547\n000549\n000550\n000552\n000553\n000556\n000557\n000562\n000563\n000565\n000570\n000573\n000574\n000575\n000576\n000577\n000578\n000579\n000580\n000582\n000584\n000585\n000586\n000587\n000592\n000593\n000594\n000596\n000597\n000598\n000599\n000602\n000603\n000605\n000606\n000607\n000608\n000609\n000616\n000617\n000621\n000622\n000623\n000627\n000629\n000631\n000632\n000633\n000637\n000638\n000640\n000641\n000643\n000646\n000649\n000651\n000652\n000653\n000654\n000656\n000661\n000662\n000663\n000664\n000665\n000666\n000668\n000671\n000672\n000673\n000675\n000676\n000678\n000680\n000681\n000685\n000686\n000687\n000688\n000689\n000690\n000693\n000695\n000697\n000701\n000703\n000705\n000707\n000709\n000710\n000711\n000712\n000713\n000714\n000715\n000719\n000720\n000723\n000724\n000726\n000730\n000732\n000733\n000735\n000738\n000739\n000742\n000743\n000744\n000747\n000749\n000753\n000755\n000757\n000758\n000759\n000760\n000762\n000763\n000764\n000770\n000775\n000776\n000777\n000780\n000781\n000783\n000784\n000785\n000786\n000787\n000788\n000789\n000791\n000793\n000794\n000796\n000797\n000799\n000808\n000813\n000814\n000815\n000817\n000818\n000820\n000821\n000822\n000824\n000825\n000827\n000828\n000829\n000830\n000832\n000833\n000834\n000835\n000836\n000839\n000842\n000845\n000846\n000851\n000853\n000855\n000856\n000857\n000858\n000860\n000861\n000864\n000865\n000866\n000867\n000868\n000870\n000871\n000872\n000880\n000882\n000883\n000886\n000887\n000888\n000890\n000891\n000892\n000895\n000896\n000898\n000900\n000901\n000902\n000903\n000905\n000906\n000908\n000910\n000913\n000914\n000918\n000919\n000921\n000924\n000925\n000927\n000929\n000933\n000934\n000935\n000936\n000937\n000941\n000945\n000946\n000947\n000950\n000951\n000954\n000955\n000957\n000959\n000960\n000962\n000965\n000968\n000972\n000975\n000977\n000978\n000980\n000982\n000987\n000989\n000990\n000992\n000993\n000994\n000995\n000996\n000997\n000998\n001000\n001001\n001003\n001004\n001005\n001009\n001016\n001017\n001020\n001023\n001024\n001028\n001029\n001030\n001031\n001032\n001033\n001034\n001036\n001038\n001040\n001041\n001044\n001045\n001047\n001048\n001049\n001052\n001056\n001057\n001059\n001060\n001061\n001062\n001064\n001072\n001073\n001074\n001079\n001080\n001081\n001082\n001085\n001087\n001090\n001091\n001092\n001093\n001098\n001100\n001103\n001105\n001109\n001110\n001112\n001117\n001119\n001121\n001122\n001124\n001126\n001128\n001130\n001137\n001142\n001146\n001151\n001156\n001157\n001159\n001160\n001161\n001164\n001165\n001166\n001168\n001169\n001170\n001171\n001174\n001175\n001181\n001184\n001185\n001186\n001190\n001196\n001197\n001200\n001201\n001202\n001204\n001205\n001208\n001209\n001210\n001211\n001212\n001215\n001219\n001220\n001223\n001227\n001229\n001231\n001233\n001238\n001240\n001247\n001248\n001250\n001256\n001258\n001262\n001264\n001276\n001277\n001278\n001279\n001280\n001282\n001283\n001285\n001288\n001290\n001293\n001297\n001298\n001299\n001300\n001301\n001302\n001309\n001310\n001311\n001312\n001313\n001315\n001316\n001319\n001320\n001321\n001322\n001323\n001324\n001325\n001326\n001327\n001328\n001335\n001338\n001340\n001341\n001343\n001348\n001349\n001351\n001354\n001357\n001358\n001360\n001361\n001362\n001364\n001366\n001367\n001368\n001369\n001370\n001371\n001373\n001378\n001379\n001383\n001385\n001390\n001392\n001393\n001394\n001396\n001399\n001400\n001401\n001402\n001403\n001404\n001405\n001406\n001408\n001409\n001413\n001414\n001417\n001418\n001420\n001422\n001423\n001425\n001426\n001428\n001429\n001430\n001433\n001434\n001436\n001440\n001444\n001447\n001449\n001452\n001453\n001454\n001455\n001456\n001457\n001459\n001460\n001462\n001464\n001465\n001467\n001468\n001470\n001472\n001473\n001474\n001475\n001476\n001479\n001482\n001483\n001484\n001486\n001490\n001491\n001492\n001493\n001494\n001496\n001498\n001499\n001500\n001503\n001504\n001505\n001506\n001509\n001510\n001512\n001515\n001518\n001519\n001520\n001523\n001529\n001530\n001531\n001532\n001534\n001539\n001540\n001541\n001543\n001544\n001548\n001550\n001551\n001553\n001554\n001556\n001558\n001559\n001561\n001563\n001566\n001568\n001570\n001571\n001572\n001575\n001578\n001580\n001581\n001584\n001593\n001595\n001598\n001599\n001601\n001604\n001607\n001608\n001609\n001611\n001612\n001614\n001618\n001620\n001622\n001623\n001624\n001626\n001628\n001630\n001632\n001636\n001637\n001638\n001639\n001641\n001642\n001644\n001646\n001648\n001649\n001651\n001652\n001653\n001655\n001657\n001659\n001661\n001663\n001668\n001669\n001671\n001672\n001673\n001674\n001676\n001677\n001678\n001679\n001681\n001685\n001686\n001687\n001688\n001690\n001691\n001692\n001695\n001696\n001698\n001700\n001703\n001708\n001715\n001716\n001720\n001723\n001724\n001725\n001728\n001730\n001731\n001734\n001735\n001736\n001737\n001738\n001739\n001743\n001744\n001747\n001748\n001753\n001754\n001756\n001757\n001759\n001760\n001761\n001763\n001766\n001767\n001769\n001770\n001773\n001775\n001777\n001779\n001784\n001785\n001788\n001789\n001790\n001791\n001792\n001793\n001796\n001798\n001799\n001803\n001805\n001806\n001809\n001810\n001811\n001812\n001815\n001816\n001819\n001821\n001826\n001827\n001829\n001830\n001832\n001833\n001834\n001836\n001837\n001838\n001839\n001841\n001842\n001843\n001845\n001847\n001849\n001850\n001857\n001860\n001864\n001865\n001866\n001870\n001871\n001873\n001874\n001876\n001879\n001882\n001883\n001889\n001891\n001894\n001895\n001896\n001899\n001901\n001902\n001903\n001906\n001907\n001908\n001910\n001911\n001912\n001913\n001914\n001915\n001916\n001917\n001918\n001921\n001922\n001930\n001935\n001938\n001939\n001944\n001947\n001948\n001949\n001950\n001951\n001953\n001955\n001956\n001957\n001958\n001961\n001962\n001963\n001964\n001965\n001968\n001970\n001971\n001973\n001974\n001975\n001976\n001981\n001987\n001988\n001990\n001992\n001993\n001994\n001998\n002003\n002005\n002006\n002007\n002009\n002015\n002016\n002018\n002020\n002023\n002024\n002026\n002030\n002031\n002032\n002033\n002039\n002040\n002041\n002047\n002051\n002053\n002055\n002059\n002060\n002061\n002063\n002064\n002065\n002066\n002067\n002069\n002070\n002072\n002077\n002080\n002083\n002084\n002088\n002090\n002092\n002095\n002096\n002097\n002098\n002099\n002104\n002105\n002106\n002109\n002110\n002114\n002116\n002117\n002119\n002122\n002125\n002126\n002129\n002132\n002133\n002134\n002141\n002143\n002144\n002145\n002146\n002147\n002148\n002149\n002150\n002154\n002155\n002156\n002157\n002162\n002164\n002167\n002171\n002172\n002174\n002175\n002176\n002178\n002180\n002181\n002184\n002186\n002189\n002190\n002191\n002192\n002194\n002195\n002197\n002198\n002199\n002203\n002204\n002205\n002208\n002210\n002211\n002212\n002213\n002214\n002217\n002221\n002222\n002223\n002226\n002227\n002230\n002231\n002235\n002236\n002237\n002238\n002240\n002241\n002242\n002244\n002247\n002249\n002252\n002253\n002256\n002259\n002261\n002263\n002264\n002265\n002267\n002268\n002269\n002270\n002271\n002273\n002274\n002275\n002278\n002281\n002285\n002288\n002289\n002296\n002297\n002301\n002302\n002305\n002309\n002311\n002312\n002313\n002316\n002317\n002318\n002321\n002322\n002323\n002324\n002326\n002328\n002331\n002333\n002335\n002339\n002342\n002343\n002349\n002350\n002351\n002352\n002354\n002355\n002358\n002360\n002361\n002363\n002364\n002368\n002371\n002373\n002374\n002375\n002377\n002379\n002381\n002388\n002389\n002390\n002394\n002395\n002396\n002400\n002401\n002402\n002403\n002406\n002407\n002408\n002409\n002410\n002412\n002413\n002416\n002417\n002421\n002426\n002427\n002430\n002431\n002435\n002436\n002437\n002438\n002441\n002443\n002444\n002445\n002447\n002448\n002449\n002451\n002452\n002453\n002456\n002459\n002464\n002465\n002466\n002467\n002468\n002469\n002470\n002471\n002472\n002475\n002480\n002481\n002482\n002484\n002485\n002487\n002489\n002491\n002493\n002494\n002496\n002498\n002501\n002507\n002508\n002510\n002512\n002513\n002514\n002515\n002517\n002518\n002522\n002523\n002524\n002527\n002533\n002535\n002536\n002537\n002542\n002544\n002545\n002547\n002549\n002550\n002551\n002553\n002554\n002555\n002559\n002560\n002561\n002566\n002567\n002571\n002573\n002576\n002578\n002579\n002582\n002587\n002588\n002589\n002591\n002592\n002593\n002595\n002596\n002597\n002605\n002607\n002608\n002609\n002610\n002611\n002614\n002616\n002617\n002618\n002620\n002622\n002623\n002624\n002627\n002629\n002632\n002634\n002637\n002639\n002642\n002643\n002647\n002648\n002649\n002650\n002652\n002654\n002655\n002658\n002659\n002660\n002662\n002664\n002665\n002667\n002668\n002670\n002671\n002672\n002676\n002678\n002679\n002682\n002683\n002684\n002687\n002688\n002689\n002691\n002697\n002698\n002700\n002701\n002703\n002704\n002705\n002708\n002714\n002716\n002718\n002719\n002723\n002731\n002732\n002733\n002734\n002736\n002738\n002739\n002741\n002743\n002750\n002751\n002754\n002756\n002759\n002762\n002766\n002768\n002769\n002770\n002771\n002774\n002776\n002777\n002778\n002779\n002780\n002781\n002782\n002784\n002785\n002788\n002790\n002791\n002792\n002795\n002798\n002799\n002802\n002803\n002807\n002808\n002813\n002816\n002817\n002819\n002821\n002822\n002823\n002824\n002825\n002829\n002832\n002834\n002835\n002837\n002838\n002842\n002843\n002849\n002850\n002851\n002852\n002854\n002855\n002857\n002859\n002860\n002862\n002864\n002865\n002868\n002869\n002870\n002871\n002872\n002873\n002874\n002882\n002884\n002886\n002887\n002888\n002897\n002898\n002899\n002904\n002906\n002907\n002909\n002910\n002912\n002913\n002915\n002918\n002920\n002921\n002922\n002923\n002926\n002927\n002929\n002931\n002932\n002933\n002936\n002938\n002939\n002940\n002941\n002943\n002946\n002949\n002950\n002952\n002954\n002956\n002965\n002967\n002968\n002969\n002970\n002972\n002973\n002975\n002980\n002981\n002983\n002986\n002987\n002989\n002990\n002992\n002996\n002998\n003002\n003008\n003009\n003012\n003013\n003014\n003015\n003016\n003017\n003018\n003020\n003021\n003023\n003026\n003028\n003036\n003037\n003039\n003040\n003041\n003044\n003045\n003049\n003051\n003057\n003059\n003060\n003063\n003064\n003068\n003069\n003070\n003072\n003075\n003077\n003078\n003079\n003081\n003083\n003084\n003085\n003086\n003089\n003091\n003092\n003093\n003095\n003097\n003098\n003100\n003104\n003105\n003108\n003111\n003113\n003115\n003117\n003119\n003120\n003121\n003122\n003123\n003125\n003128\n003130\n003132\n003138\n003139\n003140\n003143\n003147\n003149\n003151\n003152\n003154\n003155\n003157\n003158\n003160\n003163\n003164\n003166\n003168\n003169\n003171\n003173\n003176\n003178\n003184\n003185\n003186\n003188\n003189\n003191\n003193\n003195\n003196\n003198\n003200\n003201\n003205\n003206\n003208\n003209\n003212\n003213\n003215\n003218\n003220\n003223\n003227\n003230\n003234\n003235\n003237\n003238\n003241\n003243\n003244\n003245\n003246\n003248\n003249\n003253\n003256\n003258\n003260\n003261\n003262\n003263\n003264\n003267\n003268\n003270\n003271\n003273\n003274\n003277\n003278\n003279\n003282\n003284\n003285\n003286\n003287\n003289\n003290\n003291\n003293\n003294\n003297\n003299\n003303\n003307\n003309\n003311\n003314\n003317\n003320\n003321\n003326\n003327\n003328\n003329\n003332\n003333\n003334\n003335\n003336\n003339\n003340\n003342\n003344\n003345\n003348\n003349\n003354\n003356\n003359\n003360\n003361\n003362\n003363\n003369\n003371\n003372\n003374\n003376\n003377\n003378\n003380\n003381\n003382\n003383\n003384\n003387\n003388\n003389\n003390\n003391\n003392\n003398\n003400\n003413\n003414\n003415\n003416\n003418\n003420\n003423\n003424\n003427\n003431\n003433\n003436\n003437\n003438\n003439\n003440\n003441\n003442\n003444\n003445\n003446\n003451\n003452\n003454\n003455\n003457\n003458\n003459\n003460\n003462\n003463\n003468\n003472\n003473\n003475\n003476\n003477\n003479\n003485\n003486\n003493\n003494\n003498\n003499\n003500\n003501\n003505\n003507\n003508\n003509\n003510\n003512\n003513\n003514\n003516\n003518\n003522\n003523\n003525\n003526\n003532\n003533\n003534\n003536\n003537\n003538\n003540\n003541\n003542\n003545\n003546\n003548\n003549\n003551\n003555\n003556\n003560\n003561\n003564\n003565\n003566\n003567\n003569\n003570\n003572\n003575\n003576\n003577\n003578\n003579\n003581\n003585\n003586\n003587\n003589\n003590\n003591\n003592\n003593\n003594\n003595\n003596\n003597\n003598\n003599\n003602\n003603\n003606\n003610\n003612\n003613\n003615\n003617\n003619\n003625\n003626\n003628\n003636\n003637\n003638\n003639\n003640\n003641\n003642\n003644\n003646\n003648\n003650\n003651\n003654\n003656\n003657\n003660\n003663\n003664\n003665\n003666\n003670\n003672\n003673\n003674\n003675\n003680\n003681\n003685\n003686\n003687\n003693\n003694\n003695\n003696\n003697\n003698\n003699\n003700\n003701\n003704\n003706\n003709\n003710\n003713\n003714\n003717\n003720\n003721\n003722\n003724\n003725\n003727\n003729\n003730\n003731\n003732\n003733\n003734\n003740\n003741\n003742\n003743\n003744\n003745\n003749\n003752\n003754\n003757\n003758\n003759\n003760\n003761\n003765\n003766\n003767\n003768\n003770\n003772\n003773\n003774\n003776\n003780\n003783\n003784\n003785\n003786\n003789\n003790\n003791\n003792\n003795\n003796\n003797\n003799\n003801\n003803\n003806\n003810\n003813\n003815\n003816\n003817\n003818\n003819\n003821\n003823\n003824\n003825\n003829\n003831\n003832\n003833\n003836\n003838\n003839\n003840\n003842\n003843\n003844\n003845\n003846\n003848\n003849\n003850\n003851\n003853\n003855\n003857\n003858\n003861\n003862\n003863\n003865\n003867\n003868\n003871\n003875\n003876\n003877\n003882\n003884\n003887\n003888\n003889\n003893\n003895\n003896\n003900\n003903\n003904\n003906\n003908\n003910\n003911\n003912\n003913\n003917\n003918\n003919\n003921\n003922\n003925\n003927\n003928\n003929\n003930\n003933\n003935\n003936\n003939\n003940\n003941\n003942\n003944\n003947\n003949\n003951\n003952\n003953\n003954\n003955\n003957\n003959\n003960\n003963\n003966\n003967\n003968\n003971\n003973\n003974\n003976\n003978\n003979\n003983\n003985\n003987\n003988\n003989\n003990\n003991\n003993\n003994\n003995\n003997\n003999\n004005\n004006\n004012\n004013\n004014\n004015\n004017\n004018\n004019\n004020\n004022\n004023\n004024\n004025\n004029\n004030\n004031\n004035\n004037\n004039\n004043\n004044\n004046\n004047\n004050\n004052\n004053\n004054\n004056\n004057\n004058\n004060\n004062\n004066\n004067\n004069\n004070\n004071\n004073\n004075\n004076\n004078\n004080\n004084\n004086\n004088\n004090\n004093\n004094\n004097\n004099\n004102\n004103\n004106\n004112\n004114\n004115\n004123\n004127\n004133\n004134\n004135\n004139\n004141\n004144\n004145\n004146\n004147\n004151\n004159\n004165\n004166\n004167\n004169\n004170\n004176\n004177\n004178\n004179\n004180\n004181\n004182\n004183\n004184\n004186\n004192\n004193\n004194\n004197\n004198\n004199\n004200\n004201\n004203\n004204\n004208\n004211\n004212\n004216\n004217\n004218\n004219\n004225\n004227\n004229\n004230\n004231\n004233\n004234\n004235\n004236\n004238\n004240\n004244\n004245\n004247\n004252\n004253\n004257\n004258\n004261\n004262\n004264\n004265\n004266\n004267\n004268\n004269\n004272\n004273\n004274\n004276\n004279\n004283\n004286\n004287\n004292\n004296\n004297\n004302\n004304\n004308\n004310\n004313\n004315\n004316\n004317\n004320\n004322\n004325\n004328\n004331\n004332\n004333\n004334\n004339\n004341\n004344\n004346\n004347\n004351\n004354\n004355\n004356\n004357\n004358\n004359\n004361\n004365\n004366\n004371\n004372\n004375\n004376\n004378\n004379\n004380\n004381\n004382\n004386\n004387\n004389\n004390\n004394\n004395\n004399\n004400\n004405\n004408\n004409\n004410\n004411\n004412\n004413\n004416\n004417\n004427\n004428\n004431\n004432\n004436\n004441\n004442\n004445\n004446\n004448\n004449\n004451\n004453\n004455\n004457\n004459\n004461\n004463\n004464\n004466\n004467\n004468\n004471\n004473\n004476\n004477\n004478\n004479\n004484\n004488\n004492\n004495\n004497\n004498\n004499\n004500\n004503\n004504\n004505\n004506\n004507\n004509\n004510\n004512\n004514\n004515\n004518\n004522\n004523\n004524\n004525\n004533\n004535\n004536\n004537\n004538\n004539\n004543\n004544\n004545\n004546\n004550\n004552\n004554\n004555\n004558\n004559\n004560\n004561\n004563\n004564\n004565\n004571\n004572\n004575\n004577\n004579\n004580\n004583\n004584\n004586\n004590\n004592\n004593\n004594\n004595\n004597\n004600\n004601\n004602\n004604\n004605\n004606\n004607\n004613\n004614\n004616\n004617\n004619\n004621\n004623\n004625\n004627\n004628\n004631\n004635\n004637\n004639\n004641\n004642\n004643\n004645\n004646\n004653\n004654\n004656\n004659\n004661\n004662\n004663\n004664\n004670\n004671\n004674\n004675\n004676\n004677\n004678\n004681\n004684\n004690\n004696\n004701\n004702\n004703\n004704\n004707\n004712\n004719\n004723\n004727\n004728\n004729\n004731\n004733\n004736\n004741\n004747\n004749\n004750\n004751\n004754\n004755\n004757\n004758\n004760\n004761\n004765\n004767\n004771\n004772\n004774\n004775\n004778\n004779\n004780\n004781\n004784\n004785\n004786\n004789\n004793\n004794\n004795\n004796\n004798\n004801\n004802\n004803\n004805\n004808\n004809\n004812\n004818\n004819\n004820\n004823\n004824\n004826\n004827\n004828\n004833\n004834\n004836\n004837\n004838\n004840\n004841\n004842\n004844\n004845\n004847\n004853\n004854\n004855\n004856\n004857\n004865\n004866\n004869\n004870\n004872\n004876\n004877\n004878\n004879\n004880\n004882\n004883\n004884\n004886\n004889\n004890\n004894\n004897\n004899\n004900\n004901\n004906\n004908\n004910\n004911\n004912\n004913\n004915\n004916\n004919\n004922\n004923\n004925\n004930\n004933\n004936\n004937\n004939\n004940\n004945\n004950\n004951\n004952\n004955\n004957\n004961\n004964\n004965\n004967\n004968\n004969\n004970\n004971\n004972\n004973\n004975\n004977\n004978\n004980\n004982\n004984\n004987\n004991\n004992\n004997\n005000\n005003\n005005\n005006\n005007\n005009\n005011\n005012\n005016\n005018\n005020\n005022\n005023\n005025\n005027\n005029\n005030\n005031\n005033\n005035\n005039\n005042\n005043\n005044\n005046\n005047\n005048\n005051\n005059\n005060\n005061\n005066\n005069\n005071\n005076\n005083\n005084\n005085\n005087\n005088\n005089\n005091\n005092\n005096\n005097\n005098\n005099\n005100\n005102\n005104\n005106\n005107\n005111\n005114\n005115\n005116\n005117\n005118\n005119\n005123\n005126\n005129\n005130\n005131\n005132\n005134\n005137\n005142\n005146\n005148\n005150\n005151\n005152\n005154\n005159\n005160\n005165\n005169\n005171\n005173\n005177\n005178\n005183\n005186\n005187\n005192\n005193\n005195\n005196\n005200\n005202\n005203\n005204\n005205\n005207\n005208\n005209\n005210\n005211\n005212\n005215\n005216\n005220\n005223\n005224\n005225\n005228\n005231\n005232\n005235\n005238\n005239\n005243\n005245\n005247\n005248\n005250\n005252\n005253\n005254\n005257\n005258\n005259\n005261\n005263\n005264\n005265\n005266\n005269\n005270\n005272\n005277\n005278\n005281\n005283\n005285\n005286\n005288\n005290\n005291\n005293\n005294\n005295\n005300\n005301\n005302\n005303\n005305\n005306\n005310\n005314\n005317\n005320\n005324\n005326\n005327\n005331\n005332\n005339\n005340\n005344\n005346\n005348\n005351\n005352\n005353\n005354\n005355\n005356\n005357\n005358\n005361\n005362\n005364\n005367\n005370\n005373\n005374\n005376\n005380\n005382\n005383\n005384\n005387\n005388\n005392\n005393\n005394\n005395\n005396\n005397\n005398\n005399\n005400\n005401\n005402\n005403\n005406\n005407\n005408\n005409\n005410\n005411\n005412\n005414\n005416\n005417\n005418\n005419\n005420\n005421\n005424\n005425\n005428\n005432\n005433\n005435\n005436\n005438\n005439\n005440\n005442\n005446\n005451\n005454\n005455\n005456\n005457\n005462\n005463\n005464\n005468\n005469\n005470\n005475\n005478\n005480\n005483\n005485\n005488\n005490\n005491\n005492\n005493\n005496\n005497\n005499\n005500\n005501\n005502\n005503\n005504\n005506\n005507\n005508\n005509\n005512\n005513\n005516\n005517\n005518\n005519\n005520\n005521\n005522\n005524\n005526\n005527\n005529\n005530\n005533\n005535\n005537\n005539\n005541\n005543\n005547\n005548\n005549\n005550\n005553\n005554\n005561\n005562\n005563\n005564\n005567\n005568\n005569\n005574\n005575\n005578\n005579\n005583\n005585\n005591\n005592\n005593\n005594\n005597\n005598\n005599\n005604\n005605\n005606\n005607\n005608\n005609\n005611\n005612\n005614\n005615\n005620\n005621\n005622\n005624\n005626\n005627\n005628\n005629\n005632\n005636\n005637\n005641\n005644\n005645\n005646\n005647\n005648\n005651\n005654\n005655\n005657\n005661\n005663\n005665\n005666\n005667\n005670\n005671\n005674\n005675\n005678\n005679\n005681\n005682\n005684\n005686\n005688\n005690\n005691\n005692\n005693\n005694\n005696\n005697\n005701\n005702\n005705\n005710\n005711\n005715\n005716\n005718\n005719\n005720\n005721\n005722\n005723\n005726\n005730\n005732\n005733\n005734\n005737\n005738\n005742\n005748\n005749\n005750\n005752\n005753\n005755\n005756\n005758\n005759\n005761\n005764\n005766\n005767\n005768\n005769\n005770\n005771\n005772\n005773\n005774\n005775\n005776\n005778\n005779\n005780\n005781\n005788\n005789\n005791\n005792\n005795\n005797\n005798\n005799\n005802\n005804\n005808\n005809\n005810\n005813\n005814\n005815\n005816\n005817\n005823\n005824\n005825\n005828\n005830\n005831\n005832\n005833\n005835\n005836\n005837\n005838\n005842\n005844\n005845\n005846\n005847\n005848\n005849\n005850\n005851\n005853\n005858\n005860\n005861\n005862\n005863\n005865\n005866\n005867\n005868\n005870\n005871\n005872\n005874\n005875\n005877\n005880\n005884\n005886\n005888\n005890\n005891\n005895\n005896\n005897\n005898\n005902\n005904\n005908\n005915\n005920\n005924\n005928\n005929\n005930\n005932\n005934\n005936\n005937\n005940\n005941\n005942\n005943\n005945\n005946\n005950\n005951\n005953\n005954\n005956\n005957\n005959\n005960\n005964\n005966\n005967\n005968\n005971\n005973\n005974\n005976\n005977\n005979\n005980\n005983\n005987\n005989\n005990\n005991\n005992\n005993\n005995\n005998\n006000\n006004\n006006\n006007\n006011\n006015\n006017\n006018\n006019\n006020\n006021\n006022\n006025\n006032\n006035\n006037\n006040\n006049\n006051\n006053\n006055\n006056\n006059\n006064\n006065\n006069\n006072\n006073\n006076\n006079\n006080\n006081\n006082\n006084\n006089\n006090\n006091\n006092\n006094\n006099\n006101\n006104\n006105\n006108\n006109\n006111\n006112\n006113\n006119\n006120\n006124\n006128\n006129\n006131\n006132\n006134\n006135\n006137\n006138\n006140\n006141\n006142\n006143\n006145\n006147\n006149\n006150\n006153\n006155\n006157\n006158\n006159\n006160\n006162\n006164\n006166\n006170\n006171\n006172\n006174\n006175\n006178\n006179\n006180\n006181\n006183\n006184\n006188\n006189\n006191\n006192\n006193\n006197\n006199\n006200\n006201\n006203\n006205\n006206\n006207\n006209\n006211\n006212\n006214\n006216\n006217\n006218\n006220\n006221\n006223\n006224\n006225\n006226\n006230\n006231\n006234\n006235\n006236\n006237\n006239\n006241\n006242\n006243\n006245\n006248\n006251\n006252\n006253\n006254\n006255\n006256\n006257\n006259\n006260\n006261\n006262\n006264\n006268\n006271\n006277\n006279\n006281\n006283\n006284\n006285\n006289\n006290\n006291\n006292\n006293\n006294\n006295\n006296\n006298\n006299\n006303\n006304\n006307\n006308\n006309\n006310\n006311\n006313\n006318\n006319\n006320\n006323\n006325\n006326\n006327\n006328\n006329\n006330\n006335\n006336\n006337\n006341\n006346\n006347\n006350\n006352\n006358\n006359\n006361\n006362\n006363\n006365\n006367\n006373\n006374\n006375\n006376\n006378\n006382\n006383\n006384\n006387\n006389\n006390\n006392\n006397\n006398\n006399\n006400\n006401\n006402\n006404\n006408\n006412\n006413\n006414\n006418\n006419\n006421\n006422\n006428\n006429\n006430\n006431\n006432\n006438\n006443\n006447\n006448\n006449\n006450\n006455\n006456\n006457\n006458\n006459\n006460\n006461\n006463\n006466\n006467\n006471\n006476\n006479\n006480\n006485\n006487\n006489\n006490\n006492\n006494\n006495\n006499\n006500\n006501\n006502\n006504\n006509\n006510\n006511\n006513\n006518\n006522\n006523\n006526\n006527\n006528\n006536\n006538\n006539\n006541\n006543\n006544\n006545\n006546\n006547\n006550\n006552\n006554\n006557\n006559\n006562\n006564\n006566\n006567\n006571\n006572\n006573\n006575\n006579\n006580\n006584\n006585\n006587\n006589\n006591\n006594\n006598\n006599\n006600\n006601\n006605\n006606\n006607\n006608\n006609\n006610\n006615\n006616\n006617\n006619\n006620\n006621\n006622\n006627\n006630\n006631\n006635\n006639\n006640\n006642\n006644\n006645\n006646\n006648\n006652\n006653\n006654\n006657\n006661\n006662\n006663\n006665\n006668\n006671\n006672\n006673\n006675\n006680\n006681\n006683\n006684\n006687\n006688\n006689\n006690\n006691\n006697\n006699\n006700\n006702\n006704\n006705\n006706\n006707\n006708\n006716\n006717\n006718\n006721\n006722\n006724\n006727\n006728\n006730\n006735\n006736\n006739\n006740\n006742\n006743\n006746\n006748\n006749\n006750\n006757\n006763\n006766\n006769\n006774\n006775\n006776\n006779\n006784\n006787\n006788\n006790\n006793\n006795\n006799\n006801\n006802\n006805\n006809\n006810\n006814\n006817\n006820\n006821\n006823\n006824\n006825\n006826\n006827\n006830\n006831\n006834\n006835\n006838\n006839\n006840\n006842\n006845\n006846\n006848\n006851\n006857\n006859\n006861\n006864\n006865\n006867\n006869\n006871\n006875\n006877\n006878\n006880\n006883\n006886\n006888\n006890\n006892\n006893\n006894\n006896\n006902\n006904\n006905\n006909\n006911\n006912\n006915\n006916\n006918\n006919\n006920\n006921\n006923\n006924\n006926\n006927\n006929\n006931\n006932\n006933\n006934\n006935\n006939\n006940\n006941\n006946\n006947\n006949\n006951\n006952\n006957\n006958\n006961\n006963\n006965\n006966\n006967\n006969\n006970\n006972\n006974\n006975\n006976\n006979\n006983\n006984\n006985\n006986\n006988\n006991\n006993\n006995\n006996\n006998\n007001\n007002\n007004\n007007\n007009\n007013\n007017\n007018\n007020\n007021\n007024\n007025\n007035\n007036\n007039\n007040\n007041\n007044\n007045\n007046\n007050\n007051\n007054\n007057\n007058\n007060\n007062\n007064\n007066\n007070\n007073\n007075\n007077\n007086\n007090\n007092\n007093\n007094\n007096\n007097\n007099\n007101\n007102\n007104\n007105\n007106\n007107\n007108\n007111\n007113\n007114\n007116\n007118\n007121\n007123\n007124\n007126\n007127\n007128\n007129\n007134\n007137\n007140\n007141\n007142\n007143\n007147\n007148\n007150\n007151\n007152\n007153\n007155\n007156\n007159\n007160\n007167\n007170\n007171\n007173\n007175\n007179\n007181\n007184\n007185\n007186\n007188\n007189\n007190\n007191\n007192\n007193\n007195\n007196\n007197\n007203\n007206\n007209\n007211\n007213\n007216\n007218\n007220\n007222\n007223\n007224\n007226\n007228\n007231\n007234\n007236\n007237\n007239\n007241\n007243\n007245\n007248\n007249\n007250\n007251\n007254\n007257\n007259\n007263\n007264\n007268\n007269\n007270\n007276\n007281\n007282\n007285\n007286\n007293\n007295\n007296\n007297\n007298\n007301\n007305\n007306\n007307\n007308\n007312\n007313\n007314\n007316\n007317\n007320\n007321\n007324\n007328\n007332\n007333\n007334\n007335\n007338\n007340\n007341\n007346\n007348\n007354\n007355\n007356\n007357\n007358\n007361\n007362\n007363\n007365\n007366\n007367\n007368\n007370\n007372\n007373\n007378\n007379\n007386\n007387\n007388\n007390\n007392\n007393\n007394\n007399\n007400\n007404\n007406\n007408\n007414\n007417\n007418\n007425\n007427\n007428\n007429\n007431\n007432\n007438\n007441\n007443\n007444\n007446\n007451\n007452\n007454\n007455\n007457\n007459\n007460\n007461\n007465\n007471\n007472\n007474\n007476\n007479"
  },
  {
    "path": "tools/data/KITTI/ImageSets/trainval.txt",
    "content": "000000\n000001\n000002\n000003\n000004\n000005\n000006\n000007\n000008\n000009\n000010\n000011\n000012\n000013\n000014\n000015\n000016\n000017\n000018\n000019\n000020\n000021\n000022\n000023\n000024\n000025\n000026\n000027\n000028\n000029\n000030\n000031\n000032\n000033\n000034\n000035\n000036\n000037\n000038\n000039\n000040\n000041\n000042\n000043\n000044\n000045\n000046\n000047\n000048\n000049\n000050\n000051\n000052\n000053\n000054\n000055\n000056\n000057\n000058\n000059\n000060\n000061\n000062\n000063\n000064\n000065\n000066\n000067\n000068\n000069\n000070\n000071\n000072\n000073\n000074\n000075\n000076\n000077\n000078\n000079\n000080\n000081\n000082\n000083\n000084\n000085\n000086\n000087\n000088\n000089\n000090\n000091\n000092\n000093\n000094\n000095\n000096\n000097\n000098\n000099\n000100\n000101\n000102\n000103\n000104\n000105\n000106\n000107\n000108\n000109\n000110\n000111\n000112\n000113\n000114\n000115\n000116\n000117\n000118\n000119\n000120\n000121\n000122\n000123\n000124\n000125\n000126\n000127\n000128\n000129\n000130\n000131\n000132\n000133\n000134\n000135\n000136\n000137\n000138\n000139\n000140\n000141\n000142\n000143\n000144\n000145\n000146\n000147\n000148\n000149\n000150\n000151\n000152\n000153\n000154\n000155\n000156\n000157\n000158\n000159\n000160\n000161\n000162\n000163\n000164\n000165\n000166\n000167\n000168\n000169\n000170\n000171\n000172\n000173\n000174\n000175\n000176\n000177\n000178\n000179\n000180\n000181\n000182\n000183\n000184\n000185\n000186\n000187\n000188\n000189\n000190\n000191\n000192\n000193\n000194\n000195\n000196\n000197\n000198\n000199\n000200\n000201\n000202\n000203\n000204\n000205\n000206\n000207\n000208\n000209\n000210\n000211\n000212\n000213\n000214\n000215\n000216\n000217\n000218\n000219\n000220\n000221\n000222\n000223\n000224\n000225\n000226\n000227\n000228\n000229\n000230\n000231\n000232\n000233\n000234\n000235\n000236\n000237\n000238\n000239\n000240\n000241\n000242\n000243\n000244\n000245\n000246\n000247\n000248\n000249\n000250\n000251\n000252\n000253\n000254\n000255\n000256\n000257\n000258\n000259\n000260\n000261\n000262\n000263\n000264\n000265\n000266\n000267\n000268\n000269\n000270\n000271\n000272\n000273\n000274\n000275\n000276\n000277\n000278\n000279\n000280\n000281\n000282\n000283\n000284\n000285\n000286\n000287\n000288\n000289\n000290\n000291\n000292\n000293\n000294\n000295\n000296\n000297\n000298\n000299\n000300\n000301\n000302\n000303\n000304\n000305\n000306\n000307\n000308\n000309\n000310\n000311\n000312\n000313\n000314\n000315\n000316\n000317\n000318\n000319\n000320\n000321\n000322\n000323\n000324\n000325\n000326\n000327\n000328\n000329\n000330\n000331\n000332\n000333\n000334\n000335\n000336\n000337\n000338\n000339\n000340\n000341\n000342\n000343\n000344\n000345\n000346\n000347\n000348\n000349\n000350\n000351\n000352\n000353\n000354\n000355\n000356\n000357\n000358\n000359\n000360\n000361\n000362\n000363\n000364\n000365\n000366\n000367\n000368\n000369\n000370\n000371\n000372\n000373\n000374\n000375\n000376\n000377\n000378\n000379\n000380\n000381\n000382\n000383\n000384\n000385\n000386\n000387\n000388\n000389\n000390\n000391\n000392\n000393\n000394\n000395\n000396\n000397\n000398\n000399\n000400\n000401\n000402\n000403\n000404\n000405\n000406\n000407\n000408\n000409\n000410\n000411\n000412\n000413\n000414\n000415\n000416\n000417\n000418\n000419\n000420\n000421\n000422\n000423\n000424\n000425\n000426\n000427\n000428\n000429\n000430\n000431\n000432\n000433\n000434\n000435\n000436\n000437\n000438\n000439\n000440\n000441\n000442\n000443\n000444\n000445\n000446\n000447\n000448\n000449\n000450\n000451\n000452\n000453\n000454\n000455\n000456\n000457\n000458\n000459\n000460\n000461\n000462\n000463\n000464\n000465\n000466\n000467\n000468\n000469\n000470\n000471\n000472\n000473\n000474\n000475\n000476\n000477\n000478\n000479\n000480\n000481\n000482\n000483\n000484\n000485\n000486\n000487\n000488\n000489\n000490\n000491\n000492\n000493\n000494\n000495\n000496\n000497\n000498\n000499\n000500\n000501\n000502\n000503\n000504\n000505\n000506\n000507\n000508\n000509\n000510\n000511\n000512\n000513\n000514\n000515\n000516\n000517\n000518\n000519\n000520\n000521\n000522\n000523\n000524\n000525\n000526\n000527\n000528\n000529\n000530\n000531\n000532\n000533\n000534\n000535\n000536\n000537\n000538\n000539\n000540\n000541\n000542\n000543\n000544\n000545\n000546\n000547\n000548\n000549\n000550\n000551\n000552\n000553\n000554\n000555\n000556\n000557\n000558\n000559\n000560\n000561\n000562\n000563\n000564\n000565\n000566\n000567\n000568\n000569\n000570\n000571\n000572\n000573\n000574\n000575\n000576\n000577\n000578\n000579\n000580\n000581\n000582\n000583\n000584\n000585\n000586\n000587\n000588\n000589\n000590\n000591\n000592\n000593\n000594\n000595\n000596\n000597\n000598\n000599\n000600\n000601\n000602\n000603\n000604\n000605\n000606\n000607\n000608\n000609\n000610\n000611\n000612\n000613\n000614\n000615\n000616\n000617\n000618\n000619\n000620\n000621\n000622\n000623\n000624\n000625\n000626\n000627\n000628\n000629\n000630\n000631\n000632\n000633\n000634\n000635\n000636\n000637\n000638\n000639\n000640\n000641\n000642\n000643\n000644\n000645\n000646\n000647\n000648\n000649\n000650\n000651\n000652\n000653\n000654\n000655\n000656\n000657\n000658\n000659\n000660\n000661\n000662\n000663\n000664\n000665\n000666\n000667\n000668\n000669\n000670\n000671\n000672\n000673\n000674\n000675\n000676\n000677\n000678\n000679\n000680\n000681\n000682\n000683\n000684\n000685\n000686\n000687\n000688\n000689\n000690\n000691\n000692\n000693\n000694\n000695\n000696\n000697\n000698\n000699\n000700\n000701\n000702\n000703\n000704\n000705\n000706\n000707\n000708\n000709\n000710\n000711\n000712\n000713\n000714\n000715\n000716\n000717\n000718\n000719\n000720\n000721\n000722\n000723\n000724\n000725\n000726\n000727\n000728\n000729\n000730\n000731\n000732\n000733\n000734\n000735\n000736\n000737\n000738\n000739\n000740\n000741\n000742\n000743\n000744\n000745\n000746\n000747\n000748\n000749\n000750\n000751\n000752\n000753\n000754\n000755\n000756\n000757\n000758\n000759\n000760\n000761\n000762\n000763\n000764\n000765\n000766\n000767\n000768\n000769\n000770\n000771\n000772\n000773\n000774\n000775\n000776\n000777\n000778\n000779\n000780\n000781\n000782\n000783\n000784\n000785\n000786\n000787\n000788\n000789\n000790\n000791\n000792\n000793\n000794\n000795\n000796\n000797\n000798\n000799\n000800\n000801\n000802\n000803\n000804\n000805\n000806\n000807\n000808\n000809\n000810\n000811\n000812\n000813\n000814\n000815\n000816\n000817\n000818\n000819\n000820\n000821\n000822\n000823\n000824\n000825\n000826\n000827\n000828\n000829\n000830\n000831\n000832\n000833\n000834\n000835\n000836\n000837\n000838\n000839\n000840\n000841\n000842\n000843\n000844\n000845\n000846\n000847\n000848\n000849\n000850\n000851\n000852\n000853\n000854\n000855\n000856\n000857\n000858\n000859\n000860\n000861\n000862\n000863\n000864\n000865\n000866\n000867\n000868\n000869\n000870\n000871\n000872\n000873\n000874\n000875\n000876\n000877\n000878\n000879\n000880\n000881\n000882\n000883\n000884\n000885\n000886\n000887\n000888\n000889\n000890\n000891\n000892\n000893\n000894\n000895\n000896\n000897\n000898\n000899\n000900\n000901\n000902\n000903\n000904\n000905\n000906\n000907\n000908\n000909\n000910\n000911\n000912\n000913\n000914\n000915\n000916\n000917\n000918\n000919\n000920\n000921\n000922\n000923\n000924\n000925\n000926\n000927\n000928\n000929\n000930\n000931\n000932\n000933\n000934\n000935\n000936\n000937\n000938\n000939\n000940\n000941\n000942\n000943\n000944\n000945\n000946\n000947\n000948\n000949\n000950\n000951\n000952\n000953\n000954\n000955\n000956\n000957\n000958\n000959\n000960\n000961\n000962\n000963\n000964\n000965\n000966\n000967\n000968\n000969\n000970\n000971\n000972\n000973\n000974\n000975\n000976\n000977\n000978\n000979\n000980\n000981\n000982\n000983\n000984\n000985\n000986\n000987\n000988\n000989\n000990\n000991\n000992\n000993\n000994\n000995\n000996\n000997\n000998\n000999\n001000\n001001\n001002\n001003\n001004\n001005\n001006\n001007\n001008\n001009\n001010\n001011\n001012\n001013\n001014\n001015\n001016\n001017\n001018\n001019\n001020\n001021\n001022\n001023\n001024\n001025\n001026\n001027\n001028\n001029\n001030\n001031\n001032\n001033\n001034\n001035\n001036\n001037\n001038\n001039\n001040\n001041\n001042\n001043\n001044\n001045\n001046\n001047\n001048\n001049\n001050\n001051\n001052\n001053\n001054\n001055\n001056\n001057\n001058\n001059\n001060\n001061\n001062\n001063\n001064\n001065\n001066\n001067\n001068\n001069\n001070\n001071\n001072\n001073\n001074\n001075\n001076\n001077\n001078\n001079\n001080\n001081\n001082\n001083\n001084\n001085\n001086\n001087\n001088\n001089\n001090\n001091\n001092\n001093\n001094\n001095\n001096\n001097\n001098\n001099\n001100\n001101\n001102\n001103\n001104\n001105\n001106\n001107\n001108\n001109\n001110\n001111\n001112\n001113\n001114\n001115\n001116\n001117\n001118\n001119\n001120\n001121\n001122\n001123\n001124\n001125\n001126\n001127\n001128\n001129\n001130\n001131\n001132\n001133\n001134\n001135\n001136\n001137\n001138\n001139\n001140\n001141\n001142\n001143\n001144\n001145\n001146\n001147\n001148\n001149\n001150\n001151\n001152\n001153\n001154\n001155\n001156\n001157\n001158\n001159\n001160\n001161\n001162\n001163\n001164\n001165\n001166\n001167\n001168\n001169\n001170\n001171\n001172\n001173\n001174\n001175\n001176\n001177\n001178\n001179\n001180\n001181\n001182\n001183\n001184\n001185\n001186\n001187\n001188\n001189\n001190\n001191\n001192\n001193\n001194\n001195\n001196\n001197\n001198\n001199\n001200\n001201\n001202\n001203\n001204\n001205\n001206\n001207\n001208\n001209\n001210\n001211\n001212\n001213\n001214\n001215\n001216\n001217\n001218\n001219\n001220\n001221\n001222\n001223\n001224\n001225\n001226\n001227\n001228\n001229\n001230\n001231\n001232\n001233\n001234\n001235\n001236\n001237\n001238\n001239\n001240\n001241\n001242\n001243\n001244\n001245\n001246\n001247\n001248\n001249\n001250\n001251\n001252\n001253\n001254\n001255\n001256\n001257\n001258\n001259\n001260\n001261\n001262\n001263\n001264\n001265\n001266\n001267\n001268\n001269\n001270\n001271\n001272\n001273\n001274\n001275\n001276\n001277\n001278\n001279\n001280\n001281\n001282\n001283\n001284\n001285\n001286\n001287\n001288\n001289\n001290\n001291\n001292\n001293\n001294\n001295\n001296\n001297\n001298\n001299\n001300\n001301\n001302\n001303\n001304\n001305\n001306\n001307\n001308\n001309\n001310\n001311\n001312\n001313\n001314\n001315\n001316\n001317\n001318\n001319\n001320\n001321\n001322\n001323\n001324\n001325\n001326\n001327\n001328\n001329\n001330\n001331\n001332\n001333\n001334\n001335\n001336\n001337\n001338\n001339\n001340\n001341\n001342\n001343\n001344\n001345\n001346\n001347\n001348\n001349\n001350\n001351\n001352\n001353\n001354\n001355\n001356\n001357\n001358\n001359\n001360\n001361\n001362\n001363\n001364\n001365\n001366\n001367\n001368\n001369\n001370\n001371\n001372\n001373\n001374\n001375\n001376\n001377\n001378\n001379\n001380\n001381\n001382\n001383\n001384\n001385\n001386\n001387\n001388\n001389\n001390\n001391\n001392\n001393\n001394\n001395\n001396\n001397\n001398\n001399\n001400\n001401\n001402\n001403\n001404\n001405\n001406\n001407\n001408\n001409\n001410\n001411\n001412\n001413\n001414\n001415\n001416\n001417\n001418\n001419\n001420\n001421\n001422\n001423\n001424\n001425\n001426\n001427\n001428\n001429\n001430\n001431\n001432\n001433\n001434\n001435\n001436\n001437\n001438\n001439\n001440\n001441\n001442\n001443\n001444\n001445\n001446\n001447\n001448\n001449\n001450\n001451\n001452\n001453\n001454\n001455\n001456\n001457\n001458\n001459\n001460\n001461\n001462\n001463\n001464\n001465\n001466\n001467\n001468\n001469\n001470\n001471\n001472\n001473\n001474\n001475\n001476\n001477\n001478\n001479\n001480\n001481\n001482\n001483\n001484\n001485\n001486\n001487\n001488\n001489\n001490\n001491\n001492\n001493\n001494\n001495\n001496\n001497\n001498\n001499\n001500\n001501\n001502\n001503\n001504\n001505\n001506\n001507\n001508\n001509\n001510\n001511\n001512\n001513\n001514\n001515\n001516\n001517\n001518\n001519\n001520\n001521\n001522\n001523\n001524\n001525\n001526\n001527\n001528\n001529\n001530\n001531\n001532\n001533\n001534\n001535\n001536\n001537\n001538\n001539\n001540\n001541\n001542\n001543\n001544\n001545\n001546\n001547\n001548\n001549\n001550\n001551\n001552\n001553\n001554\n001555\n001556\n001557\n001558\n001559\n001560\n001561\n001562\n001563\n001564\n001565\n001566\n001567\n001568\n001569\n001570\n001571\n001572\n001573\n001574\n001575\n001576\n001577\n001578\n001579\n001580\n001581\n001582\n001583\n001584\n001585\n001586\n001587\n001588\n001589\n001590\n001591\n001592\n001593\n001594\n001595\n001596\n001597\n001598\n001599\n001600\n001601\n001602\n001603\n001604\n001605\n001606\n001607\n001608\n001609\n001610\n001611\n001612\n001613\n001614\n001615\n001616\n001617\n001618\n001619\n001620\n001621\n001622\n001623\n001624\n001625\n001626\n001627\n001628\n001629\n001630\n001631\n001632\n001633\n001634\n001635\n001636\n001637\n001638\n001639\n001640\n001641\n001642\n001643\n001644\n001645\n001646\n001647\n001648\n001649\n001650\n001651\n001652\n001653\n001654\n001655\n001656\n001657\n001658\n001659\n001660\n001661\n001662\n001663\n001664\n001665\n001666\n001667\n001668\n001669\n001670\n001671\n001672\n001673\n001674\n001675\n001676\n001677\n001678\n001679\n001680\n001681\n001682\n001683\n001684\n001685\n001686\n001687\n001688\n001689\n001690\n001691\n001692\n001693\n001694\n001695\n001696\n001697\n001698\n001699\n001700\n001701\n001702\n001703\n001704\n001705\n001706\n001707\n001708\n001709\n001710\n001711\n001712\n001713\n001714\n001715\n001716\n001717\n001718\n001719\n001720\n001721\n001722\n001723\n001724\n001725\n001726\n001727\n001728\n001729\n001730\n001731\n001732\n001733\n001734\n001735\n001736\n001737\n001738\n001739\n001740\n001741\n001742\n001743\n001744\n001745\n001746\n001747\n001748\n001749\n001750\n001751\n001752\n001753\n001754\n001755\n001756\n001757\n001758\n001759\n001760\n001761\n001762\n001763\n001764\n001765\n001766\n001767\n001768\n001769\n001770\n001771\n001772\n001773\n001774\n001775\n001776\n001777\n001778\n001779\n001780\n001781\n001782\n001783\n001784\n001785\n001786\n001787\n001788\n001789\n001790\n001791\n001792\n001793\n001794\n001795\n001796\n001797\n001798\n001799\n001800\n001801\n001802\n001803\n001804\n001805\n001806\n001807\n001808\n001809\n001810\n001811\n001812\n001813\n001814\n001815\n001816\n001817\n001818\n001819\n001820\n001821\n001822\n001823\n001824\n001825\n001826\n001827\n001828\n001829\n001830\n001831\n001832\n001833\n001834\n001835\n001836\n001837\n001838\n001839\n001840\n001841\n001842\n001843\n001844\n001845\n001846\n001847\n001848\n001849\n001850\n001851\n001852\n001853\n001854\n001855\n001856\n001857\n001858\n001859\n001860\n001861\n001862\n001863\n001864\n001865\n001866\n001867\n001868\n001869\n001870\n001871\n001872\n001873\n001874\n001875\n001876\n001877\n001878\n001879\n001880\n001881\n001882\n001883\n001884\n001885\n001886\n001887\n001888\n001889\n001890\n001891\n001892\n001893\n001894\n001895\n001896\n001897\n001898\n001899\n001900\n001901\n001902\n001903\n001904\n001905\n001906\n001907\n001908\n001909\n001910\n001911\n001912\n001913\n001914\n001915\n001916\n001917\n001918\n001919\n001920\n001921\n001922\n001923\n001924\n001925\n001926\n001927\n001928\n001929\n001930\n001931\n001932\n001933\n001934\n001935\n001936\n001937\n001938\n001939\n001940\n001941\n001942\n001943\n001944\n001945\n001946\n001947\n001948\n001949\n001950\n001951\n001952\n001953\n001954\n001955\n001956\n001957\n001958\n001959\n001960\n001961\n001962\n001963\n001964\n001965\n001966\n001967\n001968\n001969\n001970\n001971\n001972\n001973\n001974\n001975\n001976\n001977\n001978\n001979\n001980\n001981\n001982\n001983\n001984\n001985\n001986\n001987\n001988\n001989\n001990\n001991\n001992\n001993\n001994\n001995\n001996\n001997\n001998\n001999\n002000\n002001\n002002\n002003\n002004\n002005\n002006\n002007\n002008\n002009\n002010\n002011\n002012\n002013\n002014\n002015\n002016\n002017\n002018\n002019\n002020\n002021\n002022\n002023\n002024\n002025\n002026\n002027\n002028\n002029\n002030\n002031\n002032\n002033\n002034\n002035\n002036\n002037\n002038\n002039\n002040\n002041\n002042\n002043\n002044\n002045\n002046\n002047\n002048\n002049\n002050\n002051\n002052\n002053\n002054\n002055\n002056\n002057\n002058\n002059\n002060\n002061\n002062\n002063\n002064\n002065\n002066\n002067\n002068\n002069\n002070\n002071\n002072\n002073\n002074\n002075\n002076\n002077\n002078\n002079\n002080\n002081\n002082\n002083\n002084\n002085\n002086\n002087\n002088\n002089\n002090\n002091\n002092\n002093\n002094\n002095\n002096\n002097\n002098\n002099\n002100\n002101\n002102\n002103\n002104\n002105\n002106\n002107\n002108\n002109\n002110\n002111\n002112\n002113\n002114\n002115\n002116\n002117\n002118\n002119\n002120\n002121\n002122\n002123\n002124\n002125\n002126\n002127\n002128\n002129\n002130\n002131\n002132\n002133\n002134\n002135\n002136\n002137\n002138\n002139\n002140\n002141\n002142\n002143\n002144\n002145\n002146\n002147\n002148\n002149\n002150\n002151\n002152\n002153\n002154\n002155\n002156\n002157\n002158\n002159\n002160\n002161\n002162\n002163\n002164\n002165\n002166\n002167\n002168\n002169\n002170\n002171\n002172\n002173\n002174\n002175\n002176\n002177\n002178\n002179\n002180\n002181\n002182\n002183\n002184\n002185\n002186\n002187\n002188\n002189\n002190\n002191\n002192\n002193\n002194\n002195\n002196\n002197\n002198\n002199\n002200\n002201\n002202\n002203\n002204\n002205\n002206\n002207\n002208\n002209\n002210\n002211\n002212\n002213\n002214\n002215\n002216\n002217\n002218\n002219\n002220\n002221\n002222\n002223\n002224\n002225\n002226\n002227\n002228\n002229\n002230\n002231\n002232\n002233\n002234\n002235\n002236\n002237\n002238\n002239\n002240\n002241\n002242\n002243\n002244\n002245\n002246\n002247\n002248\n002249\n002250\n002251\n002252\n002253\n002254\n002255\n002256\n002257\n002258\n002259\n002260\n002261\n002262\n002263\n002264\n002265\n002266\n002267\n002268\n002269\n002270\n002271\n002272\n002273\n002274\n002275\n002276\n002277\n002278\n002279\n002280\n002281\n002282\n002283\n002284\n002285\n002286\n002287\n002288\n002289\n002290\n002291\n002292\n002293\n002294\n002295\n002296\n002297\n002298\n002299\n002300\n002301\n002302\n002303\n002304\n002305\n002306\n002307\n002308\n002309\n002310\n002311\n002312\n002313\n002314\n002315\n002316\n002317\n002318\n002319\n002320\n002321\n002322\n002323\n002324\n002325\n002326\n002327\n002328\n002329\n002330\n002331\n002332\n002333\n002334\n002335\n002336\n002337\n002338\n002339\n002340\n002341\n002342\n002343\n002344\n002345\n002346\n002347\n002348\n002349\n002350\n002351\n002352\n002353\n002354\n002355\n002356\n002357\n002358\n002359\n002360\n002361\n002362\n002363\n002364\n002365\n002366\n002367\n002368\n002369\n002370\n002371\n002372\n002373\n002374\n002375\n002376\n002377\n002378\n002379\n002380\n002381\n002382\n002383\n002384\n002385\n002386\n002387\n002388\n002389\n002390\n002391\n002392\n002393\n002394\n002395\n002396\n002397\n002398\n002399\n002400\n002401\n002402\n002403\n002404\n002405\n002406\n002407\n002408\n002409\n002410\n002411\n002412\n002413\n002414\n002415\n002416\n002417\n002418\n002419\n002420\n002421\n002422\n002423\n002424\n002425\n002426\n002427\n002428\n002429\n002430\n002431\n002432\n002433\n002434\n002435\n002436\n002437\n002438\n002439\n002440\n002441\n002442\n002443\n002444\n002445\n002446\n002447\n002448\n002449\n002450\n002451\n002452\n002453\n002454\n002455\n002456\n002457\n002458\n002459\n002460\n002461\n002462\n002463\n002464\n002465\n002466\n002467\n002468\n002469\n002470\n002471\n002472\n002473\n002474\n002475\n002476\n002477\n002478\n002479\n002480\n002481\n002482\n002483\n002484\n002485\n002486\n002487\n002488\n002489\n002490\n002491\n002492\n002493\n002494\n002495\n002496\n002497\n002498\n002499\n002500\n002501\n002502\n002503\n002504\n002505\n002506\n002507\n002508\n002509\n002510\n002511\n002512\n002513\n002514\n002515\n002516\n002517\n002518\n002519\n002520\n002521\n002522\n002523\n002524\n002525\n002526\n002527\n002528\n002529\n002530\n002531\n002532\n002533\n002534\n002535\n002536\n002537\n002538\n002539\n002540\n002541\n002542\n002543\n002544\n002545\n002546\n002547\n002548\n002549\n002550\n002551\n002552\n002553\n002554\n002555\n002556\n002557\n002558\n002559\n002560\n002561\n002562\n002563\n002564\n002565\n002566\n002567\n002568\n002569\n002570\n002571\n002572\n002573\n002574\n002575\n002576\n002577\n002578\n002579\n002580\n002581\n002582\n002583\n002584\n002585\n002586\n002587\n002588\n002589\n002590\n002591\n002592\n002593\n002594\n002595\n002596\n002597\n002598\n002599\n002600\n002601\n002602\n002603\n002604\n002605\n002606\n002607\n002608\n002609\n002610\n002611\n002612\n002613\n002614\n002615\n002616\n002617\n002618\n002619\n002620\n002621\n002622\n002623\n002624\n002625\n002626\n002627\n002628\n002629\n002630\n002631\n002632\n002633\n002634\n002635\n002636\n002637\n002638\n002639\n002640\n002641\n002642\n002643\n002644\n002645\n002646\n002647\n002648\n002649\n002650\n002651\n002652\n002653\n002654\n002655\n002656\n002657\n002658\n002659\n002660\n002661\n002662\n002663\n002664\n002665\n002666\n002667\n002668\n002669\n002670\n002671\n002672\n002673\n002674\n002675\n002676\n002677\n002678\n002679\n002680\n002681\n002682\n002683\n002684\n002685\n002686\n002687\n002688\n002689\n002690\n002691\n002692\n002693\n002694\n002695\n002696\n002697\n002698\n002699\n002700\n002701\n002702\n002703\n002704\n002705\n002706\n002707\n002708\n002709\n002710\n002711\n002712\n002713\n002714\n002715\n002716\n002717\n002718\n002719\n002720\n002721\n002722\n002723\n002724\n002725\n002726\n002727\n002728\n002729\n002730\n002731\n002732\n002733\n002734\n002735\n002736\n002737\n002738\n002739\n002740\n002741\n002742\n002743\n002744\n002745\n002746\n002747\n002748\n002749\n002750\n002751\n002752\n002753\n002754\n002755\n002756\n002757\n002758\n002759\n002760\n002761\n002762\n002763\n002764\n002765\n002766\n002767\n002768\n002769\n002770\n002771\n002772\n002773\n002774\n002775\n002776\n002777\n002778\n002779\n002780\n002781\n002782\n002783\n002784\n002785\n002786\n002787\n002788\n002789\n002790\n002791\n002792\n002793\n002794\n002795\n002796\n002797\n002798\n002799\n002800\n002801\n002802\n002803\n002804\n002805\n002806\n002807\n002808\n002809\n002810\n002811\n002812\n002813\n002814\n002815\n002816\n002817\n002818\n002819\n002820\n002821\n002822\n002823\n002824\n002825\n002826\n002827\n002828\n002829\n002830\n002831\n002832\n002833\n002834\n002835\n002836\n002837\n002838\n002839\n002840\n002841\n002842\n002843\n002844\n002845\n002846\n002847\n002848\n002849\n002850\n002851\n002852\n002853\n002854\n002855\n002856\n002857\n002858\n002859\n002860\n002861\n002862\n002863\n002864\n002865\n002866\n002867\n002868\n002869\n002870\n002871\n002872\n002873\n002874\n002875\n002876\n002877\n002878\n002879\n002880\n002881\n002882\n002883\n002884\n002885\n002886\n002887\n002888\n002889\n002890\n002891\n002892\n002893\n002894\n002895\n002896\n002897\n002898\n002899\n002900\n002901\n002902\n002903\n002904\n002905\n002906\n002907\n002908\n002909\n002910\n002911\n002912\n002913\n002914\n002915\n002916\n002917\n002918\n002919\n002920\n002921\n002922\n002923\n002924\n002925\n002926\n002927\n002928\n002929\n002930\n002931\n002932\n002933\n002934\n002935\n002936\n002937\n002938\n002939\n002940\n002941\n002942\n002943\n002944\n002945\n002946\n002947\n002948\n002949\n002950\n002951\n002952\n002953\n002954\n002955\n002956\n002957\n002958\n002959\n002960\n002961\n002962\n002963\n002964\n002965\n002966\n002967\n002968\n002969\n002970\n002971\n002972\n002973\n002974\n002975\n002976\n002977\n002978\n002979\n002980\n002981\n002982\n002983\n002984\n002985\n002986\n002987\n002988\n002989\n002990\n002991\n002992\n002993\n002994\n002995\n002996\n002997\n002998\n002999\n003000\n003001\n003002\n003003\n003004\n003005\n003006\n003007\n003008\n003009\n003010\n003011\n003012\n003013\n003014\n003015\n003016\n003017\n003018\n003019\n003020\n003021\n003022\n003023\n003024\n003025\n003026\n003027\n003028\n003029\n003030\n003031\n003032\n003033\n003034\n003035\n003036\n003037\n003038\n003039\n003040\n003041\n003042\n003043\n003044\n003045\n003046\n003047\n003048\n003049\n003050\n003051\n003052\n003053\n003054\n003055\n003056\n003057\n003058\n003059\n003060\n003061\n003062\n003063\n003064\n003065\n003066\n003067\n003068\n003069\n003070\n003071\n003072\n003073\n003074\n003075\n003076\n003077\n003078\n003079\n003080\n003081\n003082\n003083\n003084\n003085\n003086\n003087\n003088\n003089\n003090\n003091\n003092\n003093\n003094\n003095\n003096\n003097\n003098\n003099\n003100\n003101\n003102\n003103\n003104\n003105\n003106\n003107\n003108\n003109\n003110\n003111\n003112\n003113\n003114\n003115\n003116\n003117\n003118\n003119\n003120\n003121\n003122\n003123\n003124\n003125\n003126\n003127\n003128\n003129\n003130\n003131\n003132\n003133\n003134\n003135\n003136\n003137\n003138\n003139\n003140\n003141\n003142\n003143\n003144\n003145\n003146\n003147\n003148\n003149\n003150\n003151\n003152\n003153\n003154\n003155\n003156\n003157\n003158\n003159\n003160\n003161\n003162\n003163\n003164\n003165\n003166\n003167\n003168\n003169\n003170\n003171\n003172\n003173\n003174\n003175\n003176\n003177\n003178\n003179\n003180\n003181\n003182\n003183\n003184\n003185\n003186\n003187\n003188\n003189\n003190\n003191\n003192\n003193\n003194\n003195\n003196\n003197\n003198\n003199\n003200\n003201\n003202\n003203\n003204\n003205\n003206\n003207\n003208\n003209\n003210\n003211\n003212\n003213\n003214\n003215\n003216\n003217\n003218\n003219\n003220\n003221\n003222\n003223\n003224\n003225\n003226\n003227\n003228\n003229\n003230\n003231\n003232\n003233\n003234\n003235\n003236\n003237\n003238\n003239\n003240\n003241\n003242\n003243\n003244\n003245\n003246\n003247\n003248\n003249\n003250\n003251\n003252\n003253\n003254\n003255\n003256\n003257\n003258\n003259\n003260\n003261\n003262\n003263\n003264\n003265\n003266\n003267\n003268\n003269\n003270\n003271\n003272\n003273\n003274\n003275\n003276\n003277\n003278\n003279\n003280\n003281\n003282\n003283\n003284\n003285\n003286\n003287\n003288\n003289\n003290\n003291\n003292\n003293\n003294\n003295\n003296\n003297\n003298\n003299\n003300\n003301\n003302\n003303\n003304\n003305\n003306\n003307\n003308\n003309\n003310\n003311\n003312\n003313\n003314\n003315\n003316\n003317\n003318\n003319\n003320\n003321\n003322\n003323\n003324\n003325\n003326\n003327\n003328\n003329\n003330\n003331\n003332\n003333\n003334\n003335\n003336\n003337\n003338\n003339\n003340\n003341\n003342\n003343\n003344\n003345\n003346\n003347\n003348\n003349\n003350\n003351\n003352\n003353\n003354\n003355\n003356\n003357\n003358\n003359\n003360\n003361\n003362\n003363\n003364\n003365\n003366\n003367\n003368\n003369\n003370\n003371\n003372\n003373\n003374\n003375\n003376\n003377\n003378\n003379\n003380\n003381\n003382\n003383\n003384\n003385\n003386\n003387\n003388\n003389\n003390\n003391\n003392\n003393\n003394\n003395\n003396\n003397\n003398\n003399\n003400\n003401\n003402\n003403\n003404\n003405\n003406\n003407\n003408\n003409\n003410\n003411\n003412\n003413\n003414\n003415\n003416\n003417\n003418\n003419\n003420\n003421\n003422\n003423\n003424\n003425\n003426\n003427\n003428\n003429\n003430\n003431\n003432\n003433\n003434\n003435\n003436\n003437\n003438\n003439\n003440\n003441\n003442\n003443\n003444\n003445\n003446\n003447\n003448\n003449\n003450\n003451\n003452\n003453\n003454\n003455\n003456\n003457\n003458\n003459\n003460\n003461\n003462\n003463\n003464\n003465\n003466\n003467\n003468\n003469\n003470\n003471\n003472\n003473\n003474\n003475\n003476\n003477\n003478\n003479\n003480\n003481\n003482\n003483\n003484\n003485\n003486\n003487\n003488\n003489\n003490\n003491\n003492\n003493\n003494\n003495\n003496\n003497\n003498\n003499\n003500\n003501\n003502\n003503\n003504\n003505\n003506\n003507\n003508\n003509\n003510\n003511\n003512\n003513\n003514\n003515\n003516\n003517\n003518\n003519\n003520\n003521\n003522\n003523\n003524\n003525\n003526\n003527\n003528\n003529\n003530\n003531\n003532\n003533\n003534\n003535\n003536\n003537\n003538\n003539\n003540\n003541\n003542\n003543\n003544\n003545\n003546\n003547\n003548\n003549\n003550\n003551\n003552\n003553\n003554\n003555\n003556\n003557\n003558\n003559\n003560\n003561\n003562\n003563\n003564\n003565\n003566\n003567\n003568\n003569\n003570\n003571\n003572\n003573\n003574\n003575\n003576\n003577\n003578\n003579\n003580\n003581\n003582\n003583\n003584\n003585\n003586\n003587\n003588\n003589\n003590\n003591\n003592\n003593\n003594\n003595\n003596\n003597\n003598\n003599\n003600\n003601\n003602\n003603\n003604\n003605\n003606\n003607\n003608\n003609\n003610\n003611\n003612\n003613\n003614\n003615\n003616\n003617\n003618\n003619\n003620\n003621\n003622\n003623\n003624\n003625\n003626\n003627\n003628\n003629\n003630\n003631\n003632\n003633\n003634\n003635\n003636\n003637\n003638\n003639\n003640\n003641\n003642\n003643\n003644\n003645\n003646\n003647\n003648\n003649\n003650\n003651\n003652\n003653\n003654\n003655\n003656\n003657\n003658\n003659\n003660\n003661\n003662\n003663\n003664\n003665\n003666\n003667\n003668\n003669\n003670\n003671\n003672\n003673\n003674\n003675\n003676\n003677\n003678\n003679\n003680\n003681\n003682\n003683\n003684\n003685\n003686\n003687\n003688\n003689\n003690\n003691\n003692\n003693\n003694\n003695\n003696\n003697\n003698\n003699\n003700\n003701\n003702\n003703\n003704\n003705\n003706\n003707\n003708\n003709\n003710\n003711\n003712\n003713\n003714\n003715\n003716\n003717\n003718\n003719\n003720\n003721\n003722\n003723\n003724\n003725\n003726\n003727\n003728\n003729\n003730\n003731\n003732\n003733\n003734\n003735\n003736\n003737\n003738\n003739\n003740\n003741\n003742\n003743\n003744\n003745\n003746\n003747\n003748\n003749\n003750\n003751\n003752\n003753\n003754\n003755\n003756\n003757\n003758\n003759\n003760\n003761\n003762\n003763\n003764\n003765\n003766\n003767\n003768\n003769\n003770\n003771\n003772\n003773\n003774\n003775\n003776\n003777\n003778\n003779\n003780\n003781\n003782\n003783\n003784\n003785\n003786\n003787\n003788\n003789\n003790\n003791\n003792\n003793\n003794\n003795\n003796\n003797\n003798\n003799\n003800\n003801\n003802\n003803\n003804\n003805\n003806\n003807\n003808\n003809\n003810\n003811\n003812\n003813\n003814\n003815\n003816\n003817\n003818\n003819\n003820\n003821\n003822\n003823\n003824\n003825\n003826\n003827\n003828\n003829\n003830\n003831\n003832\n003833\n003834\n003835\n003836\n003837\n003838\n003839\n003840\n003841\n003842\n003843\n003844\n003845\n003846\n003847\n003848\n003849\n003850\n003851\n003852\n003853\n003854\n003855\n003856\n003857\n003858\n003859\n003860\n003861\n003862\n003863\n003864\n003865\n003866\n003867\n003868\n003869\n003870\n003871\n003872\n003873\n003874\n003875\n003876\n003877\n003878\n003879\n003880\n003881\n003882\n003883\n003884\n003885\n003886\n003887\n003888\n003889\n003890\n003891\n003892\n003893\n003894\n003895\n003896\n003897\n003898\n003899\n003900\n003901\n003902\n003903\n003904\n003905\n003906\n003907\n003908\n003909\n003910\n003911\n003912\n003913\n003914\n003915\n003916\n003917\n003918\n003919\n003920\n003921\n003922\n003923\n003924\n003925\n003926\n003927\n003928\n003929\n003930\n003931\n003932\n003933\n003934\n003935\n003936\n003937\n003938\n003939\n003940\n003941\n003942\n003943\n003944\n003945\n003946\n003947\n003948\n003949\n003950\n003951\n003952\n003953\n003954\n003955\n003956\n003957\n003958\n003959\n003960\n003961\n003962\n003963\n003964\n003965\n003966\n003967\n003968\n003969\n003970\n003971\n003972\n003973\n003974\n003975\n003976\n003977\n003978\n003979\n003980\n003981\n003982\n003983\n003984\n003985\n003986\n003987\n003988\n003989\n003990\n003991\n003992\n003993\n003994\n003995\n003996\n003997\n003998\n003999\n004000\n004001\n004002\n004003\n004004\n004005\n004006\n004007\n004008\n004009\n004010\n004011\n004012\n004013\n004014\n004015\n004016\n004017\n004018\n004019\n004020\n004021\n004022\n004023\n004024\n004025\n004026\n004027\n004028\n004029\n004030\n004031\n004032\n004033\n004034\n004035\n004036\n004037\n004038\n004039\n004040\n004041\n004042\n004043\n004044\n004045\n004046\n004047\n004048\n004049\n004050\n004051\n004052\n004053\n004054\n004055\n004056\n004057\n004058\n004059\n004060\n004061\n004062\n004063\n004064\n004065\n004066\n004067\n004068\n004069\n004070\n004071\n004072\n004073\n004074\n004075\n004076\n004077\n004078\n004079\n004080\n004081\n004082\n004083\n004084\n004085\n004086\n004087\n004088\n004089\n004090\n004091\n004092\n004093\n004094\n004095\n004096\n004097\n004098\n004099\n004100\n004101\n004102\n004103\n004104\n004105\n004106\n004107\n004108\n004109\n004110\n004111\n004112\n004113\n004114\n004115\n004116\n004117\n004118\n004119\n004120\n004121\n004122\n004123\n004124\n004125\n004126\n004127\n004128\n004129\n004130\n004131\n004132\n004133\n004134\n004135\n004136\n004137\n004138\n004139\n004140\n004141\n004142\n004143\n004144\n004145\n004146\n004147\n004148\n004149\n004150\n004151\n004152\n004153\n004154\n004155\n004156\n004157\n004158\n004159\n004160\n004161\n004162\n004163\n004164\n004165\n004166\n004167\n004168\n004169\n004170\n004171\n004172\n004173\n004174\n004175\n004176\n004177\n004178\n004179\n004180\n004181\n004182\n004183\n004184\n004185\n004186\n004187\n004188\n004189\n004190\n004191\n004192\n004193\n004194\n004195\n004196\n004197\n004198\n004199\n004200\n004201\n004202\n004203\n004204\n004205\n004206\n004207\n004208\n004209\n004210\n004211\n004212\n004213\n004214\n004215\n004216\n004217\n004218\n004219\n004220\n004221\n004222\n004223\n004224\n004225\n004226\n004227\n004228\n004229\n004230\n004231\n004232\n004233\n004234\n004235\n004236\n004237\n004238\n004239\n004240\n004241\n004242\n004243\n004244\n004245\n004246\n004247\n004248\n004249\n004250\n004251\n004252\n004253\n004254\n004255\n004256\n004257\n004258\n004259\n004260\n004261\n004262\n004263\n004264\n004265\n004266\n004267\n004268\n004269\n004270\n004271\n004272\n004273\n004274\n004275\n004276\n004277\n004278\n004279\n004280\n004281\n004282\n004283\n004284\n004285\n004286\n004287\n004288\n004289\n004290\n004291\n004292\n004293\n004294\n004295\n004296\n004297\n004298\n004299\n004300\n004301\n004302\n004303\n004304\n004305\n004306\n004307\n004308\n004309\n004310\n004311\n004312\n004313\n004314\n004315\n004316\n004317\n004318\n004319\n004320\n004321\n004322\n004323\n004324\n004325\n004326\n004327\n004328\n004329\n004330\n004331\n004332\n004333\n004334\n004335\n004336\n004337\n004338\n004339\n004340\n004341\n004342\n004343\n004344\n004345\n004346\n004347\n004348\n004349\n004350\n004351\n004352\n004353\n004354\n004355\n004356\n004357\n004358\n004359\n004360\n004361\n004362\n004363\n004364\n004365\n004366\n004367\n004368\n004369\n004370\n004371\n004372\n004373\n004374\n004375\n004376\n004377\n004378\n004379\n004380\n004381\n004382\n004383\n004384\n004385\n004386\n004387\n004388\n004389\n004390\n004391\n004392\n004393\n004394\n004395\n004396\n004397\n004398\n004399\n004400\n004401\n004402\n004403\n004404\n004405\n004406\n004407\n004408\n004409\n004410\n004411\n004412\n004413\n004414\n004415\n004416\n004417\n004418\n004419\n004420\n004421\n004422\n004423\n004424\n004425\n004426\n004427\n004428\n004429\n004430\n004431\n004432\n004433\n004434\n004435\n004436\n004437\n004438\n004439\n004440\n004441\n004442\n004443\n004444\n004445\n004446\n004447\n004448\n004449\n004450\n004451\n004452\n004453\n004454\n004455\n004456\n004457\n004458\n004459\n004460\n004461\n004462\n004463\n004464\n004465\n004466\n004467\n004468\n004469\n004470\n004471\n004472\n004473\n004474\n004475\n004476\n004477\n004478\n004479\n004480\n004481\n004482\n004483\n004484\n004485\n004486\n004487\n004488\n004489\n004490\n004491\n004492\n004493\n004494\n004495\n004496\n004497\n004498\n004499\n004500\n004501\n004502\n004503\n004504\n004505\n004506\n004507\n004508\n004509\n004510\n004511\n004512\n004513\n004514\n004515\n004516\n004517\n004518\n004519\n004520\n004521\n004522\n004523\n004524\n004525\n004526\n004527\n004528\n004529\n004530\n004531\n004532\n004533\n004534\n004535\n004536\n004537\n004538\n004539\n004540\n004541\n004542\n004543\n004544\n004545\n004546\n004547\n004548\n004549\n004550\n004551\n004552\n004553\n004554\n004555\n004556\n004557\n004558\n004559\n004560\n004561\n004562\n004563\n004564\n004565\n004566\n004567\n004568\n004569\n004570\n004571\n004572\n004573\n004574\n004575\n004576\n004577\n004578\n004579\n004580\n004581\n004582\n004583\n004584\n004585\n004586\n004587\n004588\n004589\n004590\n004591\n004592\n004593\n004594\n004595\n004596\n004597\n004598\n004599\n004600\n004601\n004602\n004603\n004604\n004605\n004606\n004607\n004608\n004609\n004610\n004611\n004612\n004613\n004614\n004615\n004616\n004617\n004618\n004619\n004620\n004621\n004622\n004623\n004624\n004625\n004626\n004627\n004628\n004629\n004630\n004631\n004632\n004633\n004634\n004635\n004636\n004637\n004638\n004639\n004640\n004641\n004642\n004643\n004644\n004645\n004646\n004647\n004648\n004649\n004650\n004651\n004652\n004653\n004654\n004655\n004656\n004657\n004658\n004659\n004660\n004661\n004662\n004663\n004664\n004665\n004666\n004667\n004668\n004669\n004670\n004671\n004672\n004673\n004674\n004675\n004676\n004677\n004678\n004679\n004680\n004681\n004682\n004683\n004684\n004685\n004686\n004687\n004688\n004689\n004690\n004691\n004692\n004693\n004694\n004695\n004696\n004697\n004698\n004699\n004700\n004701\n004702\n004703\n004704\n004705\n004706\n004707\n004708\n004709\n004710\n004711\n004712\n004713\n004714\n004715\n004716\n004717\n004718\n004719\n004720\n004721\n004722\n004723\n004724\n004725\n004726\n004727\n004728\n004729\n004730\n004731\n004732\n004733\n004734\n004735\n004736\n004737\n004738\n004739\n004740\n004741\n004742\n004743\n004744\n004745\n004746\n004747\n004748\n004749\n004750\n004751\n004752\n004753\n004754\n004755\n004756\n004757\n004758\n004759\n004760\n004761\n004762\n004763\n004764\n004765\n004766\n004767\n004768\n004769\n004770\n004771\n004772\n004773\n004774\n004775\n004776\n004777\n004778\n004779\n004780\n004781\n004782\n004783\n004784\n004785\n004786\n004787\n004788\n004789\n004790\n004791\n004792\n004793\n004794\n004795\n004796\n004797\n004798\n004799\n004800\n004801\n004802\n004803\n004804\n004805\n004806\n004807\n004808\n004809\n004810\n004811\n004812\n004813\n004814\n004815\n004816\n004817\n004818\n004819\n004820\n004821\n004822\n004823\n004824\n004825\n004826\n004827\n004828\n004829\n004830\n004831\n004832\n004833\n004834\n004835\n004836\n004837\n004838\n004839\n004840\n004841\n004842\n004843\n004844\n004845\n004846\n004847\n004848\n004849\n004850\n004851\n004852\n004853\n004854\n004855\n004856\n004857\n004858\n004859\n004860\n004861\n004862\n004863\n004864\n004865\n004866\n004867\n004868\n004869\n004870\n004871\n004872\n004873\n004874\n004875\n004876\n004877\n004878\n004879\n004880\n004881\n004882\n004883\n004884\n004885\n004886\n004887\n004888\n004889\n004890\n004891\n004892\n004893\n004894\n004895\n004896\n004897\n004898\n004899\n004900\n004901\n004902\n004903\n004904\n004905\n004906\n004907\n004908\n004909\n004910\n004911\n004912\n004913\n004914\n004915\n004916\n004917\n004918\n004919\n004920\n004921\n004922\n004923\n004924\n004925\n004926\n004927\n004928\n004929\n004930\n004931\n004932\n004933\n004934\n004935\n004936\n004937\n004938\n004939\n004940\n004941\n004942\n004943\n004944\n004945\n004946\n004947\n004948\n004949\n004950\n004951\n004952\n004953\n004954\n004955\n004956\n004957\n004958\n004959\n004960\n004961\n004962\n004963\n004964\n004965\n004966\n004967\n004968\n004969\n004970\n004971\n004972\n004973\n004974\n004975\n004976\n004977\n004978\n004979\n004980\n004981\n004982\n004983\n004984\n004985\n004986\n004987\n004988\n004989\n004990\n004991\n004992\n004993\n004994\n004995\n004996\n004997\n004998\n004999\n005000\n005001\n005002\n005003\n005004\n005005\n005006\n005007\n005008\n005009\n005010\n005011\n005012\n005013\n005014\n005015\n005016\n005017\n005018\n005019\n005020\n005021\n005022\n005023\n005024\n005025\n005026\n005027\n005028\n005029\n005030\n005031\n005032\n005033\n005034\n005035\n005036\n005037\n005038\n005039\n005040\n005041\n005042\n005043\n005044\n005045\n005046\n005047\n005048\n005049\n005050\n005051\n005052\n005053\n005054\n005055\n005056\n005057\n005058\n005059\n005060\n005061\n005062\n005063\n005064\n005065\n005066\n005067\n005068\n005069\n005070\n005071\n005072\n005073\n005074\n005075\n005076\n005077\n005078\n005079\n005080\n005081\n005082\n005083\n005084\n005085\n005086\n005087\n005088\n005089\n005090\n005091\n005092\n005093\n005094\n005095\n005096\n005097\n005098\n005099\n005100\n005101\n005102\n005103\n005104\n005105\n005106\n005107\n005108\n005109\n005110\n005111\n005112\n005113\n005114\n005115\n005116\n005117\n005118\n005119\n005120\n005121\n005122\n005123\n005124\n005125\n005126\n005127\n005128\n005129\n005130\n005131\n005132\n005133\n005134\n005135\n005136\n005137\n005138\n005139\n005140\n005141\n005142\n005143\n005144\n005145\n005146\n005147\n005148\n005149\n005150\n005151\n005152\n005153\n005154\n005155\n005156\n005157\n005158\n005159\n005160\n005161\n005162\n005163\n005164\n005165\n005166\n005167\n005168\n005169\n005170\n005171\n005172\n005173\n005174\n005175\n005176\n005177\n005178\n005179\n005180\n005181\n005182\n005183\n005184\n005185\n005186\n005187\n005188\n005189\n005190\n005191\n005192\n005193\n005194\n005195\n005196\n005197\n005198\n005199\n005200\n005201\n005202\n005203\n005204\n005205\n005206\n005207\n005208\n005209\n005210\n005211\n005212\n005213\n005214\n005215\n005216\n005217\n005218\n005219\n005220\n005221\n005222\n005223\n005224\n005225\n005226\n005227\n005228\n005229\n005230\n005231\n005232\n005233\n005234\n005235\n005236\n005237\n005238\n005239\n005240\n005241\n005242\n005243\n005244\n005245\n005246\n005247\n005248\n005249\n005250\n005251\n005252\n005253\n005254\n005255\n005256\n005257\n005258\n005259\n005260\n005261\n005262\n005263\n005264\n005265\n005266\n005267\n005268\n005269\n005270\n005271\n005272\n005273\n005274\n005275\n005276\n005277\n005278\n005279\n005280\n005281\n005282\n005283\n005284\n005285\n005286\n005287\n005288\n005289\n005290\n005291\n005292\n005293\n005294\n005295\n005296\n005297\n005298\n005299\n005300\n005301\n005302\n005303\n005304\n005305\n005306\n005307\n005308\n005309\n005310\n005311\n005312\n005313\n005314\n005315\n005316\n005317\n005318\n005319\n005320\n005321\n005322\n005323\n005324\n005325\n005326\n005327\n005328\n005329\n005330\n005331\n005332\n005333\n005334\n005335\n005336\n005337\n005338\n005339\n005340\n005341\n005342\n005343\n005344\n005345\n005346\n005347\n005348\n005349\n005350\n005351\n005352\n005353\n005354\n005355\n005356\n005357\n005358\n005359\n005360\n005361\n005362\n005363\n005364\n005365\n005366\n005367\n005368\n005369\n005370\n005371\n005372\n005373\n005374\n005375\n005376\n005377\n005378\n005379\n005380\n005381\n005382\n005383\n005384\n005385\n005386\n005387\n005388\n005389\n005390\n005391\n005392\n005393\n005394\n005395\n005396\n005397\n005398\n005399\n005400\n005401\n005402\n005403\n005404\n005405\n005406\n005407\n005408\n005409\n005410\n005411\n005412\n005413\n005414\n005415\n005416\n005417\n005418\n005419\n005420\n005421\n005422\n005423\n005424\n005425\n005426\n005427\n005428\n005429\n005430\n005431\n005432\n005433\n005434\n005435\n005436\n005437\n005438\n005439\n005440\n005441\n005442\n005443\n005444\n005445\n005446\n005447\n005448\n005449\n005450\n005451\n005452\n005453\n005454\n005455\n005456\n005457\n005458\n005459\n005460\n005461\n005462\n005463\n005464\n005465\n005466\n005467\n005468\n005469\n005470\n005471\n005472\n005473\n005474\n005475\n005476\n005477\n005478\n005479\n005480\n005481\n005482\n005483\n005484\n005485\n005486\n005487\n005488\n005489\n005490\n005491\n005492\n005493\n005494\n005495\n005496\n005497\n005498\n005499\n005500\n005501\n005502\n005503\n005504\n005505\n005506\n005507\n005508\n005509\n005510\n005511\n005512\n005513\n005514\n005515\n005516\n005517\n005518\n005519\n005520\n005521\n005522\n005523\n005524\n005525\n005526\n005527\n005528\n005529\n005530\n005531\n005532\n005533\n005534\n005535\n005536\n005537\n005538\n005539\n005540\n005541\n005542\n005543\n005544\n005545\n005546\n005547\n005548\n005549\n005550\n005551\n005552\n005553\n005554\n005555\n005556\n005557\n005558\n005559\n005560\n005561\n005562\n005563\n005564\n005565\n005566\n005567\n005568\n005569\n005570\n005571\n005572\n005573\n005574\n005575\n005576\n005577\n005578\n005579\n005580\n005581\n005582\n005583\n005584\n005585\n005586\n005587\n005588\n005589\n005590\n005591\n005592\n005593\n005594\n005595\n005596\n005597\n005598\n005599\n005600\n005601\n005602\n005603\n005604\n005605\n005606\n005607\n005608\n005609\n005610\n005611\n005612\n005613\n005614\n005615\n005616\n005617\n005618\n005619\n005620\n005621\n005622\n005623\n005624\n005625\n005626\n005627\n005628\n005629\n005630\n005631\n005632\n005633\n005634\n005635\n005636\n005637\n005638\n005639\n005640\n005641\n005642\n005643\n005644\n005645\n005646\n005647\n005648\n005649\n005650\n005651\n005652\n005653\n005654\n005655\n005656\n005657\n005658\n005659\n005660\n005661\n005662\n005663\n005664\n005665\n005666\n005667\n005668\n005669\n005670\n005671\n005672\n005673\n005674\n005675\n005676\n005677\n005678\n005679\n005680\n005681\n005682\n005683\n005684\n005685\n005686\n005687\n005688\n005689\n005690\n005691\n005692\n005693\n005694\n005695\n005696\n005697\n005698\n005699\n005700\n005701\n005702\n005703\n005704\n005705\n005706\n005707\n005708\n005709\n005710\n005711\n005712\n005713\n005714\n005715\n005716\n005717\n005718\n005719\n005720\n005721\n005722\n005723\n005724\n005725\n005726\n005727\n005728\n005729\n005730\n005731\n005732\n005733\n005734\n005735\n005736\n005737\n005738\n005739\n005740\n005741\n005742\n005743\n005744\n005745\n005746\n005747\n005748\n005749\n005750\n005751\n005752\n005753\n005754\n005755\n005756\n005757\n005758\n005759\n005760\n005761\n005762\n005763\n005764\n005765\n005766\n005767\n005768\n005769\n005770\n005771\n005772\n005773\n005774\n005775\n005776\n005777\n005778\n005779\n005780\n005781\n005782\n005783\n005784\n005785\n005786\n005787\n005788\n005789\n005790\n005791\n005792\n005793\n005794\n005795\n005796\n005797\n005798\n005799\n005800\n005801\n005802\n005803\n005804\n005805\n005806\n005807\n005808\n005809\n005810\n005811\n005812\n005813\n005814\n005815\n005816\n005817\n005818\n005819\n005820\n005821\n005822\n005823\n005824\n005825\n005826\n005827\n005828\n005829\n005830\n005831\n005832\n005833\n005834\n005835\n005836\n005837\n005838\n005839\n005840\n005841\n005842\n005843\n005844\n005845\n005846\n005847\n005848\n005849\n005850\n005851\n005852\n005853\n005854\n005855\n005856\n005857\n005858\n005859\n005860\n005861\n005862\n005863\n005864\n005865\n005866\n005867\n005868\n005869\n005870\n005871\n005872\n005873\n005874\n005875\n005876\n005877\n005878\n005879\n005880\n005881\n005882\n005883\n005884\n005885\n005886\n005887\n005888\n005889\n005890\n005891\n005892\n005893\n005894\n005895\n005896\n005897\n005898\n005899\n005900\n005901\n005902\n005903\n005904\n005905\n005906\n005907\n005908\n005909\n005910\n005911\n005912\n005913\n005914\n005915\n005916\n005917\n005918\n005919\n005920\n005921\n005922\n005923\n005924\n005925\n005926\n005927\n005928\n005929\n005930\n005931\n005932\n005933\n005934\n005935\n005936\n005937\n005938\n005939\n005940\n005941\n005942\n005943\n005944\n005945\n005946\n005947\n005948\n005949\n005950\n005951\n005952\n005953\n005954\n005955\n005956\n005957\n005958\n005959\n005960\n005961\n005962\n005963\n005964\n005965\n005966\n005967\n005968\n005969\n005970\n005971\n005972\n005973\n005974\n005975\n005976\n005977\n005978\n005979\n005980\n005981\n005982\n005983\n005984\n005985\n005986\n005987\n005988\n005989\n005990\n005991\n005992\n005993\n005994\n005995\n005996\n005997\n005998\n005999\n006000\n006001\n006002\n006003\n006004\n006005\n006006\n006007\n006008\n006009\n006010\n006011\n006012\n006013\n006014\n006015\n006016\n006017\n006018\n006019\n006020\n006021\n006022\n006023\n006024\n006025\n006026\n006027\n006028\n006029\n006030\n006031\n006032\n006033\n006034\n006035\n006036\n006037\n006038\n006039\n006040\n006041\n006042\n006043\n006044\n006045\n006046\n006047\n006048\n006049\n006050\n006051\n006052\n006053\n006054\n006055\n006056\n006057\n006058\n006059\n006060\n006061\n006062\n006063\n006064\n006065\n006066\n006067\n006068\n006069\n006070\n006071\n006072\n006073\n006074\n006075\n006076\n006077\n006078\n006079\n006080\n006081\n006082\n006083\n006084\n006085\n006086\n006087\n006088\n006089\n006090\n006091\n006092\n006093\n006094\n006095\n006096\n006097\n006098\n006099\n006100\n006101\n006102\n006103\n006104\n006105\n006106\n006107\n006108\n006109\n006110\n006111\n006112\n006113\n006114\n006115\n006116\n006117\n006118\n006119\n006120\n006121\n006122\n006123\n006124\n006125\n006126\n006127\n006128\n006129\n006130\n006131\n006132\n006133\n006134\n006135\n006136\n006137\n006138\n006139\n006140\n006141\n006142\n006143\n006144\n006145\n006146\n006147\n006148\n006149\n006150\n006151\n006152\n006153\n006154\n006155\n006156\n006157\n006158\n006159\n006160\n006161\n006162\n006163\n006164\n006165\n006166\n006167\n006168\n006169\n006170\n006171\n006172\n006173\n006174\n006175\n006176\n006177\n006178\n006179\n006180\n006181\n006182\n006183\n006184\n006185\n006186\n006187\n006188\n006189\n006190\n006191\n006192\n006193\n006194\n006195\n006196\n006197\n006198\n006199\n006200\n006201\n006202\n006203\n006204\n006205\n006206\n006207\n006208\n006209\n006210\n006211\n006212\n006213\n006214\n006215\n006216\n006217\n006218\n006219\n006220\n006221\n006222\n006223\n006224\n006225\n006226\n006227\n006228\n006229\n006230\n006231\n006232\n006233\n006234\n006235\n006236\n006237\n006238\n006239\n006240\n006241\n006242\n006243\n006244\n006245\n006246\n006247\n006248\n006249\n006250\n006251\n006252\n006253\n006254\n006255\n006256\n006257\n006258\n006259\n006260\n006261\n006262\n006263\n006264\n006265\n006266\n006267\n006268\n006269\n006270\n006271\n006272\n006273\n006274\n006275\n006276\n006277\n006278\n006279\n006280\n006281\n006282\n006283\n006284\n006285\n006286\n006287\n006288\n006289\n006290\n006291\n006292\n006293\n006294\n006295\n006296\n006297\n006298\n006299\n006300\n006301\n006302\n006303\n006304\n006305\n006306\n006307\n006308\n006309\n006310\n006311\n006312\n006313\n006314\n006315\n006316\n006317\n006318\n006319\n006320\n006321\n006322\n006323\n006324\n006325\n006326\n006327\n006328\n006329\n006330\n006331\n006332\n006333\n006334\n006335\n006336\n006337\n006338\n006339\n006340\n006341\n006342\n006343\n006344\n006345\n006346\n006347\n006348\n006349\n006350\n006351\n006352\n006353\n006354\n006355\n006356\n006357\n006358\n006359\n006360\n006361\n006362\n006363\n006364\n006365\n006366\n006367\n006368\n006369\n006370\n006371\n006372\n006373\n006374\n006375\n006376\n006377\n006378\n006379\n006380\n006381\n006382\n006383\n006384\n006385\n006386\n006387\n006388\n006389\n006390\n006391\n006392\n006393\n006394\n006395\n006396\n006397\n006398\n006399\n006400\n006401\n006402\n006403\n006404\n006405\n006406\n006407\n006408\n006409\n006410\n006411\n006412\n006413\n006414\n006415\n006416\n006417\n006418\n006419\n006420\n006421\n006422\n006423\n006424\n006425\n006426\n006427\n006428\n006429\n006430\n006431\n006432\n006433\n006434\n006435\n006436\n006437\n006438\n006439\n006440\n006441\n006442\n006443\n006444\n006445\n006446\n006447\n006448\n006449\n006450\n006451\n006452\n006453\n006454\n006455\n006456\n006457\n006458\n006459\n006460\n006461\n006462\n006463\n006464\n006465\n006466\n006467\n006468\n006469\n006470\n006471\n006472\n006473\n006474\n006475\n006476\n006477\n006478\n006479\n006480\n006481\n006482\n006483\n006484\n006485\n006486\n006487\n006488\n006489\n006490\n006491\n006492\n006493\n006494\n006495\n006496\n006497\n006498\n006499\n006500\n006501\n006502\n006503\n006504\n006505\n006506\n006507\n006508\n006509\n006510\n006511\n006512\n006513\n006514\n006515\n006516\n006517\n006518\n006519\n006520\n006521\n006522\n006523\n006524\n006525\n006526\n006527\n006528\n006529\n006530\n006531\n006532\n006533\n006534\n006535\n006536\n006537\n006538\n006539\n006540\n006541\n006542\n006543\n006544\n006545\n006546\n006547\n006548\n006549\n006550\n006551\n006552\n006553\n006554\n006555\n006556\n006557\n006558\n006559\n006560\n006561\n006562\n006563\n006564\n006565\n006566\n006567\n006568\n006569\n006570\n006571\n006572\n006573\n006574\n006575\n006576\n006577\n006578\n006579\n006580\n006581\n006582\n006583\n006584\n006585\n006586\n006587\n006588\n006589\n006590\n006591\n006592\n006593\n006594\n006595\n006596\n006597\n006598\n006599\n006600\n006601\n006602\n006603\n006604\n006605\n006606\n006607\n006608\n006609\n006610\n006611\n006612\n006613\n006614\n006615\n006616\n006617\n006618\n006619\n006620\n006621\n006622\n006623\n006624\n006625\n006626\n006627\n006628\n006629\n006630\n006631\n006632\n006633\n006634\n006635\n006636\n006637\n006638\n006639\n006640\n006641\n006642\n006643\n006644\n006645\n006646\n006647\n006648\n006649\n006650\n006651\n006652\n006653\n006654\n006655\n006656\n006657\n006658\n006659\n006660\n006661\n006662\n006663\n006664\n006665\n006666\n006667\n006668\n006669\n006670\n006671\n006672\n006673\n006674\n006675\n006676\n006677\n006678\n006679\n006680\n006681\n006682\n006683\n006684\n006685\n006686\n006687\n006688\n006689\n006690\n006691\n006692\n006693\n006694\n006695\n006696\n006697\n006698\n006699\n006700\n006701\n006702\n006703\n006704\n006705\n006706\n006707\n006708\n006709\n006710\n006711\n006712\n006713\n006714\n006715\n006716\n006717\n006718\n006719\n006720\n006721\n006722\n006723\n006724\n006725\n006726\n006727\n006728\n006729\n006730\n006731\n006732\n006733\n006734\n006735\n006736\n006737\n006738\n006739\n006740\n006741\n006742\n006743\n006744\n006745\n006746\n006747\n006748\n006749\n006750\n006751\n006752\n006753\n006754\n006755\n006756\n006757\n006758\n006759\n006760\n006761\n006762\n006763\n006764\n006765\n006766\n006767\n006768\n006769\n006770\n006771\n006772\n006773\n006774\n006775\n006776\n006777\n006778\n006779\n006780\n006781\n006782\n006783\n006784\n006785\n006786\n006787\n006788\n006789\n006790\n006791\n006792\n006793\n006794\n006795\n006796\n006797\n006798\n006799\n006800\n006801\n006802\n006803\n006804\n006805\n006806\n006807\n006808\n006809\n006810\n006811\n006812\n006813\n006814\n006815\n006816\n006817\n006818\n006819\n006820\n006821\n006822\n006823\n006824\n006825\n006826\n006827\n006828\n006829\n006830\n006831\n006832\n006833\n006834\n006835\n006836\n006837\n006838\n006839\n006840\n006841\n006842\n006843\n006844\n006845\n006846\n006847\n006848\n006849\n006850\n006851\n006852\n006853\n006854\n006855\n006856\n006857\n006858\n006859\n006860\n006861\n006862\n006863\n006864\n006865\n006866\n006867\n006868\n006869\n006870\n006871\n006872\n006873\n006874\n006875\n006876\n006877\n006878\n006879\n006880\n006881\n006882\n006883\n006884\n006885\n006886\n006887\n006888\n006889\n006890\n006891\n006892\n006893\n006894\n006895\n006896\n006897\n006898\n006899\n006900\n006901\n006902\n006903\n006904\n006905\n006906\n006907\n006908\n006909\n006910\n006911\n006912\n006913\n006914\n006915\n006916\n006917\n006918\n006919\n006920\n006921\n006922\n006923\n006924\n006925\n006926\n006927\n006928\n006929\n006930\n006931\n006932\n006933\n006934\n006935\n006936\n006937\n006938\n006939\n006940\n006941\n006942\n006943\n006944\n006945\n006946\n006947\n006948\n006949\n006950\n006951\n006952\n006953\n006954\n006955\n006956\n006957\n006958\n006959\n006960\n006961\n006962\n006963\n006964\n006965\n006966\n006967\n006968\n006969\n006970\n006971\n006972\n006973\n006974\n006975\n006976\n006977\n006978\n006979\n006980\n006981\n006982\n006983\n006984\n006985\n006986\n006987\n006988\n006989\n006990\n006991\n006992\n006993\n006994\n006995\n006996\n006997\n006998\n006999\n007000\n007001\n007002\n007003\n007004\n007005\n007006\n007007\n007008\n007009\n007010\n007011\n007012\n007013\n007014\n007015\n007016\n007017\n007018\n007019\n007020\n007021\n007022\n007023\n007024\n007025\n007026\n007027\n007028\n007029\n007030\n007031\n007032\n007033\n007034\n007035\n007036\n007037\n007038\n007039\n007040\n007041\n007042\n007043\n007044\n007045\n007046\n007047\n007048\n007049\n007050\n007051\n007052\n007053\n007054\n007055\n007056\n007057\n007058\n007059\n007060\n007061\n007062\n007063\n007064\n007065\n007066\n007067\n007068\n007069\n007070\n007071\n007072\n007073\n007074\n007075\n007076\n007077\n007078\n007079\n007080\n007081\n007082\n007083\n007084\n007085\n007086\n007087\n007088\n007089\n007090\n007091\n007092\n007093\n007094\n007095\n007096\n007097\n007098\n007099\n007100\n007101\n007102\n007103\n007104\n007105\n007106\n007107\n007108\n007109\n007110\n007111\n007112\n007113\n007114\n007115\n007116\n007117\n007118\n007119\n007120\n007121\n007122\n007123\n007124\n007125\n007126\n007127\n007128\n007129\n007130\n007131\n007132\n007133\n007134\n007135\n007136\n007137\n007138\n007139\n007140\n007141\n007142\n007143\n007144\n007145\n007146\n007147\n007148\n007149\n007150\n007151\n007152\n007153\n007154\n007155\n007156\n007157\n007158\n007159\n007160\n007161\n007162\n007163\n007164\n007165\n007166\n007167\n007168\n007169\n007170\n007171\n007172\n007173\n007174\n007175\n007176\n007177\n007178\n007179\n007180\n007181\n007182\n007183\n007184\n007185\n007186\n007187\n007188\n007189\n007190\n007191\n007192\n007193\n007194\n007195\n007196\n007197\n007198\n007199\n007200\n007201\n007202\n007203\n007204\n007205\n007206\n007207\n007208\n007209\n007210\n007211\n007212\n007213\n007214\n007215\n007216\n007217\n007218\n007219\n007220\n007221\n007222\n007223\n007224\n007225\n007226\n007227\n007228\n007229\n007230\n007231\n007232\n007233\n007234\n007235\n007236\n007237\n007238\n007239\n007240\n007241\n007242\n007243\n007244\n007245\n007246\n007247\n007248\n007249\n007250\n007251\n007252\n007253\n007254\n007255\n007256\n007257\n007258\n007259\n007260\n007261\n007262\n007263\n007264\n007265\n007266\n007267\n007268\n007269\n007270\n007271\n007272\n007273\n007274\n007275\n007276\n007277\n007278\n007279\n007280\n007281\n007282\n007283\n007284\n007285\n007286\n007287\n007288\n007289\n007290\n007291\n007292\n007293\n007294\n007295\n007296\n007297\n007298\n007299\n007300\n007301\n007302\n007303\n007304\n007305\n007306\n007307\n007308\n007309\n007310\n007311\n007312\n007313\n007314\n007315\n007316\n007317\n007318\n007319\n007320\n007321\n007322\n007323\n007324\n007325\n007326\n007327\n007328\n007329\n007330\n007331\n007332\n007333\n007334\n007335\n007336\n007337\n007338\n007339\n007340\n007341\n007342\n007343\n007344\n007345\n007346\n007347\n007348\n007349\n007350\n007351\n007352\n007353\n007354\n007355\n007356\n007357\n007358\n007359\n007360\n007361\n007362\n007363\n007364\n007365\n007366\n007367\n007368\n007369\n007370\n007371\n007372\n007373\n007374\n007375\n007376\n007377\n007378\n007379\n007380\n007381\n007382\n007383\n007384\n007385\n007386\n007387\n007388\n007389\n007390\n007391\n007392\n007393\n007394\n007395\n007396\n007397\n007398\n007399\n007400\n007401\n007402\n007403\n007404\n007405\n007406\n007407\n007408\n007409\n007410\n007411\n007412\n007413\n007414\n007415\n007416\n007417\n007418\n007419\n007420\n007421\n007422\n007423\n007424\n007425\n007426\n007427\n007428\n007429\n007430\n007431\n007432\n007433\n007434\n007435\n007436\n007437\n007438\n007439\n007440\n007441\n007442\n007443\n007444\n007445\n007446\n007447\n007448\n007449\n007450\n007451\n007452\n007453\n007454\n007455\n007456\n007457\n007458\n007459\n007460\n007461\n007462\n007463\n007464\n007465\n007466\n007467\n007468\n007469\n007470\n007471\n007472\n007473\n007474\n007475\n007476\n007477\n007478\n007479\n007480"
  },
  {
    "path": "tools/data/KITTI/ImageSets/val.txt",
    "content": "000001\n000002\n000004\n000005\n000006\n000008\n000015\n000019\n000020\n000021\n000023\n000024\n000025\n000027\n000028\n000031\n000033\n000035\n000037\n000039\n000040\n000042\n000047\n000048\n000050\n000052\n000053\n000058\n000059\n000061\n000062\n000063\n000065\n000066\n000076\n000077\n000078\n000081\n000089\n000090\n000093\n000094\n000098\n000102\n000104\n000106\n000107\n000108\n000116\n000117\n000118\n000122\n000124\n000126\n000128\n000132\n000134\n000135\n000137\n000139\n000140\n000143\n000147\n000151\n000152\n000153\n000156\n000159\n000161\n000167\n000168\n000169\n000170\n000173\n000174\n000175\n000181\n000182\n000183\n000186\n000187\n000188\n000190\n000191\n000192\n000194\n000195\n000196\n000197\n000199\n000201\n000203\n000204\n000207\n000211\n000212\n000213\n000216\n000218\n000223\n000224\n000226\n000229\n000230\n000231\n000234\n000235\n000236\n000237\n000239\n000242\n000246\n000247\n000248\n000249\n000250\n000251\n000252\n000260\n000262\n000263\n000265\n000266\n000268\n000269\n000270\n000272\n000273\n000278\n000279\n000281\n000283\n000284\n000289\n000290\n000291\n000293\n000297\n000301\n000302\n000305\n000307\n000308\n000309\n000311\n000312\n000314\n000315\n000319\n000320\n000321\n000323\n000324\n000327\n000328\n000329\n000332\n000333\n000335\n000336\n000340\n000341\n000343\n000345\n000346\n000347\n000350\n000351\n000352\n000354\n000355\n000356\n000357\n000359\n000360\n000361\n000362\n000365\n000366\n000369\n000370\n000372\n000373\n000376\n000377\n000378\n000379\n000381\n000382\n000383\n000385\n000386\n000388\n000391\n000392\n000393\n000394\n000395\n000396\n000397\n000398\n000399\n000401\n000402\n000403\n000404\n000407\n000408\n000409\n000413\n000414\n000415\n000419\n000420\n000422\n000427\n000428\n000429\n000430\n000436\n000437\n000440\n000443\n000446\n000448\n000450\n000451\n000452\n000453\n000454\n000455\n000457\n000459\n000463\n000468\n000469\n000472\n000473\n000475\n000476\n000477\n000478\n000479\n000480\n000481\n000485\n000486\n000489\n000491\n000492\n000493\n000494\n000495\n000496\n000498\n000499\n000503\n000504\n000506\n000508\n000509\n000510\n000512\n000515\n000517\n000519\n000521\n000524\n000527\n000528\n000530\n000533\n000536\n000541\n000542\n000543\n000545\n000546\n000548\n000551\n000554\n000555\n000558\n000559\n000560\n000561\n000564\n000566\n000567\n000568\n000569\n000571\n000572\n000581\n000583\n000588\n000589\n000590\n000591\n000595\n000600\n000601\n000604\n000610\n000611\n000612\n000613\n000614\n000615\n000618\n000619\n000620\n000624\n000625\n000626\n000628\n000630\n000634\n000635\n000636\n000639\n000642\n000644\n000645\n000647\n000648\n000650\n000655\n000657\n000658\n000659\n000660\n000667\n000669\n000670\n000674\n000677\n000679\n000682\n000683\n000684\n000691\n000692\n000694\n000696\n000698\n000699\n000700\n000702\n000704\n000706\n000708\n000716\n000717\n000718\n000721\n000722\n000725\n000727\n000728\n000729\n000731\n000734\n000736\n000737\n000740\n000741\n000745\n000746\n000748\n000750\n000751\n000752\n000754\n000756\n000761\n000765\n000766\n000767\n000768\n000769\n000771\n000772\n000773\n000774\n000778\n000779\n000782\n000790\n000792\n000795\n000798\n000800\n000801\n000802\n000803\n000804\n000805\n000806\n000807\n000809\n000810\n000811\n000812\n000816\n000819\n000823\n000826\n000831\n000837\n000838\n000840\n000841\n000843\n000844\n000847\n000848\n000849\n000850\n000852\n000854\n000859\n000862\n000863\n000869\n000873\n000874\n000875\n000876\n000877\n000878\n000879\n000881\n000884\n000885\n000889\n000893\n000894\n000897\n000899\n000904\n000907\n000909\n000911\n000912\n000915\n000916\n000917\n000920\n000922\n000923\n000926\n000928\n000930\n000931\n000932\n000938\n000939\n000940\n000942\n000943\n000944\n000948\n000949\n000952\n000953\n000956\n000958\n000961\n000963\n000964\n000966\n000967\n000969\n000970\n000971\n000973\n000974\n000976\n000979\n000981\n000983\n000984\n000985\n000986\n000988\n000991\n000999\n001002\n001006\n001007\n001008\n001010\n001011\n001012\n001013\n001014\n001015\n001018\n001019\n001021\n001022\n001025\n001026\n001027\n001035\n001037\n001039\n001042\n001043\n001046\n001050\n001051\n001053\n001054\n001055\n001058\n001063\n001065\n001066\n001067\n001068\n001069\n001070\n001071\n001075\n001076\n001077\n001078\n001083\n001084\n001086\n001088\n001089\n001094\n001095\n001096\n001097\n001099\n001101\n001102\n001104\n001106\n001107\n001108\n001111\n001113\n001114\n001115\n001116\n001118\n001120\n001123\n001125\n001127\n001129\n001131\n001132\n001133\n001134\n001135\n001136\n001138\n001139\n001140\n001141\n001143\n001144\n001145\n001147\n001148\n001149\n001150\n001152\n001153\n001154\n001155\n001158\n001162\n001163\n001167\n001172\n001173\n001176\n001177\n001178\n001179\n001180\n001182\n001183\n001187\n001188\n001189\n001191\n001192\n001193\n001194\n001195\n001198\n001199\n001203\n001206\n001207\n001213\n001214\n001216\n001217\n001218\n001221\n001222\n001224\n001225\n001226\n001228\n001230\n001232\n001234\n001235\n001236\n001237\n001239\n001241\n001242\n001243\n001244\n001245\n001246\n001249\n001251\n001252\n001253\n001254\n001255\n001257\n001259\n001260\n001261\n001263\n001265\n001266\n001267\n001268\n001269\n001270\n001271\n001272\n001273\n001274\n001275\n001281\n001284\n001286\n001287\n001289\n001291\n001292\n001294\n001295\n001296\n001303\n001304\n001305\n001306\n001307\n001308\n001314\n001317\n001318\n001329\n001330\n001331\n001332\n001333\n001334\n001336\n001337\n001339\n001342\n001344\n001345\n001346\n001347\n001350\n001352\n001353\n001355\n001356\n001359\n001363\n001365\n001372\n001374\n001375\n001376\n001377\n001380\n001381\n001382\n001384\n001386\n001387\n001388\n001389\n001391\n001395\n001397\n001398\n001407\n001410\n001411\n001412\n001415\n001416\n001419\n001421\n001424\n001427\n001431\n001432\n001435\n001437\n001438\n001439\n001441\n001442\n001443\n001445\n001446\n001448\n001450\n001451\n001458\n001461\n001463\n001466\n001469\n001471\n001477\n001478\n001480\n001481\n001485\n001487\n001488\n001489\n001495\n001497\n001501\n001502\n001507\n001508\n001511\n001513\n001514\n001516\n001517\n001521\n001522\n001524\n001525\n001526\n001527\n001528\n001533\n001535\n001536\n001537\n001538\n001542\n001545\n001546\n001547\n001549\n001552\n001555\n001557\n001560\n001562\n001564\n001565\n001567\n001569\n001573\n001574\n001576\n001577\n001579\n001582\n001583\n001585\n001586\n001587\n001588\n001589\n001590\n001591\n001592\n001594\n001596\n001597\n001600\n001602\n001603\n001605\n001606\n001610\n001613\n001615\n001616\n001617\n001619\n001621\n001625\n001627\n001629\n001631\n001633\n001634\n001635\n001640\n001643\n001645\n001647\n001650\n001654\n001656\n001658\n001660\n001662\n001664\n001665\n001666\n001667\n001670\n001675\n001680\n001682\n001683\n001684\n001689\n001693\n001694\n001697\n001699\n001701\n001702\n001704\n001705\n001706\n001707\n001709\n001710\n001711\n001712\n001713\n001714\n001717\n001718\n001719\n001721\n001722\n001726\n001727\n001729\n001732\n001733\n001740\n001741\n001742\n001745\n001746\n001749\n001750\n001751\n001752\n001755\n001758\n001762\n001764\n001765\n001768\n001771\n001772\n001774\n001776\n001778\n001780\n001781\n001782\n001783\n001786\n001787\n001794\n001795\n001797\n001800\n001801\n001802\n001804\n001807\n001808\n001813\n001814\n001817\n001818\n001820\n001822\n001823\n001824\n001825\n001828\n001831\n001835\n001840\n001844\n001846\n001848\n001851\n001852\n001853\n001854\n001855\n001856\n001858\n001859\n001861\n001862\n001863\n001867\n001868\n001869\n001872\n001875\n001877\n001878\n001880\n001881\n001884\n001885\n001886\n001887\n001888\n001890\n001892\n001893\n001897\n001898\n001900\n001904\n001905\n001909\n001919\n001920\n001923\n001924\n001925\n001926\n001927\n001928\n001929\n001931\n001932\n001933\n001934\n001936\n001937\n001940\n001941\n001942\n001943\n001945\n001946\n001952\n001954\n001959\n001960\n001966\n001967\n001969\n001972\n001977\n001978\n001979\n001980\n001982\n001983\n001984\n001985\n001986\n001989\n001991\n001995\n001996\n001997\n001999\n002000\n002001\n002002\n002004\n002008\n002010\n002011\n002012\n002013\n002014\n002017\n002019\n002021\n002022\n002025\n002027\n002028\n002029\n002034\n002035\n002036\n002037\n002038\n002042\n002043\n002044\n002045\n002046\n002048\n002049\n002050\n002052\n002054\n002056\n002057\n002058\n002062\n002068\n002071\n002073\n002074\n002075\n002076\n002078\n002079\n002081\n002082\n002085\n002086\n002087\n002089\n002091\n002093\n002094\n002100\n002101\n002102\n002103\n002107\n002108\n002111\n002112\n002113\n002115\n002118\n002120\n002121\n002123\n002124\n002127\n002128\n002130\n002131\n002135\n002136\n002137\n002138\n002139\n002140\n002142\n002151\n002152\n002153\n002158\n002159\n002160\n002161\n002163\n002165\n002166\n002168\n002169\n002170\n002173\n002177\n002179\n002182\n002183\n002185\n002187\n002188\n002193\n002196\n002200\n002201\n002202\n002206\n002207\n002209\n002215\n002216\n002218\n002219\n002220\n002224\n002225\n002228\n002229\n002232\n002233\n002234\n002239\n002243\n002245\n002246\n002248\n002250\n002251\n002254\n002255\n002257\n002258\n002260\n002262\n002266\n002272\n002276\n002277\n002279\n002280\n002282\n002283\n002284\n002286\n002287\n002290\n002291\n002292\n002293\n002294\n002295\n002298\n002299\n002300\n002303\n002304\n002306\n002307\n002308\n002310\n002314\n002315\n002319\n002320\n002325\n002327\n002329\n002330\n002332\n002334\n002336\n002337\n002338\n002340\n002341\n002344\n002345\n002346\n002347\n002348\n002353\n002356\n002357\n002359\n002362\n002365\n002366\n002367\n002369\n002370\n002372\n002376\n002378\n002380\n002382\n002383\n002384\n002385\n002386\n002387\n002391\n002392\n002393\n002397\n002398\n002399\n002404\n002405\n002411\n002414\n002415\n002418\n002419\n002420\n002422\n002423\n002424\n002425\n002428\n002429\n002432\n002433\n002434\n002439\n002440\n002442\n002446\n002450\n002454\n002455\n002457\n002458\n002460\n002461\n002462\n002463\n002473\n002474\n002476\n002477\n002478\n002479\n002483\n002486\n002488\n002490\n002492\n002495\n002497\n002499\n002500\n002502\n002503\n002504\n002505\n002506\n002509\n002511\n002516\n002519\n002520\n002521\n002525\n002526\n002528\n002529\n002530\n002531\n002532\n002534\n002538\n002539\n002540\n002541\n002543\n002546\n002548\n002552\n002556\n002557\n002558\n002562\n002563\n002564\n002565\n002568\n002569\n002570\n002572\n002574\n002575\n002577\n002580\n002581\n002583\n002584\n002585\n002586\n002590\n002594\n002598\n002599\n002600\n002601\n002602\n002603\n002604\n002606\n002612\n002613\n002615\n002619\n002621\n002625\n002626\n002628\n002630\n002631\n002633\n002635\n002636\n002638\n002640\n002641\n002644\n002645\n002646\n002651\n002653\n002656\n002657\n002661\n002663\n002666\n002669\n002673\n002674\n002675\n002677\n002680\n002681\n002685\n002686\n002690\n002692\n002693\n002694\n002695\n002696\n002699\n002702\n002706\n002707\n002709\n002710\n002711\n002712\n002713\n002715\n002717\n002720\n002721\n002722\n002724\n002725\n002726\n002727\n002728\n002729\n002730\n002735\n002737\n002740\n002742\n002744\n002745\n002746\n002747\n002748\n002749\n002752\n002753\n002755\n002757\n002758\n002760\n002761\n002763\n002764\n002765\n002767\n002772\n002773\n002775\n002783\n002786\n002787\n002789\n002793\n002794\n002796\n002797\n002800\n002801\n002804\n002805\n002806\n002809\n002810\n002811\n002812\n002814\n002815\n002818\n002820\n002826\n002827\n002828\n002830\n002831\n002833\n002836\n002839\n002840\n002841\n002844\n002845\n002846\n002847\n002848\n002853\n002856\n002858\n002861\n002863\n002866\n002867\n002875\n002876\n002877\n002878\n002879\n002880\n002881\n002883\n002885\n002889\n002890\n002891\n002892\n002893\n002894\n002895\n002896\n002900\n002901\n002902\n002903\n002905\n002908\n002911\n002914\n002916\n002917\n002919\n002924\n002925\n002928\n002930\n002934\n002935\n002937\n002942\n002944\n002945\n002947\n002948\n002951\n002953\n002955\n002957\n002958\n002959\n002960\n002961\n002962\n002963\n002964\n002966\n002971\n002974\n002976\n002977\n002978\n002979\n002982\n002984\n002985\n002988\n002991\n002993\n002994\n002995\n002997\n002999\n003000\n003001\n003003\n003004\n003005\n003006\n003007\n003010\n003011\n003019\n003022\n003024\n003025\n003027\n003029\n003030\n003031\n003032\n003033\n003034\n003035\n003038\n003042\n003043\n003046\n003047\n003048\n003050\n003052\n003053\n003054\n003055\n003056\n003058\n003061\n003062\n003065\n003066\n003067\n003071\n003073\n003074\n003076\n003080\n003082\n003087\n003088\n003090\n003094\n003096\n003099\n003101\n003102\n003103\n003106\n003107\n003109\n003110\n003112\n003114\n003116\n003118\n003124\n003126\n003127\n003129\n003131\n003133\n003134\n003135\n003136\n003137\n003141\n003142\n003144\n003145\n003146\n003148\n003150\n003153\n003156\n003159\n003161\n003162\n003165\n003167\n003170\n003172\n003174\n003175\n003177\n003179\n003180\n003181\n003182\n003183\n003187\n003190\n003192\n003194\n003197\n003199\n003202\n003203\n003204\n003207\n003210\n003211\n003214\n003216\n003217\n003219\n003221\n003222\n003224\n003225\n003226\n003228\n003229\n003231\n003232\n003233\n003236\n003239\n003240\n003242\n003247\n003250\n003251\n003252\n003254\n003255\n003257\n003259\n003265\n003266\n003269\n003272\n003275\n003276\n003280\n003281\n003283\n003288\n003292\n003295\n003296\n003298\n003300\n003301\n003302\n003304\n003305\n003306\n003308\n003310\n003312\n003313\n003315\n003316\n003318\n003319\n003322\n003323\n003324\n003325\n003330\n003331\n003337\n003338\n003341\n003343\n003346\n003347\n003350\n003351\n003352\n003353\n003355\n003357\n003358\n003364\n003365\n003366\n003367\n003368\n003370\n003373\n003375\n003379\n003385\n003386\n003393\n003394\n003395\n003396\n003397\n003399\n003401\n003402\n003403\n003404\n003405\n003406\n003407\n003408\n003409\n003410\n003411\n003412\n003417\n003419\n003421\n003422\n003425\n003426\n003428\n003429\n003430\n003432\n003434\n003435\n003443\n003447\n003448\n003449\n003450\n003453\n003456\n003461\n003464\n003465\n003466\n003467\n003469\n003470\n003471\n003474\n003478\n003480\n003481\n003482\n003483\n003484\n003487\n003488\n003489\n003490\n003491\n003492\n003495\n003496\n003497\n003502\n003503\n003504\n003506\n003511\n003515\n003517\n003519\n003520\n003521\n003524\n003527\n003528\n003529\n003530\n003531\n003535\n003539\n003543\n003544\n003547\n003550\n003552\n003553\n003554\n003557\n003558\n003559\n003562\n003563\n003568\n003571\n003573\n003574\n003580\n003582\n003583\n003584\n003588\n003600\n003601\n003604\n003605\n003607\n003608\n003609\n003611\n003614\n003616\n003618\n003620\n003621\n003622\n003623\n003624\n003627\n003629\n003630\n003631\n003632\n003633\n003634\n003635\n003643\n003645\n003647\n003649\n003652\n003653\n003655\n003658\n003659\n003661\n003662\n003667\n003668\n003669\n003671\n003676\n003677\n003678\n003679\n003682\n003683\n003684\n003688\n003689\n003690\n003691\n003692\n003702\n003703\n003705\n003707\n003708\n003711\n003712\n003715\n003716\n003718\n003719\n003723\n003726\n003728\n003735\n003736\n003737\n003738\n003739\n003746\n003747\n003748\n003750\n003751\n003753\n003755\n003756\n003762\n003763\n003764\n003769\n003771\n003775\n003777\n003778\n003779\n003781\n003782\n003787\n003788\n003793\n003794\n003798\n003800\n003802\n003804\n003805\n003807\n003808\n003809\n003811\n003812\n003814\n003820\n003822\n003826\n003827\n003828\n003830\n003834\n003835\n003837\n003841\n003847\n003852\n003854\n003856\n003859\n003860\n003864\n003866\n003869\n003870\n003872\n003873\n003874\n003878\n003879\n003880\n003881\n003883\n003885\n003886\n003890\n003891\n003892\n003894\n003897\n003898\n003899\n003901\n003902\n003905\n003907\n003909\n003914\n003915\n003916\n003920\n003923\n003924\n003926\n003931\n003932\n003934\n003937\n003938\n003943\n003945\n003946\n003948\n003950\n003956\n003958\n003961\n003962\n003964\n003965\n003969\n003970\n003972\n003975\n003977\n003980\n003981\n003982\n003984\n003986\n003992\n003996\n003998\n004000\n004001\n004002\n004003\n004004\n004007\n004008\n004009\n004010\n004011\n004016\n004021\n004026\n004027\n004028\n004032\n004033\n004034\n004036\n004038\n004040\n004041\n004042\n004045\n004048\n004049\n004051\n004055\n004059\n004061\n004063\n004064\n004065\n004068\n004072\n004074\n004077\n004079\n004081\n004082\n004083\n004085\n004087\n004089\n004091\n004092\n004095\n004096\n004098\n004100\n004101\n004104\n004105\n004107\n004108\n004109\n004110\n004111\n004113\n004116\n004117\n004118\n004119\n004120\n004121\n004122\n004124\n004125\n004126\n004128\n004129\n004130\n004131\n004132\n004136\n004137\n004138\n004140\n004142\n004143\n004148\n004149\n004150\n004152\n004153\n004154\n004155\n004156\n004157\n004158\n004160\n004161\n004162\n004163\n004164\n004168\n004171\n004172\n004173\n004174\n004175\n004185\n004187\n004188\n004189\n004190\n004191\n004195\n004196\n004202\n004205\n004206\n004207\n004209\n004210\n004213\n004214\n004215\n004220\n004221\n004222\n004223\n004224\n004226\n004228\n004232\n004237\n004239\n004241\n004242\n004243\n004246\n004248\n004249\n004250\n004251\n004254\n004255\n004256\n004259\n004260\n004263\n004270\n004271\n004275\n004277\n004278\n004280\n004281\n004282\n004284\n004285\n004288\n004289\n004290\n004291\n004293\n004294\n004295\n004298\n004299\n004300\n004301\n004303\n004305\n004306\n004307\n004309\n004311\n004312\n004314\n004318\n004319\n004321\n004323\n004324\n004326\n004327\n004329\n004330\n004335\n004336\n004337\n004338\n004340\n004342\n004343\n004345\n004348\n004349\n004350\n004352\n004353\n004360\n004362\n004363\n004364\n004367\n004368\n004369\n004370\n004373\n004374\n004377\n004383\n004384\n004385\n004388\n004391\n004392\n004393\n004396\n004397\n004398\n004401\n004402\n004403\n004404\n004406\n004407\n004414\n004415\n004418\n004419\n004420\n004421\n004422\n004423\n004424\n004425\n004426\n004429\n004430\n004433\n004434\n004435\n004437\n004438\n004439\n004440\n004443\n004444\n004447\n004450\n004452\n004454\n004456\n004458\n004460\n004462\n004465\n004469\n004470\n004472\n004474\n004475\n004480\n004481\n004482\n004483\n004485\n004486\n004487\n004489\n004490\n004491\n004493\n004494\n004496\n004501\n004502\n004508\n004511\n004513\n004516\n004517\n004519\n004520\n004521\n004526\n004527\n004528\n004529\n004530\n004531\n004532\n004534\n004540\n004541\n004542\n004547\n004548\n004549\n004551\n004553\n004556\n004557\n004562\n004566\n004567\n004568\n004569\n004570\n004573\n004574\n004576\n004578\n004581\n004582\n004585\n004587\n004588\n004589\n004591\n004596\n004598\n004599\n004603\n004608\n004609\n004610\n004611\n004612\n004615\n004618\n004620\n004622\n004624\n004626\n004629\n004630\n004632\n004633\n004634\n004636\n004638\n004640\n004644\n004647\n004648\n004649\n004650\n004651\n004652\n004655\n004657\n004658\n004660\n004665\n004666\n004667\n004668\n004669\n004672\n004673\n004679\n004680\n004682\n004683\n004685\n004686\n004687\n004688\n004689\n004691\n004692\n004693\n004694\n004695\n004697\n004698\n004699\n004700\n004705\n004706\n004708\n004709\n004710\n004711\n004713\n004714\n004715\n004716\n004717\n004718\n004720\n004721\n004722\n004724\n004725\n004726\n004730\n004732\n004734\n004735\n004737\n004738\n004739\n004740\n004742\n004743\n004744\n004745\n004746\n004748\n004752\n004753\n004756\n004759\n004762\n004763\n004764\n004766\n004768\n004769\n004770\n004773\n004776\n004777\n004782\n004783\n004787\n004788\n004790\n004791\n004792\n004797\n004799\n004800\n004804\n004806\n004807\n004810\n004811\n004813\n004814\n004815\n004816\n004817\n004821\n004822\n004825\n004829\n004830\n004831\n004832\n004835\n004839\n004843\n004846\n004848\n004849\n004850\n004851\n004852\n004858\n004859\n004860\n004861\n004862\n004863\n004864\n004867\n004868\n004871\n004873\n004874\n004875\n004881\n004885\n004887\n004888\n004891\n004892\n004893\n004895\n004896\n004898\n004902\n004903\n004904\n004905\n004907\n004909\n004914\n004917\n004918\n004920\n004921\n004924\n004926\n004927\n004928\n004929\n004931\n004932\n004934\n004935\n004938\n004941\n004942\n004943\n004944\n004946\n004947\n004948\n004949\n004953\n004954\n004956\n004958\n004959\n004960\n004962\n004963\n004966\n004974\n004976\n004979\n004981\n004983\n004985\n004986\n004988\n004989\n004990\n004993\n004994\n004995\n004996\n004998\n004999\n005001\n005002\n005004\n005008\n005010\n005013\n005014\n005015\n005017\n005019\n005021\n005024\n005026\n005028\n005032\n005034\n005036\n005037\n005038\n005040\n005041\n005045\n005049\n005050\n005052\n005053\n005054\n005055\n005056\n005057\n005058\n005062\n005063\n005064\n005065\n005067\n005068\n005070\n005072\n005073\n005074\n005075\n005077\n005078\n005079\n005080\n005081\n005082\n005086\n005090\n005093\n005094\n005095\n005101\n005103\n005105\n005108\n005109\n005110\n005112\n005113\n005120\n005121\n005122\n005124\n005125\n005127\n005128\n005133\n005135\n005136\n005138\n005139\n005140\n005141\n005143\n005144\n005145\n005147\n005149\n005153\n005155\n005156\n005157\n005158\n005161\n005162\n005163\n005164\n005166\n005167\n005168\n005170\n005172\n005174\n005175\n005176\n005179\n005180\n005181\n005182\n005184\n005185\n005188\n005189\n005190\n005191\n005194\n005197\n005198\n005199\n005201\n005206\n005213\n005214\n005217\n005218\n005219\n005221\n005222\n005226\n005227\n005229\n005230\n005233\n005234\n005236\n005237\n005240\n005241\n005242\n005244\n005246\n005249\n005251\n005255\n005256\n005260\n005262\n005267\n005268\n005271\n005273\n005274\n005275\n005276\n005279\n005280\n005282\n005284\n005287\n005289\n005292\n005296\n005297\n005298\n005299\n005304\n005307\n005308\n005309\n005311\n005312\n005313\n005315\n005316\n005318\n005319\n005321\n005322\n005323\n005325\n005328\n005329\n005330\n005333\n005334\n005335\n005336\n005337\n005338\n005341\n005342\n005343\n005345\n005347\n005349\n005350\n005359\n005360\n005363\n005365\n005366\n005368\n005369\n005371\n005372\n005375\n005377\n005378\n005379\n005381\n005385\n005386\n005389\n005390\n005391\n005404\n005405\n005413\n005415\n005422\n005423\n005426\n005427\n005429\n005430\n005431\n005434\n005437\n005441\n005443\n005444\n005445\n005447\n005448\n005449\n005450\n005452\n005453\n005458\n005459\n005460\n005461\n005465\n005466\n005467\n005471\n005472\n005473\n005474\n005476\n005477\n005479\n005481\n005482\n005484\n005486\n005487\n005489\n005494\n005495\n005498\n005505\n005510\n005511\n005514\n005515\n005523\n005525\n005528\n005531\n005532\n005534\n005536\n005538\n005540\n005542\n005544\n005545\n005546\n005551\n005552\n005555\n005556\n005557\n005558\n005559\n005560\n005565\n005566\n005570\n005571\n005572\n005573\n005576\n005577\n005580\n005581\n005582\n005584\n005586\n005587\n005588\n005589\n005590\n005595\n005596\n005600\n005601\n005602\n005603\n005610\n005613\n005616\n005617\n005618\n005619\n005623\n005625\n005630\n005631\n005633\n005634\n005635\n005638\n005639\n005640\n005642\n005643\n005649\n005650\n005652\n005653\n005656\n005658\n005659\n005660\n005662\n005664\n005668\n005669\n005672\n005673\n005676\n005677\n005680\n005683\n005685\n005687\n005689\n005695\n005698\n005699\n005700\n005703\n005704\n005706\n005707\n005708\n005709\n005712\n005713\n005714\n005717\n005724\n005725\n005727\n005728\n005729\n005731\n005735\n005736\n005739\n005740\n005741\n005743\n005744\n005745\n005746\n005747\n005751\n005754\n005757\n005760\n005762\n005763\n005765\n005777\n005782\n005783\n005784\n005785\n005786\n005787\n005790\n005793\n005794\n005796\n005800\n005801\n005803\n005805\n005806\n005807\n005811\n005812\n005818\n005819\n005820\n005821\n005822\n005826\n005827\n005829\n005834\n005839\n005840\n005841\n005843\n005852\n005854\n005855\n005856\n005857\n005859\n005864\n005869\n005873\n005876\n005878\n005879\n005881\n005882\n005883\n005885\n005887\n005889\n005892\n005893\n005894\n005899\n005900\n005901\n005903\n005905\n005906\n005907\n005909\n005910\n005911\n005912\n005913\n005914\n005916\n005917\n005918\n005919\n005921\n005922\n005923\n005925\n005926\n005927\n005931\n005933\n005935\n005938\n005939\n005944\n005947\n005948\n005949\n005952\n005955\n005958\n005961\n005962\n005963\n005965\n005969\n005970\n005972\n005975\n005978\n005981\n005982\n005984\n005985\n005986\n005988\n005994\n005996\n005997\n005999\n006001\n006002\n006003\n006005\n006008\n006009\n006010\n006012\n006013\n006014\n006016\n006023\n006024\n006026\n006027\n006028\n006029\n006030\n006031\n006033\n006034\n006036\n006038\n006039\n006041\n006042\n006043\n006044\n006045\n006046\n006047\n006048\n006050\n006052\n006054\n006057\n006058\n006060\n006061\n006062\n006063\n006066\n006067\n006068\n006070\n006071\n006074\n006075\n006077\n006078\n006083\n006085\n006086\n006087\n006088\n006093\n006095\n006096\n006097\n006098\n006100\n006102\n006103\n006106\n006107\n006110\n006114\n006115\n006116\n006117\n006118\n006121\n006122\n006123\n006125\n006126\n006127\n006130\n006133\n006136\n006139\n006144\n006146\n006148\n006151\n006152\n006154\n006156\n006161\n006163\n006165\n006167\n006168\n006169\n006173\n006176\n006177\n006182\n006185\n006186\n006187\n006190\n006194\n006195\n006196\n006198\n006202\n006204\n006208\n006210\n006213\n006215\n006219\n006222\n006227\n006228\n006229\n006232\n006233\n006238\n006240\n006244\n006246\n006247\n006249\n006250\n006258\n006263\n006265\n006266\n006267\n006269\n006270\n006272\n006273\n006274\n006275\n006276\n006278\n006280\n006282\n006286\n006287\n006288\n006297\n006300\n006301\n006302\n006305\n006306\n006312\n006314\n006315\n006316\n006317\n006321\n006322\n006324\n006331\n006332\n006333\n006334\n006338\n006339\n006340\n006342\n006343\n006344\n006345\n006348\n006349\n006351\n006353\n006354\n006355\n006356\n006357\n006360\n006364\n006366\n006368\n006369\n006370\n006371\n006372\n006377\n006379\n006380\n006381\n006385\n006386\n006388\n006391\n006393\n006394\n006395\n006396\n006403\n006405\n006406\n006407\n006409\n006410\n006411\n006415\n006416\n006417\n006420\n006423\n006424\n006425\n006426\n006427\n006433\n006434\n006435\n006436\n006437\n006439\n006440\n006441\n006442\n006444\n006445\n006446\n006451\n006452\n006453\n006454\n006462\n006464\n006465\n006468\n006469\n006470\n006472\n006473\n006474\n006475\n006477\n006478\n006481\n006482\n006483\n006484\n006486\n006488\n006491\n006493\n006496\n006497\n006498\n006503\n006505\n006506\n006507\n006508\n006512\n006514\n006515\n006516\n006517\n006519\n006520\n006521\n006524\n006525\n006529\n006530\n006531\n006532\n006533\n006534\n006535\n006537\n006540\n006542\n006548\n006549\n006551\n006553\n006555\n006556\n006558\n006560\n006561\n006563\n006565\n006568\n006569\n006570\n006574\n006576\n006577\n006578\n006581\n006582\n006583\n006586\n006588\n006590\n006592\n006593\n006595\n006596\n006597\n006602\n006603\n006604\n006611\n006612\n006613\n006614\n006618\n006623\n006624\n006625\n006626\n006628\n006629\n006632\n006633\n006634\n006636\n006637\n006638\n006641\n006643\n006647\n006649\n006650\n006651\n006655\n006656\n006658\n006659\n006660\n006664\n006666\n006667\n006669\n006670\n006674\n006676\n006677\n006678\n006679\n006682\n006685\n006686\n006692\n006693\n006694\n006695\n006696\n006698\n006701\n006703\n006709\n006710\n006711\n006712\n006713\n006714\n006715\n006719\n006720\n006723\n006725\n006726\n006729\n006731\n006732\n006733\n006734\n006737\n006738\n006741\n006744\n006745\n006747\n006751\n006752\n006753\n006754\n006755\n006756\n006758\n006759\n006760\n006761\n006762\n006764\n006765\n006767\n006768\n006770\n006771\n006772\n006773\n006777\n006778\n006780\n006781\n006782\n006783\n006785\n006786\n006789\n006791\n006792\n006794\n006796\n006797\n006798\n006800\n006803\n006804\n006806\n006807\n006808\n006811\n006812\n006813\n006815\n006816\n006818\n006819\n006822\n006828\n006829\n006832\n006833\n006836\n006837\n006841\n006843\n006844\n006847\n006849\n006850\n006852\n006853\n006854\n006855\n006856\n006858\n006860\n006862\n006863\n006866\n006868\n006870\n006872\n006873\n006874\n006876\n006879\n006881\n006882\n006884\n006885\n006887\n006889\n006891\n006895\n006897\n006898\n006899\n006900\n006901\n006903\n006906\n006907\n006908\n006910\n006913\n006914\n006917\n006922\n006925\n006928\n006930\n006936\n006937\n006938\n006942\n006943\n006944\n006945\n006948\n006950\n006953\n006954\n006955\n006956\n006959\n006960\n006962\n006964\n006968\n006971\n006973\n006977\n006978\n006980\n006981\n006982\n006987\n006989\n006990\n006992\n006994\n006997\n006999\n007000\n007003\n007005\n007006\n007008\n007010\n007011\n007012\n007014\n007015\n007016\n007019\n007022\n007023\n007026\n007027\n007028\n007029\n007030\n007031\n007032\n007033\n007034\n007037\n007038\n007042\n007043\n007047\n007048\n007049\n007052\n007053\n007055\n007056\n007059\n007061\n007063\n007065\n007067\n007068\n007069\n007071\n007072\n007074\n007076\n007078\n007079\n007080\n007081\n007082\n007083\n007084\n007085\n007087\n007088\n007089\n007091\n007095\n007098\n007100\n007103\n007109\n007110\n007112\n007115\n007117\n007119\n007120\n007122\n007125\n007130\n007131\n007132\n007133\n007135\n007136\n007138\n007139\n007144\n007145\n007146\n007149\n007154\n007157\n007158\n007161\n007162\n007163\n007164\n007165\n007166\n007168\n007169\n007172\n007174\n007176\n007177\n007178\n007180\n007182\n007183\n007187\n007194\n007198\n007199\n007200\n007201\n007202\n007204\n007205\n007207\n007208\n007210\n007212\n007214\n007215\n007217\n007219\n007221\n007225\n007227\n007229\n007230\n007232\n007233\n007235\n007238\n007240\n007242\n007244\n007246\n007247\n007252\n007253\n007255\n007256\n007258\n007260\n007261\n007262\n007265\n007266\n007267\n007271\n007272\n007273\n007274\n007275\n007277\n007278\n007279\n007280\n007283\n007284\n007287\n007288\n007289\n007290\n007291\n007292\n007294\n007299\n007300\n007302\n007303\n007304\n007309\n007310\n007311\n007315\n007318\n007319\n007322\n007323\n007325\n007326\n007327\n007329\n007330\n007331\n007336\n007337\n007339\n007342\n007343\n007344\n007345\n007347\n007349\n007350\n007351\n007352\n007353\n007359\n007360\n007364\n007369\n007371\n007374\n007375\n007376\n007377\n007380\n007381\n007382\n007383\n007384\n007385\n007389\n007391\n007395\n007396\n007397\n007398\n007401\n007402\n007403\n007405\n007407\n007409\n007410\n007411\n007412\n007413\n007415\n007416\n007419\n007420\n007421\n007422\n007423\n007424\n007426\n007430\n007433\n007434\n007435\n007436\n007437\n007439\n007440\n007442\n007445\n007447\n007448\n007449\n007450\n007453\n007456\n007458\n007462\n007463\n007464\n007466\n007467\n007468\n007469\n007470\n007473\n007475\n007477\n007478\n007480"
  },
  {
    "path": "tools/dataset.py",
    "content": "import os\nimport numpy as np\nimport torch.utils.data as torch_data\nimport kitti_utils\nimport cv2\nfrom PIL import Image\n\n\nUSE_INTENSITY = False\n\n\nclass KittiDataset(torch_data.Dataset):\n    def __init__(self, root_dir, split='train', mode='TRAIN'):\n        self.split = split\n        self.mode = mode\n        self.classes = ['Car']\n        is_test = self.split == 'test'\n        self.imageset_dir = os.path.join(root_dir, 'KITTI', 'object', 'testing' if is_test else 'training')\n\n        split_dir = os.path.join(root_dir, 'KITTI', 'ImageSets', split + '.txt')\n        self.image_idx_list = [x.strip() for x in open(split_dir).readlines()]\n        self.sample_id_list = [int(sample_id) for sample_id in self.image_idx_list]\n        self.num_sample = self.image_idx_list.__len__()\n\n        self.npoints = 16384\n\n        self.image_dir = os.path.join(self.imageset_dir, 'image_2')\n        self.lidar_dir = os.path.join(self.imageset_dir, 'velodyne')\n        self.calib_dir = os.path.join(self.imageset_dir, 'calib')\n        self.label_dir = os.path.join(self.imageset_dir, 'label_2')\n        self.plane_dir = os.path.join(self.imageset_dir, 'planes')\n\n    def get_image(self, idx):\n        img_file = os.path.join(self.image_dir, '%06d.png' % idx)\n        assert os.path.exists(img_file)\n        return cv2.imread(img_file)  # (H, W, 3) BGR mode\n\n    def get_image_shape(self, idx):\n        img_file = os.path.join(self.image_dir, '%06d.png' % idx)\n        assert os.path.exists(img_file)\n        im = Image.open(img_file)\n        width, height = im.size\n        return height, width, 3\n\n    def get_lidar(self, idx):\n        lidar_file = os.path.join(self.lidar_dir, '%06d.bin' % idx)\n        assert os.path.exists(lidar_file)\n        return np.fromfile(lidar_file, dtype=np.float32).reshape(-1, 4)\n\n    def get_calib(self, idx):\n        calib_file = os.path.join(self.calib_dir, '%06d.txt' % idx)\n        assert os.path.exists(calib_file)\n        return kitti_utils.Calibration(calib_file)\n\n    def get_label(self, idx):\n        label_file = os.path.join(self.label_dir, '%06d.txt' % idx)\n        assert os.path.exists(label_file)\n        return kitti_utils.get_objects_from_label(label_file)\n\n    @staticmethod\n    def get_valid_flag(pts_rect, pts_img, pts_rect_depth, img_shape):\n        val_flag_1 = np.logical_and(pts_img[:, 0] >= 0, pts_img[:, 0] < img_shape[1])\n        val_flag_2 = np.logical_and(pts_img[:, 1] >= 0, pts_img[:, 1] < img_shape[0])\n        val_flag_merge = np.logical_and(val_flag_1, val_flag_2)\n        pts_valid_flag = np.logical_and(val_flag_merge, pts_rect_depth >= 0)\n        return pts_valid_flag\n\n    def filtrate_objects(self, obj_list):\n        type_whitelist = self.classes\n        if self.mode == 'TRAIN':\n            type_whitelist = list(self.classes)\n            if 'Car' in self.classes:\n                type_whitelist.append('Van')\n\n        valid_obj_list = []\n        for obj in obj_list:\n            if obj.cls_type not in type_whitelist:\n                continue\n\n            valid_obj_list.append(obj)\n        return valid_obj_list\n\n    def __len__(self):\n        return len(self.sample_id_list)\n\n    def __getitem__(self, index):\n        sample_id = int(self.sample_id_list[index])\n        calib = self.get_calib(sample_id)\n        img_shape = self.get_image_shape(sample_id)\n        pts_lidar = self.get_lidar(sample_id)\n\n        # get valid point (projected points should be in image)\n        pts_rect = calib.lidar_to_rect(pts_lidar[:, 0:3])\n        pts_intensity = pts_lidar[:, 3]\n\n        pts_img, pts_rect_depth = calib.rect_to_img(pts_rect)\n        pts_valid_flag = self.get_valid_flag(pts_rect, pts_img, pts_rect_depth, img_shape)\n\n        pts_rect = pts_rect[pts_valid_flag][:, 0:3]\n        pts_intensity = pts_intensity[pts_valid_flag]\n\n        if self.npoints < len(pts_rect):\n            pts_depth = pts_rect[:, 2]\n            pts_near_flag = pts_depth < 40.0\n            far_idxs_choice = np.where(pts_near_flag == 0)[0]\n            near_idxs = np.where(pts_near_flag == 1)[0]\n            near_idxs_choice = np.random.choice(near_idxs, self.npoints - len(far_idxs_choice), replace=False)\n\n            choice = np.concatenate((near_idxs_choice, far_idxs_choice), axis=0) \\\n                if len(far_idxs_choice) > 0 else near_idxs_choice\n            np.random.shuffle(choice)\n        else:\n            choice = np.arange(0, len(pts_rect), dtype=np.int32)\n            if self.npoints > len(pts_rect):\n                extra_choice = np.random.choice(choice, self.npoints - len(pts_rect), replace=False)\n                choice = np.concatenate((choice, extra_choice), axis=0)\n            np.random.shuffle(choice)\n\n        ret_pts_rect = pts_rect[choice, :]\n        ret_pts_intensity = pts_intensity[choice] - 0.5  # translate intensity to [-0.5, 0.5]\n\n        pts_features = [ret_pts_intensity.reshape(-1, 1)]\n        ret_pts_features = np.concatenate(pts_features, axis=1) if pts_features.__len__() > 1 else pts_features[0]\n\n        sample_info = {'sample_id': sample_id}\n\n        if self.mode == 'TEST':\n            if USE_INTENSITY:\n                pts_input = np.concatenate((ret_pts_rect, ret_pts_features), axis=1)  # (N, C)\n            else:\n                pts_input = ret_pts_rect\n            sample_info['pts_input'] = pts_input\n            sample_info['pts_rect'] = ret_pts_rect\n            sample_info['pts_features'] = ret_pts_features\n            return sample_info\n\n        gt_obj_list = self.filtrate_objects(self.get_label(sample_id))\n\n        gt_boxes3d = kitti_utils.objs_to_boxes3d(gt_obj_list)\n\n        # prepare input\n        if USE_INTENSITY:\n            pts_input = np.concatenate((ret_pts_rect, ret_pts_features), axis=1)  # (N, C)\n        else:\n            pts_input = ret_pts_rect\n\n        # generate training labels\n        cls_labels = self.generate_training_labels(ret_pts_rect, gt_boxes3d)\n        sample_info['pts_input'] = pts_input\n        sample_info['pts_rect'] = ret_pts_rect\n        sample_info['cls_labels'] = cls_labels\n        return sample_info\n\n    @staticmethod\n    def generate_training_labels(pts_rect, gt_boxes3d):\n        cls_label = np.zeros((pts_rect.shape[0]), dtype=np.int32)\n        gt_corners = kitti_utils.boxes3d_to_corners3d(gt_boxes3d, rotate=True)\n        extend_gt_boxes3d = kitti_utils.enlarge_box3d(gt_boxes3d, extra_width=0.2)\n        extend_gt_corners = kitti_utils.boxes3d_to_corners3d(extend_gt_boxes3d, rotate=True)\n        for k in range(gt_boxes3d.shape[0]):\n            box_corners = gt_corners[k]\n            fg_pt_flag = kitti_utils.in_hull(pts_rect, box_corners)\n            cls_label[fg_pt_flag] = 1\n\n            # enlarge the bbox3d, ignore nearby points\n            extend_box_corners = extend_gt_corners[k]\n            fg_enlarge_flag = kitti_utils.in_hull(pts_rect, extend_box_corners)\n            ignore_flag = np.logical_xor(fg_pt_flag, fg_enlarge_flag)\n            cls_label[ignore_flag] = -1\n\n        return cls_label\n\n    def collate_batch(self, batch):\n        batch_size = batch.__len__()\n        ans_dict = {}\n\n        for key in batch[0].keys():\n            if isinstance(batch[0][key], np.ndarray):\n                ans_dict[key] = np.concatenate([batch[k][key][np.newaxis, ...] for k in range(batch_size)], axis=0)\n\n            else:\n                ans_dict[key] = [batch[k][key] for k in range(batch_size)]\n                if isinstance(batch[0][key], int):\n                    ans_dict[key] = np.array(ans_dict[key], dtype=np.int32)\n                elif isinstance(batch[0][key], float):\n                    ans_dict[key] = np.array(ans_dict[key], dtype=np.float32)\n\n        return ans_dict\n"
  },
  {
    "path": "tools/kitti_utils.py",
    "content": "import numpy as np\nfrom scipy.spatial import Delaunay\nimport scipy\n\n\ndef cls_type_to_id(cls_type):\n    type_to_id = {'Car': 1, 'Pedestrian': 2, 'Cyclist': 3, 'Van': 4}\n    if cls_type not in type_to_id.keys():\n        return -1\n    return type_to_id[cls_type]\n\n\nclass Object3d(object):\n    def __init__(self, line):\n        label = line.strip().split(' ')\n        self.src = line\n        self.cls_type = label[0]\n        self.cls_id = cls_type_to_id(self.cls_type)\n        self.trucation = float(label[1])\n        self.occlusion = float(label[2])  # 0:fully visible 1:partly occluded 2:largely occluded 3:unknown\n        self.alpha = float(label[3])\n        self.box2d = np.array((float(label[4]), float(label[5]), float(label[6]), float(label[7])), dtype=np.float32)\n        self.h = float(label[8])\n        self.w = float(label[9])\n        self.l = float(label[10])\n        self.pos = np.array((float(label[11]), float(label[12]), float(label[13])), dtype=np.float32)\n        self.dis_to_cam = np.linalg.norm(self.pos)\n        self.ry = float(label[14])\n        self.score = float(label[15]) if label.__len__() == 16 else -1.0\n        self.level_str = None\n        self.level = self.get_obj_level()\n\n    def get_obj_level(self):\n        height = float(self.box2d[3]) - float(self.box2d[1]) + 1\n\n        if height >= 40 and self.trucation <= 0.15 and self.occlusion <= 0:\n            self.level_str = 'Easy'\n            return 1  # Easy\n        elif height >= 25 and self.trucation <= 0.3 and self.occlusion <= 1:\n            self.level_str = 'Moderate'\n            return 2  # Moderate\n        elif height >= 25 and self.trucation <= 0.5 and self.occlusion <= 2:\n            self.level_str = 'Hard'\n            return 3  # Hard\n        else:\n            self.level_str = 'UnKnown'\n            return 4\n\n    def generate_corners3d(self):\n        \"\"\"\n        generate corners3d representation for this object\n        :return corners_3d: (8, 3) corners of box3d in camera coord\n        \"\"\"\n        l, h, w = self.l, self.h, self.w\n        x_corners = [l / 2, l / 2, -l / 2, -l / 2, l / 2, l / 2, -l / 2, -l / 2]\n        y_corners = [0, 0, 0, 0, -h, -h, -h, -h]\n        z_corners = [w / 2, -w / 2, -w / 2, w / 2, w / 2, -w / 2, -w / 2, w / 2]\n\n        R = np.array([[np.cos(self.ry), 0, np.sin(self.ry)],\n                      [0, 1, 0],\n                      [-np.sin(self.ry), 0, np.cos(self.ry)]])\n        corners3d = np.vstack([x_corners, y_corners, z_corners])  # (3, 8)\n        corners3d = np.dot(R, corners3d).T\n        corners3d = corners3d + self.pos\n        return corners3d\n\n    def to_str(self):\n        print_str = '%s %.3f %.3f %.3f box2d: %s hwl: [%.3f %.3f %.3f] pos: %s ry: %.3f' \\\n                     % (self.cls_type, self.trucation, self.occlusion, self.alpha, self.box2d, self.h, self.w, self.l,\n                        self.pos, self.ry)\n        return print_str\n\n    def to_kitti_format(self):\n        kitti_str = '%s %.2f %d %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f' \\\n                    % (self.cls_type, self.trucation, int(self.occlusion), self.alpha, self.box2d[0], self.box2d[1],\n                       self.box2d[2], self.box2d[3], self.h, self.w, self.l, self.pos[0], self.pos[1], self.pos[2],\n                       self.ry)\n        return kitti_str\n\n\ndef get_calib_from_file(calib_file):\n    with open(calib_file) as f:\n        lines = f.readlines()\n\n    obj = lines[2].strip().split(' ')[1:]\n    P2 = np.array(obj, dtype=np.float32)\n    obj = lines[3].strip().split(' ')[1:]\n    P3 = np.array(obj, dtype=np.float32)\n    obj = lines[4].strip().split(' ')[1:]\n    R0 = np.array(obj, dtype=np.float32)\n    obj = lines[5].strip().split(' ')[1:]\n    Tr_velo_to_cam = np.array(obj, dtype=np.float32)\n\n    return {'P2': P2.reshape(3, 4),\n            'P3': P3.reshape(3, 4),\n            'R0': R0.reshape(3, 3),\n            'Tr_velo2cam': Tr_velo_to_cam.reshape(3, 4)}\n\n\nclass Calibration(object):\n    def __init__(self, calib_file):\n        if isinstance(calib_file, str):\n            calib = get_calib_from_file(calib_file)\n        else:\n            calib = calib_file\n\n        self.P2 = calib['P2']  # 3 x 4\n        self.R0 = calib['R0']  # 3 x 3\n        self.V2C = calib['Tr_velo2cam']  # 3 x 4\n\n    def cart_to_hom(self, pts):\n        \"\"\"\n        :param pts: (N, 3 or 2)\n        :return pts_hom: (N, 4 or 3)\n        \"\"\"\n        pts_hom = np.hstack((pts, np.ones((pts.shape[0], 1), dtype=np.float32)))\n        return pts_hom\n\n    def lidar_to_rect(self, pts_lidar):\n        \"\"\"\n        :param pts_lidar: (N, 3)\n        :return pts_rect: (N, 3)\n        \"\"\"\n        pts_lidar_hom = self.cart_to_hom(pts_lidar)\n        pts_rect = np.dot(pts_lidar_hom, np.dot(self.V2C.T, self.R0.T))\n        return pts_rect\n\n    def rect_to_img(self, pts_rect):\n        \"\"\"\n        :param pts_rect: (N, 3)\n        :return pts_img: (N, 2)\n        \"\"\"\n        pts_rect_hom = self.cart_to_hom(pts_rect)\n        pts_2d_hom = np.dot(pts_rect_hom, self.P2.T)\n        pts_img = (pts_2d_hom[:, 0:2].T / pts_rect_hom[:, 2]).T  # (N, 2)\n        pts_rect_depth = pts_2d_hom[:, 2] - self.P2.T[3, 2]  # depth in rect camera coord\n        return pts_img, pts_rect_depth\n\n    def lidar_to_img(self, pts_lidar):\n        \"\"\"\n        :param pts_lidar: (N, 3)\n        :return pts_img: (N, 2)\n        \"\"\"\n        pts_rect = self.lidar_to_rect(pts_lidar)\n        pts_img, pts_depth = self.rect_to_img(pts_rect)\n        return pts_img, pts_depth\n\n\ndef get_objects_from_label(label_file):\n    with open(label_file, 'r') as f:\n        lines = f.readlines()\n    objects = [Object3d(line) for line in lines]\n    return objects\n\n\ndef objs_to_boxes3d(obj_list):\n    boxes3d = np.zeros((obj_list.__len__(), 7), dtype=np.float32)\n    for k, obj in enumerate(obj_list):\n        boxes3d[k, 0:3], boxes3d[k, 3], boxes3d[k, 4], boxes3d[k, 5], boxes3d[k, 6] \\\n            = obj.pos, obj.h, obj.w, obj.l, obj.ry\n    return boxes3d\n\n\ndef boxes3d_to_corners3d(boxes3d, rotate=True):\n    \"\"\"\n    :param boxes3d: (N, 7) [x, y, z, h, w, l, ry]\n    :param rotate:\n    :return: corners3d: (N, 8, 3)\n    \"\"\"\n    boxes_num = boxes3d.shape[0]\n    h, w, l = boxes3d[:, 3], boxes3d[:, 4], boxes3d[:, 5]\n    x_corners = np.array([l / 2., l / 2., -l / 2., -l / 2., l / 2., l / 2., -l / 2., -l / 2.], dtype=np.float32).T  # (N, 8)\n    z_corners = np.array([w / 2., -w / 2., -w / 2., w / 2., w / 2., -w / 2., -w / 2., w / 2.], dtype=np.float32).T  # (N, 8)\n\n    y_corners = np.zeros((boxes_num, 8), dtype=np.float32)\n    y_corners[:, 4:8] = -h.reshape(boxes_num, 1).repeat(4, axis=1)  # (N, 8)\n\n    if rotate:\n        ry = boxes3d[:, 6]\n        zeros, ones = np.zeros(ry.size, dtype=np.float32), np.ones(ry.size, dtype=np.float32)\n        rot_list = np.array([[np.cos(ry), zeros, -np.sin(ry)],\n                             [zeros,       ones,       zeros],\n                             [np.sin(ry), zeros,  np.cos(ry)]])  # (3, 3, N)\n        R_list = np.transpose(rot_list, (2, 0, 1))  # (N, 3, 3)\n\n        temp_corners = np.concatenate((x_corners.reshape(-1, 8, 1), y_corners.reshape(-1, 8, 1),\n                                       z_corners.reshape(-1, 8, 1)), axis=2)  # (N, 8, 3)\n        rotated_corners = np.matmul(temp_corners, R_list)  # (N, 8, 3)\n        x_corners, y_corners, z_corners = rotated_corners[:, :, 0], rotated_corners[:, :, 1], rotated_corners[:, :, 2]\n\n    x_loc, y_loc, z_loc = boxes3d[:, 0], boxes3d[:, 1], boxes3d[:, 2]\n\n    x = x_loc.reshape(-1, 1) + x_corners.reshape(-1, 8)\n    y = y_loc.reshape(-1, 1) + y_corners.reshape(-1, 8)\n    z = z_loc.reshape(-1, 1) + z_corners.reshape(-1, 8)\n\n    corners = np.concatenate((x.reshape(-1, 8, 1), y.reshape(-1, 8, 1), z.reshape(-1, 8, 1)), axis=2)\n\n    return corners.astype(np.float32)\n\n\ndef enlarge_box3d(boxes3d, extra_width):\n    \"\"\"\n    :param boxes3d: (N, 7) [x, y, z, h, w, l, ry]\n    \"\"\"\n    if isinstance(boxes3d, np.ndarray):\n        large_boxes3d = boxes3d.copy()\n    else:\n        large_boxes3d = boxes3d.clone()\n    large_boxes3d[:, 3:6] += extra_width * 2\n    large_boxes3d[:, 1] += extra_width\n    return large_boxes3d\n\n\ndef in_hull(p, hull):\n    \"\"\"\n    :param p: (N, K) test points\n    :param hull: (M, K) M corners of a box\n    :return (N) bool\n    \"\"\"\n    try:\n        if not isinstance(hull, Delaunay):\n            hull = Delaunay(hull)\n        flag = hull.find_simplex(p) >= 0\n    except scipy.spatial.qhull.QhullError:\n        print('Warning: not a hull %s' % str(hull))\n        flag = np.zeros(p.shape[0], dtype=np.bool)\n\n    return flag\n"
  },
  {
    "path": "tools/pointnet2_msg.py",
    "content": "import torch\nimport torch.nn as nn\nfrom pointnet2.pointnet2_modules import PointnetFPModule, PointnetSAModuleMSG\nimport pointnet2.pytorch_utils as pt_utils\n\n\ndef get_model(input_channels=0):\n    return Pointnet2MSG(input_channels=input_channels)\n\n\nNPOINTS = [4096, 1024, 256, 64]\nRADIUS = [[0.1, 0.5], [0.5, 1.0], [1.0, 2.0], [2.0, 4.0]]\nNSAMPLE = [[16, 32], [16, 32], [16, 32], [16, 32]]\nMLPS = [[[16, 16, 32], [32, 32, 64]], [[64, 64, 128], [64, 96, 128]],\n        [[128, 196, 256], [128, 196, 256]], [[256, 256, 512], [256, 384, 512]]]\nFP_MLPS = [[128, 128], [256, 256], [512, 512], [512, 512]]\nCLS_FC = [128]\nDP_RATIO = 0.5\n\n\nclass Pointnet2MSG(nn.Module):\n    def __init__(self, input_channels=6):\n        super().__init__()\n\n        self.SA_modules = nn.ModuleList()\n        channel_in = input_channels\n\n        skip_channel_list = [input_channels]\n        for k in range(NPOINTS.__len__()):\n            mlps = MLPS[k].copy()\n            channel_out = 0\n            for idx in range(mlps.__len__()):\n                mlps[idx] = [channel_in] + mlps[idx]\n                channel_out += mlps[idx][-1]\n\n            self.SA_modules.append(\n                PointnetSAModuleMSG(\n                    npoint=NPOINTS[k],\n                    radii=RADIUS[k],\n                    nsamples=NSAMPLE[k],\n                    mlps=mlps,\n                    use_xyz=True,\n                    bn=True\n                )\n            )\n            skip_channel_list.append(channel_out)\n            channel_in = channel_out\n\n        self.FP_modules = nn.ModuleList()\n\n        for k in range(FP_MLPS.__len__()):\n            pre_channel = FP_MLPS[k + 1][-1] if k + 1 < len(FP_MLPS) else channel_out\n            self.FP_modules.append(\n                PointnetFPModule(mlp=[pre_channel + skip_channel_list[k]] + FP_MLPS[k])\n            )\n\n        cls_layers = []\n        pre_channel = FP_MLPS[0][-1]\n        for k in range(0, CLS_FC.__len__()):\n            cls_layers.append(pt_utils.Conv1d(pre_channel, CLS_FC[k], bn=True))\n            pre_channel = CLS_FC[k]\n        cls_layers.append(pt_utils.Conv1d(pre_channel, 1, activation=None))\n        cls_layers.insert(1, nn.Dropout(0.5))\n        self.cls_layer = nn.Sequential(*cls_layers)\n\n    def _break_up_pc(self, pc):\n        xyz = pc[..., 0:3].contiguous()\n        features = (\n            pc[..., 3:].transpose(1, 2).contiguous()\n            if pc.size(-1) > 3 else None\n        )\n\n        return xyz, features\n\n    def forward(self, pointcloud: torch.cuda.FloatTensor):\n        xyz, features = self._break_up_pc(pointcloud)\n\n        l_xyz, l_features = [xyz], [features]\n        for i in range(len(self.SA_modules)):\n            li_xyz, li_features = self.SA_modules[i](l_xyz[i], l_features[i])\n            l_xyz.append(li_xyz)\n            l_features.append(li_features)\n\n        for i in range(-1, -(len(self.FP_modules) + 1), -1):\n            l_features[i - 1] = self.FP_modules[i](\n                l_xyz[i - 1], l_xyz[i], l_features[i - 1], l_features[i]\n            )\n\n        pred_cls = self.cls_layer(l_features[0]).transpose(1, 2).contiguous()  # (B, N, 1)\n        return pred_cls\n"
  },
  {
    "path": "tools/train_and_eval.py",
    "content": "import _init_path\nimport numpy as np\nimport os\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nimport torch.optim.lr_scheduler as lr_sched\nfrom torch.nn.utils import clip_grad_norm_\nfrom torch.utils.data import DataLoader\nimport tensorboard_logger as tb_log\nfrom dataset import KittiDataset\nimport argparse\nimport importlib\n\nparser = argparse.ArgumentParser(description=\"Arg parser\")\nparser.add_argument(\"--batch_size\", type=int, default=8)\nparser.add_argument(\"--epochs\", type=int, default=100)\nparser.add_argument(\"--ckpt_save_interval\", type=int, default=5)\nparser.add_argument('--workers', type=int, default=4)\nparser.add_argument(\"--mode\", type=str, default='train')\nparser.add_argument(\"--ckpt\", type=str, default='None')\n\nparser.add_argument(\"--net\", type=str, default='pointnet2_msg')\n\nparser.add_argument('--lr', type=float, default=0.002)\nparser.add_argument('--lr_decay', type=float, default=0.2)\nparser.add_argument('--lr_clip', type=float, default=0.000001)\nparser.add_argument('--decay_step_list', type=list, default=[50, 70, 80, 90])\nparser.add_argument('--weight_decay', type=float, default=0.001)\n\nparser.add_argument(\"--output_dir\", type=str, default='output')\nparser.add_argument(\"--extra_tag\", type=str, default='default')\n\nargs = parser.parse_args()\n\nFG_THRESH = 0.3\n\n\ndef log_print(info, log_f=None):\n    print(info)\n    if log_f is not None:\n        print(info, file=log_f)\n\n\nclass DiceLoss(nn.Module):\n    def __init__(self, ignore_target=-1):\n        super().__init__()\n        self.ignore_target = ignore_target\n\n    def forward(self, input, target):\n        \"\"\"\n        :param input: (N), logit\n        :param target: (N), {0, 1}\n        :return:\n        \"\"\"\n        input = torch.sigmoid(input.view(-1))\n        target = target.float().view(-1)\n        mask = (target != self.ignore_target).float()\n        return 1.0 - (torch.min(input, target) * mask).sum() / torch.clamp((torch.max(input, target) * mask).sum(), min=1.0)\n\n\ndef train_one_epoch(model, train_loader, optimizer, epoch, lr_scheduler, total_it, tb_log, log_f):\n    model.train()\n    log_print('===============TRAIN EPOCH %d================' % epoch, log_f=log_f)\n    loss_func = DiceLoss(ignore_target=-1)\n\n    for it, batch in enumerate(train_loader):\n        optimizer.zero_grad()\n\n        pts_input, cls_labels = batch['pts_input'], batch['cls_labels']\n        pts_input = torch.from_numpy(pts_input).cuda(non_blocking=True).float()\n        cls_labels = torch.from_numpy(cls_labels).cuda(non_blocking=True).long().view(-1)\n\n        pred_cls = model(pts_input)\n        pred_cls = pred_cls.view(-1)\n\n        loss = loss_func(pred_cls, cls_labels)\n        loss.backward()\n        clip_grad_norm_(model.parameters(), 1.0)\n        optimizer.step()\n\n        total_it += 1\n\n        pred_class = (torch.sigmoid(pred_cls) > FG_THRESH)\n        fg_mask = cls_labels > 0\n        correct = ((pred_class.long() == cls_labels) & fg_mask).float().sum()\n        union = fg_mask.sum().float() + (pred_class > 0).sum().float() - correct\n        iou = correct / torch.clamp(union, min=1.0)\n\n        cur_lr = lr_scheduler.get_lr()[0]\n        tb_log.log_value('learning_rate', cur_lr, epoch)\n        if tb_log is not None:\n            tb_log.log_value('train_loss', loss, total_it)\n            tb_log.log_value('train_fg_iou', iou, total_it)\n\n        log_print('training epoch %d: it=%d/%d, total_it=%d, loss=%.5f, fg_iou=%.3f, lr=%f' %\n                  (epoch, it, len(train_loader), total_it, loss.item(), iou.item(), cur_lr), log_f=log_f)\n\n    return total_it\n\n\ndef eval_one_epoch(model, eval_loader, epoch, tb_log=None, log_f=None):\n    model.train()\n    log_print('===============EVAL EPOCH %d================' % epoch, log_f=log_f)\n\n    iou_list = []\n    for it, batch in enumerate(eval_loader):\n        pts_input, cls_labels = batch['pts_input'], batch['cls_labels']\n        pts_input = torch.from_numpy(pts_input).cuda(non_blocking=True).float()\n        cls_labels = torch.from_numpy(cls_labels).cuda(non_blocking=True).long().view(-1)\n\n        pred_cls = model(pts_input)\n        pred_cls = pred_cls.view(-1)\n\n        pred_class = (torch.sigmoid(pred_cls) > FG_THRESH)\n        fg_mask = cls_labels > 0\n        correct = ((pred_class.long() == cls_labels) & fg_mask).float().sum()\n        union = fg_mask.sum().float() + (pred_class > 0).sum().float() - correct\n        iou = correct / torch.clamp(union, min=1.0)\n\n        iou_list.append(iou.item())\n        log_print('EVAL: it=%d/%d, iou=%.3f' % (it, len(eval_loader), iou), log_f=log_f)\n\n    iou_list = np.array(iou_list)\n    avg_iou = iou_list.mean()\n    if tb_log is not None:\n        tb_log.log_value('eval_fg_iou', avg_iou, epoch)\n\n    log_print('\\nEpoch %d: Average IoU (samples=%d): %.6f' % (epoch, iou_list.__len__(), avg_iou), log_f=log_f)\n    return avg_iou\n\n\ndef save_checkpoint(model, epoch, ckpt_name):\n    if isinstance(model, torch.nn.DataParallel):\n        model_state = model.module.state_dict()\n    else:\n        model_state = model.state_dict()\n\n    state = {'epoch': epoch, 'model_state': model_state}\n    ckpt_name = '{}.pth'.format(ckpt_name)\n    torch.save(state, ckpt_name)\n\n\ndef load_checkpoint(model, filename):\n    if os.path.isfile(filename):\n        log_print(\"==> Loading from checkpoint %s\" % filename)\n        checkpoint = torch.load(filename)\n        epoch = checkpoint['epoch']\n        model.load_state_dict(checkpoint['model_state'])\n        log_print(\"==> Done\")\n    else:\n        raise FileNotFoundError\n\n    return epoch\n\n\ndef train_and_eval(model, train_loader, eval_loader, tb_log, ckpt_dir, log_f):\n    model.cuda()\n    optimizer = optim.Adam(model.parameters(), lr=args.lr, weight_decay=args.weight_decay)\n\n    def lr_lbmd(cur_epoch):\n        cur_decay = 1\n        for decay_step in args.decay_step_list:\n            if cur_epoch >= decay_step:\n                cur_decay = cur_decay * args.lr_decay\n        return max(cur_decay, args.lr_clip / args.lr)\n\n    lr_scheduler = lr_sched.LambdaLR(optimizer, lr_lbmd)\n\n    total_it = 0\n    for epoch in range(1, args.epochs + 1):\n        lr_scheduler.step(epoch)\n        total_it = train_one_epoch(model, train_loader, optimizer, epoch, lr_scheduler, total_it, tb_log, log_f)\n\n        if epoch % args.ckpt_save_interval == 0:\n            with torch.no_grad():\n                avg_iou = eval_one_epoch(model, eval_loader, epoch, tb_log, log_f)\n                ckpt_name = os.path.join(ckpt_dir, 'checkpoint_epoch_%d' % epoch)\n                save_checkpoint(model, epoch, ckpt_name)\n\n\nif __name__ == '__main__':\n    MODEL = importlib.import_module(args.net)  # import network module\n    model = MODEL.get_model(input_channels=0)\n\n    eval_set = KittiDataset(root_dir='./data', mode='EVAL', split='val')\n    eval_loader = DataLoader(eval_set, batch_size=args.batch_size, shuffle=False, pin_memory=True,\n                             num_workers=args.workers, collate_fn=eval_set.collate_batch)\n\n    if args.mode == 'train':\n        train_set = KittiDataset(root_dir='./data', mode='TRAIN', split='train')\n        train_loader = DataLoader(train_set, batch_size=args.batch_size, shuffle=True, pin_memory=True,\n                                  num_workers=args.workers, collate_fn=train_set.collate_batch)\n        # output dir config\n        output_dir = os.path.join(args.output_dir, args.extra_tag)\n        os.makedirs(output_dir, exist_ok=True)\n        tb_log.configure(os.path.join(output_dir, 'tensorboard'))\n        ckpt_dir = os.path.join(output_dir, 'ckpt')\n        os.makedirs(ckpt_dir, exist_ok=True)\n\n        log_file = os.path.join(output_dir, 'log.txt')\n        log_f = open(log_file, 'w')\n\n        for key, val in vars(args).items():\n            log_print(\"{:16} {}\".format(key, val), log_f=log_f)\n\n        # train and eval\n        train_and_eval(model, train_loader, eval_loader, tb_log, ckpt_dir, log_f)\n        log_f.close()\n    elif args.mode == 'eval':\n        epoch = load_checkpoint(model, args.ckpt)\n        model.cuda()\n        with torch.no_grad():\n            avg_iou = eval_one_epoch(model, eval_loader, epoch)\n    else:\n        raise NotImplementedError\n\n"
  }
]