)]}'
{"nova/api/openstack/placement/handlers/allocation_candidate.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"cbbcd8c4a9bb1981506151ae9a33cf823f5a1520","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        schema \u003d _GET_SCHEMA_1_11"},{"line_number":184,"context_line":"    util.validate_query_params(req, schema)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    filters \u003d util.parse_qs_resources_and_traits(req.GET)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    if want_version \u003c\u003d (1, 10):"},{"line_number":189,"context_line":"        filters \u003d {"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_2917b0a6","line":186,"updated":"2017-10-26 12:42:39.000000000","message":"You may already be, but keep in mind that we\u0027re going to be adding \u0027limit\u0027 to these filters and potentially other stuff later.\n\nhttps://review.openstack.org/#/c/513526/","commit_id":"6b1825e1711d7af102494ba1c6dcf26bbfa3f863"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"486c7db9d4d77c2685a879af3cf6e3a0c18c3c8f","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        schema \u003d _GET_SCHEMA_1_11"},{"line_number":184,"context_line":"    util.validate_query_params(req, schema)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    filters \u003d util.parse_qs_resources_and_traits(req.GET)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    if want_version \u003c\u003d (1, 10):"},{"line_number":189,"context_line":"        filters \u003d {"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_42c0137d","line":186,"in_reply_to":"3f4b6375_2917b0a6","updated":"2017-10-31 14:10:53.000000000","message":"Agree, just couldn\u0027t think of a better name yet.  I think we\u0027re going with \"request groups\", which should cover.","commit_id":"6b1825e1711d7af102494ba1c6dcf26bbfa3f863"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"b6a0a97a3ef5086fea4d3ab21fe9451a4d308307","unresolved":false,"context_lines":[{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    filters \u003d util.parse_qs_resources_and_traits(req.GET)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    if want_version \u003c\u003d (1, 10):"},{"line_number":189,"context_line":"        filters \u003d {"},{"line_number":190,"context_line":"            \u0027resources\u0027: filters[\u0027unnumbered\u0027][\u0027resources\u0027],"},{"line_number":191,"context_line":"        }"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        try:"},{"line_number":194,"context_line":"            cands \u003d rp_obj.AllocationCandidates.get_by_filters(context,"},{"line_number":195,"context_line":"                                                               filters)"},{"line_number":196,"context_line":"        except exception.ResourceClassNotFound as exc:"},{"line_number":197,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":198,"context_line":"                _(\u0027Invalid resource class in resources parameter: %(error)s\u0027) %"},{"line_number":199,"context_line":"                {\u0027error\u0027: exc})"},{"line_number":200,"context_line":"    else:"},{"line_number":201,"context_line":"        try:"},{"line_number":202,"context_line":"            cands \u003d rp_obj.AllocationCandidates.get_by_filters_grouped(context,"},{"line_number":203,"context_line":"                                                                       filters)"},{"line_number":204,"context_line":"        except exception.ResourceClassNotFound as exc:"},{"line_number":205,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":206,"context_line":"                _(\u0027Invalid resource class in a \"resources\" parameter: \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_b97cbc72","line":203,"range":{"start_line":188,"start_character":4,"end_line":203,"end_character":79},"updated":"2017-10-30 16:24:28.000000000","message":"I don\u0027t see a need to have two different AllocationCandidates.get_XXX() methods. The existing get_by_filters() should be reworked so that instead of \u0027resources\u0027 and \u0027required_traits\u0027 filter keys, there should be a single \u0027request_groups\u0027 filter key. This filter will be a list of RequestGroup objects that describe the groups of resources/traits to filter on.","commit_id":"6b1825e1711d7af102494ba1c6dcf26bbfa3f863"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"486c7db9d4d77c2685a879af3cf6e3a0c18c3c8f","unresolved":false,"context_lines":[{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    filters \u003d util.parse_qs_resources_and_traits(req.GET)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    if want_version \u003c\u003d (1, 10):"},{"line_number":189,"context_line":"        filters \u003d {"},{"line_number":190,"context_line":"            \u0027resources\u0027: filters[\u0027unnumbered\u0027][\u0027resources\u0027],"},{"line_number":191,"context_line":"        }"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        try:"},{"line_number":194,"context_line":"            cands \u003d rp_obj.AllocationCandidates.get_by_filters(context,"},{"line_number":195,"context_line":"                                                               filters)"},{"line_number":196,"context_line":"        except exception.ResourceClassNotFound as exc:"},{"line_number":197,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":198,"context_line":"                _(\u0027Invalid resource class in resources parameter: %(error)s\u0027) %"},{"line_number":199,"context_line":"                {\u0027error\u0027: exc})"},{"line_number":200,"context_line":"    else:"},{"line_number":201,"context_line":"        try:"},{"line_number":202,"context_line":"            cands \u003d rp_obj.AllocationCandidates.get_by_filters_grouped(context,"},{"line_number":203,"context_line":"                                                                       filters)"},{"line_number":204,"context_line":"        except exception.ResourceClassNotFound as exc:"},{"line_number":205,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":206,"context_line":"                _(\u0027Invalid resource class in a \"resources\" parameter: \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_a2834704","line":203,"range":{"start_line":188,"start_character":4,"end_line":203,"end_character":79},"in_reply_to":"3f4b6375_b97cbc72","updated":"2017-10-31 14:10:53.000000000","message":"My thought was that the two separate methods were necessary to straddle microversions.  But I suppose I can do that validation up front here.  If the validation passes for the earlier microversion, it means the parameter would contain only one RequestGroup (the unnumbered \"sharing\" one) and no traits.\n\nWill fix.","commit_id":"6b1825e1711d7af102494ba1c6dcf26bbfa3f863"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"52b92e69d762f988a3b832fc2bac4b3aabed551f","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"# Pattern property key format for a numbered or un-numbered grouping"},{"line_number":48,"context_line":"_GROUP_PAT_FMT \u003d \"^%s([1-9][0-9]*)?$\""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"# TODO(efried): Whatever microversion we\u0027re at when this is ready to go..."},{"line_number":52,"context_line":"_GET_SCHEMA_1_11 \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f4b6375_d882aba5","line":49,"updated":"2017-10-31 20:46:39.000000000","message":"nit: only need one blankline here.","commit_id":"3d857dee19d9e9f02bc88006af8e35549df14479"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"52b92e69d762f988a3b832fc2bac4b3aabed551f","unresolved":false,"context_lines":[{"line_number":179,"context_line":"    \"\"\""},{"line_number":180,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"},{"line_number":181,"context_line":"    want_version \u003d req.environ[microversion.MICROVERSION_ENVIRON]"},{"line_number":182,"context_line":"    if want_version \u003c\u003d (1, 10):"},{"line_number":183,"context_line":"        schema \u003d _GET_SCHEMA_1_10"},{"line_number":184,"context_line":"    else:"},{"line_number":185,"context_line":"        schema \u003d _GET_SCHEMA_1_11"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f4b6375_78bdf766","line":182,"updated":"2017-10-31 20:46:39.000000000","message":"Takashi will likely tell you to use the matches(VERSION) function instead of comparing to raw tuples. :)","commit_id":"3d857dee19d9e9f02bc88006af8e35549df14479"}],"nova/objects/resource_provider.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c73c1b640a826ca01a96b461e8431a072485cccc","unresolved":false,"context_lines":[{"line_number":2449,"context_line":"        of allocation requests constructed from that list of resource"},{"line_number":2450,"context_line":"        providers."},{"line_number":2451,"context_line":""},{"line_number":2452,"context_line":"        :param filters: List of nova.api.openstack.placement.util.RequestGroup."},{"line_number":2453,"context_line":"                        Each RequestGroup contains:"},{"line_number":2454,"context_line":""},{"line_number":2455,"context_line":"            resources: A dict, keyed by resource class name, of amounts of"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_8367e3b7","line":2452,"range":{"start_line":2452,"start_character":15,"end_line":2452,"end_character":22},"updated":"2017-11-02 18:33:45.000000000","message":"I\u0027d recommend getting rid of the filters parameter and changing the function to be just AllocationCandidates.get_by_requests() and passing a \"request_groups\" parameter that would simply be a list of RequestGroup objects.","commit_id":"76fc8fe67afaec0432f60fdb3c5dd2723ab6e3ce"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"48823ce7f887d63f5ed30e7668f41c137f871d57","unresolved":false,"context_lines":[{"line_number":2449,"context_line":"        of allocation requests constructed from that list of resource"},{"line_number":2450,"context_line":"        providers."},{"line_number":2451,"context_line":""},{"line_number":2452,"context_line":"        :param filters: List of nova.api.openstack.placement.util.RequestGroup."},{"line_number":2453,"context_line":"                        Each RequestGroup contains:"},{"line_number":2454,"context_line":""},{"line_number":2455,"context_line":"            resources: A dict, keyed by resource class name, of amounts of"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f4b6375_57008101","line":2452,"range":{"start_line":2452,"start_character":15,"end_line":2452,"end_character":22},"in_reply_to":"3f4b6375_8367e3b7","updated":"2017-11-02 20:34:03.000000000","message":"Done\n\n(Patch still very much unfinished, of course)","commit_id":"76fc8fe67afaec0432f60fdb3c5dd2723ab6e3ce"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bff603af761350605131538eea5e9cf594daed25","unresolved":false,"context_lines":[{"line_number":2459,"context_line":"                               required_traits in this group must come from the"},{"line_number":2460,"context_line":"                               same resource provider.  If False, they may come"},{"line_number":2461,"context_line":"                               from any resource provider in the same nested"},{"line_number":2462,"context_line":"                               tree or associated aggregate."},{"line_number":2463,"context_line":"        \"\"\""},{"line_number":2464,"context_line":"        _ensure_rc_cache(context)"},{"line_number":2465,"context_line":"        alloc_reqs, provider_summaries \u003d cls._get_by_requests(context,"}],"source_content_type":"text/x-python","patch_set":11,"id":"3f4b6375_a03e0e88","line":2462,"updated":"2017-11-06 23:28:37.000000000","message":"I actually wouldn\u0027t bother documenting the RequestGroup attributes like this. Reason being: you will need to update two places if/when attributes change. Better, I think, to just state that the requests param is of type list of nova.api.openstack.placement.util.RequestGroup and leave it at that.","commit_id":"ee525c47d73ae700ea19185e092c76ec1a61d944"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"66cb00fec7772a90aee832d02dfec1f7c51740cc","unresolved":false,"context_lines":[{"line_number":2459,"context_line":"                               required_traits in this group must come from the"},{"line_number":2460,"context_line":"                               same resource provider.  If False, they may come"},{"line_number":2461,"context_line":"                               from any resource provider in the same nested"},{"line_number":2462,"context_line":"                               tree or associated aggregate."},{"line_number":2463,"context_line":"        \"\"\""},{"line_number":2464,"context_line":"        _ensure_rc_cache(context)"},{"line_number":2465,"context_line":"        alloc_reqs, provider_summaries \u003d cls._get_by_requests(context,"}],"source_content_type":"text/x-python","patch_set":11,"id":"3f4b6375_80b672f8","line":2462,"in_reply_to":"3f4b6375_a03e0e88","updated":"2017-11-07 01:49:21.000000000","message":"Done","commit_id":"ee525c47d73ae700ea19185e092c76ec1a61d944"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bff603af761350605131538eea5e9cf594daed25","unresolved":false,"context_lines":[{"line_number":2480,"context_line":"        # share one or more of the requested resource(s)"},{"line_number":2481,"context_line":"        # TODO(efried): Handle traits; handle non-sharing groups."},{"line_number":2482,"context_line":"        # For now, this extracts just the data expected by 1.10 - no API change"},{"line_number":2483,"context_line":"        resources \u003d [resource_group.resources for resource_group in requests"},{"line_number":2484,"context_line":"                     if not resource_group.use_same_provider]"},{"line_number":2485,"context_line":"        if len(resources) !\u003d 1:"},{"line_number":2486,"context_line":"            raise ValueError(_(\"Supply a resources collection in filters.\"))"}],"source_content_type":"text/x-python","patch_set":11,"id":"3f4b6375_800f92de","line":2483,"range":{"start_line":2483,"start_character":50,"end_line":2483,"end_character":64},"updated":"2017-11-06 23:28:37.000000000","message":"request_group","commit_id":"ee525c47d73ae700ea19185e092c76ec1a61d944"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"66cb00fec7772a90aee832d02dfec1f7c51740cc","unresolved":false,"context_lines":[{"line_number":2480,"context_line":"        # share one or more of the requested resource(s)"},{"line_number":2481,"context_line":"        # TODO(efried): Handle traits; handle non-sharing groups."},{"line_number":2482,"context_line":"        # For now, this extracts just the data expected by 1.10 - no API change"},{"line_number":2483,"context_line":"        resources \u003d [resource_group.resources for resource_group in requests"},{"line_number":2484,"context_line":"                     if not resource_group.use_same_provider]"},{"line_number":2485,"context_line":"        if len(resources) !\u003d 1:"},{"line_number":2486,"context_line":"            raise ValueError(_(\"Supply a resources collection in filters.\"))"}],"source_content_type":"text/x-python","patch_set":11,"id":"3f4b6375_a0b3ae09","line":2483,"range":{"start_line":2483,"start_character":50,"end_line":2483,"end_character":64},"in_reply_to":"3f4b6375_800f92de","updated":"2017-11-07 01:49:21.000000000","message":"Gah!  Done.","commit_id":"ee525c47d73ae700ea19185e092c76ec1a61d944"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1fb46d39baf6b9b04e98abbd06706f06a9ccb1c5","unresolved":false,"context_lines":[{"line_number":2473,"context_line":"        resources \u003d [request_group.resources for request_group in requests"},{"line_number":2474,"context_line":"                     if not request_group.use_same_provider]"},{"line_number":2475,"context_line":"        if len(resources) !\u003d 1:"},{"line_number":2476,"context_line":"            raise ValueError(_(\"Supply a resources collection in filters.\"))"},{"line_number":2477,"context_line":"        resources \u003d resources[0]"},{"line_number":2478,"context_line":""},{"line_number":2479,"context_line":"        # Transform resource string names to internal integer IDs"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f485f77_6c91d499","line":2476,"range":{"start_line":2476,"start_character":41,"end_line":2476,"end_character":61},"updated":"2017-11-13 13:07:25.000000000","message":"\u0027a list of RequestGroup objects\u0027 would be more correct here now","commit_id":"153527889dc8e1247cd10f5ef14ad60cf14eb74f"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1fb46d39baf6b9b04e98abbd06706f06a9ccb1c5","unresolved":false,"context_lines":[{"line_number":2473,"context_line":"        resources \u003d [request_group.resources for request_group in requests"},{"line_number":2474,"context_line":"                     if not request_group.use_same_provider]"},{"line_number":2475,"context_line":"        if len(resources) !\u003d 1:"},{"line_number":2476,"context_line":"            raise ValueError(_(\"Supply a resources collection in filters.\"))"},{"line_number":2477,"context_line":"        resources \u003d resources[0]"},{"line_number":2478,"context_line":""},{"line_number":2479,"context_line":"        # Transform resource string names to internal integer IDs"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f485f77_0ceee021","line":2476,"range":{"start_line":2476,"start_character":62,"end_line":2476,"end_character":72},"updated":"2017-11-13 13:07:25.000000000","message":"It is not called fiters any more.","commit_id":"153527889dc8e1247cd10f5ef14ad60cf14eb74f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"acf28b9f12d55b25e49de30a1b6d7d89c3634834","unresolved":false,"context_lines":[{"line_number":2473,"context_line":"        resources \u003d [request_group.resources for request_group in requests"},{"line_number":2474,"context_line":"                     if not request_group.use_same_provider]"},{"line_number":2475,"context_line":"        if len(resources) !\u003d 1:"},{"line_number":2476,"context_line":"            raise ValueError(_(\"Supply a resources collection in filters.\"))"},{"line_number":2477,"context_line":"        resources \u003d resources[0]"},{"line_number":2478,"context_line":""},{"line_number":2479,"context_line":"        # Transform resource string names to internal integer IDs"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f485f77_4e872b11","line":2476,"range":{"start_line":2476,"start_character":62,"end_line":2476,"end_character":72},"in_reply_to":"1f485f77_0ceee021","updated":"2017-11-13 15:09:54.000000000","message":"Done","commit_id":"153527889dc8e1247cd10f5ef14ad60cf14eb74f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"acf28b9f12d55b25e49de30a1b6d7d89c3634834","unresolved":false,"context_lines":[{"line_number":2473,"context_line":"        resources \u003d [request_group.resources for request_group in requests"},{"line_number":2474,"context_line":"                     if not request_group.use_same_provider]"},{"line_number":2475,"context_line":"        if len(resources) !\u003d 1:"},{"line_number":2476,"context_line":"            raise ValueError(_(\"Supply a resources collection in filters.\"))"},{"line_number":2477,"context_line":"        resources \u003d resources[0]"},{"line_number":2478,"context_line":""},{"line_number":2479,"context_line":"        # Transform resource string names to internal integer IDs"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f485f77_2e7e2f19","line":2476,"range":{"start_line":2476,"start_character":41,"end_line":2476,"end_character":61},"in_reply_to":"1f485f77_6c91d499","updated":"2017-11-13 15:09:54.000000000","message":"Done","commit_id":"153527889dc8e1247cd10f5ef14ad60cf14eb74f"}],"nova/tests/functional/db/test_resource_provider.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bff603af761350605131538eea5e9cf594daed25","unresolved":false,"context_lines":[{"line_number":2495,"context_line":"                    \u0027CUSTOM_GOLD\u0027"},{"line_number":2496,"context_line":"                }"},{"line_number":2497,"context_line":"            ),"},{"line_number":2498,"context_line":"            placement_lib.RequestGroup("},{"line_number":2499,"context_line":"                resources\u003d{"},{"line_number":2500,"context_line":"                    fields.ResourceClass.IPV4_ADDRESS: 2,"},{"line_number":2501,"context_line":"                },"},{"line_number":2502,"context_line":"                required_traits\u003d{"},{"line_number":2503,"context_line":"                    \u0027HW_NIC_OFFLOAD_RX\u0027,"},{"line_number":2504,"context_line":"                }"},{"line_number":2505,"context_line":"            )"},{"line_number":2506,"context_line":"        ]"},{"line_number":2507,"context_line":"        return requests"},{"line_number":2508,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3f4b6375_e02f663c","line":2505,"range":{"start_line":2498,"start_character":1,"end_line":2505,"end_character":13},"updated":"2017-11-06 23:28:37.000000000","message":"for the test fixtures (that are testing the functionality of *right now*), I\u0027d prefer we just returned a request that matches what we *currently* support. In other words, just return a single placement_lib.RequestGroup object representing the request for DISK, MEMORY_MB, and VCPU.","commit_id":"ee525c47d73ae700ea19185e092c76ec1a61d944"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"66cb00fec7772a90aee832d02dfec1f7c51740cc","unresolved":false,"context_lines":[{"line_number":2495,"context_line":"                    \u0027CUSTOM_GOLD\u0027"},{"line_number":2496,"context_line":"                }"},{"line_number":2497,"context_line":"            ),"},{"line_number":2498,"context_line":"            placement_lib.RequestGroup("},{"line_number":2499,"context_line":"                resources\u003d{"},{"line_number":2500,"context_line":"                    fields.ResourceClass.IPV4_ADDRESS: 2,"},{"line_number":2501,"context_line":"                },"},{"line_number":2502,"context_line":"                required_traits\u003d{"},{"line_number":2503,"context_line":"                    \u0027HW_NIC_OFFLOAD_RX\u0027,"},{"line_number":2504,"context_line":"                }"},{"line_number":2505,"context_line":"            )"},{"line_number":2506,"context_line":"        ]"},{"line_number":2507,"context_line":"        return requests"},{"line_number":2508,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3f4b6375_40919a51","line":2505,"range":{"start_line":2498,"start_character":1,"end_line":2505,"end_character":13},"in_reply_to":"3f4b6375_e02f663c","updated":"2017-11-07 01:49:21.000000000","message":"Fair enough.  It was a sort of pseudo-unit test to make sure the code on L2483-4 was doing the filtering right to make a backward-compatible object.\n\nDone.","commit_id":"ee525c47d73ae700ea19185e092c76ec1a61d944"}]}
