{
  "schema_version": 2,
  "id": "develop/ai/search-and-query/indexing/geoindex",
  "title": "Geospatial indexing",
  "url": "https://redis.io/docs/latest/develop/ai/search-and-query/indexing/geoindex/",
  "summary": "Options for indexing geospatial data",
  "aliases": [
    "/develop/interact/search-and-query/indexing/geoindex"
  ],
  "tags": [
    "docs",
    "develop",
    "stack",
    "oss",
    "rs",
    "rc",
    "oss",
    "kubernetes",
    "clients"
  ],
  "last_updated": "2026-09-11T15:33:04+01:00",
  "page_type": "content",
  "content_hash": "ea6cf3d914b3e077175020b8b6ada1b9d84c5a80232a34cbd568441e544b1f3f",
  "sections": [
    {
      "id": "geo",
      "title": "`GEO`",
      "role": "content",
      "text": "The following example creates a `GEO` index for JSON objects that store\ngeospatial data in a field called `location`, adds two product documents (any\nJSON object with the `product:` prefix and a `location` field is indexed\nautomatically), and then queries for products within a 100 mile radius of\nColorado Springs (Longitude=-104.800644, Latitude=38.846127). This returns only\nthe location in Denver, but a radius of 200 miles would also include the\nlocation in Fort Collins:\n\nGEO index: create a GEO index, add geospatial point documents, then run a radius query to find nearby locations\n\n**Difficulty:** Beginner\n\n**Commands:** FT.CREATE, JSON.SET, FT.SEARCH\n\n**Complexity:**\n- FT.CREATE: O(K)\n- JSON.SET: O(M+N)\n- FT.SEARCH: O(N)\n\n**Available in:** Redis CLI, C#, Go, Java (Synchronous - Jedis), Python\n\n##### Redis CLI\n\n[code example]\n\n##### C#\n\n[code example]\n\n##### Go\n\n[code example]\n\n##### Java (Synchronous - Jedis)\n\n[code example]\n\n##### Python\n\n[code example]\n\n\n\nSee [Geospatial queries](https://redis.io/docs/latest/develop/ai/search-and-query/query/geo-spatial)\nfor more information about the available options."
    },
    {
      "id": "geoshape",
      "title": "`GEOSHAPE`",
      "role": "content",
      "text": "The following example creates an index for JSON objects that include\ngeospatial data in a field called `geom`. The `FLAT` option at the end\nof the field definition specifies Cartesian coordinates instead of\nthe default spherical geographical coordinates (use `SPHERICAL` in\nplace of `FLAT` to choose the coordinate space explicitly). It then adds\nseveral shapes using the `shape:` prefix and runs a query that returns any\nshapes within the boundary of the green square but omits the green square\nitself:\n\nGEOSHAPE index: create a GEOSHAPE index, add polygon and point documents, then run a WITHIN query to test shape containment\n\n**Difficulty:** Intermediate\n\n**Commands:** FT.CREATE, JSON.SET, FT.SEARCH\n\n**Complexity:**\n- FT.CREATE: O(K)\n- JSON.SET: O(M+N)\n- FT.SEARCH: O(N)\n\n**Available in:** Redis CLI, C#, Go, Java (Synchronous - Jedis), Python\n\n##### Redis CLI\n\n[code example]\n\n##### C#\n\n[code example]\n\n##### Go\n\n[code example]\n\n##### Java (Synchronous - Jedis)\n\n[code example]\n\n##### Python\n\n[code example]\n\n\n\nYou can also run queries to find whether shapes in the index completely contain\nor overlap each other. See\n[Geospatial queries](https://redis.io/docs/latest/develop/ai/search-and-query/query/geo-spatial)\nfor more information."
    }
  ],
  "examples": [
    {
      "id": "geo-ex0",
      "language": "plaintext",
      "code": "> FT.CREATE productidx ON JSON PREFIX 1 product: SCHEMA $.location AS location GEO\nOK\n> JSON.SET product:46885 $ '{\"description\": \"Navy Blue Slippers\",\"price\": 45.99,\"city\": \"Denver\",\"location\": \"-104.991531, 39.742043\"}'\nOK\n> JSON.SET product:46886 $ '{\"description\": \"Bright Green Socks\",\"price\": 25.50,\"city\": \"Fort Collins\",\"location\": \"-105.0618814,40.5150098\"}'\nOK\n> FT.SEARCH productidx '@location:[-104.800644 38.846127 100 mi]'\n1) (integer) 1\n2) \"product:46885\"\n3) 1) \"$\"\n   2) \"{\\\"description\\\":\\\"Navy Blue Slippers\\\",\\\"price\\\":45.99,\\\"city\\\":\\\"Denver\\\",\\\"location\\\":\\\"-104.991531, 39.742043\\\"}\"",
      "section_id": "geo"
    },
    {
      "id": "geo-ex1",
      "language": "csharp",
      "code": "Schema geoSchema = new Schema()\n            .AddGeoField(new FieldName(\"$.location\", \"location\"));\n\n        bool geoCreateResult = db.FT().Create(\n            \"productidx\",\n            new FTCreateParams()\n                .On(IndexDataType.JSON)\n                .Prefix(\"product:\"),\n            geoSchema\n        );\n        Console.WriteLine(geoCreateResult); // >>> True\n\n        var product46885 = new\n        {\n            description = \"Navy Blue Slippers\",\n            price = 45.99,\n            city = \"Denver\",\n            location = \"-104.991531, 39.742043\"\n        };\n\n        bool gjAddResult1 = db.JSON().Set(\"product:46885\", \"$\", product46885);\n        Console.WriteLine(gjAddResult1); // >>> True\n\n        var product46886 = new\n        {\n            description = \"Bright Green Socks\",\n            price = 25.50,\n            city = \"Fort Collins\",\n            location = \"-105.0618814,40.5150098\"\n        };\n\n        bool gjAddResult2 = db.JSON().Set(\"product:46886\", \"$\", product46886);\n        Console.WriteLine(gjAddResult2); // >>> True\n\n        SearchResult geoQueryResult = db.FT().Search(\n            \"productidx\",\n            new Query(\"@location:[-104.800644 38.846127 100 mi]\")\n        );\n        Console.WriteLine(geoQueryResult.Documents.Count); // >>> 1\n\n        Console.WriteLine(\n            string.Join(\", \", geoQueryResult.Documents.Select(x => x[\"json\"]))\n        );\n        // >>> {\"description\":\"Navy Blue Slippers\",\"price\":45.99,\"city\":\"Denver\"...",
      "section_id": "geo"
    },
    {
      "id": "geo-ex2",
      "language": "go",
      "code": "geoCreateResult, err := rdb.FTCreate(ctx,\n\t\t\"productidx\",\n\t\t&redis.FTCreateOptions{\n\t\t\tOnJSON: true,\n\t\t\tPrefix: []interface{}{\"product:\"},\n\t\t},\n\t\t&redis.FieldSchema{\n\t\t\tFieldName: \"$.location\",\n\t\t\tAs:        \"location\",\n\t\t\tFieldType: redis.SearchFieldTypeGeo,\n\t\t},\n\t).Result()\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Println(geoCreateResult) // >>> OK\n\n\tprd46885 := map[string]interface{}{\n\t\t\"description\": \"Navy Blue Slippers\",\n\t\t\"price\":       45.99,\n\t\t\"city\":        \"Denver\",\n\t\t\"location\":    \"-104.991531, 39.742043\",\n\t}\n\n\tgjResult1, err := rdb.JSONSet(ctx, \"product:46885\", \"$\", prd46885).Result()\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Println(gjResult1) // >>> OK\n\n\tprd46886 := map[string]interface{}{\n\t\t\"description\": \"Bright Green Socks\",\n\t\t\"price\":       25.50,\n\t\t\"city\":        \"Fort Collins\",\n\t\t\"location\":    \"-105.0618814,40.5150098\",\n\t}\n\n\tgjResult2, err := rdb.JSONSet(ctx, \"product:46886\", \"$\", prd46886).Result()\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Println(gjResult2) // >>> OK\n\n\tgeoQueryResult, err := rdb.FTSearch(ctx, \"productidx\",\n\t\t\"@location:[-104.800644 38.846127 100 mi]\",\n\t).Result()\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Println(geoQueryResult)\n\t// >>> {1 [{product:46885...",
      "section_id": "geo"
    },
    {
      "id": "geo-ex3",
      "language": "java",
      "code": "SchemaField[] geoSchema = {\n            GeoField.of(\"$.location\").as(\"location\")\n        };\n\n        String geoIdxCreateResult = jedis.ftCreate(\"productidx\",\n            FTCreateParams.createParams()\n                    .on(IndexDataType.JSON)\n                    .addPrefix(\"product:\"),\n            geoSchema\n        );\n        \n        JSONObject prd46885 = new JSONObject()\n                .put(\"description\", \"Navy Blue Slippers\")\n                .put(\"price\", 45.99)\n                .put(\"city\", \"Denver\")\n                .put(\"location\", \"-104.991531, 39.742043\");\n        \n        String jsonAddResult1 = jedis.jsonSet(\"product:46885\", new Path2(\"$\"), prd46885);\n        System.out.println(jsonAddResult1); // >>> OK\n\n        JSONObject prd46886 = new JSONObject()\n                .put(\"description\", \"Bright Green Socks\")\n                .put(\"price\", 25.50)\n                .put(\"city\", \"Fort Collins\")\n                .put(\"location\", \"-105.0618814,40.5150098\");\n        \n        String jsonAddResult2 = jedis.jsonSet(\"product:46886\", new Path2(\"$\"), prd46886);\n        System.out.println(jsonAddResult2); // >>> OK\n\n        SearchResult geoResult = jedis.ftSearch(\"productidx\",\n            \"@location:[-104.800644 38.846127 100 mi]\"\n        );\n\n        System.out.println(geoResult.getTotalResults()); // >>> 1\n\n        for (Document doc: geoResult.getDocuments()) {\n            System.out.println(doc.getId());\n        }\n        // >>> product:46885",
      "section_id": "geo"
    },
    {
      "id": "geo-ex4",
      "language": "python",
      "code": "geo_schema = (\n    GeoField(\"$.location\", as_name=\"location\")\n)\n\ngeo_index_create_result = r.ft(\"productidx\").create_index(\n    geo_schema,\n    definition=IndexDefinition(\n        prefix=[\"product:\"], index_type=IndexType.JSON\n    )\n)\nprint(geo_index_create_result)  # >>> True\n\nprd46885 = {\n    \"description\": \"Navy Blue Slippers\",\n    \"price\": 45.99,\n    \"city\": \"Denver\",\n    \"location\": \"-104.991531, 39.742043\"\n}\n\njson_add_result_1 = r.json().set(\"product:46885\", Path.root_path(), prd46885)\nprint(json_add_result_1)  # >>> True\n\nprd46886 = {\n    \"description\": \"Bright Green Socks\",\n    \"price\": 25.50,\n    \"city\": \"Fort Collins\",\n    \"location\": \"-105.0618814,40.5150098\"\n}\n\njson_add_result_2 = r.json().set(\"product:46886\", Path.root_path(), prd46886)\nprint(json_add_result_2)  # >>> True\n\ngeo_result = r.ft(\"productidx\").search(\n    \"@location:[-104.800644 38.846127 100 mi]\"\n)\nprint(geo_result)\n# >>> Result{1 total, docs: [Document {'id': 'product:46885'...",
      "section_id": "geo"
    },
    {
      "id": "geoshape-ex0",
      "language": "plaintext",
      "code": "> FT.CREATE geomidx ON JSON PREFIX 1 shape: SCHEMA $.name AS name TEXT $.geom AS geom GEOSHAPE FLAT\nOK\n> JSON.SET shape:1 $ '{\"name\": \"Green Square\", \"geom\": \"POLYGON ((1 1, 1 3, 3 3, 3 1, 1 1))\"}'\nOK\n> JSON.SET shape:2 $ '{\"name\": \"Red Rectangle\", \"geom\": \"POLYGON ((2 2.5, 2 3.5, 3.5 3.5, 3.5 2.5, 2 2.5))\"}'\nOK\n> JSON.SET shape:3 $ '{\"name\": \"Blue Triangle\", \"geom\": \"POLYGON ((3.5 1, 3.75 2, 4 1, 3.5 1))\"}'\nOK\n> JSON.SET shape:4 $ '{\"name\": \"Purple Point\", \"geom\": \"POINT (2 2)\"}'\nOK\n> FT.SEARCH geomidx \"(-@name:(Green Square) @geom:[WITHIN $qshape])\" PARAMS 2 qshape \"POLYGON ((1 1, 1 3, 3 3, 3 1, 1 1))\" RETURN 1 name DIALECT 2\n1) (integer) 1\n2) \"shape:4\"\n3) 1) \"name\"\n   2) \"Purple Point\"",
      "section_id": "geoshape"
    },
    {
      "id": "geoshape-ex1",
      "language": "csharp",
      "code": "Version version = muxer.GetServer(\"localhost:6379\").Version;\n        if (version.Major >= 7)\n        {\n            Schema geomSchema = new Schema()\n                .AddGeoShapeField(\n                    new FieldName(\"$.geom\", \"geom\"),\n                    Schema.GeoShapeField.CoordinateSystem.FLAT\n                )\n                .AddTextField(new FieldName(\"$.name\", \"name\"));\n\n            bool geomCreateResult = db.FT().Create(\n                \"geomidx\",\n                new FTCreateParams()\n                    .On(IndexDataType.JSON)\n                    .Prefix(\"shape:\"),\n                    geomSchema\n            );\n            Console.WriteLine(geomCreateResult); // >>> True\n        }\n\n\n        var shape1 = new\n        {\n            name = \"Green Square\",\n            geom = \"POLYGON ((1 1, 1 3, 3 3, 3 1, 1 1))\"\n        };\n\n        bool gmJsonRes1 = db.JSON().Set(\"shape:1\", \"$\", shape1);\n        Console.WriteLine(gmJsonRes1); // >>> True\n\n        var shape2 = new\n        {\n            name = \"Red Rectangle\",\n            geom = \"POLYGON ((2 2.5, 2 3.5, 3.5 3.5, 3.5 2.5, 2 2.5))\"\n        };\n\n        bool gmJsonRes2 = db.JSON().Set(\"shape:2\", \"$\", shape2);\n        Console.WriteLine(gmJsonRes2); // >>> True\n\n        var shape3 = new\n        {\n            name = \"Blue Triangle\",\n            geom = \"POLYGON ((3.5 1, 3.75 2, 4 1, 3.5 1))\"\n        };\n\n        bool gmJsonRes3 = db.JSON().Set(\"shape:3\", \"$\", shape3);\n        Console.WriteLine(gmJsonRes3); // >>> True\n\n        var shape4 = new\n        {\n            name = \"Purple Point\",\n            geom = \"POINT (2 2)\"\n        };\n\n        bool gmJsonRes4 = db.JSON().Set(\"shape:4\", \"$\", shape4);\n        Console.WriteLine(gmJsonRes4); // >>> True\n\n        if (version.Major >= 7)\n        {\n            SearchResult geomQueryResult = db.FT().Search(\n                \"geomidx\",\n                new Query(\"(-@name:(Green Square) @geom:[WITHIN $qshape])\")\n                    .AddParam(\"qshape\", \"POLYGON ((1 1, 1 3, 3 3, 3 1, 1 1))\")\n                    .Limit(0, 1)\n                    .Dialect(2)\n            );\n\n            Console.WriteLine(geomQueryResult.Documents.Count); // >>> 1\n            var res = string.Join(\", \", geomQueryResult.Documents.Select(x => x[\"json\"]));\n\n            Console.WriteLine(\n                string.Join(\", \", geomQueryResult.Documents.Select(x => x[\"json\"]))\n            );\n            // >>> {\"name\":\"Purple Point\",\"geom\":\"POINT (2 2)\"}\n        }",
      "section_id": "geoshape"
    },
    {
      "id": "geoshape-ex2",
      "language": "go",
      "code": "geomCreateResult, err := rdb.FTCreate(ctx, \"geomidx\",\n\t\t&redis.FTCreateOptions{\n\t\t\tOnJSON: true,\n\t\t\tPrefix: []interface{}{\"shape:\"},\n\t\t},\n\t\t&redis.FieldSchema{\n\t\t\tFieldName: \"$.name\",\n\t\t\tAs:        \"name\",\n\t\t\tFieldType: redis.SearchFieldTypeText,\n\t\t},\n\t\t&redis.FieldSchema{\n\t\t\tFieldName:         \"$.geom\",\n\t\t\tAs:                \"geom\",\n\t\t\tFieldType:         redis.SearchFieldTypeGeoShape,\n\t\t\tGeoShapeFieldType: \"FLAT\",\n\t\t},\n\t).Result()\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Println(geomCreateResult) // >>> OK\n\n\tshape1 := map[string]interface{}{\n\t\t\"name\": \"Green Square\",\n\t\t\"geom\": \"POLYGON ((1 1, 1 3, 3 3, 3 1, 1 1))\",\n\t}\n\n\tgmjResult1, err := rdb.JSONSet(ctx, \"shape:1\", \"$\", shape1).Result()\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Println(gmjResult1) // >>> OK\n\n\tshape2 := map[string]interface{}{\n\t\t\"name\": \"Red Rectangle\",\n\t\t\"geom\": \"POLYGON ((2 2.5, 2 3.5, 3.5 3.5, 3.5 2.5, 2 2.5))\",\n\t}\n\n\tgmjResult2, err := rdb.JSONSet(ctx, \"shape:2\", \"$\", shape2).Result()\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Println(gmjResult2) // >>> OK\n\n\tshape3 := map[string]interface{}{\n\t\t\"name\": \"Blue Triangle\",\n\t\t\"geom\": \"POLYGON ((3.5 1, 3.75 2, 4 1, 3.5 1))\",\n\t}\n\n\tgmjResult3, err := rdb.JSONSet(ctx, \"shape:3\", \"$\", shape3).Result()\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Println(gmjResult3) // >>> OK\n\n\tshape4 := map[string]interface{}{\n\t\t\"name\": \"Purple Point\",\n\t\t\"geom\": \"POINT (2 2)\",\n\t}\n\n\tgmjResult4, err := rdb.JSONSet(ctx, \"shape:4\", \"$\", shape4).Result()\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Println(gmjResult4) // >>> OK\n\n\tgeomQueryResult, err := rdb.FTSearchWithArgs(ctx, \"geomidx\",\n\t\t\"(-@name:(Green Square) @geom:[WITHIN $qshape])\",\n\t\t&redis.FTSearchOptions{\n\t\t\tParams: map[string]interface{}{\n\t\t\t\t\"qshape\": \"POLYGON ((1 1, 1 3, 3 3, 3 1, 1 1))\",\n\t\t\t},\n\t\t\tDialectVersion: 4,\n\t\t\tLimit:          1,\n\t\t},\n\t).Result()\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tfmt.Println(geomQueryResult)\n\t// >>> {1 [{shape:4...",
      "section_id": "geoshape"
    },
    {
      "id": "geoshape-ex3",
      "language": "java",
      "code": "SchemaField[] geomSchema = {\n            TextField.of(\"$.name\").as(\"name\"),\n            GeoShapeField.of(\"$.geom\", CoordinateSystem.FLAT).as(\"geom\")\n        };\n\n        String geomIndexCreateResult = jedis.ftCreate(\"geomidx\",\n            FTCreateParams.createParams()\n                    .on(IndexDataType.JSON)\n                    .addPrefix(\"shape:\"),\n            geomSchema\n        );\n        System.out.println(geomIndexCreateResult); // >>> OK\n\n        JSONObject shape1 = new JSONObject()\n                .put(\"name\", \"Green Square\")\n                .put(\"geom\", \"POLYGON ((1 1, 1 3, 3 3, 3 1, 1 1))\");\n        \n        String gmJsonRes1 = jedis.jsonSet(\"shape:1\", new Path2(\"$\"), shape1);\n        System.out.println(gmJsonRes1); // >>> OK\n\n        JSONObject shape2 = new JSONObject()\n                .put(\"name\", \"Red Rectangle\")\n                .put(\"geom\", \"POLYGON ((2 2.5, 2 3.5, 3.5 3.5, 3.5 2.5, 2 2.5))\");\n        \n        String gmJsonRes2 = jedis.jsonSet(\"shape:2\", new Path2(\"$\"), shape2);\n        System.out.println(gmJsonRes2); // >>> OK\n\n        JSONObject shape3 = new JSONObject()\n                .put(\"name\", \"Blue Triangle\")\n                .put(\"geom\", \"POLYGON ((3.5 1, 3.75 2, 4 1, 3.5 1))\");\n        \n        String gmJsonRes3 = jedis.jsonSet(\"shape:3\", new Path2(\"$\"), shape3);\n        System.out.println(gmJsonRes3); // >>> OK\n\n        JSONObject shape4 = new JSONObject()\n                .put(\"name\", \"Purple Point\")\n                .put(\"geom\", \"POINT (2 2)\");\n        \n        String gmJsonRes4 = jedis.jsonSet(\"shape:4\", new Path2(\"$\"), shape4);\n        System.out.println(gmJsonRes4); // >>> OK\n\n        SearchResult geomResult = jedis.ftSearch(\"geomidx\",\n            \"(-@name:(Green Square) @geom:[WITHIN $qshape])\",\n            FTSearchParams.searchParams()\n                    .addParam(\"qshape\", \"POLYGON ((1 1, 1 3, 3 3, 3 1, 1 1))\")\n                    .dialect(4)\n                    .limit(0, 1)\n        );\n        System.out.println(geomResult.getTotalResults()); // >>> 1\n\n        for (Document doc: geomResult.getDocuments()) {\n            System.out.println(doc.getId());\n        }\n        // shape:4",
      "section_id": "geoshape"
    },
    {
      "id": "geoshape-ex4",
      "language": "python",
      "code": "geom_schema = (\n    TextField(\"$.name\", as_name=\"name\"),\n    GeoShapeField(\n        \"$.geom\", as_name=\"geom\", coord_system=GeoShapeField.FLAT\n    )\n)\n\ngeom_index_create_result = r.ft(\"geomidx\").create_index(\n    geom_schema,\n    definition=IndexDefinition(\n        prefix=[\"shape:\"], index_type=IndexType.JSON\n    )\n)\nprint(geom_index_create_result)  # True\n\nshape1 = {\n    \"name\": \"Green Square\",\n    \"geom\": \"POLYGON ((1 1, 1 3, 3 3, 3 1, 1 1))\"\n}\n\ngm_json_res_1 = r.json().set(\"shape:1\", Path.root_path(), shape1)\nprint(gm_json_res_1)  # >>> True\n\nshape2 = {\n    \"name\": \"Red Rectangle\",\n    \"geom\": \"POLYGON ((2 2.5, 2 3.5, 3.5 3.5, 3.5 2.5, 2 2.5))\"\n}\n\ngm_json_res_2 = r.json().set(\"shape:2\", Path.root_path(), shape2)\nprint(gm_json_res_2)  # >>> True\n\nshape3 = {\n    \"name\": \"Blue Triangle\",\n    \"geom\": \"POLYGON ((3.5 1, 3.75 2, 4 1, 3.5 1))\"\n}\n\ngm_json_res_3 = r.json().set(\"shape:3\", Path.root_path(), shape3)\nprint(gm_json_res_3)  # >>> True\n\nshape4 = {\n    \"name\": \"Purple Point\",\n    \"geom\": \"POINT (2 2)\"\n}\n\ngm_json_res_4 = r.json().set(\"shape:4\", Path.root_path(), shape4)\nprint(gm_json_res_4)  # >>> True\n\ngeom_result = r.ft(\"geomidx\").search(\n    Query(\n        \"(-@name:(Green Square) @geom:[WITHIN $qshape])\"\n    ).dialect(4).paging(0, 1),\n    query_params={\n        \"qshape\": \"POLYGON ((1 1, 1 3, 3 3, 3 1, 1 1))\"\n    }\n)\nprint(geom_result)\n# >>> Result{1 total, docs: [Document {'id': 'shape:4'...",
      "section_id": "geoshape"
    }
  ]
}
