library Parsing {
    // Split the minting blob into token_id and blueprint portions
    // {token_id}:{blueprint}

    function split(bytes calldata blob)
        internal
        pure
        returns (uint256, bytes memory)
    {
        int256 index = Bytes.indexOf(blob, ":", 0);
        require(index >= 0, "Separator must exist");
        // Trim the { and } from the parameters
        uint256 tokenID = Bytes.toUint(blob[1:uint256(index) - 1]);
        uint256 blueprintLength = blob.length - uint256(index) - 3;
        if (blueprintLength == 0) {
            return (tokenID, bytes(""));
        }
        bytes calldata blueprint = blob[uint256(index) + 2:blob.length - 1];
        return (tokenID, blueprint);
    }
}
function split(bytes calldata blob)
    internal
    pure
    returns (uint256, bytes memory)
{
    int256 index = Bytes.indexOf(blob, ":", 0);
    require(index >= 0, "Separator must exist");
    // Trim the { and } from the parameters
    uint256 tokenID = Bytes.toUint(blob[1:uint256(index) - 1]);
    uint256 blueprintLength = blob.length - uint256(index) - 3;
    if (blueprintLength == 0) {
        return (tokenID, bytes(""));
    }
    bytes calldata blueprint = blob[uint256(index) + 2:blob.length - 1];
    return (tokenID, blueprint);
}

// Split the minting blob into token_id and blueprint portions
// {token_id}:{blueprint}