)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"0b908d0650d8faeef4d33d9785cb9a4da73949f9","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Jaume Devesa \u003cdevvesa@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-06-12 16:51:42 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Autocreated ports count agains port quota"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This commit adds a filter when counting port quota to avoid count"},{"line_number":10,"context_line":"auto-created ports used by neutron routers, dhcp routers and floating ip"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"1ae5cdf2_64bdeeb0","line":7,"updated":"2014-06-13 07:31:46.000000000","message":"s/agains/against/","commit_id":"edc9c55e2457ce282d761efff64b68908408c7fc"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"0b908d0650d8faeef4d33d9785cb9a4da73949f9","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Autocreated ports count agains port quota"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This commit adds a filter when counting port quota to avoid count"},{"line_number":10,"context_line":"auto-created ports used by neutron routers, dhcp routers and floating ip"},{"line_number":11,"context_line":"addresses."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"1ae5cdf2_84df5a0c","line":9,"updated":"2014-06-13 07:31:46.000000000","message":"s/count/counting/","commit_id":"edc9c55e2457ce282d761efff64b68908408c7fc"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"664f84f653f743053238bf54f5c6792d4796bb4a","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Autocreated ports count agains port quota"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This commit adds a filter when counting port quota to avoid count"},{"line_number":10,"context_line":"auto-created ports used by neutron routers, dhcp routers and floating ip"},{"line_number":11,"context_line":"addresses."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"1ae5cdf2_2f865fb9","line":9,"in_reply_to":"1ae5cdf2_84df5a0c","updated":"2014-06-13 08:22:08.000000000","message":"Thanks Kevin","commit_id":"edc9c55e2457ce282d761efff64b68908408c7fc"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"250fd39b7e28bb05478562b5c9e3a6cae86c0c01","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Autocreated ports count against port quota"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This commit adds a filter when counting port quota to avoid counting"},{"line_number":10,"context_line":"auto-created ports used by neutron routers, dhcp routers and floating ip"},{"line_number":11,"context_line":"addresses."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Closes-bug: #1212338"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"1ae5cdf2_8bc39456","line":10,"updated":"2014-06-16 19:21:51.000000000","message":"s/dhcp routers/dhcp servers/","commit_id":"e5509063bef69654ce8d1bbb909f4f3f37cf5295"}],"neutron/quota.py":[{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"1fae2a0905cc3f9a2af8e92785f4bf196bb32383","unresolved":false,"context_lines":[{"line_number":314,"context_line":"    filters \u003d {\u0027tenant_id\u0027: [tenant_id]}"},{"line_number":315,"context_line":"    # Auto-created ports\u0027 device-owner field always start with the \u0027network:\u0027"},{"line_number":316,"context_line":"    # prefix. Avoid these values. Although this may change in a future, it has"},{"line_number":317,"context_line":"    # been accepted as a temporary solution."},{"line_number":318,"context_line":"    if resources \u003d\u003d attributes.PORTS:"},{"line_number":319,"context_line":"        filters[\u0027device_owner\u0027] \u003d [\u0027\u0027, \u0027compute:nova\u0027]"},{"line_number":320,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1ae5cdf2_4f610238","line":317,"updated":"2014-06-12 16:32:52.000000000","message":"it\u0027s better to explain what kind of ports these items in the filter (\"\" and \"compute:nova\") are for.","commit_id":"1cc5c9249a5a505bd173721154052f0e84943759"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"250fd39b7e28bb05478562b5c9e3a6cae86c0c01","unresolved":false,"context_lines":[{"line_number":315,"context_line":"    # Auto-created ports\u0027 device_owner field always start with the \u0027network:*\u0027"},{"line_number":316,"context_line":"    # prefix. \u0027compute:nova\u0027 and empty \u0027\u0027 values are ports created by the"},{"line_number":317,"context_line":"    # user and hence, the ones acceptable to be computed in quotas. Although"},{"line_number":318,"context_line":"    # this may change in a future, it has been accepted as a temporary"},{"line_number":319,"context_line":"    # solution."},{"line_number":320,"context_line":"    if resources \u003d\u003d attributes.PORTS:"},{"line_number":321,"context_line":"        filters[\u0027device_owner\u0027] \u003d [\u0027\u0027, \u0027compute:nova\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_2b93605d","line":318,"updated":"2014-06-16 19:21:51.000000000","message":"s/in a/in the/","commit_id":"e5509063bef69654ce8d1bbb909f4f3f37cf5295"},{"author":{"_account_id":1935,"name":"Tomoe Sugihara","email":"tomoe.sugihara@gmail.com","username":"tomoe"},"change_message_id":"89e992ad31b7bbeb455945eb9a1ad9dfdd1f5e71","unresolved":false,"context_lines":[{"line_number":316,"context_line":"    # prefix. \u0027compute:nova\u0027 and empty \u0027\u0027 values are ports created by the"},{"line_number":317,"context_line":"    # user and hence, the ones acceptable to be computed in quotas. Although"},{"line_number":318,"context_line":"    # this may change in a future, it has been accepted as a temporary"},{"line_number":319,"context_line":"    # solution."},{"line_number":320,"context_line":"    if resources \u003d\u003d attributes.PORTS:"},{"line_number":321,"context_line":"        filters[\u0027device_owner\u0027] \u003d [\u0027\u0027, \u0027compute:nova\u0027]"},{"line_number":322,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1ae5cdf2_daf71658","line":319,"updated":"2014-06-17 04:52:24.000000000","message":"How about something like this to explain the change and the issue to be fixed simpler? \n\nCount ports only with empty \u0027\u0027 or \u0027compute:nova\u0027  in their device_owner field so that auto created ports (not created by tenants) wouldn\u0027t affect quota.","commit_id":"e5509063bef69654ce8d1bbb909f4f3f37cf5295"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"447afda41cb1077b950d4a5b23aae4459b83bdba","unresolved":false,"context_lines":[{"line_number":318,"context_line":"    # this may change in the future, it has been accepted as a temporary"},{"line_number":319,"context_line":"    # solution."},{"line_number":320,"context_line":"    if resources \u003d\u003d attributes.PORTS:"},{"line_number":321,"context_line":"        filters[\u0027device_owner\u0027] \u003d [\u0027\u0027, \u0027compute:nova\u0027]"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    # Some plugins support a count method for particular resources,"},{"line_number":324,"context_line":"    # using a DB\u0027s optimized counting features. We try to use that one"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_a32e6c8a","line":321,"updated":"2014-06-18 06:56:53.000000000","message":"oVirt uses Neutron as a network as a service appliance, and uses a different device_owner value (\u0027ovirt\u0027). Such ports would be counted against the quota. The alternative of doing a reverse filter of Neutron owned stuff (dhcp, routers, etc) isn\u0027t bullet proof (The network prefix dropped, or more types of owners added), but that can probably be \u0027enforced\u0027 with a unit test that\u0027d be designed to break if any of that stuff changes. \n\nJust something to consider.","commit_id":"3b50bf87c1b8076fd48ba4a6ac648c5ed55daeb5"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"577b0e6d6ff92c8e212ac1be255dff885e5f0766","unresolved":false,"context_lines":[{"line_number":318,"context_line":"    # this may change in the future, it has been accepted as a temporary"},{"line_number":319,"context_line":"    # solution."},{"line_number":320,"context_line":"    if resources \u003d\u003d attributes.PORTS:"},{"line_number":321,"context_line":"        filters[\u0027device_owner\u0027] \u003d [\u0027\u0027, \u0027compute:nova\u0027]"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    # Some plugins support a count method for particular resources,"},{"line_number":324,"context_line":"    # using a DB\u0027s optimized counting features. We try to use that one"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_c84c70a0","line":321,"in_reply_to":"1ae5cdf2_681c3c6b","updated":"2014-06-18 09:10:53.000000000","message":"I added Mike Kolesnik as a reviewer. I\u0027m not sure about the exact device_owner value for oVirt, he should be able to provide it.","commit_id":"3b50bf87c1b8076fd48ba4a6ac648c5ed55daeb5"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"a77c3b39e864461d39c144be7fa485ca2067afba","unresolved":false,"context_lines":[{"line_number":318,"context_line":"    # this may change in the future, it has been accepted as a temporary"},{"line_number":319,"context_line":"    # solution."},{"line_number":320,"context_line":"    if resources \u003d\u003d attributes.PORTS:"},{"line_number":321,"context_line":"        filters[\u0027device_owner\u0027] \u003d [\u0027\u0027, \u0027compute:nova\u0027]"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    # Some plugins support a count method for particular resources,"},{"line_number":324,"context_line":"    # using a DB\u0027s optimized counting features. We try to use that one"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_681c3c6b","line":321,"in_reply_to":"1ae5cdf2_9299b77b","updated":"2014-06-18 08:49:12.000000000","message":"No harm, I\u0027ll do a new patch soon.","commit_id":"3b50bf87c1b8076fd48ba4a6ac648c5ed55daeb5"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"c0765fed9e0f90ea01a23dd636993ffc9a3d4264","unresolved":false,"context_lines":[{"line_number":318,"context_line":"    # this may change in the future, it has been accepted as a temporary"},{"line_number":319,"context_line":"    # solution."},{"line_number":320,"context_line":"    if resources \u003d\u003d attributes.PORTS:"},{"line_number":321,"context_line":"        filters[\u0027device_owner\u0027] \u003d [\u0027\u0027, \u0027compute:nova\u0027]"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    # Some plugins support a count method for particular resources,"},{"line_number":324,"context_line":"    # using a DB\u0027s optimized counting features. We try to use that one"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_c85e1ee9","line":321,"in_reply_to":"1ae5cdf2_975b5721","updated":"2014-06-18 15:47:45.000000000","message":"tomoe, while i don\u0027t object entirely, it sounds too much for a temporary solution like this.","commit_id":"3b50bf87c1b8076fd48ba4a6ac648c5ed55daeb5"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"ef90eb63a0893ed41e86de291543b4ba8eb7262a","unresolved":false,"context_lines":[{"line_number":318,"context_line":"    # this may change in the future, it has been accepted as a temporary"},{"line_number":319,"context_line":"    # solution."},{"line_number":320,"context_line":"    if resources \u003d\u003d attributes.PORTS:"},{"line_number":321,"context_line":"        filters[\u0027device_owner\u0027] \u003d [\u0027\u0027, \u0027compute:nova\u0027]"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    # Some plugins support a count method for particular resources,"},{"line_number":324,"context_line":"    # using a DB\u0027s optimized counting features. We try to use that one"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_a3d58ce6","line":321,"in_reply_to":"1ae5cdf2_a32e6c8a","updated":"2014-06-18 07:15:21.000000000","message":"I thought about using the reverse filter as a first solution, but It does not exist by default in any of the _get_(entity)_query methods in base db module: https://github.com/openstack/neutron/blob/master/neutron/db/db_base_plugin_v2.py\n\nSuch change would be too big for a case like this, and as you have said, the use of reverse filter is not neither a bullet proof. So finally I decided to use the existing \u0027filters\u0027 parameter.\n\nSince the mock objects in the unit test modules mock the database access, I think the only way to have a confident test is doing it in tempest. I have it added in my TODO list.","commit_id":"3b50bf87c1b8076fd48ba4a6ac648c5ed55daeb5"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"61656904ff778b55d24be5860f802f6cc5b562f2","unresolved":false,"context_lines":[{"line_number":318,"context_line":"    # this may change in the future, it has been accepted as a temporary"},{"line_number":319,"context_line":"    # solution."},{"line_number":320,"context_line":"    if resources \u003d\u003d attributes.PORTS:"},{"line_number":321,"context_line":"        filters[\u0027device_owner\u0027] \u003d [\u0027\u0027, \u0027compute:nova\u0027]"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    # Some plugins support a count method for particular resources,"},{"line_number":324,"context_line":"    # using a DB\u0027s optimized counting features. We try to use that one"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_9299b77b","line":321,"in_reply_to":"1ae5cdf2_a3d58ce6","updated":"2014-06-18 08:07:19.000000000","message":"any harm if \u0027ovirt\u0027 is added to the list?","commit_id":"3b50bf87c1b8076fd48ba4a6ac648c5ed55daeb5"},{"author":{"_account_id":1935,"name":"Tomoe Sugihara","email":"tomoe.sugihara@gmail.com","username":"tomoe"},"change_message_id":"047b9832f597c7ce6bf5215da7a028b10d113325","unresolved":false,"context_lines":[{"line_number":318,"context_line":"    # this may change in the future, it has been accepted as a temporary"},{"line_number":319,"context_line":"    # solution."},{"line_number":320,"context_line":"    if resources \u003d\u003d attributes.PORTS:"},{"line_number":321,"context_line":"        filters[\u0027device_owner\u0027] \u003d [\u0027\u0027, \u0027compute:nova\u0027]"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    # Some plugins support a count method for particular resources,"},{"line_number":324,"context_line":"    # using a DB\u0027s optimized counting features. We try to use that one"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_975b5721","line":321,"in_reply_to":"1ae5cdf2_c84c70a0","updated":"2014-06-18 14:51:48.000000000","message":"It might be worthwhile to make the exclusion list configurable as opposed to hardcode it here.","commit_id":"3b50bf87c1b8076fd48ba4a6ac648c5ed55daeb5"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"946db382e023cb8cc15c198267b9404d40a5ac6a","unresolved":false,"context_lines":[{"line_number":319,"context_line":"    # solution."},{"line_number":320,"context_line":"    if resources \u003d\u003d attributes.PORTS:"},{"line_number":321,"context_line":"        filters[\u0027device_owner\u0027] \u003d [\u0027\u0027, \u0027compute:nova\u0027]"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    # Some plugins support a count method for particular resources,"},{"line_number":324,"context_line":"    # using a DB\u0027s optimized counting features. We try to use that one"},{"line_number":325,"context_line":"    # if present. Otherwise just use regular getter to retrieve all objects"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_6c789e7e","line":322,"updated":"2014-06-19 08:45:45.000000000","message":"The device owner has several types:\ncompute:nova,\nnetwork:floatingip/dhcp/router_interface/router_gateway,\nneutron:LOADBALANCER,\ncompute:None\n\nMaybe it is just a temporary solution, but I think it needs further investigation about which port is acceptable in quota.\n\nFor user perspective, maybe he will doubt that he only created 5 instances but the port quota counts 8 or 9 or more.\n\nBut IMO, it is acceptable that the user also creates a loadbalancer, a router and a dhcp-enabled network.\n\n\u0027Port\u0027 is a broad conception in SDN, not just the definition of virtual ethernet interface of instance.\n\nAs an alternative, we can just write comments in quota section of neutron.conf or in documentation to explain how it counts, rather than providing such a temporary solution.","commit_id":"3b50bf87c1b8076fd48ba4a6ac648c5ed55daeb5"},{"author":{"_account_id":7505,"name":"Jaume Devesa","email":"devvesa@gmail.com","username":"devesa"},"change_message_id":"6ae88ae1544cf266a0d43bf166999dd41e8dd0fc","unresolved":false,"context_lines":[{"line_number":319,"context_line":"    # solution."},{"line_number":320,"context_line":"    if resources \u003d\u003d attributes.PORTS:"},{"line_number":321,"context_line":"        filters[\u0027device_owner\u0027] \u003d [\u0027\u0027, \u0027compute:nova\u0027]"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    # Some plugins support a count method for particular resources,"},{"line_number":324,"context_line":"    # using a DB\u0027s optimized counting features. We try to use that one"},{"line_number":325,"context_line":"    # if present. Otherwise just use regular getter to retrieve all objects"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_c32dee47","line":322,"in_reply_to":"1ae5cdf2_21513c62","updated":"2014-06-19 18:01:05.000000000","message":"So it seems most people is not agree with the solution. If you have any idea about how to approach this another way that would convince you, I\u0027ve opened the discussion again in the launchpad. Any comment would be appreciate!\n\nhttps://bugs.launchpad.net/neutron/+bug/1212338","commit_id":"3b50bf87c1b8076fd48ba4a6ac648c5ed55daeb5"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"4c22e7a27854c80c2e8366173382ee30742bc1a4","unresolved":false,"context_lines":[{"line_number":319,"context_line":"    # solution."},{"line_number":320,"context_line":"    if resources \u003d\u003d attributes.PORTS:"},{"line_number":321,"context_line":"        filters[\u0027device_owner\u0027] \u003d [\u0027\u0027, \u0027compute:nova\u0027]"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    # Some plugins support a count method for particular resources,"},{"line_number":324,"context_line":"    # using a DB\u0027s optimized counting features. We try to use that one"},{"line_number":325,"context_line":"    # if present. Otherwise just use regular getter to retrieve all objects"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_21513c62","line":322,"in_reply_to":"1ae5cdf2_6c789e7e","updated":"2014-06-19 10:46:37.000000000","message":"+1\n\nI think it would be much clearer to put in the config file a list of port types that are excluded from the quota count. Something like:\n\nport_type_excluded_from_quota_count \u003d network:dhcp, network:floatingip\n\n\nAnyway this seems a new feature more than a bug","commit_id":"3b50bf87c1b8076fd48ba4a6ac648c5ed55daeb5"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"5657bccf813e5cedcc22c7e41eb6d907b57e2b82","unresolved":false,"context_lines":[{"line_number":319,"context_line":"    # solution."},{"line_number":320,"context_line":"    if resources \u003d\u003d attributes.PORTS:"},{"line_number":321,"context_line":"        filters[\u0027device_owner\u0027] \u003d [\u0027\u0027, \u0027compute:nova\u0027]"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    # Some plugins support a count method for particular resources,"},{"line_number":324,"context_line":"    # using a DB\u0027s optimized counting features. We try to use that one"},{"line_number":325,"context_line":"    # if present. Otherwise just use regular getter to retrieve all objects"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_0dffb735","line":322,"in_reply_to":"1ae5cdf2_c32dee47","updated":"2014-06-30 22:46:12.000000000","message":"I\u0027ve also seen \"compute:az1\", etc.  I think it may be too difficult to maintain any comprehensive list of device_owners to include.  I\u0027m not a fan of doing this by device_owner field.","commit_id":"3b50bf87c1b8076fd48ba4a6ac648c5ed55daeb5"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"63fa2524fed903b5e5a47b1eb041e74a083f636a","unresolved":false,"context_lines":[{"line_number":319,"context_line":"    # solution."},{"line_number":320,"context_line":"    if resources \u003d\u003d attributes.PORTS:"},{"line_number":321,"context_line":"        filters[\u0027device_owner\u0027] \u003d [\u0027\u0027, \u0027compute:nova\u0027]"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"    # Some plugins support a count method for particular resources,"},{"line_number":324,"context_line":"    # using a DB\u0027s optimized counting features. We try to use that one"},{"line_number":325,"context_line":"    # if present. Otherwise just use regular getter to retrieve all objects"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_5da376b1","line":322,"in_reply_to":"baada198_0dffb735","updated":"2014-07-04 16:50:21.000000000","message":"I\u0027m not feeling good for filtering device_owner, and it should not be directly exposed to administrator.\n\nThere are various device_owners and meanwhile, some vendors may introduce new device_owner. It is not that easy to define a list including all kinds of device_owner. And generally, \"Port\" in neutron is not just the virtual ethernet interface. Other ports should be counted in the context of SDN.\n\nAs I mentioned before, I suggest to write comments in quota section of neutron.conf and other documentation to explain how it counts. If the statement is clear enough, I think admins can understand.","commit_id":"3b50bf87c1b8076fd48ba4a6ac648c5ed55daeb5"}]}
