)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"bc92c533edeefe0c05720b47c71a3fb76ad0a123","unresolved":false,"context_lines":[{"line_number":13,"context_line":"configurability of random name patterns."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Subsequent commits will implement the new generator."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I189474fbb185ab402e3b248421b4188b7ccde7f4"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"ba15a1d1_c5431dae","line":16,"updated":"2015-09-23 09:36:30.000000000","message":"Please mention here that this patch implements https://github.com/openstack/rally/blob/master/doc/specs/in-progress/consistent_resource_names.rst","commit_id":"1129f7a8d1b979b4caf38f7334fe1b63c8c58d0f"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"213f78c980f37dacd8797b2a103b80984411b6c6","unresolved":false,"context_lines":[{"line_number":12,"context_line":"prefix; adds a task-specific portion to the random name; and improves"},{"line_number":13,"context_line":"configurability of random name patterns."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Subsequent commits will implement the new generator."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Implements: blueprint consistent-resource-names"},{"line_number":18,"context_line":"Change-Id: I189474fbb185ab402e3b248421b4188b7ccde7f4"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"9a1a9d01_e1baec09","line":15,"updated":"2015-09-28 16:37:02.000000000","message":"I think that link to the spec here would be reasonable.","commit_id":"9979c25d404b4bba2896b9926eea194434a90f76"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"b996580feeab681dc8155f2038c648bdad0ee391","unresolved":false,"context_lines":[{"line_number":12,"context_line":"prefix; adds a task-specific portion to the random name; and improves"},{"line_number":13,"context_line":"configurability of random name patterns."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Subsequent commits will implement the new generator."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Implements: blueprint consistent-resource-names"},{"line_number":18,"context_line":"Change-Id: I189474fbb185ab402e3b248421b4188b7ccde7f4"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"9a1a9d01_543cf42e","line":15,"in_reply_to":"9a1a9d01_e1baec09","updated":"2015-10-02 13:05:18.000000000","message":"The location of the spec will change (from in-progress/ to implemented/) once this is done. Where should I link to?","commit_id":"9979c25d404b4bba2896b9926eea194434a90f76"}],"rally/common/utils.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"92813081cec255a0cfcade19707bfa53bd9aa812","unresolved":false,"context_lines":[{"line_number":481,"context_line":""},{"line_number":482,"context_line":"# TODO(stpierre): make these configurable?"},{"line_number":483,"context_line":"_ASCII_LETTERS_AND_DIGITS \u003d string.ascii_letters + string.digits"},{"line_number":484,"context_line":"_RESOURCE_NAME_PREFIX \u003d \"rally_\""},{"line_number":485,"context_line":""},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"def generate_random_name(prefix\u003dNone):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a016987_797bc8c1","line":484,"updated":"2015-05-21 23:48:25.000000000","message":"let\u0027s change default prefix to \"__rally_\"","commit_id":"32af216b67970784d1c9f8ded773bfe98e286002"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"1fbfe16d246e8f019cbe281c234774a757cfa595","unresolved":false,"context_lines":[{"line_number":481,"context_line":""},{"line_number":482,"context_line":"# TODO(stpierre): make these configurable?"},{"line_number":483,"context_line":"_ASCII_LETTERS_AND_DIGITS \u003d string.ascii_letters + string.digits"},{"line_number":484,"context_line":"_RESOURCE_NAME_PREFIX \u003d \"rally_\""},{"line_number":485,"context_line":""},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"def generate_random_name(prefix\u003dNone):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a016987_b9ba0709","line":484,"in_reply_to":"7a016987_745edf13","updated":"2015-05-26 17:33:56.000000000","message":"oh... also murano and heat resources should start with letters :(","commit_id":"32af216b67970784d1c9f8ded773bfe98e286002"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"5032a0492ee20572f907d108a7fc839b911d55b3","unresolved":false,"context_lines":[{"line_number":481,"context_line":""},{"line_number":482,"context_line":"# TODO(stpierre): make these configurable?"},{"line_number":483,"context_line":"_ASCII_LETTERS_AND_DIGITS \u003d string.ascii_letters + string.digits"},{"line_number":484,"context_line":"_RESOURCE_NAME_PREFIX \u003d \"rally_\""},{"line_number":485,"context_line":""},{"line_number":486,"context_line":""},{"line_number":487,"context_line":"def generate_random_name(prefix\u003dNone):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a016987_745edf13","line":484,"in_reply_to":"7a016987_797bc8c1","updated":"2015-05-26 14:01:13.000000000","message":"Unfortunately this won\u0027t play well with Sahara, which does not allow underscores in its hostnames. Other suggestions? \"--rally-\" just doesn\u0027t look right for some reason.","commit_id":"32af216b67970784d1c9f8ded773bfe98e286002"},{"author":{"_account_id":14884,"name":"Kiran Ranganath","email":"kiran7193@gmail.com","username":"kiran"},"change_message_id":"149aa10ab517165e0b8f365a41b212b59f7563a2","unresolved":false,"context_lines":[{"line_number":366,"context_line":"        \"\"\"Generate a random string."},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"        :param length: The length of the random string."},{"line_number":369,"context_line":"        :param chars: A string consisting of the characters to be used in the"},{"line_number":370,"context_line":"        string."},{"line_number":371,"context_line":"        \"\"\""},{"line_number":372,"context_line":"        return \"\".join(random.choice(self.RESOURCE_NAME_ALLOWED_CHARACTERS)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba15a1d1_0429de9a","line":369,"updated":"2015-09-24 11:31:32.000000000","message":"This docstring is not needed here.","commit_id":"baedbe71e3ab165fdfb6182af63d04a6734e23d8"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"213f78c980f37dacd8797b2a103b80984411b6c6","unresolved":false,"context_lines":[{"line_number":365,"context_line":"    def _generate_random_part(self, length):"},{"line_number":366,"context_line":"        \"\"\"Generate a random string."},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"        :param length: The length of the random string."},{"line_number":369,"context_line":"        \"\"\""},{"line_number":370,"context_line":"        return \"\".join(random.choice(self.RESOURCE_NAME_ALLOWED_CHARACTERS)"},{"line_number":371,"context_line":"                       for i in range(length))"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_e1c42c60","line":368,"updated":"2015-09-28 16:37:02.000000000","message":"Please add returns here","commit_id":"9979c25d404b4bba2896b9926eea194434a90f76"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"b996580feeab681dc8155f2038c648bdad0ee391","unresolved":false,"context_lines":[{"line_number":365,"context_line":"    def _generate_random_part(self, length):"},{"line_number":366,"context_line":"        \"\"\"Generate a random string."},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"        :param length: The length of the random string."},{"line_number":369,"context_line":"        \"\"\""},{"line_number":370,"context_line":"        return \"\".join(random.choice(self.RESOURCE_NAME_ALLOWED_CHARACTERS)"},{"line_number":371,"context_line":"                       for i in range(length))"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_54e4f40b","line":368,"in_reply_to":"9a1a9d01_e1c42c60","updated":"2015-10-02 13:05:18.000000000","message":"Done","commit_id":"9979c25d404b4bba2896b9926eea194434a90f76"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"213f78c980f37dacd8797b2a103b80984411b6c6","unresolved":false,"context_lines":[{"line_number":394,"context_line":"        # the first part of the random name is a subset of the task ID"},{"line_number":395,"context_line":"        task_id_part \u003d task_id.replace(\"-\", \"\")[0:len(parts[\"task\"])]"},{"line_number":396,"context_line":""},{"line_number":397,"context_line":"        # determine if the portion of the task ID that we would use"},{"line_number":398,"context_line":"        # contains only characters in resource_name_allowed_characters."},{"line_number":399,"context_line":"        if any(char not in self.RESOURCE_NAME_ALLOWED_CHARACTERS"},{"line_number":400,"context_line":"               for char in task_id_part):"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_216544e0","line":397,"updated":"2015-09-28 16:37:02.000000000","message":"Please follow the common note format: \u0027# NOTE (author): comment\u0027","commit_id":"9979c25d404b4bba2896b9926eea194434a90f76"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"b996580feeab681dc8155f2038c648bdad0ee391","unresolved":false,"context_lines":[{"line_number":394,"context_line":"        # the first part of the random name is a subset of the task ID"},{"line_number":395,"context_line":"        task_id_part \u003d task_id.replace(\"-\", \"\")[0:len(parts[\"task\"])]"},{"line_number":396,"context_line":""},{"line_number":397,"context_line":"        # determine if the portion of the task ID that we would use"},{"line_number":398,"context_line":"        # contains only characters in resource_name_allowed_characters."},{"line_number":399,"context_line":"        if any(char not in self.RESOURCE_NAME_ALLOWED_CHARACTERS"},{"line_number":400,"context_line":"               for char in task_id_part):"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_b4b9d0ee","line":397,"in_reply_to":"9a1a9d01_216544e0","updated":"2015-10-02 13:05:18.000000000","message":"Done","commit_id":"9979c25d404b4bba2896b9926eea194434a90f76"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"213f78c980f37dacd8797b2a103b80984411b6c6","unresolved":false,"context_lines":[{"line_number":451,"context_line":"    :param name: The resource name to check against the object\u0027s"},{"line_number":452,"context_line":"                 RESOURCE_NAME_FORMAT."},{"line_number":453,"context_line":"    :param obj: The class or object to fetch random name generation"},{"line_number":454,"context_line":"                parameters from."},{"line_number":455,"context_line":"    \"\"\""},{"line_number":456,"context_line":"    return name_matches_pattern(name, obj.RESOURCE_NAME_FORMAT,"},{"line_number":457,"context_line":"                                obj.RESOURCE_NAME_ALLOWED_CHARACTERS)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_a1787490","line":454,"updated":"2015-09-28 16:37:02.000000000","message":"Here returns is required because I need to look at other function to know wht the type of return value.","commit_id":"9979c25d404b4bba2896b9926eea194434a90f76"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"b996580feeab681dc8155f2038c648bdad0ee391","unresolved":false,"context_lines":[{"line_number":451,"context_line":"    :param name: The resource name to check against the object\u0027s"},{"line_number":452,"context_line":"                 RESOURCE_NAME_FORMAT."},{"line_number":453,"context_line":"    :param obj: The class or object to fetch random name generation"},{"line_number":454,"context_line":"                parameters from."},{"line_number":455,"context_line":"    \"\"\""},{"line_number":456,"context_line":"    return name_matches_pattern(name, obj.RESOURCE_NAME_FORMAT,"},{"line_number":457,"context_line":"                                obj.RESOURCE_NAME_ALLOWED_CHARACTERS)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_f4c74862","line":454,"in_reply_to":"9a1a9d01_a1787490","updated":"2015-10-02 13:05:18.000000000","message":"Done","commit_id":"9979c25d404b4bba2896b9926eea194434a90f76"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"dd6e48365a68e832ce9a859c85a22b56d30ad2d4","unresolved":false,"context_lines":[{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    This mixin provides one method,"},{"line_number":348,"context_line":"    ``generate_random_name()``. Classes that include it must provide a"},{"line_number":349,"context_line":"    ``self.task`` attribute that contains a task dict. Classes that"},{"line_number":350,"context_line":"    use this mixin may set two class variables to alter the behavior"},{"line_number":351,"context_line":"    of ``generate_random_name()``:"},{"line_number":352,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7a2fa921_06863465","line":349,"updated":"2015-10-07 07:47:50.000000000","message":"Only a few types in Python do contain values. An attribute merely references a dict.","commit_id":"72be8280a45dc0ba7b137e0c6dad3e9f54aede4d"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"dd6e48365a68e832ce9a859c85a22b56d30ad2d4","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        \"\"\""},{"line_number":391,"context_line":"        task_id \u003d self.task[\"uuid\"]"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"        match \u003d _resource_name_placeholder_re.match(self.RESOURCE_NAME_FORMAT)"},{"line_number":394,"context_line":"        parts \u003d match.groupdict()"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"        result \u003d [parts[\"prefix\"]]"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a2fa921_26e81010","line":393,"updated":"2015-10-07 07:47:50.000000000","message":"Please raise an ValueError exception here whenever the RESOURCE_NAME_FORMAT is not matching the regexp.\n\nIt would be even better to move this check to an __init__ so these a caught earlier.","commit_id":"72be8280a45dc0ba7b137e0c6dad3e9f54aede4d"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"dd6e48365a68e832ce9a859c85a22b56d30ad2d4","unresolved":false,"context_lines":[{"line_number":406,"context_line":"               for char in task_id_part):"},{"line_number":407,"context_line":"            # NOTE(stpierre): seed pRNG with task ID so that all random"},{"line_number":408,"context_line":"            # names with the same task ID have the same task ID part"},{"line_number":409,"context_line":"            random.seed(task_id)"},{"line_number":410,"context_line":"            task_id_part \u003d self._generate_random_part(len(parts[\"task\"]))"},{"line_number":411,"context_line":"            random.seed()"},{"line_number":412,"context_line":"            LOG.debug(\"Task ID %s cannot be included in a random name because \""}],"source_content_type":"text/x-python","patch_set":15,"id":"7a2fa921_66e848e3","line":409,"updated":"2015-10-07 07:47:50.000000000","message":"Please use try/finally clause here.","commit_id":"72be8280a45dc0ba7b137e0c6dad3e9f54aede4d"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"bf9e65b664b4a4831ae8873a4bb680dbe83f3d45","unresolved":false,"context_lines":[{"line_number":392,"context_line":""},{"line_number":393,"context_line":"        match \u003d _resource_name_placeholder_re.match(self.RESOURCE_NAME_FORMAT)"},{"line_number":394,"context_line":"        if match is None:"},{"line_number":395,"context_line":"            raise ValueError(\"%s is not a valid resource name format\" %"},{"line_number":396,"context_line":"                             self.RESOURCE_NAME_FORMAT)"},{"line_number":397,"context_line":"        parts \u003d match.groupdict()"},{"line_number":398,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"7a2fa921_444cbdc7","line":395,"updated":"2015-10-09 03:24:41.000000000","message":"btw why this is not in __init__?","commit_id":"18141cb71c5bf06b5c51466425bba1b2cec59c3b"}],"rally/plugins/openstack/context/servers.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"92813081cec255a0cfcade19707bfa53bd9aa812","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            clients \u003d osclients.Clients(user[\"endpoint\"])"},{"line_number":86,"context_line":"            nova_scenario \u003d nova_utils.NovaScenario(clients\u003dclients)"},{"line_number":87,"context_line":"            server_name_prefix \u003d rutils.generate_random_name("},{"line_number":88,"context_line":"                prefix\u003d\"ctx_rally_server_\")"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"            LOG.debug(\"Calling _boot_servers with server_name_prefix\u003d%s \""},{"line_number":91,"context_line":"                      \"image_id\u003d%s flavor_id\u003d%s servers_per_tenant\u003d%s\""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a016987_f4021d09","line":88,"updated":"2015-05-21 23:48:25.000000000","message":"such prefix looks awful. `generate_random_name` will generate name which will start with \"rally_ctx_rally_server\"","commit_id":"32af216b67970784d1c9f8ded773bfe98e286002"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"5032a0492ee20572f907d108a7fc839b911d55b3","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            clients \u003d osclients.Clients(user[\"endpoint\"])"},{"line_number":86,"context_line":"            nova_scenario \u003d nova_utils.NovaScenario(clients\u003dclients)"},{"line_number":87,"context_line":"            server_name_prefix \u003d rutils.generate_random_name("},{"line_number":88,"context_line":"                prefix\u003d\"ctx_rally_server_\")"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"            LOG.debug(\"Calling _boot_servers with server_name_prefix\u003d%s \""},{"line_number":91,"context_line":"                      \"image_id\u003d%s flavor_id\u003d%s servers_per_tenant\u003d%s\""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a016987_f4cd2fb8","line":88,"in_reply_to":"7a016987_f4021d09","updated":"2015-05-26 14:01:13.000000000","message":"I\u0027ve gone through and fixed (I believe) all of the prefixes that will look awful.","commit_id":"32af216b67970784d1c9f8ded773bfe98e286002"}],"rally/plugins/openstack/context/vm/custom_image.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"92813081cec255a0cfcade19707bfa53bd9aa812","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        vm_scenario \u003d vmtasks.VMTasks(self.context, clients\u003dclients)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        server, fip \u003d vm_scenario._boot_server_with_fip("},{"line_number":158,"context_line":"            name\u003dutils.generate_random_name(\"rally_ctx_custom_image_\"),"},{"line_number":159,"context_line":"            image\u003dimage_id, flavor\u003dflavor_id,"},{"line_number":160,"context_line":"            floating_network\u003dself.config.get(\"floating_network\"),"},{"line_number":161,"context_line":"            userdata\u003dself.config.get(\"userdata\"),"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a016987_d405e110","line":158,"updated":"2015-05-21 23:48:25.000000000","message":"same as for servers ctx","commit_id":"32af216b67970784d1c9f8ded773bfe98e286002"}],"rally/plugins/openstack/context/volumes.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"92813081cec255a0cfcade19707bfa53bd9aa812","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            cinder_util \u003d cinder_utils.CinderScenario(clients\u003dclients)"},{"line_number":63,"context_line":"            for i in range(volumes_per_tenant):"},{"line_number":64,"context_line":"                rnd_name \u003d rutils.generate_random_name("},{"line_number":65,"context_line":"                    prefix\u003d\"ctx_rally_volume_\")"},{"line_number":66,"context_line":"                vol \u003d cinder_util._create_volume(size, display_name\u003drnd_name)"},{"line_number":67,"context_line":"                self.context[\"tenants\"][tenant_id][\"volumes\"].append(vol._info)"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a016987_b4082529","line":65,"updated":"2015-05-21 23:48:25.000000000","message":"same as for servers ctx","commit_id":"32af216b67970784d1c9f8ded773bfe98e286002"}],"rally/plugins/openstack/scenarios/keystone/basic.py":[{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"88aa6cf294f0ef990d87bf81eb527e4564a9da6e","unresolved":false,"context_lines":[{"line_number":142,"context_line":"    @validation.number(\"name_length\", minval\u003d10)"},{"line_number":143,"context_line":"    @validation.required_openstack(admin\u003dTrue)"},{"line_number":144,"context_line":"    @base.scenario(context\u003d{\"admin_cleanup\": [\"keystone\"]})"},{"line_number":145,"context_line":"    def create_user_update_password(self, name_length\u003d10, password_length\u003d10):"},{"line_number":146,"context_line":"        \"\"\"Create user and update password for that user."},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        :param name_length: length of the user name"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a016987_130a4c8a","side":"PARENT","line":145,"updated":"2015-05-24 11:11:13.000000000","message":"You must change scenarios parameters. https://github.com/openstack/rally/blob/master/rally-jobs/rally.yaml#L92 And don\u0027t forget about samples. We test functionaly sample too.","commit_id":"957c005909f37f4e7a101675b50200f84c53abb8"}]}
