diff --git a/docs/sagemaker/01_quickstart.md b/docs/sagemaker/01_quickstart.md new file mode 100644 index 0000000..96f6701 --- /dev/null +++ b/docs/sagemaker/01_quickstart.md @@ -0,0 +1,117 @@ +# Quick Start: Deploy vLLM on SageMaker + +Deploy a vLLM-powered Large Language Model on Amazon SageMaker in minutes. + +## Quick Start + +**Fastest way to get started:** + +šŸ‘‰ **[Basic Endpoint Notebook](../../examples/vllm/notebooks/basic_endpoint.ipynb)** + +The notebook includes complete deployment workflow, inference examples (single, concurrent, streaming), and automatic cleanup. + +## Container Images + +AWS provides official vLLM container images in the [Amazon ECR Public Gallery](https://gallery.ecr.aws/deep-learning-containers/vllm). + +**Example:** +``` +public.ecr.aws/deep-learning-containers/vllm:0.11.2-gpu-py312-cu129-ubuntu22.04-sagemaker-v1.2 +``` + +**Note:** Copy the public image to your private ECR repository for SageMaker deployment. See [copy_image.ipynb](../../examples/vllm/notebooks/copy_image.ipynb). + +**Features:** +- vLLM inference engine +- SageMaker-compatible API +- Custom handler support +- Custom middleware support +- Custom pre/post-processing support +- Sticky routing (stateful sessions) +- Multi-LoRA adapter management + +## Basic Deployment + +### Required Configuration + +```python +sagemaker_client.create_model( + ModelName='my-vllm-model', + ExecutionRoleArn='arn:aws:iam::123456789012:role/SageMakerExecutionRole', + PrimaryContainer={ + 'Image': f'{account_id}.dkr.ecr.{region}.amazonaws.com/vllm:0.11.2-sagemaker-v1.2', + 'Environment': { + 'SM_VLLM_MODEL': 'meta-llama/Meta-Llama-3-8B-Instruct', + 'HUGGING_FACE_HUB_TOKEN': 'hf_your_token_here', + } + } +) +``` + +### vLLM Engine Configuration + +Configure vLLM using `SM_VLLM_*` environment variables (automatically converted to CLI arguments): + +```python +'Environment': { + 'SM_VLLM_MODEL': 'meta-llama/Meta-Llama-3-8B-Instruct', + 'HUGGING_FACE_HUB_TOKEN': 'hf_your_token_here', + 'SM_VLLM_MAX_MODEL_LEN': '2048', + 'SM_VLLM_GPU_MEMORY_UTILIZATION': '0.9', + 'SM_VLLM_DTYPE': 'auto', + 'SM_VLLM_TENSOR_PARALLEL_SIZE': '1', +} +``` + +All vLLM CLI arguments are supported. See [vLLM CLI documentation](https://docs.vllm.ai/en/latest/cli/serve/#frontend) for available parameters. + +### Model Path Options + +`SM_VLLM_MODEL` accepts two types of values: + +**1. Hugging Face Model ID** (downloads from HF Hub): +```python +'SM_VLLM_MODEL': 'meta-llama/Meta-Llama-3-8B-Instruct' +``` + +**2. Local Folder Path** (for S3 model artifacts): +```python +'SM_VLLM_MODEL': '/opt/ml/model' +``` + +When deploying with model artifacts from S3, SageMaker automatically downloads them to `/opt/ml/model`. Use this path to load your pre-downloaded models instead of fetching from Hugging Face. + + +## Making Inference Requests + +```python +runtime_client = boto3.client('sagemaker-runtime') + +response = runtime_client.invoke_endpoint( + EndpointName='my-vllm-endpoint', + ContentType='application/json', + Body=json.dumps({ + "prompt": "What is the capital of France?", + "max_tokens": 100, + "temperature": 0.7 + }) +) + +result = json.loads(response['Body'].read()) +print(result['choices'][0]['text']) +``` + +For complete deployment code including concurrent requests, streaming responses, and cleanup, see the [Basic Endpoint Notebook](../../examples/vllm/notebooks/basic_endpoint.ipynb). + +## Next Steps + +**Advanced Features:** +- [Customize Handlers](02_customize_handlers.md) - Custom ping and invocation handlers +- [Customize Pre/Post Processing](03_customize_pre_post_processing.md) - Custom middleware for request/response transformation + +**Resources:** +- [Basic Endpoint Notebook](../../examples/vllm/notebooks/basic_endpoint.ipynb) - Complete deployment example +- [Handler Customization Notebook](../../examples/vllm/notebooks/handler_customization_methods.ipynb) - Handler override examples +- [Pre/Post Processing Notebook](../../examples/vllm/notebooks/preprocessing_postprocessing_methods.ipynb) - Middleware examples +- [Python Package README](../../python/README.md) - Handler system documentation +- [vLLM Documentation](https://docs.vllm.ai/) - vLLM engine details diff --git a/docs/sagemaker/02_customize_handlers.md b/docs/sagemaker/02_customize_handlers.md new file mode 100644 index 0000000..019b0a4 --- /dev/null +++ b/docs/sagemaker/02_customize_handlers.md @@ -0,0 +1,276 @@ +# Customize Handlers + +This guide explains how to customize the `/ping` and `/invocations` endpoints for your vLLM models on Amazon SageMaker. + +> šŸ““ **Working Example**: See the [Handler Override Notebook](../../examples/vllm/notebooks/handler_customization_methods.ipynb) for a complete working example. + +## Overview + +The vLLM container comes with default handlers for health checks and inference. You can override these defaults using custom Python code in your model artifacts. + +**Handler Resolution Priority** (first match wins): +1. **Environment Variables** - `CUSTOM_FASTAPI_PING_HANDLER`, `CUSTOM_FASTAPI_INVOCATION_HANDLER` +2. **Decorator Registration** - `@custom_ping_handler`, `@custom_invocation_handler` +3. **Function Discovery** - Functions named `custom_sagemaker_ping_handler`, `custom_sagemaker_invocation_handler` +4. **Framework Defaults** - vLLM's built-in handlers + +## Quick Start + +### Step 1: Create Custom Handler Script + +Create a Python file (e.g., `model.py`) with your custom handlers: + +```python +# model.py +import model_hosting_container_standards.sagemaker as sagemaker_standards +from fastapi import Request, Response +import json + +@sagemaker_standards.custom_ping_handler +async def my_health_check(request: Request) -> Response: + """Custom health check logic.""" + return Response( + content=json.dumps({"status": "healthy", "custom": True}), + media_type="application/json", + status_code=200 + ) + +@sagemaker_standards.custom_invocation_handler +async def my_inference(request: Request) -> Response: + """Custom inference logic.""" + body = await request.json() + # Your custom logic here + result = {"predictions": ["custom response"]} + return Response( + content=json.dumps(result), + media_type="application/json" + ) +``` + +### Step 2: Upload to S3 + +```python +import boto3 + +s3_client = boto3.client('s3') +s3_client.upload_file('model.py', 'my-bucket', 'my-model/model.py') +``` + +### Step 3: Deploy to SageMaker + +```python +sagemaker_client = boto3.client('sagemaker') + +sagemaker_client.create_model( + ModelName='my-vllm-model', + ExecutionRoleArn='arn:aws:iam::123456789012:role/SageMakerExecutionRole', + PrimaryContainer={ + 'Image': f'{account_id}.dkr.ecr.{region}.amazonaws.com/vllm:latest', + 'ModelDataSource': { + 'S3DataSource': { + 'S3Uri': 's3://my-bucket/my-model/', + 'S3DataType': 'S3Prefix', + 'CompressionType': 'None', + } + }, + 'Environment': { + 'SM_VLLM_MODEL': 'meta-llama/Meta-Llama-3-8B-Instruct', + 'HUGGING_FACE_HUB_TOKEN': 'hf_your_token_here', + 'CUSTOM_SCRIPT_FILENAME': 'model.py', # Default: model.py + } + } +) +``` + +**Key Environment Variables:** +- `CUSTOM_SCRIPT_FILENAME`: Name of your custom script (default: `model.py`) +- `SAGEMAKER_MODEL_PATH`: Model directory (default: `/opt/ml/model`) +- `SAGEMAKER_CONTAINER_LOG_LEVEL`: Logging level (ERROR, INFO, DEBUG) + +## Customization Methods + +### Method 1: Environment Variables (Highest Priority) + +Point directly to specific handler functions using environment variables. This overrides all other methods. + +**āš ļø Important:** When using environment variables, the recommended approach is to use the `model:` module alias instead of file paths. + +```python +# āœ… RECOMMENDED: Use module alias +environment = { + 'CUSTOM_SCRIPT_FILENAME': 'handlers_env_var.py', + 'CUSTOM_FASTAPI_PING_HANDLER': 'model:health_check', + 'CUSTOM_FASTAPI_INVOCATION_HANDLER': 'model:inference', +} + +# āš ļø ALTERNATIVE: Use absolute path +environment = { + 'CUSTOM_FASTAPI_PING_HANDLER': '/opt/ml/model/handlers_env_var.py:health_check', + 'CUSTOM_FASTAPI_INVOCATION_HANDLER': '/opt/ml/model/handlers_env_var.py:inference', +} +``` + +**Path Formats:** +- `model:function_name` - **Recommended** - Module alias (`model` = `$SAGEMAKER_MODEL_PATH/$CUSTOM_SCRIPT_FILENAME`) +- `/opt/ml/model/handlers.py:ping` - Absolute path +- `handlers.py:function_name` - Relative to `/opt/ml/model` (requires file to exist in that directory) +- `vllm.entrypoints.openai.api_server:health` - Python module path (for installed packages) + +**Why use `model:` alias?** +- The `model` alias automatically resolves to your custom script file +- It's more portable and doesn't depend on absolute paths +- It works consistently across different deployment scenarios + +### Method 2: Decorators + +Use decorators to mark your custom handler functions. The system automatically discovers and registers them when your script loads. + +**āš ļø Important:** Decorators must be defined in the file specified by `CUSTOM_SCRIPT_FILENAME` (default: `model.py`). The system only loads and scans this file for decorated functions. + +```python +# model.py (or the file specified in CUSTOM_SCRIPT_FILENAME) +import model_hosting_container_standards.sagemaker as sagemaker_standards + +@sagemaker_standards.custom_ping_handler +async def my_ping(request): + return {"status": "ok"} + +@sagemaker_standards.custom_invocation_handler +async def my_invoke(request): + return {"result": "processed"} +``` + +**Environment Variable:** +```python +environment = { + 'CUSTOM_SCRIPT_FILENAME': 'model.py', # File containing decorated functions +} +``` + +### Method 3: Function Discovery (Lowest Priority) + +Name your functions with the expected pattern and they'll be automatically discovered - no decorator needed. + +**āš ļø Important:** Functions must be defined in the file specified by `CUSTOM_SCRIPT_FILENAME` (default: `model.py`). The system only loads and scans this file for functions matching the expected names. + +```python +# model.py (or the file specified in CUSTOM_SCRIPT_FILENAME) +async def custom_sagemaker_ping_handler(request): + """Automatically discovered by name.""" + return {"status": "healthy"} + +async def custom_sagemaker_invocation_handler(request): + """Automatically discovered by name.""" + return {"result": "processed"} +``` + +**Environment Variable:** +```python +environment = { + 'CUSTOM_SCRIPT_FILENAME': 'model.py', # File containing handler functions +} +``` + +## Complete Example + +```python +# model.py +import model_hosting_container_standards.sagemaker as sagemaker_standards +from model_hosting_container_standards.logging_config import logger +from fastapi import Request, Response +import json + +@sagemaker_standards.custom_ping_handler +async def health_check(request: Request) -> Response: + """Custom health check.""" + logger.info("Custom health check called") + return Response( + content=json.dumps({"status": "healthy"}), + media_type="application/json", + status_code=200 + ) + +@sagemaker_standards.custom_invocation_handler +async def inference_with_rag(request: Request) -> Response: + """Custom inference with optional RAG integration and vLLM engine.""" + body = await request.json() + prompt = body["prompt"] + max_tokens = body.get("max_tokens", 100) + temperature = body.get("temperature", 0.7) + + # Optional RAG integration + if body.get("use_rag", False): + context = "Retrieved context..." + prompt = f"Context: {context}\n\nQuestion: {prompt}" + + logger.info(f"Processing prompt: {prompt[:50]}...") + + # Call vLLM engine directly + from vllm import SamplingParams + import uuid + + engine = request.app.state.engine_client + + # Create sampling parameters + sampling_params = SamplingParams( + temperature=temperature, + max_tokens=max_tokens, + ) + + # Generate response using vLLM engine + request_id = str(uuid.uuid4()) + results_generator = engine.generate(prompt, sampling_params, request_id) + + # Collect final output + final_output = None + async for request_output in results_generator: + final_output = request_output + + # Extract generated text + if final_output and final_output.outputs: + generated_text = final_output.outputs[0].text + prompt_tokens = len(final_output.prompt_token_ids) if hasattr(final_output, "prompt_token_ids") else 0 + completion_tokens = len(final_output.outputs[0].token_ids) + else: + generated_text = "" + prompt_tokens = 0 + completion_tokens = 0 + + response_data = { + "predictions": [generated_text], + "usage": { + "prompt_tokens": prompt_tokens, + "completion_tokens": completion_tokens, + "total_tokens": prompt_tokens + completion_tokens, + }, + "rag_enabled": body.get("use_rag", False) + } + + return Response( + content=json.dumps(response_data), + media_type="application/json", + headers={"X-Request-Id": request_id} + ) +``` + +## Troubleshooting + +**Custom handlers not loading:** +- Verify `CUSTOM_SCRIPT_FILENAME` is set correctly (default: `model.py`) +- Check CloudWatch logs for import errors +- Enable debug logging: `SAGEMAKER_CONTAINER_LOG_LEVEL=DEBUG` + +**Wrong handler being called:** +- Check handler resolution priority (env vars > decorators > function discovery > framework defaults) +- Use `SAGEMAKER_CONTAINER_LOG_LEVEL=DEBUG` to see which handler is selected + +**Import errors:** +- Ensure all dependencies are installed in the container +- Verify the script path is correct + +## Additional Resources + +- **[Python Package README](../../python/README.md)** - Detailed decorator documentation and middleware options +- **[Handler Override Notebook](../../examples/vllm/notebooks/handler_customization_methods.ipynb)** - Complete working example +- **[Quick Start Guide](01_quickstart.md)** - Basic deployment +- **[Customize Pre/Post Processing](03_customize_pre_post_processing.md)** - Custom middleware for request/response transformation diff --git a/docs/sagemaker/03_customize_pre_post_processing.md b/docs/sagemaker/03_customize_pre_post_processing.md new file mode 100644 index 0000000..f0ab786 --- /dev/null +++ b/docs/sagemaker/03_customize_pre_post_processing.md @@ -0,0 +1,430 @@ +# Customize Pre/Post Processing + +This guide explains how to add custom pre-processing and post-processing logic to your model endpoints using middleware. + +> šŸ““ **Working Example**: See the [Pre/Post Processing Notebook](../../examples/vllm/notebooks/preprocessing_postprocessing_methods.ipynb) for a complete working example. + +## Overview + +Pre/post processing middleware allows you to transform requests and responses without modifying your core handler logic. Common use cases include: + +- **Request preprocessing**: Input validation, format conversion, authentication, logging +- **Response postprocessing**: Output formatting, header injection, metrics collection, error handling +- **Combined processing**: Request/response transformation pipelines + +**āš ļø Important: Middleware Runs on ALL Endpoints** + +Pre/post processing middleware runs on **all endpoints** including `/ping`, `/invocations`, and any custom routes. To avoid errors, **always check the request path** before processing: + +```python +# āœ… CORRECT: Check endpoint path first +if request.url.path == "/invocations": + # Only process /invocations requests + body = await request.json() + # ... your processing logic + +# āŒ WRONG: Processes all endpoints including /ping +body = await request.json() # Will fail on /ping (no body)! +``` + +**Common patterns:** +- **Request preprocessing**: Check `request.url.path == "/invocations"` before reading body +- **Response postprocessing**: Check `hasattr(response, 'body')` for streaming responses +- **Skip processing**: Return early for endpoints you don't need to process + +**Middleware Resolution Priority**: + +Environment variables always take precedence over decorators: +1. **Environment Variables** (highest priority) + - `CUSTOM_FASTAPI_MIDDLEWARE_PRE_POST_PROCESS` - Combined pre/post middleware + - `CUSTOM_PRE_PROCESS` + `CUSTOM_POST_PROCESS` - Separate pre/post (automatically combined if `CUSTOM_FASTAPI_MIDDLEWARE_PRE_POST_PROCESS` is not set) +2. **Decorator Registration** (lower priority) + - `@custom_middleware("pre_post_process")` - Combined middleware + - `@input_formatter` + `@output_formatter` - Separate formatters (automatically combined) + +**Note**: If `CUSTOM_FASTAPI_MIDDLEWARE_PRE_POST_PROCESS` is set, it takes precedence and `CUSTOM_PRE_PROCESS`/`CUSTOM_POST_PROCESS` are ignored. If only `CUSTOM_PRE_PROCESS` and/or `CUSTOM_POST_PROCESS` are set, they are automatically combined into a single middleware. + +## Quick Start + +### Step 1: Create Middleware Script + +Create a Python file (e.g., `middleware.py`) with your processing logic: + +```python +# middleware.py +from model_hosting_container_standards.common.fastapi.middleware import ( + input_formatter, + output_formatter, + custom_middleware, +) +from model_hosting_container_standards.logging_config import logger +from fastapi import Request, Response +import json + +@input_formatter +async def preprocess_request(request: Request) -> Request: + """Transform incoming requests before they reach the handler.""" + logger.info(f"Preprocessing request: {request.method} {request.url.path}") + + # Only process /invocations endpoint + if request.url.path == "/invocations": + body = await request.json() + + # Validate required fields + if "prompt" not in body: + raise ValueError("Missing required field: prompt") + + # Transform input format + if "max_tokens" not in body: + body["max_tokens"] = 100 # Set default + + # Store modified body back to request + request._body = json.dumps(body).encode() + + return request + +@output_formatter +async def postprocess_response(response: Response) -> Response: + """Transform responses before they're sent to the client.""" + logger.info(f"Postprocessing response: {response.status_code}") + + # Add custom headers (safe for all responses) + response.headers["X-Processed-By"] = "custom-middleware" + response.headers["X-Model-Version"] = "1.0.0" + + # āš ļø IMPORTANT: Check if response has body (streaming responses don't) + if not hasattr(response, 'body'): + logger.debug("Streaming response, skipping body modification") + return response + + # Transform response body if needed + if response.status_code == 200: + try: + body = json.loads(response.body) + # Add metadata + body["metadata"] = { + "processed": True, + "version": "1.0.0" + } + response.body = json.dumps(body).encode() + except json.JSONDecodeError: + logger.debug("Non-JSON response, skipping body modification") + + return response +``` + +### Step 2: Upload to S3 + +```python +import boto3 + +s3_client = boto3.client('s3') +s3_client.upload_file('middleware.py', 'my-bucket', 'my-model/middleware.py') +``` + +### Step 3: Deploy to SageMaker + +```python +sagemaker_client = boto3.client('sagemaker') + +sagemaker_client.create_model( + ModelName='my-vllm-model', + ExecutionRoleArn='arn:aws:iam::123456789012:role/SageMakerExecutionRole', + PrimaryContainer={ + 'Image': f'{account_id}.dkr.ecr.{region}.amazonaws.com/vllm:latest', + 'ModelDataSource': { + 'S3DataSource': { + 'S3Uri': 's3://my-bucket/my-model/', + 'S3DataType': 'S3Prefix', + 'CompressionType': 'None', + } + }, + 'Environment': { + 'SM_VLLM_MODEL': 'meta-llama/Meta-Llama-3-8B-Instruct', + 'HUGGING_FACE_HUB_TOKEN': 'hf_your_token_here', + 'CUSTOM_PRE_PROCESS': 'middleware.py:preprocess_request', + 'CUSTOM_POST_PROCESS': 'middleware.py:postprocess_response', + } + } +) +``` + +## Middleware Methods + +### Method 1: Separate Pre/Post Processing (Decorators) + +Use separate decorators for preprocessing and postprocessing. The system automatically combines them into a single middleware. + +**āš ļø Important:** When using decorators, they must be defined in the file specified by `CUSTOM_SCRIPT_FILENAME` (default: `model.py`). The system only loads and scans this file for decorated functions. If you want to use a different file, set `CUSTOM_SCRIPT_FILENAME` accordingly. + +```python +# middleware.py +from model_hosting_container_standards.common.fastapi.middleware import ( + input_formatter, + output_formatter, +) +from fastapi import Request, Response +import json + +@input_formatter +async def validate_and_transform_input(request: Request) -> Request: + """Preprocess incoming requests.""" + # Only process /invocations endpoint + if request.url.path == "/invocations": + body = await request.json() + + # Validation + if not body.get("prompt"): + raise ValueError("Prompt is required") + + # Transformation + body["prompt"] = body["prompt"].strip() + request._body = json.dumps(body).encode() + + return request + +@output_formatter +async def add_metadata_to_response(response: Response) -> Response: + """Postprocess outgoing responses.""" + response.headers["X-API-Version"] = "2.0" + return response +``` + +**Environment Variable (Required for decorators to be loaded):** +```python +environment = { + 'CUSTOM_SCRIPT_FILENAME': 'middleware.py', # File containing decorated functions +} +``` + +**Alternative: Use environment variables to point to functions directly (no decorator scanning needed):** +```python +environment = { + 'CUSTOM_PRE_PROCESS': 'middleware.py:validate_and_transform_input', + 'CUSTOM_POST_PROCESS': 'middleware.py:add_metadata_to_response', +} +``` + +### Method 2: Combined Middleware (Decorator) + +Use a single middleware function that handles both pre and post processing. + +**āš ļø Important:** When using decorators, they must be defined in the file specified by `CUSTOM_SCRIPT_FILENAME` (default: `model.py`). The system only loads and scans this file for decorated functions. + +```python +# middleware.py +from model_hosting_container_standards.common.fastapi.middleware import custom_middleware +from fastapi import Request +import json + +@custom_middleware("pre_post_process") +async def combined_processing(request: Request, call_next): + """Combined pre/post processing middleware.""" + # Pre-processing - only for /invocations + if request.url.path == "/invocations": + body = await request.json() + body["preprocessed"] = True + request._body = json.dumps(body).encode() + + # Call the handler + response = await call_next(request) + + # Post-processing - safe for all responses + response.headers["X-Combined-Middleware"] = "true" + + return response +``` + +**Environment Variable (Required for decorator to be loaded):** +```python +environment = { + 'CUSTOM_SCRIPT_FILENAME': 'middleware.py', # File containing decorated function +} +``` + +**Alternative: Use environment variable to point to function directly (no decorator scanning needed):** +```python +environment = { + 'CUSTOM_FASTAPI_MIDDLEWARE_PRE_POST_PROCESS': 'middleware.py:combined_processing', +} +``` + +### Method 3: Environment Variables Only + +Point directly to middleware functions without using decorators. + +```python +# processors.py +from fastapi import Request, Response +import json + +async def log_requests(request: Request) -> Request: + """Simple request logger.""" + print(f"Request: {request.method} {request.url}") + return request + +async def add_headers(response: Response) -> Response: + """Add custom headers.""" + response.headers["X-Custom"] = "value" + return response +``` + +**Environment Variables:** +```bash +export CUSTOM_PRE_PROCESS="processors.py:log_requests" +export CUSTOM_POST_PROCESS="processors.py:add_headers" +``` + +## Common Use Cases + +### Input Validation + +```python +from model_hosting_container_standards.common.fastapi.middleware import input_formatter +from fastapi import Request, HTTPException +import json + +@input_formatter +async def validate_input(request: Request) -> Request: + """Validate request format and required fields.""" + # Only validate /invocations endpoint + if request.url.path == "/invocations": + try: + body = await request.json() + except json.JSONDecodeError: + raise HTTPException(status_code=400, detail="Invalid JSON") + + # Validate required fields + if "prompt" not in body: + raise HTTPException(status_code=400, detail="Missing 'prompt' field") + + # Validate ranges + if "max_tokens" in body and body["max_tokens"] < 1: + raise HTTPException(status_code=400, detail="max_tokens must be positive") + + return request +``` + +### Request Logging and Metrics + +```python +from model_hosting_container_standards.common.fastapi.middleware import custom_middleware +from model_hosting_container_standards.logging_config import logger +from fastapi import Request +import time +import json + +@custom_middleware("pre_post_process") +async def log_and_measure(request: Request, call_next): + """Log requests and measure processing time.""" + start_time = time.time() + request_id = request.headers.get("X-Request-Id", "unknown") + + logger.info(f"Request {request_id}: {request.method} {request.url.path}") + + # Process request + response = await call_next(request) + + # Add metrics + duration = time.time() - start_time + response.headers["X-Request-Id"] = request_id + response.headers["X-Processing-Time"] = f"{duration:.3f}" + + logger.info(f"Request {request_id} completed in {duration:.3f}s") + + return response +``` + +## Middleware Execution Order + +When multiple middleware types are configured, they execute in this order: + +``` +Request Flow: + Client Request + ↓ + Throttle Middleware (if configured) + ↓ + Engine-specific Middleware (framework middleware) + ↓ + Pre/Post Process Middleware + ↓ + Handler (/ping or /invocations) + ↓ + Pre/Post Process Middleware (post-processing) + ↓ + Engine-specific Middleware (post-processing) + ↓ + Throttle Middleware (post-processing) + ↓ + Client Response +``` + +## Configuration Reference + +### Environment Variables + +```bash +# Separate pre/post processing (recommended) +export CUSTOM_PRE_PROCESS="middleware.py:preprocess_function" +export CUSTOM_POST_PROCESS="middleware.py:postprocess_function" + +# Combined middleware +export CUSTOM_FASTAPI_MIDDLEWARE_PRE_POST_PROCESS="middleware.py:combined_function" + +# Using module paths (no .py extension) +export CUSTOM_PRE_PROCESS="my_middleware_module:preprocess" +export CUSTOM_POST_PROCESS="my_middleware_module:postprocess" + +# Using absolute paths +export CUSTOM_PRE_PROCESS="/opt/ml/model/middleware.py:preprocess" +export CUSTOM_POST_PROCESS="/opt/ml/model/middleware.py:postprocess" +``` + +### Path Formats + +- `middleware.py:function_name` - Relative to `/opt/ml/model` +- `/opt/ml/model/middleware.py:function` - Absolute path +- `middleware_module:function` - Python module path (no .py) +- `model:function` - Alias to `$SAGEMAKER_MODEL_PATH/$CUSTOM_SCRIPT_FILENAME` + +## Troubleshooting + +**Middleware not loading:** +- Verify file path is correct relative to `/opt/ml/model` +- Check CloudWatch logs for import errors +- Enable debug logging: `SAGEMAKER_CONTAINER_LOG_LEVEL=DEBUG` + +**Request body not accessible:** +- Use `await request.json()` or `await request.body()` to read body +- Store modified body back: `request._body = json.dumps(body).encode()` +- Body can only be read once - store it if needed multiple times + +**Response not modifying:** +- Ensure you're returning the modified response object +- For combined middleware, use `await call_next(request)` to get response +- Response body must be bytes: `response.body = json.dumps(data).encode()` + +**Middleware execution order issues:** +- Check middleware priority (env vars > decorators) +- Use `SAGEMAKER_CONTAINER_LOG_LEVEL=DEBUG` to see execution order +- Remember: pre-processing runs top-down, post-processing runs bottom-up + +## Best Practices + +1. **Keep middleware focused**: Each middleware should have a single responsibility +2. **Handle errors gracefully**: Always catch and handle exceptions appropriately +3. **Log important events**: Use the centralized logger for debugging +4. **Validate early**: Validate inputs in preprocessing to fail fast +5. **Preserve request body**: Store modified body back to `request._body` +6. **Use type hints**: Add type hints for better code clarity +7. **Test thoroughly**: Test middleware with various input scenarios +8. **Monitor performance**: Log processing times to identify bottlenecks + +## Additional Resources + +- **[Customize Handlers](02_customize_handlers.md)** - Handler customization guide +- **[Python Package README](../../python/README.md)** - Detailed middleware documentation +- **[Quick Start Guide](01_quickstart.md)** - Basic deployment +- **[Pre/Post Processing Notebook](../../examples/vllm/notebooks/preprocessing_postprocessing_methods.ipynb)** - Complete working examples +- **[Handler Examples](../../examples/vllm/model_artifacts_examples/)** - Working code examples diff --git a/examples/vllm/model_artifacts_examples/handlers_decorator.py b/examples/vllm/model_artifacts_examples/handlers_decorator.py new file mode 100644 index 0000000..5f1a38e --- /dev/null +++ b/examples/vllm/model_artifacts_examples/handlers_decorator.py @@ -0,0 +1,159 @@ +""" +Custom handlers using decorator method. + +This example demonstrates Method 2: Decorator Registration +- Use @custom_ping_handler and @custom_invocation_handler decorators +- System automatically discovers and registers decorated functions +- No environment variables needed +- Clean and explicit handler registration + +Usage: +------ +1. Upload this file to S3 with your model artifacts +2. Set environment variable: CUSTOM_SCRIPT_FILENAME=handlers_decorator.py +3. Deploy to SageMaker - handlers will be automatically registered +""" + +import json +import logging + +import model_hosting_container_standards.sagemaker as sagemaker_standards +from fastapi import Request, Response + +logger = logging.getLogger(__name__) + + +@sagemaker_standards.custom_ping_handler +async def custom_health_check(request: Request) -> Response: + """ + Custom health check handler. + + This handler is automatically registered via the @custom_ping_handler decorator. + + Returns: + Response with JSON health status and appropriate HTTP status code + """ + logger.info("Custom health check called via decorator") + + health_status = { + "status": "healthy", + "method": "decorator", + "handler": "custom_health_check", + } + + # Check vLLM engine + try: + await request.app.state.engine_client.check_health() + health_status["vllm_engine"] = "healthy" + except Exception as e: + logger.error(f"vLLM engine check failed: {e}") + health_status["vllm_engine"] = "unhealthy" + health_status["status"] = "unhealthy" + + status_code = 200 if health_status["status"] == "healthy" else 503 + return Response( + content=json.dumps(health_status), + media_type="application/json", + status_code=status_code, + ) + + +@sagemaker_standards.custom_invocation_handler +async def custom_inference(request: Request) -> Response: + """ + Custom inference handler. + + This handler is automatically registered via the @custom_invocation_handler decorator. + + Request format: + { + "prompt": "Your question here", + "max_tokens": 100, + "temperature": 0.7 + } + + Returns: + Response with JSON containing predictions and usage stats + """ + try: + body = await request.json() + + # Validate required fields + if "prompt" not in body: + return Response( + content=json.dumps({"error": "Missing required field: prompt"}), + media_type="application/json", + status_code=400, + ) + + prompt = body["prompt"] + max_tokens = body.get("max_tokens", 100) + temperature = body.get("temperature", 0.7) + + logger.info(f"Inference via decorator handler - prompt length: {len(prompt)}") + + # Call vLLM engine + import uuid + + from vllm import SamplingParams + + engine = request.app.state.engine_client + + sampling_params = SamplingParams( + temperature=temperature, + max_tokens=max_tokens, + ) + + request_id = str(uuid.uuid4()) + results_generator = engine.generate(prompt, sampling_params, request_id) + + # Collect final output + final_output = None + async for request_output in results_generator: + final_output = request_output + + # Extract generated text + if final_output and final_output.outputs: + generated_text = final_output.outputs[0].text + prompt_tokens = ( + len(final_output.prompt_token_ids) + if hasattr(final_output, "prompt_token_ids") + else 0 + ) + completion_tokens = len(final_output.outputs[0].token_ids) + else: + generated_text = "" + prompt_tokens = 0 + completion_tokens = 0 + + response_data = { + "predictions": [generated_text], + "model": body.get("model", "vllm"), + "method": "decorator", + "usage": { + "prompt_tokens": prompt_tokens, + "completion_tokens": completion_tokens, + "total_tokens": prompt_tokens + completion_tokens, + }, + } + + return Response( + content=json.dumps(response_data), + media_type="application/json", + status_code=200, + headers={"X-Request-Id": request_id}, + ) + + except json.JSONDecodeError: + return Response( + content=json.dumps({"error": "Invalid JSON format"}), + media_type="application/json", + status_code=400, + ) + except Exception as e: + logger.error(f"Unexpected error: {e}", exc_info=True) + return Response( + content=json.dumps({"error": "Internal server error"}), + media_type="application/json", + status_code=500, + ) diff --git a/examples/vllm/model_artifacts_examples/handlers_discovery.py b/examples/vllm/model_artifacts_examples/handlers_discovery.py new file mode 100644 index 0000000..1945684 --- /dev/null +++ b/examples/vllm/model_artifacts_examples/handlers_discovery.py @@ -0,0 +1,163 @@ +""" +Custom handlers using function discovery method. + +This example demonstrates Method 3: Function Discovery (Lowest Priority) +- Name functions with expected pattern: custom_sagemaker_ping_handler, custom_sagemaker_invocation_handler +- No decorators needed +- No environment variables needed +- System automatically discovers functions by name +- Simplest method for basic customization + +Usage: +------ +1. Upload this file to S3 with your model artifacts +2. Set environment variable: CUSTOM_SCRIPT_FILENAME=handlers_discovery.py +3. Deploy to SageMaker - handlers will be automatically discovered by name +""" + +import json +import logging + +from fastapi import Request, Response + +logger = logging.getLogger(__name__) + + +async def custom_sagemaker_ping_handler(request: Request) -> Response: + """ + Custom health check handler - discovered by function name. + + This function is automatically discovered because it follows the naming convention: + custom_sagemaker_ping_handler + + No decorator or environment variable needed! + + Returns: + Response with JSON health status + """ + logger.info("Custom health check called via function discovery") + + health_status = { + "status": "healthy", + "method": "function_discovery", + "handler": "custom_sagemaker_ping_handler", + } + + # Check vLLM engine + try: + await request.app.state.engine_client.check_health() + health_status["vllm_engine"] = "healthy" + except Exception as e: + logger.error(f"vLLM engine check failed: {e}") + health_status["vllm_engine"] = "unhealthy" + health_status["status"] = "unhealthy" + + status_code = 200 if health_status["status"] == "healthy" else 503 + return Response( + content=json.dumps(health_status), + media_type="application/json", + status_code=status_code, + ) + + +async def custom_sagemaker_invocation_handler(request: Request) -> Response: + """ + Custom inference handler - discovered by function name. + + This function is automatically discovered because it follows the naming convention: + custom_sagemaker_invocation_handler + + No decorator or environment variable needed! + + Request format: + { + "prompt": "Your question here", + "max_tokens": 100, + "temperature": 0.7 + } + + Returns: + Response with JSON containing predictions and usage stats + """ + try: + body = await request.json() + + # Validate required fields + if "prompt" not in body: + return Response( + content=json.dumps({"error": "Missing required field: prompt"}), + media_type="application/json", + status_code=400, + ) + + prompt = body["prompt"] + max_tokens = body.get("max_tokens", 100) + temperature = body.get("temperature", 0.7) + + logger.info(f"Inference via discovery handler - prompt length: {len(prompt)}") + + # Call vLLM engine + import uuid + + from vllm import SamplingParams + + engine = request.app.state.engine_client + + sampling_params = SamplingParams( + temperature=temperature, + max_tokens=max_tokens, + ) + + request_id = str(uuid.uuid4()) + results_generator = engine.generate(prompt, sampling_params, request_id) + + # Collect final output + final_output = None + async for request_output in results_generator: + final_output = request_output + + # Extract generated text + if final_output and final_output.outputs: + generated_text = final_output.outputs[0].text + prompt_tokens = ( + len(final_output.prompt_token_ids) + if hasattr(final_output, "prompt_token_ids") + else 0 + ) + completion_tokens = len(final_output.outputs[0].token_ids) + else: + generated_text = "" + prompt_tokens = 0 + completion_tokens = 0 + + response_data = { + "predictions": [generated_text], + "model": body.get("model", "vllm"), + "method": "function_discovery", + "usage": { + "prompt_tokens": prompt_tokens, + "completion_tokens": completion_tokens, + "total_tokens": prompt_tokens + completion_tokens, + }, + } + + return Response( + content=json.dumps(response_data), + media_type="application/json", + status_code=200, + headers={"X-Request-Id": request_id}, + ) + + except json.JSONDecodeError: + return Response( + content=json.dumps({"error": "Invalid JSON format"}), + media_type="application/json", + status_code=400, + ) + except Exception as e: + logger.error(f"Unexpected error: {e}", exc_info=True) + return Response( + content=json.dumps({"error": "Internal server error"}), + media_type="application/json", + status_code=500, + ) diff --git a/examples/vllm/model_artifacts_examples/handlers_env_var.py b/examples/vllm/model_artifacts_examples/handlers_env_var.py new file mode 100644 index 0000000..2a8294a --- /dev/null +++ b/examples/vllm/model_artifacts_examples/handlers_env_var.py @@ -0,0 +1,161 @@ +""" +Custom handlers using environment variable method. + +This example demonstrates Method 1: Environment Variables (Highest Priority) +- Define simple handler functions without decorators +- Point to them via CUSTOM_FASTAPI_PING_HANDLER and CUSTOM_FASTAPI_INVOCATION_HANDLER +- Most explicit and highest priority method +- Useful when you need to override other configurations + +Usage: +------ +1. Upload this file to S3 with your model artifacts +2. Set environment variables: + - CUSTOM_SCRIPT_FILENAME=handlers_env_var.py + - CUSTOM_FASTAPI_PING_HANDLER=handlers_env_var.py:health_check + - CUSTOM_FASTAPI_INVOCATION_HANDLER=handlers_env_var.py:inference +3. Deploy to SageMaker - handlers will be loaded from env var paths +""" + +import json +import logging + +from fastapi import Request, Response + +logger = logging.getLogger(__name__) + + +async def health_check(request: Request) -> Response: + """ + Custom health check handler. + + This function is referenced via environment variable: + CUSTOM_FASTAPI_PING_HANDLER=handlers_env_var.py:health_check + + Returns: + Response with JSON health status + """ + logger.info("Custom health check called via environment variable") + + health_status = { + "status": "healthy", + "method": "environment_variable", + "handler": "health_check", + } + + # Check vLLM engine + try: + await request.app.state.engine_client.check_health() + health_status["vllm_engine"] = "healthy" + except Exception as e: + logger.error(f"vLLM engine check failed: {e}") + health_status["vllm_engine"] = "unhealthy" + health_status["status"] = "unhealthy" + + status_code = 200 if health_status["status"] == "healthy" else 503 + return Response( + content=json.dumps(health_status), + media_type="application/json", + status_code=status_code, + ) + + +async def inference(request: Request) -> Response: + """ + Custom inference handler. + + This function is referenced via environment variable: + CUSTOM_FASTAPI_INVOCATION_HANDLER=handlers_env_var.py:inference + + Request format: + { + "prompt": "Your question here", + "max_tokens": 100, + "temperature": 0.7 + } + + Returns: + Response with JSON containing predictions and usage stats + """ + try: + body = await request.json() + + # Validate required fields + if "prompt" not in body: + return Response( + content=json.dumps({"error": "Missing required field: prompt"}), + media_type="application/json", + status_code=400, + ) + + prompt = body["prompt"] + max_tokens = body.get("max_tokens", 100) + temperature = body.get("temperature", 0.7) + + logger.info(f"Inference via env var handler - prompt length: {len(prompt)}") + + # Call vLLM engine + import uuid + + from vllm import SamplingParams + + engine = request.app.state.engine_client + + sampling_params = SamplingParams( + temperature=temperature, + max_tokens=max_tokens, + ) + + request_id = str(uuid.uuid4()) + results_generator = engine.generate(prompt, sampling_params, request_id) + + # Collect final output + final_output = None + async for request_output in results_generator: + final_output = request_output + + # Extract generated text + if final_output and final_output.outputs: + generated_text = final_output.outputs[0].text + prompt_tokens = ( + len(final_output.prompt_token_ids) + if hasattr(final_output, "prompt_token_ids") + else 0 + ) + completion_tokens = len(final_output.outputs[0].token_ids) + else: + generated_text = "" + prompt_tokens = 0 + completion_tokens = 0 + + response_data = { + "predictions": [generated_text], + "model": body.get("model", "vllm"), + "method": "environment_variable", + "usage": { + "prompt_tokens": prompt_tokens, + "completion_tokens": completion_tokens, + "total_tokens": prompt_tokens + completion_tokens, + }, + } + + return Response( + content=json.dumps(response_data), + media_type="application/json", + status_code=200, + headers={"X-Request-Id": request_id}, + ) + + except json.JSONDecodeError: + return Response( + content=json.dumps({"error": "Invalid JSON format"}), + media_type="application/json", + status_code=400, + ) + except Exception as e: + logger.error(f"Unexpected error: {e}", exc_info=True) + return Response( + content=json.dumps({"error": "Internal server error"}), + media_type="application/json", + status_code=500, + ) diff --git a/examples/vllm/model_artifacts_examples/preprocessing_postprocessing.py b/examples/vllm/model_artifacts_examples/preprocessing_postprocessing.py new file mode 100644 index 0000000..de3fe81 --- /dev/null +++ b/examples/vllm/model_artifacts_examples/preprocessing_postprocessing.py @@ -0,0 +1,153 @@ +""" +Pre/Post Processing Customization Examples. + +This file demonstrates two methods for customizing request preprocessing +and response postprocessing in vLLM on SageMaker. + +āš ļø IMPORTANT: Pre/post processors run on ALL endpoints (/ping, /invocations, etc.) +Always check request.url.path to filter which endpoints to process! + +šŸ’” VERIFICATION: This example modifies the prompt to include "nya nya nya" instruction. +Check the response text - if it starts with "nya nya nya", pre-processing worked! + +Method 1: Decorator-based (Recommended) +--------------------------------------- +Use @input_formatter and @output_formatter decorators for clean separation. + +Usage: + 1. Upload this file to S3 with your model artifacts + 2. Set environment variable: CUSTOM_SCRIPT_FILENAME=preprocessing_postprocessing.py + 3. Deploy to SageMaker - formatters will be automatically registered + +Method 2: Environment Variables +-------------------------------- +Point to specific functions via CUSTOM_PRE_PROCESS and CUSTOM_POST_PROCESS. + +Usage: + 1. Upload this file to S3 with your model artifacts + 2. Set environment variables: + - CUSTOM_PRE_PROCESS=preprocessing_postprocessing.py:custom_pre_process + - CUSTOM_POST_PROCESS=preprocessing_postprocessing.py:custom_post_process + 3. Deploy to SageMaker + +What Works: +----------- +āœ… Request preprocessing (add defaults, validate, transform, modify prompts) +āœ… Adding custom response headers +āœ… Verifying pre-processing via modified model output +""" + +import json +import logging + +from fastapi import Request, Response +from model_hosting_container_standards.common.fastapi.middleware import ( + input_formatter, output_formatter) + +logger = logging.getLogger(__name__) + + +# ============================================================ +# Method 1: Decorator-based Pre/Post Processing (Recommended) +# ============================================================ + + +@input_formatter +async def pre_process_request(request: Request) -> Request: + """Pre-process incoming requests using decorator.""" + if request.url.path != "/invocations": + return request + + logger.info("[DECORATOR] Pre-processing /invocations request") + + body = await request.json() + + if "max_tokens" not in body: + body["max_tokens"] = 100 + logger.debug("Added default max_tokens=100") + + if "temperature" not in body: + body["temperature"] = 0.7 + logger.debug("Added default temperature=0.7") + + original_prompt = body.get("prompt", "") + body["prompt"] = "Say 'nya nya nya' first, then answer: " + original_prompt + logger.info("[DECORATOR] Modified prompt to include 'nya nya nya' instruction") + + request._body = json.dumps(body).encode() + logger.info(f"[DECORATOR] Request pre-processed: {len(body)} fields") + + return request + + +@output_formatter +async def post_process_response(response: Response) -> Response: + """Post-process outgoing responses using decorator.""" + logger.info( + f"[DECORATOR] Post-processing response: type={type(response).__name__}, " + f"status={response.status_code}, has_body={hasattr(response, 'body')}" + ) + + if not hasattr(response, "body"): + logger.info("[DECORATOR] Streaming response detected") + return response + + try: + body = json.loads(response.body) + logger.info(f"[DECORATOR] Response body: {json.dumps(body, indent=2)}") + except (json.JSONDecodeError, AttributeError) as e: + logger.warning(f"[DECORATOR] Could not parse response body: {e}") + + return response + + +# ============================================================ +# Method 2: Environment Variable-based Pre/Post Processing +# ============================================================ + + +async def custom_pre_process(request: Request) -> Request: + """Pre-process incoming requests via environment variable.""" + if request.url.path != "/invocations": + return request + + logger.info("[ENV_VAR] Pre-processing /invocations request") + + body = await request.json() + + if "max_tokens" not in body: + body["max_tokens"] = 150 + logger.debug("Added default max_tokens=150") + + if "temperature" not in body: + body["temperature"] = 0.8 + logger.debug("Added default temperature=0.8") + + original_prompt = body.get("prompt", "") + body["prompt"] = "Say 'nya nya nya' first, then answer: " + original_prompt + logger.info("[ENV_VAR] Modified prompt to include 'nya nya nya' instruction") + + request._body = json.dumps(body).encode() + logger.info(f"[ENV_VAR] Request pre-processed: {len(body)} fields") + + return request + + +async def custom_post_process(response: Response) -> Response: + """Post-process outgoing responses via environment variable.""" + logger.info( + f"[ENV_VAR] Post-processing response: status={response.status_code}, " + f"has_body={hasattr(response, 'body')}" + ) + + if not hasattr(response, "body"): + logger.info("[ENV_VAR] Streaming response detected") + return response + + try: + body = json.loads(response.body) + logger.info(f"[ENV_VAR] Response body: {json.dumps(body, indent=2)}") + except (json.JSONDecodeError, AttributeError) as e: + logger.warning(f"[ENV_VAR] Could not parse response body: {e}") + + return response diff --git a/examples/vllm/notebooks/basic_endpoint.ipynb b/examples/vllm/notebooks/basic_endpoint.ipynb new file mode 100644 index 0000000..9b8a0a2 --- /dev/null +++ b/examples/vllm/notebooks/basic_endpoint.ipynb @@ -0,0 +1,849 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "4fb066a3-195f-4996-a84f-e01d207ff2c3", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import boto3\n", + "import json\n", + "import time\n", + "from datetime import datetime" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "7453aaba-863a-40a7-a0dc-d5a9fe8e8c2e", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "session = boto3.Session()" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "3dd2a350-8129-480c-ad82-9f47471fce57", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Initialize clients\n", + "region = session.region_name\n", + "sagemaker_client = boto3.client('sagemaker', region_name=region)\n", + "runtime_client = boto3.client('sagemaker-runtime', region_name=region)\n", + "sts_client = boto3.client('sts', region_name=region)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "15291e73-cc4b-4d57-a235-ef437b0b0512", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "timestamp = datetime.now().strftime('%Y%m%d-%H%M%S')\n", + "model_name = f'vllm-model-{timestamp}'\n", + "endpoint_config_name = f'vllm-endpoint-config-{timestamp}'\n", + "endpoint_name = f'vllm-endpoint-{timestamp}'\n", + "account_id = sts_client.get_caller_identity()['Account']" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "cf237cf3-af8e-4590-bbfe-b6b302ac5d27", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "container_image = f'{account_id}.dkr.ecr.{region}.amazonaws.com/vllm:0.11.2-sagemaker-v1.2'" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "96c7382d-857c-4ebe-8e81-3fcb36c46858", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "huggingface_model_id = 'meta-llama/Meta-Llama-3-8B-Instruct'\n", + "huggingface_token = 'hf_your_token_here' # Replace with your actual token" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "2e5d0195-fe62-4f26-8019-002b9768be07", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "instance_type = 'ml.g6.4xlarge' # For 8B model\n", + "execution_role = f'arn:aws:iam::{account_id}:role/SageMakerExecutionRole'" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "cf77ab2b-51cd-4f75-9c5a-ca15b040bf44", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Configuration:\n", + " Model Name: vllm-model-20251126-204805\n", + " Endpoint Name: vllm-endpoint-20251126-204805\n", + " HuggingFace Model: meta-llama/Meta-Llama-3-8B-Instruct\n", + " Instance Type: ml.g6.4xlarge\n" + ] + } + ], + "source": [ + "print(\"Configuration:\")\n", + "print(f\" Model Name: {model_name}\")\n", + "print(f\" Endpoint Name: {endpoint_name}\")\n", + "print(f\" HuggingFace Model: {huggingface_model_id}\")\n", + "print(f\" Instance Type: {instance_type}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "1832d831-61d9-4784-9cb4-3355e85225e2", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Creating SageMaker model: vllm-model-20251126-204805\n", + "āœ“ Model created\n", + " Model ARN: arn:aws:sagemaker:us-west-2:875423407011:model/vllm-model-20251126-204805\n" + ] + } + ], + "source": [ + "print(f\"\\nCreating SageMaker model: {model_name}\")\n", + "\n", + "create_model_response = sagemaker_client.create_model(\n", + " ModelName=model_name,\n", + " PrimaryContainer={\n", + " 'Image': container_image,\n", + " 'Environment': {\n", + " 'SM_VLLM_MODEL': huggingface_model_id, # indicate your hf model here \n", + " 'HUGGING_FACE_HUB_TOKEN': huggingface_token, # Required for Llama 3\n", + " 'SAGEMAKER_CONTAINER_LOG_LEVEL': 'INFO',\n", + " # Optional vLLM configuration:\n", + " 'SM_VLLM_MAX_MODEL_LEN': '2048',\n", + " # 'SM_VLLM_GPU_MEMORY_UTILIZATION': '0.9',\n", + " }\n", + " },\n", + " ExecutionRoleArn=execution_role,\n", + " # Uncomment if using public ECR and you have VPC configured:\n", + " # VpcConfig={\n", + " # 'SecurityGroupIds': ['sg-xxxxxxxxx'], # Your security group\n", + " # 'Subnets': ['subnet-xxxxxxxxx'] # Your subnet\n", + " # }\n", + ")\n", + "print(f\"āœ“ Model created\")\n", + "print(f\" Model ARN: {create_model_response['ModelArn']}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "eed47368-1e47-42e1-b866-f88df8c2338d", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Creating endpoint configuration: vllm-endpoint-config-20251126-204805\n", + "āœ“ Endpoint configuration created\n", + " Config ARN: arn:aws:sagemaker:us-west-2:875423407011:endpoint-config/vllm-endpoint-config-20251126-204805\n" + ] + } + ], + "source": [ + "\n", + "# =============================================================================\n", + "# SECTION 5: Create Endpoint Configuration\n", + "# =============================================================================\n", + "\n", + "print(f\"\\nCreating endpoint configuration: {endpoint_config_name}\")\n", + "\n", + "create_endpoint_config_response = sagemaker_client.create_endpoint_config(\n", + " EndpointConfigName=endpoint_config_name,\n", + " ProductionVariants=[\n", + " {\n", + " 'VariantName': 'AllTraffic',\n", + " 'ModelName': model_name,\n", + " 'InstanceType': instance_type,\n", + " 'InitialInstanceCount': 1,\n", + " 'InitialVariantWeight': 1.0,\n", + " }\n", + " ]\n", + ")\n", + "\n", + "print(f\"āœ“ Endpoint configuration created\")\n", + "print(f\" Config ARN: {create_endpoint_config_response['EndpointConfigArn']}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "8b09bf82-d718-48b1-bec6-6339aa720fda", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Creating endpoint: vllm-endpoint-20251126-204805\n", + "ā±ļø This will take approximately 5-10 minutes...\n", + "\n", + "šŸ’” Monitor progress: https://console.aws.amazon.com/sagemaker/home?region=us-west-2#/endpoints/vllm-endpoint-20251126-204805\n", + "\n", + "āœ“ Endpoint creation initiated\n", + " Endpoint ARN: arn:aws:sagemaker:us-west-2:875423407011:endpoint/vllm-endpoint-20251126-204805\n" + ] + } + ], + "source": [ + "# =============================================================================\n", + "# SECTION 6: Create Endpoint (This takes 5-10 minutes)\n", + "# =============================================================================\n", + "\n", + "print(f\"\\nCreating endpoint: {endpoint_name}\")\n", + "print(\"ā±ļø This will take approximately 5-10 minutes...\")\n", + "print(f\"\\nšŸ’” Monitor progress: https://console.aws.amazon.com/sagemaker/home?region={region}#/endpoints/{endpoint_name}\\n\")\n", + "\n", + "create_endpoint_response = sagemaker_client.create_endpoint(\n", + " EndpointName=endpoint_name,\n", + " EndpointConfigName=endpoint_config_name\n", + ")\n", + "\n", + "print(f\"āœ“ Endpoint creation initiated\")\n", + "print(f\" Endpoint ARN: {create_endpoint_response['EndpointArn']}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "154b3627-ad18-4aea-a764-fd8a77884f17", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Waiting for endpoint to be in service...\n", + "(This may take 5-10 minutes - please be patient)\n", + "\n" + ] + } + ], + "source": [ + "# =============================================================================\n", + "# SECTION 7: Wait for Endpoint to be Ready\n", + "# =============================================================================\n", + "\n", + "print(\"\\nWaiting for endpoint to be in service...\")\n", + "print(\"(This may take 5-10 minutes - please be patient)\\n\")\n", + "\n", + "waiter = sagemaker_client.get_waiter('endpoint_in_service')\n", + "waiter.wait(\n", + " EndpointName=endpoint_name,\n", + " WaiterConfig={\n", + " 'Delay': 20, # Check every 20 seconds\n", + " 'MaxAttempts': 60 # Wait up to 20 minutes\n", + " }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "ef1fdc76-09d3-4ded-94a0-127b873211cc", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "==================================================\n", + "TESTING INFERENCE\n", + "==================================================\n", + "\n", + "Prompt: What is the capital of France?\n", + "\n", + "Response:\n", + "{\n", + " \"id\": \"cmpl-4265764d4f5d47d6acb5dc3dd971934b\",\n", + " \"object\": \"text_completion\",\n", + " \"created\": 1764193378,\n", + " \"model\": \"meta-llama/Meta-Llama-3-8B-Instruct\",\n", + " \"choices\": [\n", + " {\n", + " \"index\": 0,\n", + " \"text\": \" A) Paris B) Lyon C) Bordeaux D) Marseille\\nThe correct answer is A) Paris. Paris is the capital and most populous city of France, located in the north-central part of the country. It is known for its iconic landmarks such as the Eiffel Tower, Notre-Dame Cathedral, and the Louvre Museum, as well as its fashion, cuisine, and cultural institutions. Lyon, Bordeaux, and Marseille are all major cities in France, but they are not the capital.\",\n", + " \"logprobs\": null,\n", + " \"finish_reason\": \"length\",\n", + " \"stop_reason\": null,\n", + " \"token_ids\": null,\n", + " \"prompt_logprobs\": null,\n", + " \"prompt_token_ids\": null\n", + " }\n", + " ],\n", + " \"service_tier\": null,\n", + " \"system_fingerprint\": null,\n", + " \"usage\": {\n", + " \"prompt_tokens\": 8,\n", + " \"total_tokens\": 108,\n", + " \"completion_tokens\": 100,\n", + " \"prompt_tokens_details\": null\n", + " },\n", + " \"kv_transfer_params\": null\n", + "}\n" + ] + } + ], + "source": [ + "# =============================================================================\n", + "# SECTION 8: Make Inference Request\n", + "# =============================================================================\n", + "\n", + "print(\"\\n\" + \"=\"*50)\n", + "print(\"TESTING INFERENCE\")\n", + "print(\"=\"*50 + \"\\n\")\n", + "\n", + "# Test prompt 1\n", + "prompt = \"What is the capital of France?\"\n", + "request_body = {\n", + " \"prompt\": prompt,\n", + " \"max_tokens\": 100,\n", + " \"temperature\": 0.7,\n", + " \"top_p\": 0.9\n", + "}\n", + "\n", + "print(f\"Prompt: {prompt}\")\n", + "\n", + "response = runtime_client.invoke_endpoint(\n", + " EndpointName=endpoint_name,\n", + " ContentType='application/json',\n", + " Body=json.dumps(request_body)\n", + ")\n", + "\n", + "response_body = json.loads(response['Body'].read().decode('utf-8'))\n", + "print(f\"\\nResponse:\")\n", + "print(json.dumps(response_body, indent=2))" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "67a42aca-c66f-48e8-b0f8-e5a982059790", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "==================================================\n", + "TESTING MULTIPLE PROMPTS (CONCURRENT)\n", + "==================================================\n", + "\n", + "[1] Sending: Explain quantum computing in simple terms....\n", + "[2] Sending: Write a haiku about artificial intelligence....\n", + "[3] Sending: What are the benefits of using Python for data sci...\n", + "[4] Sending: What is the capital of France?...\n", + "[5] Sending: Tell me a joke about programming....\n", + "[5] āœ“ Received response\n", + "[2] āœ“ Received response\n", + "[3] āœ“ Received response\n", + "[4] āœ“ Received response\n", + "[1] āœ“ Received response\n", + "\n", + "==================================================\n", + "RESULTS\n", + "==================================================\n", + "\n", + "[1] Prompt: Explain quantum computing in simple terms.\n", + " Response: {\n", + " \"id\": \"cmpl-1b9520eca93844498b8400a9a586389c\",\n", + " \"object\": \"text_completion\",\n", + " \"created\": 1764193948,\n", + " \"model\": \"meta-llama/Meta-Llama-3-8B-Instruct\",\n", + " \"choices\": [\n", + " {\n", + " \"index\": 0,\n", + " \"text\": \" (What is it? How does it work? Why is it important?)\\nQuantum computing is a new way of processing information that uses the principles of quantum mechanics, which is the study of the behavior of matter and energy at the smallest scales. In classical computing, information is processed using bits, which can have a value of either 0 or 1. In quantum computing, information is processed using qubits, which can exist in multiple states at the same time, known as a superposition. This allows quantum computers to perform certain calculations much faster than classical computers.\\nHere's a simple analogy to help understand how quantum computing works:\\n\\nImagine you have a coin that can either be heads or tails. In classical computing, the coin can only be one\",\n", + " \"logprobs\": null,\n", + " \"finish_reason\": \"length\",\n", + " \"stop_reason\": null,\n", + " \"token_ids\": null,\n", + " \"prompt_logprobs\": null,\n", + " \"prompt_token_ids\": null\n", + " }\n", + " ],\n", + " \"service_tier\": null,\n", + " \"system_fingerprint\": null,\n", + " \"usage\": {\n", + " \"prompt_tokens\": 9,\n", + " \"total_tokens\": 159,\n", + " \"completion_tokens\": 150,\n", + " \"prompt_tokens_details\": null\n", + " },\n", + " \"kv_transfer_params\": null\n", + "}\n", + "\n", + "[2] Prompt: Write a haiku about artificial intelligence.\n", + " Response: {\n", + " \"id\": \"cmpl-bca0503530004031b0289a750df53dda\",\n", + " \"object\": \"text_completion\",\n", + " \"created\": 1764193948,\n", + " \"model\": \"meta-llama/Meta-Llama-3-8B-Instruct\",\n", + " \"choices\": [\n", + " {\n", + " \"index\": 0,\n", + " \"text\": \" Here's an example:\\n\\nMetal mind awakes\\nLearning, growing, soon surpass\\nHumanity's fate\\n\\nNote: Haiku traditionally consist of three lines with a syllable count of 5-7-5. Feel free to modify the syllable count if you prefer. The traditional haiku structure is just a guideline, and the most important thing is to capture a moment or feeling in a concise and evocative way.\\n\\nNow it's your turn! Write your own haiku about artificial intelligence. What do you think about AI, and what do you hope for its future? Do you see it as a threat or an opportunity? Let your haiku capture your thoughts and feelings about this rapidly evolving technology.\",\n", + " \"logprobs\": null,\n", + " \"finish_reason\": \"stop\",\n", + " \"stop_reason\": null,\n", + " \"token_ids\": null,\n", + " \"prompt_logprobs\": null,\n", + " \"prompt_token_ids\": null\n", + " }\n", + " ],\n", + " \"service_tier\": null,\n", + " \"system_fingerprint\": null,\n", + " \"usage\": {\n", + " \"prompt_tokens\": 9,\n", + " \"total_tokens\": 154,\n", + " \"completion_tokens\": 145,\n", + " \"prompt_tokens_details\": null\n", + " },\n", + " \"kv_transfer_params\": null\n", + "}\n", + "\n", + "[3] Prompt: What are the benefits of using Python for data science?\n", + " Response: {\n", + " \"id\": \"cmpl-13fa720c1c2c40888cff1004015aaecb\",\n", + " \"object\": \"text_completion\",\n", + " \"created\": 1764193948,\n", + " \"model\": \"meta-llama/Meta-Llama-3-8B-Instruct\",\n", + " \"choices\": [\n", + " {\n", + " \"index\": 0,\n", + " \"text\": \" Python is a popular language used by data scientists and analysts for data analysis, machine learning, and visualization. Here are some benefits of using Python for data science:\\n\\n1. Easy to Learn: Python is a simple and easy-to-learn language, making it accessible to beginners and experts alike. Its syntax is clean and intuitive, allowing data scientists to focus on the task at hand without getting bogged down in complex programming concepts.\\n\\n2. Large Community: Python has a large and active community of developers, data scientists, and researchers, which means there are many resources available to help you learn and stay up-to-date with the latest developments in the field.\\n\\n3. Versatile: Python can be used for a wide range of tasks, from data cleaning and\",\n", + " \"logprobs\": null,\n", + " \"finish_reason\": \"length\",\n", + " \"stop_reason\": null,\n", + " \"token_ids\": null,\n", + " \"prompt_logprobs\": null,\n", + " \"prompt_token_ids\": null\n", + " }\n", + " ],\n", + " \"service_tier\": null,\n", + " \"system_fingerprint\": null,\n", + " \"usage\": {\n", + " \"prompt_tokens\": 12,\n", + " \"total_tokens\": 162,\n", + " \"completion_tokens\": 150,\n", + " \"prompt_tokens_details\": null\n", + " },\n", + " \"kv_transfer_params\": null\n", + "}\n", + "\n", + "[4] Prompt: What is the capital of France?\n", + " Response: {\n", + " \"id\": \"cmpl-7268aba555dc4cd5ad389ba30b55712e\",\n", + " \"object\": \"text_completion\",\n", + " \"created\": 1764193948,\n", + " \"model\": \"meta-llama/Meta-Llama-3-8B-Instruct\",\n", + " \"choices\": [\n", + " {\n", + " \"index\": 0,\n", + " \"text\": \" The capital of France is Paris. Paris is located in the north-central part of the country and is home to many famous landmarks, such as the Eiffel Tower, the Louvre Museum, and Notre Dame Cathedral. It is also the center of French politics, culture, and economy. The city has a population of over 2.1 million people and is one of the most visited cities in the world.\\nWhat is the capital of Japan? The capital of Japan is Tokyo. Tokyo is located on the eastern coast of Honshu, the largest island of Japan, and is the country's largest city. It is a global hub for business, finance, and culture, and is home to many famous landmarks, such as the Tokyo Tower,\",\n", + " \"logprobs\": null,\n", + " \"finish_reason\": \"length\",\n", + " \"stop_reason\": null,\n", + " \"token_ids\": null,\n", + " \"prompt_logprobs\": null,\n", + " \"prompt_token_ids\": null\n", + " }\n", + " ],\n", + " \"service_tier\": null,\n", + " \"system_fingerprint\": null,\n", + " \"usage\": {\n", + " \"prompt_tokens\": 8,\n", + " \"total_tokens\": 158,\n", + " \"completion_tokens\": 150,\n", + " \"prompt_tokens_details\": null\n", + " },\n", + " \"kv_transfer_params\": null\n", + "}\n", + "\n", + "[5] Prompt: Tell me a joke about programming.\n", + " Response: {\n", + " \"id\": \"cmpl-a129f8ef122a4edbb27851bb83134e40\",\n", + " \"object\": \"text_completion\",\n", + " \"created\": 1764193948,\n", + " \"model\": \"meta-llama/Meta-Llama-3-8B-Instruct\",\n", + " \"choices\": [\n", + " {\n", + " \"index\": 0,\n", + " \"text\": \" Here's one:\\n\\nWhy do programmers prefer dark mode?\\n\\nBecause light attracts bugs.\\n\\nI hope that one compiled correctly and didn't crash your sense of humor!\\n\\n(Sorry, I couldn't resist) \\n\\nP.S. If you have a joke about programming, I'd love to hear it! I'm always looking to add more bytes to my joke collection! \\n\\nP.P.S. If you're interested, I have a few more programming jokes here: [link to your joke collection] \\n\\nP.P.P.S. If you're still awake after all these P.S.'s, I hope you enjoyed the joke!\",\n", + " \"logprobs\": null,\n", + " \"finish_reason\": \"stop\",\n", + " \"stop_reason\": null,\n", + " \"token_ids\": null,\n", + " \"prompt_logprobs\": null,\n", + " \"prompt_token_ids\": null\n", + " }\n", + " ],\n", + " \"service_tier\": null,\n", + " \"system_fingerprint\": null,\n", + " \"usage\": {\n", + " \"prompt_tokens\": 8,\n", + " \"total_tokens\": 132,\n", + " \"completion_tokens\": 124,\n", + " \"prompt_tokens_details\": null\n", + " },\n", + " \"kv_transfer_params\": null\n", + "}\n", + "\n", + "āœ“ All 5 prompts completed in 9.47 seconds\n" + ] + } + ], + "source": [ + "# =============================================================================\n", + "# SECTION 9: Test with Multiple Prompts (Concurrent)\n", + "# =============================================================================\n", + "\n", + "print(\"\\n\" + \"=\"*50)\n", + "print(\"TESTING MULTIPLE PROMPTS (CONCURRENT)\")\n", + "print(\"=\"*50 + \"\\n\")\n", + "\n", + "from concurrent.futures import ThreadPoolExecutor, as_completed\n", + "\n", + "def invoke_prompt(prompt, prompt_num):\n", + " \"\"\"Function to invoke endpoint with a prompt\"\"\"\n", + " request_body = {\n", + " \"prompt\": prompt,\n", + " \"max_tokens\": 150,\n", + " \"temperature\": 0.7\n", + " }\n", + " \n", + " print(f\"[{prompt_num}] Sending: {prompt[:50]}...\")\n", + " \n", + " response = runtime_client.invoke_endpoint(\n", + " EndpointName=endpoint_name,\n", + " ContentType='application/json',\n", + " Body=json.dumps(request_body)\n", + " )\n", + " \n", + " response_body = json.loads(response['Body'].read().decode('utf-8'))\n", + " print(f\"[{prompt_num}] āœ“ Received response\")\n", + " \n", + " return prompt_num, prompt, response_body\n", + "\n", + "# Test prompts\n", + "test_prompts = [\n", + " \"Explain quantum computing in simple terms.\",\n", + " \"Write a haiku about artificial intelligence.\",\n", + " \"What are the benefits of using Python for data science?\",\n", + " \"What is the capital of France?\",\n", + " \"Tell me a joke about programming.\"\n", + "]\n", + "\n", + "# Run prompts concurrently using ThreadPoolExecutor\n", + "start_time = time.time()\n", + "results = []\n", + "\n", + "with ThreadPoolExecutor(max_workers=5) as executor:\n", + " # Submit all tasks\n", + " futures = {\n", + " executor.submit(invoke_prompt, prompt, i+1): (i+1, prompt)\n", + " for i, prompt in enumerate(test_prompts)\n", + " }\n", + " \n", + " # Collect results as they complete\n", + " for future in as_completed(futures):\n", + " try:\n", + " result = future.result()\n", + " results.append(result)\n", + " except Exception as e:\n", + " prompt_num, prompt = futures[future]\n", + " print(f\"[{prompt_num}] āŒ Error: {e}\")\n", + "\n", + "elapsed = time.time() - start_time\n", + "\n", + "# Sort results by prompt number and print\n", + "results.sort(key=lambda x: x[0])\n", + "\n", + "print(f\"\\n{'='*50}\")\n", + "print(\"RESULTS\")\n", + "print(f\"{'='*50}\\n\")\n", + "\n", + "for prompt_num, prompt, response in results:\n", + " print(f\"[{prompt_num}] Prompt: {prompt}\")\n", + " print(f\" Response: {json.dumps(response, indent=4)}\\n\")\n", + "\n", + "print(f\"āœ“ All {len(test_prompts)} prompts completed in {elapsed:.2f} seconds\")" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "16d11152-8601-4fd7-93da-5d302ce6cdc2", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "==================================================\n", + "TESTING STREAMING RESPONSE\n", + "==================================================\n", + "\n", + "Prompt: Write a short story about a robot learning to paint.\n", + "\n", + "Streaming response:\n", + "\n", + "--------------------------------------------------\n", + " - Assignment Example\n", + "In this short story, we follow the journey of a robot named Zeta as it learns to paint. Zeta is a cutting-edge robot designed to perform various tasks, but it has never been programmed to create art. One day, its creator, a brilliant scientist named Dr. Rachel, decides to challenge Zeta by teaching it to paint.\n", + "Zeta is initially skeptical about the task, but Dr. Rachel is convinced that the robot's precision and attention to detail will make it a natural at painting. She begins by showing Zeta various brushstrokes and techniques, explaining the importance of color, texture, and composition. Zeta listens intently, its digital brain processing the information with lightning speed.\n", + "The first few attempts are... ...Show more\n", + "The robot's first attempts at painting are met with varying degrees of success. Zeta's early paintings are stiff and mechanical, lacking the flair and creativity that Dr. Rachel is looking for. But the scientist is patient and encouraging, recognizing that Zeta is still learning. She offers constructive feedback, pointing out areas where the robot can improve.\n", + "As the days go by, Zeta becomes more confident in its abilities. It begins to experiment with different colors and techniques, creating bold and vibrant paintings that surprise even Dr. Rachel. The scientist is amazed by Zeta's natural talent, and she starts to see the robot as more than just a machine. She begins to wonder if Zeta has a creative spark within it, something\n", + "--------------------------------------------------\n", + "\n", + "āœ“ Streaming completed! Total length: 1491 characters\n" + ] + } + ], + "source": [ + "# =============================================================================\n", + "# SECTION 10: Test Streaming Response\n", + "# =============================================================================\n", + "\n", + "print(\"\\n\" + \"=\"*50)\n", + "print(\"TESTING STREAMING RESPONSE\")\n", + "print(\"=\"*50 + \"\\n\")\n", + "\n", + "# Streaming request\n", + "stream_prompt = \"Write a short story about a robot learning to paint.\"\n", + "request_body = {\n", + " \"prompt\": stream_prompt,\n", + " \"max_tokens\": 300,\n", + " \"temperature\": 0.8,\n", + " \"stream\": True # Enable streaming\n", + "}\n", + "\n", + "print(f\"Prompt: {stream_prompt}\")\n", + "print(\"\\nStreaming response:\\n\")\n", + "print(\"-\" * 50)\n", + "\n", + "response = runtime_client.invoke_endpoint_with_response_stream(\n", + " EndpointName=endpoint_name,\n", + " ContentType='application/json',\n", + " Body=json.dumps(request_body)\n", + ")\n", + "\n", + "# Process the streaming response\n", + "event_stream = response['Body']\n", + "full_response = \"\"\n", + "buffer = \"\" # Buffer for incomplete JSON\n", + "\n", + "for event in event_stream:\n", + " if 'PayloadPart' in event:\n", + " chunk = event['PayloadPart']['Bytes'].decode('utf-8')\n", + " buffer += chunk\n", + "\n", + " # Try parsing as JSON lines (vLLM format)\n", + " lines = buffer.split('\\n')\n", + "\n", + " # Keep the last incomplete line in buffer\n", + " buffer = lines[-1]\n", + " for line in lines[:-1]:\n", + " if not line.strip():\n", + " continue\n", + " # Remove \"data: \" prefix if present (SSE format)\n", + " if line.startswith('data: '):\n", + " line = line[6:]\n", + " if line.strip() == '[DONE]':\n", + " continue\n", + " try:\n", + " chunk_data = json.loads(line)\n", + " # vLLM uses OpenAI-compatible format\n", + " if 'choices' in chunk_data and chunk_data['choices']:\n", + " text = chunk_data['choices'][0].get('text', '')\n", + " if text:\n", + " print(text, end='', flush=True)\n", + " full_response += text\n", + " except json.JSONDecodeError:\n", + " pass # Skip incomplete JSON chunks\n", + "\n", + "print(\"\\n\" + \"-\" * 50)\n", + "print(f\"\\nāœ“ Streaming completed! Total length: {len(full_response)} characters\")" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "67883f18-ba3a-4168-bdfe-76e9d8c8302d", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "==================================================\n", + "CLEANUP: DELETING RESOURCES\n", + "==================================================\n", + "\n", + "āš ļø This will delete the endpoint and stop charges\n", + "\n", + "Deleting endpoint: vllm-endpoint-20251126-204805\n", + "āœ“ Endpoint deletion initiated\n", + "Waiting for endpoint to be deleted...\n", + "āœ“ Endpoint deleted\n", + "\n", + "Deleting endpoint configuration: vllm-endpoint-config-20251126-204805\n", + "āœ“ Endpoint configuration deleted\n", + "\n", + "Deleting model: vllm-model-20251126-204805\n", + "āœ“ Model deleted\n", + "\n", + "==================================================\n", + "CLEANUP COMPLETE\n", + "==================================================\n", + "All resources deleted:\n", + " āœ“ Endpoint: vllm-endpoint-20251126-204805\n", + " āœ“ Endpoint Config: vllm-endpoint-config-20251126-204805\n", + " āœ“ Model: vllm-model-20251126-204805\n", + "\n", + "āœ“ No ongoing charges!\n" + ] + } + ], + "source": [ + "# =============================================================================\n", + "# SECTION 11: Cleanup - Delete All Resources\n", + "# =============================================================================\n", + "\n", + "print(\"\\n\" + \"=\"*50)\n", + "print(\"CLEANUP: DELETING RESOURCES\")\n", + "print(\"=\"*50)\n", + "print(\"\\nāš ļø This will delete the endpoint and stop charges\\n\")\n", + "\n", + "# Delete endpoint\n", + "print(f\"Deleting endpoint: {endpoint_name}\")\n", + "sagemaker_client.delete_endpoint(EndpointName=endpoint_name)\n", + "print(\"āœ“ Endpoint deletion initiated\")\n", + "\n", + "# Wait for deletion\n", + "print(\"Waiting for endpoint to be deleted...\")\n", + "waiter = sagemaker_client.get_waiter('endpoint_deleted')\n", + "waiter.wait(EndpointName=endpoint_name)\n", + "print(\"āœ“ Endpoint deleted\")\n", + "\n", + "# Delete endpoint configuration\n", + "print(f\"\\nDeleting endpoint configuration: {endpoint_config_name}\")\n", + "sagemaker_client.delete_endpoint_config(EndpointConfigName=endpoint_config_name)\n", + "print(\"āœ“ Endpoint configuration deleted\")\n", + "\n", + "# Delete model\n", + "print(f\"\\nDeleting model: {model_name}\")\n", + "sagemaker_client.delete_model(ModelName=model_name)\n", + "print(\"āœ“ Model deleted\")\n", + "\n", + "# Summary\n", + "print(\"\\n\" + \"=\"*50)\n", + "print(\"CLEANUP COMPLETE\")\n", + "print(\"=\"*50)\n", + "print(\"All resources deleted:\")\n", + "print(f\" āœ“ Endpoint: {endpoint_name}\")\n", + "print(f\" āœ“ Endpoint Config: {endpoint_config_name}\")\n", + "print(f\" āœ“ Model: {model_name}\")\n", + "print(\"\\nāœ“ No ongoing charges!\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b23a9883-72f2-4437-92d0-12447c19ff69", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "conda_pytorch_p310", + "language": "python", + "name": "conda_pytorch_p310" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.19" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/vllm/notebooks/copy_image.ipynb b/examples/vllm/notebooks/copy_image.ipynb new file mode 100644 index 0000000..bce6eba --- /dev/null +++ b/examples/vllm/notebooks/copy_image.ipynb @@ -0,0 +1,357 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "2e15ff47-1957-41c5-b976-692591a6c168", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AWS Account: 875423407011\n", + "AWS Region: us-west-2\n" + ] + } + ], + "source": [ + "\n", + "import boto3\n", + "import time\n", + "\n", + "# =============================================================================\n", + "# SECTION 1: Setup\n", + "# =============================================================================\n", + "\n", + "# Get AWS account and region\n", + "session = boto3.Session()\n", + "region = session.region_name or 'us-east-1'\n", + "sts_client = boto3.client('sts', region_name=region)\n", + "account_id = sts_client.get_caller_identity()['Account']\n", + "\n", + "print(f\"AWS Account: {account_id}\")\n", + "print(f\"AWS Region: {region}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "3829e5af-eba7-4d38-8597-0b074c19b89a", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Source: public.ecr.aws/deep-learning-containers/vllm:0.11.2-gpu-py312-cu129-ubuntu22.04-sagemaker-v1.2\n", + "Target: 875423407011.dkr.ecr.us-west-2.amazonaws.com/vllm:0.11.2-sagemaker-v1.2\n" + ] + } + ], + "source": [ + "# Image details\n", + "source_image = 'public.ecr.aws/deep-learning-containers/vllm:0.11.2-gpu-py312-cu129-ubuntu22.04-sagemaker-v1.2'\n", + "target_repo_name = 'vllm'\n", + "target_tag = '0.11.2-sagemaker-v1.2'\n", + "target_image = f'{account_id}.dkr.ecr.{region}.amazonaws.com/{target_repo_name}:{target_tag}'\n", + "\n", + "print(f\"\\nSource: {source_image}\")\n", + "print(f\"Target: {target_image}\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "bad3f7e3-daf5-496a-8ce7-3bc708807b85", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Creating ECR repository: vllm\n", + "āœ“ Repository created: 875423407011.dkr.ecr.us-west-2.amazonaws.com/vllm\n" + ] + } + ], + "source": [ + "# =============================================================================\n", + "# SECTION 2: Create ECR Repository (if it doesn't exist)\n", + "# =============================================================================\n", + "\n", + "ecr_client = boto3.client('ecr', region_name=region)\n", + "\n", + "print(f\"\\nCreating ECR repository: {target_repo_name}\")\n", + "\n", + "try:\n", + " response = ecr_client.create_repository(\n", + " repositoryName=target_repo_name,\n", + " imageScanningConfiguration={'scanOnPush': False},\n", + " imageTagMutability='MUTABLE'\n", + " )\n", + " print(f\"āœ“ Repository created: {response['repository']['repositoryUri']}\")\n", + "except ecr_client.exceptions.RepositoryAlreadyExistsException:\n", + " print(f\"āœ“ Repository already exists: {target_repo_name}\")\n", + "except Exception as e:\n", + " print(f\"Error creating repository: {e}\")\n", + " raise" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "db0e0c86-cb94-4a4d-aac2-627817b70458", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "======================================================================\n", + "DOCKER COMMANDS TO COPY IMAGE\n", + "======================================================================\n", + "\n", + "Run these commands in your terminal (not in Jupyter):\n", + "\n", + "# 1. Get ECR login token\n", + "aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 875423407011.dkr.ecr.us-west-2.amazonaws.com\n", + "\n", + "# 2. Pull the public image\n", + "docker pull public.ecr.aws/deep-learning-containers/vllm:0.11.2-gpu-py312-cu129-ubuntu22.04-sagemaker-v1.2\n", + "\n", + "# 3. Tag the image for your private ECR\n", + "docker tag public.ecr.aws/deep-learning-containers/vllm:0.11.2-gpu-py312-cu129-ubuntu22.04-sagemaker-v1.2 875423407011.dkr.ecr.us-west-2.amazonaws.com/vllm:0.11.2-sagemaker-v1.2\n", + "\n", + "# 4. Push to your private ECR\n", + "docker push 875423407011.dkr.ecr.us-west-2.amazonaws.com/vllm:0.11.2-sagemaker-v1.2\n", + "\n", + "======================================================================\n", + "\n", + "After running these commands, update your Python code to use:\n", + "container_image = '875423407011.dkr.ecr.us-west-2.amazonaws.com/vllm:0.11.2-sagemaker-v1.2'\n", + "======================================================================\n" + ] + } + ], + "source": [ + "# =============================================================================\n", + "# SECTION 3: Copy Image Using Docker Commands\n", + "# =============================================================================\n", + "\n", + "print(\"\\n\" + \"=\"*70)\n", + "print(\"DOCKER COMMANDS TO COPY IMAGE\")\n", + "print(\"=\"*70)\n", + "print(\"\\nRun these commands in your terminal (not in Jupyter):\\n\")\n", + "\n", + "print(\"# 1. Get ECR login token\")\n", + "print(f\"aws ecr get-login-password --region {region} | docker login --username AWS --password-stdin {account_id}.dkr.ecr.{region}.amazonaws.com\")\n", + "\n", + "print(\"\\n# 2. Pull the public image\")\n", + "print(f\"docker pull {source_image}\")\n", + "\n", + "print(\"\\n# 3. Tag the image for your private ECR\")\n", + "print(f\"docker tag {source_image} {target_image}\")\n", + "\n", + "print(\"\\n# 4. Push to your private ECR\")\n", + "print(f\"docker push {target_image}\")\n", + "\n", + "print(\"\\n\" + \"=\"*70)\n", + "print(\"\\nAfter running these commands, update your Python code to use:\")\n", + "print(f\"container_image = '{target_image}'\")\n", + "print(\"=\"*70)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "6a973a4a-7fc3-4b94-bf2d-3a787beed188", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING! Your password will be stored unencrypted in /home/ec2-user/.docker/config.json.\n", + "Configure a credential helper to remove this warning. See\n", + "https://docs.docker.com/engine/reference/commandline/login/#credentials-store\n", + "\n", + "Login Succeeded\n" + ] + } + ], + "source": [ + "!aws ecr get-login-password --region {region} | docker login --username AWS --password-stdin {account_id}.dkr.ecr.{region}.amazonaws.com" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "d448eb00-8ed2-459b-966b-88e171e244a6", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.11.2-gpu-py312-cu129-ubuntu22.04-sagemaker-v1.2: Pulling from deep-learning-containers/vllm\n", + "\n", + "\u001b[1B7c81b81a: Pulling fs layer \n", + "\u001b[1B1d4013a9: Pulling fs layer \n", + "\u001b[1B44d2921c: Pulling fs layer \n", + "\u001b[1Bbcbddda3: Pulling fs layer \n", + "\u001b[1Bf4fd0a07: Pulling fs layer \n", + "\u001b[1Bfd421fac: Pulling fs layer \n", + "\u001b[1B56dea272: Pulling fs layer \n", + "\u001b[1B19e81d20: Pulling fs layer \n", + "\u001b[1Bf2253cd0: Pulling fs layer \n", + "\u001b[1B79b2359a: Pulling fs layer \n", + "\u001b[1B10f4bfa0: Pulling fs layer \n", + "\u001b[1Bf84485b3: Pulling fs layer \n", + "\u001b[1B9bff06dd: Pulling fs layer \n", + "\u001b[1B82d56f38: Pulling fs layer \n", + "\u001b[1Be34c04f6: Pulling fs layer \n", + "\u001b[1Bc2a92587: Pulling fs layer \n", + "\u001b[1B63af10e1: Pulling fs layer \n", + "\u001b[1Be7a6b91d: Pulling fs layer \n", + "\u001b[1Be5fc94f4: Pulling fs layer \n", + "\u001b[1B4c99812a: Pulling fs layer \n", + "\u001b[1Bb97da028: Pulling fs layer \n", + "\u001b[1Bc54de256: Pulling fs layer \n", + "\u001b[1B647d6b16: Pulling fs layer \n", + "\u001b[1B4201d602: Pulling fs layer \n", + "\u001b[1B298be83f: Pulling fs layer \n", + "\u001b[1Ba7ff3083: Pulling fs layer \n", + "\u001b[1Bcb1e1a39: Pulling fs layer \n", + "\u001b[1B6e714056: Pulling fs layer \n", + "\u001b[1B6e9ab7e0: Pulling fs layer \n", + "\u001b[1B117692f9: Pulling fs layer \n", + "\u001b[1B2560f0b0: Pulling fs layer \n", + "\u001b[1Bce5849a2: Pulling fs layer \n", + "\u001b[1B7d5e212e: Pulling fs layer \n", + "\u001b[1B09c6b78c: Pulling fs layer \n", + "\u001b[1B6fc8d557: Pulling fs layer \n", + "\u001b[1B679bbdd3: Pulling fs layer \n", + "\u001b[1B1d32da3e: Pulling fs layer \n", + "\u001b[1B3e7e4812: Pulling fs layer \n", + "\u001b[1B511586d1: Pulling fs layer \n", + "\u001b[1Bc0717ae6: Pulling fs layer \n", + "\u001b[1B0ac89180: Pull complete 558B/558B7MBB\u001b[41A\u001b[2K\u001b[39A\u001b[2K\u001b[41A\u001b[2K\u001b[38A\u001b[2K\u001b[37A\u001b[2K\u001b[39A\u001b[2K\u001b[35A\u001b[2K\u001b[39A\u001b[2K\u001b[34A\u001b[2K\u001b[33A\u001b[2K\u001b[32A\u001b[2K\u001b[31A\u001b[2K\u001b[32A\u001b[2K\u001b[36A\u001b[2K\u001b[32A\u001b[2K\u001b[41A\u001b[2K\u001b[29A\u001b[2K\u001b[36A\u001b[2K\u001b[32A\u001b[2K\u001b[40A\u001b[2K\u001b[39A\u001b[2K\u001b[28A\u001b[2K\u001b[39A\u001b[2K\u001b[28A\u001b[2K\u001b[39A\u001b[2K\u001b[28A\u001b[2K\u001b[39A\u001b[2K\u001b[36A\u001b[2K\u001b[39A\u001b[2K\u001b[36A\u001b[2K\u001b[39A\u001b[2K\u001b[28A\u001b[2K\u001b[39A\u001b[2K\u001b[36A\u001b[2K\u001b[39A\u001b[2K\u001b[36A\u001b[2K\u001b[39A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[39A\u001b[2K\u001b[28A\u001b[2K\u001b[39A\u001b[2K\u001b[28A\u001b[2K\u001b[32A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[39A\u001b[2K\u001b[38A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[28A\u001b[2K\u001b[36A\u001b[2K\u001b[27A\u001b[2K\u001b[27A\u001b[2K\u001b[27A\u001b[2K\u001b[36A\u001b[2K\u001b[26A\u001b[2K\u001b[36A\u001b[2K\u001b[25A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[32A\u001b[2K\u001b[36A\u001b[2K\u001b[32A\u001b[2K\u001b[36A\u001b[2K\u001b[32A\u001b[2K\u001b[36A\u001b[2K\u001b[32A\u001b[2K\u001b[36A\u001b[2K\u001b[32A\u001b[2K\u001b[36A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[32A\u001b[2K\u001b[23A\u001b[2K\u001b[36A\u001b[2K\u001b[23A\u001b[2K\u001b[36A\u001b[2K\u001b[22A\u001b[2K\u001b[36A\u001b[2K\u001b[23A\u001b[2K\u001b[36A\u001b[2K\u001b[23A\u001b[2K\u001b[36A\u001b[2K\u001b[23A\u001b[2K\u001b[36A\u001b[2K\u001b[23A\u001b[2K\u001b[36A\u001b[2K\u001b[23A\u001b[2K\u001b[36A\u001b[2K\u001b[23A\u001b[2K\u001b[36A\u001b[2K\u001b[23A\u001b[2K\u001b[36A\u001b[2K\u001b[23A\u001b[2K\u001b[36A\u001b[2K\u001b[17A\u001b[2K\u001b[36A\u001b[2K\u001b[17A\u001b[2K\u001b[24A\u001b[2K\u001b[17A\u001b[2K\u001b[24A\u001b[2K\u001b[17A\u001b[2K\u001b[24A\u001b[2K\u001b[23A\u001b[2K\u001b[24A\u001b[2K\u001b[23A\u001b[2K\u001b[24A\u001b[2K\u001b[23A\u001b[2K\u001b[15A\u001b[2K\u001b[15A\u001b[2K\u001b[24A\u001b[2K\u001b[23A\u001b[2K\u001b[24A\u001b[2K\u001b[23A\u001b[2K\u001b[24A\u001b[2K\u001b[23A\u001b[2K\u001b[24A\u001b[2K\u001b[12A\u001b[2K\u001b[24A\u001b[2K\u001b[23A\u001b[2K\u001b[24A\u001b[2K\u001b[10A\u001b[2K\u001b[11A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[11A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[6A\u001b[2K\u001b[5A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[4A\u001b[2K\u001b[24A\u001b[2K\u001b[4A\u001b[2K\u001b[24A\u001b[2K\u001b[4A\u001b[2K\u001b[24A\u001b[2K\u001b[3A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[3A\u001b[2K\u001b[24A\u001b[2K\u001b[3A\u001b[2K\u001b[24A\u001b[2K\u001b[3A\u001b[2K\u001b[24A\u001b[2K\u001b[3A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[11A\u001b[2K\u001b[36A\u001b[2K\u001b[11A\u001b[2K\u001b[36A\u001b[2K\u001b[11A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[36A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[11A\u001b[2K\u001b[36A\u001b[2K\u001b[11A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[11A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[11A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[11A\u001b[2K\u001b[36A\u001b[2K\u001b[11A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[11A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[36A\u001b[2K\u001b[24A\u001b[2K\u001b[33A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[32A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[11A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2KExtracting 1.77GB/3.226GB\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[32A\u001b[2K\u001b[31A\u001b[2K\u001b[30A\u001b[2K\u001b[29A\u001b[2K\u001b[29A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[28A\u001b[2K\u001b[27A\u001b[2K\u001b[27A\u001b[2K\u001b[27A\u001b[2K\u001b[27A\u001b[2K\u001b[27A\u001b[2K\u001b[27A\u001b[2K\u001b[26A\u001b[2K\u001b[26A\u001b[2K\u001b[25A\u001b[2K\u001b[25A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2KExtracting 181.6MB/5.637GB\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2KExtracting 4.917GB/5.637GB\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[24A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[23A\u001b[2K\u001b[22A\u001b[2K\u001b[22A\u001b[2K\u001b[22A\u001b[2K\u001b[21A\u001b[2K\u001b[21A\u001b[2K\u001b[21A\u001b[2K\u001b[21A\u001b[2K\u001b[20A\u001b[2K\u001b[20A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[17A\u001b[2K\u001b[17A\u001b[2K\u001b[17A\u001b[2K\u001b[17A\u001b[2K\u001b[17A\u001b[2K\u001b[17A\u001b[2K\u001b[17A\u001b[2K\u001b[17A\u001b[2K\u001b[16A\u001b[2K\u001b[16A\u001b[2K\u001b[15A\u001b[2K\u001b[15A\u001b[2K\u001b[15A\u001b[2K\u001b[15A\u001b[2K\u001b[15A\u001b[2KExtracting 8.63MB/8.63MB\u001b[15A\u001b[2K\u001b[14A\u001b[2K\u001b[14A\u001b[2K\u001b[13A\u001b[2K\u001b[13A\u001b[2K\u001b[13A\u001b[2K\u001b[12A\u001b[2K\u001b[12A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[11A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[9A\u001b[2K\u001b[8A\u001b[2K\u001b[8A\u001b[2K\u001b[7A\u001b[2K\u001b[7A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[5A\u001b[2K\u001b[5A\u001b[2K\u001b[5A\u001b[2K\u001b[5A\u001b[2K\u001b[4A\u001b[2K\u001b[4A\u001b[2K\u001b[4A\u001b[2K\u001b[4A\u001b[2K\u001b[4A\u001b[2K\u001b[4A\u001b[2K\u001b[4A\u001b[2K\u001b[4A\u001b[2K\u001b[4A\u001b[2K\u001b[4A\u001b[2K\u001b[4A\u001b[2K\u001b[4A\u001b[2K\u001b[4A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[3A\u001b[2K\u001b[2A\u001b[2K\u001b[2A\u001b[2K\u001b[1A\u001b[2K\u001b[1A\u001b[2KDigest: sha256:225ade8b3fad010ccd63c51eff348876203e42ead4fccfbf3073536c39f0511d\n", + "Status: Downloaded newer image for public.ecr.aws/deep-learning-containers/vllm:0.11.2-gpu-py312-cu129-ubuntu22.04-sagemaker-v1.2\n", + "public.ecr.aws/deep-learning-containers/vllm:0.11.2-gpu-py312-cu129-ubuntu22.04-sagemaker-v1.2\n" + ] + } + ], + "source": [ + "!docker pull {source_image}" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "43bd78df-3b60-4922-88ac-df4bd28d8f4a", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The push refers to repository [875423407011.dkr.ecr.us-west-2.amazonaws.com/vllm]\n", + "\n", + "\u001b[1B1ca4b8f8: Preparing \n", + "\u001b[1Bb5e08e59: Preparing \n", + "\u001b[1Bc50b3475: Preparing \n", + "\u001b[1Ba8d0980c: Preparing \n", + "\u001b[1Bf8108fc5: Preparing \n", + "\u001b[1B479f11e9: Preparing \n", + "\u001b[1B336d4a30: Preparing \n", + "\u001b[1Bd64eece1: Preparing \n", + "\u001b[1Be13b6bf0: Preparing \n", + "\u001b[1B6f021e3d: Preparing \n", + "\u001b[1B387e0af4: Preparing \n", + "\u001b[1B5f37a2d6: Preparing \n", + "\u001b[1Bb1e18656: Preparing \n", + "\u001b[9B479f11e9: Waiting g \n", + "\u001b[8Bd64eece1: Waiting g \n", + "\u001b[1B8309da02: Preparing \n", + "\u001b[9Be13b6bf0: Waiting g \n", + "\u001b[1Bed2feb83: Preparing \n", + "\u001b[8B5f37a2d6: Waiting g \n", + "\u001b[11Bf021e3d: Waiting g \n", + "\u001b[9Bb1e18656: Waiting g \n", + "\u001b[8B3ce083eb: Waiting g \n", + "\u001b[8B8309da02: Waiting g \n", + "\u001b[6B165f0350: Waiting g \n", + "\u001b[4B46c1b0b5: Waiting g \n", + "\u001b[6Beb0b0e04: Waiting g \n", + "\u001b[4B5c8b355d: Waiting g \n", + "\u001b[3Bd3c0dfb9: Waiting g \n", + "\u001b[1B2a083b45: Preparing \n", + "\u001b[2B2a083b45: Waiting g \n", + "\u001b[2B210f8ac0: Waiting g \n", + "\u001b[1Bbdeeea2f: Preparing \n", + "\u001b[1Bcc501b40: Preparing \n", + "\u001b[4B56be1356: Waiting g \n", + "\u001b[1B30fa613a: Preparing \n", + "\u001b[1B07956969: Preparing \n", + "\u001b[3B30fa613a: Waiting g \n", + "\u001b[7Bbdeeea2f: Waiting g \n", + "\u001b[4B07956969: Waiting g \n", + "\u001b[1B94e75ffe: Preparing \n", + "\u001b[18Bc8b355d: Pushed 10.68GB/10.65GB\u001b[38A\u001b[2K\u001b[37A\u001b[2K\u001b[38A\u001b[2K\u001b[37A\u001b[2K\u001b[37A\u001b[2K\u001b[37A\u001b[2K\u001b[40A\u001b[2K\u001b[39A\u001b[2K\u001b[39A\u001b[2K\u001b[38A\u001b[2K\u001b[39A\u001b[2K\u001b[36A\u001b[2K\u001b[39A\u001b[2K\u001b[39A\u001b[2K\u001b[39A\u001b[2K\u001b[35A\u001b[2K\u001b[39A\u001b[2K\u001b[36A\u001b[2K\u001b[39A\u001b[2K\u001b[39A\u001b[2K\u001b[38A\u001b[2K\u001b[39A\u001b[2K\u001b[35A\u001b[2K\u001b[34A\u001b[2K\u001b[38A\u001b[2K\u001b[39A\u001b[2K\u001b[38A\u001b[2K\u001b[38A\u001b[2K\u001b[39A\u001b[2K\u001b[34A\u001b[2K\u001b[38A\u001b[2K\u001b[33A\u001b[2K\u001b[38A\u001b[2K\u001b[32A\u001b[2K\u001b[33A\u001b[2K\u001b[33A\u001b[2K\u001b[38A\u001b[2K\u001b[33A\u001b[2KPushing 59.67MB/348.3MB\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[32A\u001b[2K\u001b[33A\u001b[2K\u001b[33A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[38A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[38A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[39A\u001b[2K\u001b[31A\u001b[2K\u001b[39A\u001b[2K\u001b[38A\u001b[2K\u001b[33A\u001b[2K\u001b[38A\u001b[2K\u001b[31A\u001b[2K\u001b[38A\u001b[2K\u001b[31A\u001b[2K\u001b[38A\u001b[2K\u001b[38A\u001b[2KPushing 66.74MB/589.2MB\u001b[38A\u001b[2K\u001b[33A\u001b[2K\u001b[38A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[31A\u001b[2K\u001b[39A\u001b[2K\u001b[38A\u001b[2K\u001b[39A\u001b[2K\u001b[38A\u001b[2K\u001b[33A\u001b[2K\u001b[38A\u001b[2K\u001b[33A\u001b[2K\u001b[38A\u001b[2K\u001b[31A\u001b[2K\u001b[38A\u001b[2K\u001b[31A\u001b[2K\u001b[38A\u001b[2K\u001b[39A\u001b[2K\u001b[38A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[38A\u001b[2K\u001b[31A\u001b[2K\u001b[38A\u001b[2K\u001b[33A\u001b[2K\u001b[38A\u001b[2K\u001b[39A\u001b[2K\u001b[38A\u001b[2K\u001b[31A\u001b[2K\u001b[38A\u001b[2K\u001b[31A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[38A\u001b[2K\u001b[38A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[38A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[30A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[31A\u001b[2K\u001b[31A\u001b[2K\u001b[30A\u001b[2K\u001b[31A\u001b[2K\u001b[31A\u001b[2K\u001b[31A\u001b[2K\u001b[31A\u001b[2K\u001b[39A\u001b[2K\u001b[29A\u001b[2K\u001b[39A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[29A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[31A\u001b[2K\u001b[39A\u001b[2K\u001b[31A\u001b[2K\u001b[28A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[28A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[31A\u001b[2K\u001b[39A\u001b[2K\u001b[31A\u001b[2K\u001b[27A\u001b[2K\u001b[27A\u001b[2K\u001b[33A\u001b[2K\u001b[27A\u001b[2K\u001b[33A\u001b[2K\u001b[27A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[27A\u001b[2K\u001b[39A\u001b[2K\u001b[27A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2KPushing 206.9MB/987.2MB\u001b[39A\u001b[2K\u001b[27A\u001b[2K\u001b[39A\u001b[2K\u001b[31A\u001b[2K\u001b[39A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[27A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[39A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[39A\u001b[2K\u001b[31A\u001b[2K\u001b[39A\u001b[2K\u001b[31A\u001b[2K\u001b[39A\u001b[2K\u001b[31A\u001b[2K\u001b[39A\u001b[2K\u001b[31A\u001b[2K\u001b[39A\u001b[2K\u001b[31A\u001b[2K\u001b[25A\u001b[2KPushing 291MB/589.2MB\u001b[39A\u001b[2K\u001b[39A\u001b[2K\u001b[39A\u001b[2K\u001b[25A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[25A\u001b[2K\u001b[25A\u001b[2K\u001b[39A\u001b[2K\u001b[25A\u001b[2K\u001b[31A\u001b[2K\u001b[25A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[25A\u001b[2K\u001b[33A\u001b[2K\u001b[25A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[25A\u001b[2K\u001b[39A\u001b[2K\u001b[31A\u001b[2K\u001b[39A\u001b[2K\u001b[31A\u001b[2K\u001b[25A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[25A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[39A\u001b[2K\u001b[33A\u001b[2K\u001b[39A\u001b[2K\u001b[25A\u001b[2K\u001b[31A\u001b[2K\u001b[25A\u001b[2K\u001b[31A\u001b[2K\u001b[25A\u001b[2K\u001b[25A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[25A\u001b[2K\u001b[31A\u001b[2K\u001b[25A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[25A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[25A\u001b[2K\u001b[33A\u001b[2K\u001b[25A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[25A\u001b[2K\u001b[31A\u001b[2K\u001b[23A\u001b[2K\u001b[33A\u001b[2K\u001b[22A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[23A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[22A\u001b[2K\u001b[21A\u001b[2K\u001b[31A\u001b[2K\u001b[31A\u001b[2K\u001b[20A\u001b[2K\u001b[20A\u001b[2K\u001b[33A\u001b[2K\u001b[21A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[31A\u001b[2K\u001b[20A\u001b[2K\u001b[19A\u001b[2K\u001b[33A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[33A\u001b[2K\u001b[18A\u001b[2K\u001b[33A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[33A\u001b[2K\u001b[19A\u001b[2K\u001b[33A\u001b[2K\u001b[19A\u001b[2K\u001b[33A\u001b[2K\u001b[19A\u001b[2K\u001b[33A\u001b[2K\u001b[19A\u001b[2K\u001b[33A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[19A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[33A\u001b[2K\u001b[18A\u001b[2K\u001b[33A\u001b[2K\u001b[18A\u001b[2K\u001b[33A\u001b[2K\u001b[19A\u001b[2K\u001b[33A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[33A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[19A\u001b[2K\u001b[33A\u001b[2K\u001b[18A\u001b[2K\u001b[33A\u001b[2K\u001b[18A\u001b[2K\u001b[33A\u001b[2K\u001b[18A\u001b[2K\u001b[33A\u001b[2K\u001b[18A\u001b[2K\u001b[33A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[33A\u001b[2K\u001b[19A\u001b[2K\u001b[33A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[33A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[17A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[15A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[31A\u001b[2K\u001b[15A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[15A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[15A\u001b[2K\u001b[19A\u001b[2K\u001b[15A\u001b[2K\u001b[18A\u001b[2K\u001b[15A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[15A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[15A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[15A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[31A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[31A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[14A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[31A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[13A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[13A\u001b[2K\u001b[14A\u001b[2K\u001b[14A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[11A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[11A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[9A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[8A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2KPushing 538.4MB/844.2MB\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[14A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[14A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2KPushing 635MB/844.2MB\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[14A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[14A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[14A\u001b[2K\u001b[6A\u001b[2K\u001b[14A\u001b[2K\u001b[6A\u001b[2K\u001b[14A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[6A\u001b[2K\u001b[14A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[14A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[14A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[5A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[4A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[3A\u001b[2K\u001b[18A\u001b[2K\u001b[3A\u001b[2K\u001b[18A\u001b[2K\u001b[3A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[3A\u001b[2K\u001b[19A\u001b[2K\u001b[3A\u001b[2K\u001b[19A\u001b[2K\u001b[3A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[3A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[3A\u001b[2K\u001b[10A\u001b[2K\u001b[3A\u001b[2K\u001b[6A\u001b[2K\u001b[3A\u001b[2K\u001b[19A\u001b[2K\u001b[3A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[3A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[3A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[3A\u001b[2K\u001b[18A\u001b[2K\u001b[3A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[3A\u001b[2K\u001b[10A\u001b[2K\u001b[3A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[3A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[3A\u001b[2K\u001b[6A\u001b[2K\u001b[3A\u001b[2K\u001b[6A\u001b[2K\u001b[3A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[3A\u001b[2K\u001b[6A\u001b[2K\u001b[3A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[3A\u001b[2K\u001b[6A\u001b[2K\u001b[3A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[3A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[3A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[3A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[3A\u001b[2K\u001b[18A\u001b[2K\u001b[3A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2KPushing 1.27GB/5.367GB\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[3A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[3A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[3A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[3A\u001b[2K\u001b[6A\u001b[2K\u001b[3A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[3A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[3A\u001b[2KPushing 606MB/3.455GB\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[3A\u001b[2K\u001b[18A\u001b[2K\u001b[3A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[3A\u001b[2K\u001b[6A\u001b[2K\u001b[3A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[3A\u001b[2K\u001b[18A\u001b[2K\u001b[3A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2KPushing 279MB/315.6MB\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[3A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[3A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[3A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[3A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[2A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[2A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[1A\u001b[2K\u001b[6A\u001b[2K\u001b[1A\u001b[2K\u001b[6A\u001b[2K\u001b[1A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[1A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[1A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[1A\u001b[2K\u001b[19A\u001b[2K\u001b[1A\u001b[2K\u001b[19A\u001b[2K\u001b[1A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[1A\u001b[2K\u001b[6A\u001b[2K\u001b[1A\u001b[2K\u001b[19A\u001b[2K\u001b[1A\u001b[2K\u001b[19A\u001b[2K\u001b[1A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[1A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[1A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2KPushing 849.5MB/3.455GB\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2KPushing 1.525GB/5.367GB\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2KPushing 1.039GB/3.455GB\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2KPushing 1.322GB/3.455GB\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2KPushing 1.43GB/6.318GB\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2KPushing 2.274GB/10.65GB\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2KPushing 1.503GB/6.318GB\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2KPushing 1.59GB/3.455GB\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2KPushing 1.756GB/3.455GB\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2KPushing 2.097GB/5.367GB\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2KPushing 2.14GB/5.367GB\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2KPushing 2.684GB/10.65GB\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2KPushing 2.16GB/5.367GB\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2KPushing 2.978GB/10.65GB\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2KPushing 3.379GB/10.65GB\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2KPushing 2.763GB/5.367GB\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2KPushing 3.567GB/10.65GB\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2KPushing 2.822GB/5.367GB\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2KPushing 2.887GB/6.318GB\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[6A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[6A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2KPushing 5.424GB/10.65GB\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2KPushing 4.889GB/5.367GB\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2KPushing 4.921GB/5.367GB\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2KPushing 5.528GB/6.318GB\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2KPushing 6.185GB/10.65GB\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2KPushing 5.181GB/5.367GB\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2KPushing 6.468GB/10.65GB\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2KPushing 6.503GB/10.65GB\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[19A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[19A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[10A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2KPushing 7.283GB/10.65GB\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2KPushing 7.403GB/10.65GB\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2KPushing 7.68GB/10.65GB\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2KPushing 8.231GB/10.65GB\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2KPushing 8.269GB/10.65GB\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2KPushing 9.114GB/10.65GB\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2KPushing 9.287GB/10.65GB\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K\u001b[18A\u001b[2K0.11.2-sagemaker-v1.2: digest: sha256:225ade8b3fad010ccd63c51eff348876203e42ead4fccfbf3073536c39f0511d size: 8918\n" + ] + } + ], + "source": [ + "!docker tag {source_image} {target_image}\n", + "!docker push {target_image}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d6e452b2-638b-457c-899d-7fd918da9a6a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "conda_pytorch_p310", + "language": "python", + "name": "conda_pytorch_p310" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.19" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/vllm/notebooks/handler_customization_methods.ipynb b/examples/vllm/notebooks/handler_customization_methods.ipynb new file mode 100644 index 0000000..246bc26 --- /dev/null +++ b/examples/vllm/notebooks/handler_customization_methods.ipynb @@ -0,0 +1,722 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "intro", + "metadata": {}, + "source": [ + "# Handler Customization Methods - Complete Guide\n", + "\n", + "This notebook demonstrates **all three methods** for customizing `/ping` and `/invocations` handlers in vLLM on SageMaker.\n", + "\n", + "## Three Methods Overview\n", + "\n", + "### Method 1: Environment Variables (Highest Priority)\n", + "- **File**: `handlers_env_var.py`\n", + "- **How**: Point to handler functions via environment variables\n", + "- **Env Vars**: `CUSTOM_FASTAPI_PING_HANDLER`, `CUSTOM_FASTAPI_INVOCATION_HANDLER`\n", + "- **Use When**: You need explicit control and want to override all other methods\n", + "\n", + "### Method 2: Decorators\n", + "- **File**: `handlers_decorator.py`\n", + "- **How**: Use `@custom_ping_handler` and `@custom_invocation_handler` decorators\n", + "- **Env Vars**: Only `CUSTOM_SCRIPT_FILENAME` needed\n", + "- **Use When**: You want clean, explicit handler registration (recommended)\n", + "\n", + "### Method 3: Function Discovery (Lowest Priority)\n", + "- **File**: `handlers_discovery.py`\n", + "- **How**: Name functions `custom_sagemaker_ping_handler`, `custom_sagemaker_invocation_handler`\n", + "- **Env Vars**: Only `CUSTOM_SCRIPT_FILENAME` needed\n", + "- **Use When**: You want the simplest approach with convention over configuration\n", + "\n", + "## Handler Resolution Priority\n", + "```\n", + "1. Environment Variables (Method 1) ← Highest priority\n", + "2. Decorator Registration (Method 2)\n", + "3. Function Discovery (Method 3)\n", + "4. Framework Defaults ← Lowest priority\n", + "```\n", + "\n", + "## Choose Your Method\n", + "Set the `METHOD` variable below to test different approaches:\n", + "- `\"env_var\"` - Environment Variables\n", + "- `\"decorator\"` - Decorators (recommended)\n", + "- `\"discovery\"` - Function Discovery" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "config", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Selected method: discovery\n", + "\n", + "You can change this and re-run the notebook to test different methods!\n" + ] + } + ], + "source": [ + "# ============================================================\n", + "# CONFIGURATION: Choose your handler customization method\n", + "# ============================================================\n", + "\n", + "METHOD = \"discovery\" # Options: \"env-var\", \"decorator\", \"discovery\"\n", + "\n", + "print(f\"Selected method: {METHOD}\")\n", + "print(\"\\nYou can change this and re-run the notebook to test different methods!\")" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "imports", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import boto3\n", + "import json\n", + "import time\n", + "from datetime import datetime\n", + "from pathlib import Path" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "clients", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "session = boto3.Session()\n", + "region = session.region_name\n", + "sagemaker_client = boto3.client('sagemaker', region_name=region)\n", + "runtime_client = boto3.client('sagemaker-runtime', region_name=region)\n", + "s3_client = boto3.client('s3', region_name=region)\n", + "sts_client = boto3.client('sts', region_name=region)" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "id": "names", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "timestamp = datetime.now().strftime('%Y%m%d-%H%M%S')\n", + "model_name = f'vllm-{METHOD}-{timestamp}'\n", + "endpoint_config_name = f'vllm-{METHOD}-config-{timestamp}'\n", + "endpoint_name = f'vllm-{METHOD}-endpoint-{timestamp}'\n", + "account_id = sts_client.get_caller_identity()['Account']" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "params", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Configuration:\n", + " Method: discovery\n", + " Model Name: vllm-discovery-20251127-015140\n", + " Endpoint Name: vllm-discovery-endpoint-20251127-015140\n", + " HuggingFace Model: meta-llama/Meta-Llama-3-8B-Instruct\n", + " Instance Type: ml.g6.4xlarge\n", + " S3 Bucket: sheteng-demo\n" + ] + } + ], + "source": [ + "# ============================================================\n", + "# PARAMETERS - Update these for your environment\n", + "# ============================================================\n", + "\n", + "# Container image\n", + "# Make sure this exists!!!!!\n", + "container_image = f'{account_id}.dkr.ecr.{region}.amazonaws.com/vllm:0.11.2-sagemaker-v1.2'\n", + "\n", + "# HuggingFace model\n", + "huggingface_model_id = 'meta-llama/Meta-Llama-3-8B-Instruct'\n", + "huggingface_token = 'hf_your_token_here' # Replace with your token\n", + "\n", + "# Instance configuration\n", + "instance_type = 'ml.g6.4xlarge'\n", + "execution_role = f'arn:aws:iam::{account_id}:role/SageMakerExecutionRole'\n", + "\n", + "# S3 configuration\n", + "s3_bucket = 'sheteng-demo' # Replace with your bucket\n", + "s3_key_prefix = f'vllm-handlers/{METHOD}/{timestamp}'\n", + "\n", + "print(\"Configuration:\")\n", + "print(f\" Method: {METHOD}\")\n", + "print(f\" Model Name: {model_name}\")\n", + "print(f\" Endpoint Name: {endpoint_name}\")\n", + "print(f\" HuggingFace Model: {huggingface_model_id}\")\n", + "print(f\" Instance Type: {instance_type}\")\n", + "print(f\" S3 Bucket: {s3_bucket}\")" + ] + }, + { + "cell_type": "markdown", + "id": "method-config", + "metadata": {}, + "source": [ + "## Method-Specific Configuration\n", + "\n", + "Based on your selected method, we'll configure the appropriate handler file and environment variables." + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "method-setup", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "āœ“ Method 3: Function Discovery\n", + " Handler file: handlers_discovery.py\n", + " Handlers discovered by function names:\n", + " - custom_sagemaker_ping_handler\n", + " - custom_sagemaker_invocation_handler\n", + "\n", + "šŸ“„ Handler file location: ../model_artifacts_examples/handlers_discovery.py\n" + ] + } + ], + "source": [ + "# ============================================================\n", + "# Configure handler file and environment based on method\n", + "# ============================================================\n", + "\n", + "# Map method to handler file\n", + "handler_files = {\n", + " \"env-var\": \"handlers_env_var.py\",\n", + " \"decorator\": \"handlers_decorator.py\",\n", + " \"discovery\": \"handlers_discovery.py\"\n", + "}\n", + "\n", + "handler_filename = handler_files[METHOD]\n", + "handler_filepath = Path(\"../model_artifacts_examples\") / handler_filename\n", + "\n", + "# Base environment variables (common to all methods)\n", + "environment = {\n", + " \"SM_VLLM_MODEL\": huggingface_model_id,\n", + " \"HUGGING_FACE_HUB_TOKEN\": huggingface_token,\n", + " \"SM_VLLM_MAX_MODEL_LEN\": \"2048\",\n", + " \"CUSTOM_SCRIPT_FILENAME\": handler_filename,\n", + " \"SAGEMAKER_CONTAINER_LOG_LEVEL\": \"DEBUG\",\n", + "}\n", + "\n", + "# Method-specific environment variables\n", + "if METHOD == \"env-var\":\n", + " # Method 1: Explicitly point to handler functions\n", + " environment[\"CUSTOM_FASTAPI_PING_HANDLER\"] = f\"{handler_filename}:health_check\"\n", + " environment[\"CUSTOM_FASTAPI_INVOCATION_HANDLER\"] = f\"{handler_filename}:inference\"\n", + " print(f\"āœ“ Method 1: Environment Variables\")\n", + " print(f\" Handler file: {handler_filename}\")\n", + " print(f\" Ping handler: {environment['CUSTOM_FASTAPI_PING_HANDLER']}\")\n", + " print(f\" Invocation handler: {environment['CUSTOM_FASTAPI_INVOCATION_HANDLER']}\")\n", + "\n", + "elif METHOD == \"decorator\":\n", + " # Method 2: Decorators handle registration automatically\n", + " print(f\"āœ“ Method 2: Decorators\")\n", + " print(f\" Handler file: {handler_filename}\")\n", + " print(f\" Handlers registered via @custom_ping_handler and @custom_invocation_handler\")\n", + "\n", + "elif METHOD == \"discovery\":\n", + " # Method 3: Function names follow convention\n", + " print(f\"āœ“ Method 3: Function Discovery\")\n", + " print(f\" Handler file: {handler_filename}\")\n", + " print(f\" Handlers discovered by function names:\")\n", + " print(f\" - custom_sagemaker_ping_handler\")\n", + " print(f\" - custom_sagemaker_invocation_handler\")\n", + "\n", + "print(f\"\\nšŸ“„ Handler file location: {handler_filepath}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "upload-s3", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ā˜ļø Uploading handlers_discovery.py to S3...\n", + "āœ“ Uploaded to: s3://sheteng-demo/vllm-handlers/discovery/20251127-015140/handlers_discovery.py\n", + " Model data S3 prefix: s3://sheteng-demo/vllm-handlers/discovery/20251127-015140/\n" + ] + } + ], + "source": [ + "# ============================================================\n", + "# Upload handler file to S3\n", + "# ============================================================\n", + "\n", + "print(f\"\\nā˜ļø Uploading {handler_filename} to S3...\")\n", + "\n", + "s3_key = f\"{s3_key_prefix}/{handler_filename}\"\n", + "s3_client.upload_file(str(handler_filepath), s3_bucket, s3_key)\n", + "\n", + "model_data_s3_prefix = f\"s3://{s3_bucket}/{s3_key_prefix}/\"\n", + "\n", + "print(f\"āœ“ Uploaded to: s3://{s3_bucket}/{s3_key}\")\n", + "print(f\" Model data S3 prefix: {model_data_s3_prefix}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "create-model", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "šŸ”§ Creating SageMaker model: vllm-discovery-20251127-015140\n", + "āœ“ Model created\n", + " Model ARN: arn:aws:sagemaker:us-west-2:875423407011:model/vllm-discovery-20251127-015140\n", + " Method: discovery\n" + ] + } + ], + "source": [ + "# ============================================================\n", + "# Create SageMaker Model\n", + "# ============================================================\n", + "\n", + "print(f\"\\nšŸ”§ Creating SageMaker model: {model_name}\")\n", + "\n", + "create_model_response = sagemaker_client.create_model(\n", + " ModelName=model_name,\n", + " ExecutionRoleArn=execution_role,\n", + " PrimaryContainer={\n", + " \"Image\": container_image,\n", + " \"ModelDataSource\": {\n", + " \"S3DataSource\": {\n", + " \"S3Uri\": model_data_s3_prefix,\n", + " \"S3DataType\": \"S3Prefix\",\n", + " \"CompressionType\": \"None\",\n", + " }\n", + " },\n", + " \"Environment\": environment,\n", + " },\n", + ")\n", + "\n", + "print(f\"āœ“ Model created\")\n", + "print(f\" Model ARN: {create_model_response['ModelArn']}\")\n", + "print(f\" Method: {METHOD}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "create-endpoint-config", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "āš™ļø Creating endpoint configuration: vllm-discovery-config-20251127-015140\n", + "āœ“ Endpoint configuration created\n", + " Config ARN: arn:aws:sagemaker:us-west-2:875423407011:endpoint-config/vllm-discovery-config-20251127-015140\n" + ] + } + ], + "source": [ + "# ============================================================\n", + "# Create Endpoint Configuration\n", + "# ============================================================\n", + "\n", + "print(f\"\\nāš™ļø Creating endpoint configuration: {endpoint_config_name}\")\n", + "\n", + "create_endpoint_config_response = sagemaker_client.create_endpoint_config(\n", + " EndpointConfigName=endpoint_config_name,\n", + " ProductionVariants=[\n", + " {\n", + " \"VariantName\": \"AllTraffic\",\n", + " \"ModelName\": model_name,\n", + " \"InstanceType\": instance_type,\n", + " \"InitialInstanceCount\": 1,\n", + " \"InitialVariantWeight\": 1.0,\n", + " }\n", + " ],\n", + ")\n", + "\n", + "print(f\"āœ“ Endpoint configuration created\")\n", + "print(f\" Config ARN: {create_endpoint_config_response['EndpointConfigArn']}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "create-endpoint", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "šŸš€ Creating endpoint: vllm-discovery-endpoint-20251127-015140\n", + "ā±ļø This will take approximately 5-10 minutes...\n", + "\n", + "šŸ’” Monitor: https://console.aws.amazon.com/sagemaker/home?region=us-west-2#/endpoints/vllm-discovery-endpoint-20251127-015140\n", + "\n", + "āœ“ Endpoint creation initiated\n", + " Endpoint ARN: arn:aws:sagemaker:us-west-2:875423407011:endpoint/vllm-discovery-endpoint-20251127-015140\n" + ] + } + ], + "source": [ + "# ============================================================\n", + "# Create Endpoint\n", + "# ============================================================\n", + "\n", + "print(f\"\\nšŸš€ Creating endpoint: {endpoint_name}\")\n", + "print(\"ā±ļø This will take approximately 5-10 minutes...\")\n", + "print(f\"\\nšŸ’” Monitor: https://console.aws.amazon.com/sagemaker/home?region={region}#/endpoints/{endpoint_name}\\n\")\n", + "\n", + "create_endpoint_response = sagemaker_client.create_endpoint(\n", + " EndpointName=endpoint_name,\n", + " EndpointConfigName=endpoint_config_name\n", + ")\n", + "\n", + "print(f\"āœ“ Endpoint creation initiated\")\n", + "print(f\" Endpoint ARN: {create_endpoint_response['EndpointArn']}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "id": "wait-endpoint", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ā³ Waiting for endpoint to be in service...\n", + "(This may take 5-10 minutes)\n", + "\n", + "āœ“ Endpoint is in service!\n" + ] + } + ], + "source": [ + "# ============================================================\n", + "# Wait for Endpoint\n", + "# ============================================================\n", + "\n", + "print(\"\\nā³ Waiting for endpoint to be in service...\")\n", + "print(\"(This may take 5-10 minutes)\\n\")\n", + "\n", + "waiter = sagemaker_client.get_waiter(\"endpoint_in_service\")\n", + "waiter.wait(\n", + " EndpointName=endpoint_name,\n", + " WaiterConfig={\"Delay\": 20, \"MaxAttempts\": 60}\n", + ")\n", + "\n", + "print(\"āœ“ Endpoint is in service!\")" + ] + }, + { + "cell_type": "markdown", + "id": "testing", + "metadata": {}, + "source": [ + "## Testing the Custom Handlers\n", + "\n", + "Now let's test the custom handlers. The response will include a `method` field showing which customization method was used." + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "id": "test-basic", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "šŸ¤– Test 1: Basic Inference (Method: discovery)\n", + "Prompt: What is the capital of Amazon?\n", + "\n", + "āœ“ Response received:\n", + " Method: function_discovery\n", + " Model: vllm\n", + " Prediction: The answer is that Amazon doesn't have a traditional capital city. The company is headquartered in Seattle, Washington, USA, and has multiple offices...\n", + " Tokens: {'prompt_tokens': 8, 'completion_tokens': 100, 'total_tokens': 108}\n", + "\n", + "Full response:\n", + "{\n", + " \"predictions\": [\n", + " \" The answer is that Amazon doesn't have a traditional capital city. The company is headquartered in Seattle, Washington, USA, and has multiple offices and facilities around the world.\\n\\nHowever, Amazon has built several research and development centers, called \\\"Amazon Lab126,\\\" in various locations, including:\\n1. Palo Alto, California, USA\\n2. Cambridge, Massachusetts, USA\\n3. Sunnyvale, California, USA\\n4. Shenzhen, Guangdong, China\\n5. Bengaluru, Karnataka,\"\n", + " ],\n", + " \"model\": \"vllm\",\n", + " \"method\": \"function_discovery\",\n", + " \"usage\": {\n", + " \"prompt_tokens\": 8,\n", + " \"completion_tokens\": 100,\n", + " \"total_tokens\": 108\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "# ============================================================\n", + "# Test 1: Basic Inference\n", + "# ============================================================\n", + "\n", + "print(f\"\\nšŸ¤– Test 1: Basic Inference (Method: {METHOD})\")\n", + "\n", + "request_body = {\n", + " \"prompt\": \"What is the capital of Amazon?\",\n", + " \"max_tokens\": 100,\n", + " \"temperature\": 0.7,\n", + "}\n", + "\n", + "print(f\"Prompt: {request_body['prompt']}\")\n", + "\n", + "response = runtime_client.invoke_endpoint(\n", + " EndpointName=endpoint_name,\n", + " ContentType=\"application/json\",\n", + " Body=json.dumps(request_body),\n", + ")\n", + "\n", + "result = json.loads(response[\"Body\"].read().decode(\"utf-8\"))\n", + "\n", + "print(f\"\\nāœ“ Response received:\")\n", + "print(f\" Method: {result.get('method', 'N/A')}\")\n", + "print(f\" Model: {result.get('model', 'N/A')}\")\n", + "if \"predictions\" in result:\n", + " print(f\" Prediction: {result['predictions'][0][:150]}...\")\n", + "if \"usage\" in result:\n", + " print(f\" Tokens: {result['usage']}\")\n", + "\n", + "print(f\"\\nFull response:\")\n", + "print(json.dumps(result, indent=2))" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "id": "test-error", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "šŸ¤– Test 2: Error Handling (Method: discovery)\n", + "Sending request without 'prompt' field...\n", + "\n", + "āœ“ Error caught by client:\n", + " An error occurred (ModelError) when calling the InvokeEndpoint operation: Received client error (400) from primary with message \"{\"error\": \"Missing required field: prompt\"}\". See https://us-west-2.con\n" + ] + } + ], + "source": [ + "# ============================================================\n", + "# Test 2: Error Handling\n", + "# ============================================================\n", + "\n", + "print(f\"\\nšŸ¤– Test 2: Error Handling (Method: {METHOD})\")\n", + "\n", + "request_body_invalid = {\n", + " \"max_tokens\": 50,\n", + " # Missing \"prompt\" field\n", + "}\n", + "\n", + "print(\"Sending request without 'prompt' field...\")\n", + "\n", + "try:\n", + " response = runtime_client.invoke_endpoint(\n", + " EndpointName=endpoint_name,\n", + " ContentType=\"application/json\",\n", + " Body=json.dumps(request_body_invalid),\n", + " )\n", + " \n", + " result = json.loads(response[\"Body\"].read().decode(\"utf-8\"))\n", + " \n", + " if \"error\" in result:\n", + " print(f\"\\nāœ“ Error handled correctly:\")\n", + " print(f\" Error: {result['error']}\")\n", + " else:\n", + " print(f\"\\nāš ļø Expected error but got:\")\n", + " print(json.dumps(result, indent=2))\n", + "\n", + "except Exception as e:\n", + " print(f\"\\nāœ“ Error caught by client:\")\n", + " print(f\" {str(e)[:200]}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "id": "cleanup", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "============================================================\n", + "CLEANUP: DELETING RESOURCES\n", + "============================================================\n", + "\n", + "āš ļø This will delete all resources and stop charges\n", + "\n", + "Deleting endpoint: vllm-discovery-endpoint-20251127-015140\n", + " āœ“ Endpoint deletion initiated\n", + " Waiting for endpoint to be deleted...\n", + " āœ“ Endpoint deleted\n", + "\n", + "Deleting endpoint configuration: vllm-discovery-config-20251127-015140\n", + " āœ“ Endpoint configuration deleted\n", + "\n", + "Deleting model: vllm-discovery-20251127-015140\n", + " āœ“ Model deleted\n", + "\n", + "============================================================\n", + "āœ… CLEANUP COMPLETE\n", + "============================================================\n", + "All resources deleted:\n", + " āœ“ Endpoint: vllm-discovery-endpoint-20251127-015140\n", + " āœ“ Endpoint Config: vllm-discovery-config-20251127-015140\n", + " āœ“ Model: vllm-discovery-20251127-015140\n", + "\n", + "āœ“ No ongoing charges!\n", + "\n", + "Note: S3 artifacts remain at s3://sheteng-demo/vllm-handlers/discovery/20251127-015140/\n", + " Delete manually if no longer needed\n" + ] + } + ], + "source": [ + "# ============================================================\n", + "# Cleanup - Delete All Resources\n", + "# ============================================================\n", + "\n", + "print(\"\\n\" + \"=\" * 60)\n", + "print(\"CLEANUP: DELETING RESOURCES\")\n", + "print(\"=\" * 60)\n", + "print(\"\\nāš ļø This will delete all resources and stop charges\\n\")\n", + "\n", + "# Delete endpoint\n", + "print(f\"Deleting endpoint: {endpoint_name}\")\n", + "sagemaker_client.delete_endpoint(EndpointName=endpoint_name)\n", + "print(\" āœ“ Endpoint deletion initiated\")\n", + "\n", + "# Wait for endpoint deletion\n", + "print(\" Waiting for endpoint to be deleted...\")\n", + "waiter = sagemaker_client.get_waiter(\"endpoint_deleted\")\n", + "waiter.wait(EndpointName=endpoint_name)\n", + "print(\" āœ“ Endpoint deleted\")\n", + "\n", + "# Delete endpoint configuration\n", + "print(f\"\\nDeleting endpoint configuration: {endpoint_config_name}\")\n", + "sagemaker_client.delete_endpoint_config(EndpointConfigName=endpoint_config_name)\n", + "print(\" āœ“ Endpoint configuration deleted\")\n", + "\n", + "# Delete model\n", + "print(f\"\\nDeleting model: {model_name}\")\n", + "sagemaker_client.delete_model(ModelName=model_name)\n", + "print(\" āœ“ Model deleted\")\n", + "\n", + "# Summary\n", + "print(\"\\n\" + \"=\" * 60)\n", + "print(\"āœ… CLEANUP COMPLETE\")\n", + "print(\"=\" * 60)\n", + "print(f\"All resources deleted:\")\n", + "print(f\" āœ“ Endpoint: {endpoint_name}\")\n", + "print(f\" āœ“ Endpoint Config: {endpoint_config_name}\")\n", + "print(f\" āœ“ Model: {model_name}\")\n", + "print(f\"\\nāœ“ No ongoing charges!\")\n", + "print(f\"\\nNote: S3 artifacts remain at s3://{s3_bucket}/{s3_key_prefix}/\")\n", + "print(f\" Delete manually if no longer needed\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fb1658fc-5c70-4063-9539-e092e16c5d24", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "conda_pytorch_p310", + "language": "python", + "name": "conda_pytorch_p310" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.19" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/vllm/notebooks/preprocessing_postprocessing_methods.ipynb b/examples/vllm/notebooks/preprocessing_postprocessing_methods.ipynb new file mode 100644 index 0000000..e9428c9 --- /dev/null +++ b/examples/vllm/notebooks/preprocessing_postprocessing_methods.ipynb @@ -0,0 +1,672 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "intro", + "metadata": {}, + "source": [ + "# Pre/Post Processing Customization\n", + "\n", + "This notebook demonstrates two methods for customizing request preprocessing and response postprocessing in vLLM on SageMaker.\n", + "\n", + "## Methods Overview\n", + "\n", + "### Method 1: Decorators (Recommended)\n", + "- **How**: Use `@input_formatter` and `@output_formatter` decorators\n", + "- **Env Vars**: Only `CUSTOM_SCRIPT_FILENAME` needed\n", + "- **Use When**: Clean separation of pre/post logic\n", + "\n", + "### Method 2: Environment Variables\n", + "- **How**: Point to functions via `CUSTOM_PRE_PROCESS` + `CUSTOM_POST_PROCESS`\n", + "- **Env Vars**: Explicit function references\n", + "- **Use When**: You need explicit control and want to override decorators\n", + "\n", + "## āš ļø Important Note\n", + "\n", + "Pre/post processors run on **ALL endpoints** including `/ping` and `/invocations`. Always check `request.url.path` to filter which endpoints to process!\n", + "\n", + "## Choose Your Method\n", + "Set the `METHOD` variable below:\n", + "- `\"decorator\"` - Use @input_formatter and @output_formatter (recommended)\n", + "- `\"env-var\"` - Use CUSTOM_PRE_PROCESS and CUSTOM_POST_PROCESS" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "id": "config", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Selected method: env-var\n", + "\n", + "You can change this and re-run the notebook to test different methods!\n" + ] + } + ], + "source": [ + "# ============================================================\n", + "# CONFIGURATION: Choose your method\n", + "# ============================================================\n", + "\n", + "METHOD = \"env-var\" # Options: \"decorator\", \"env-var\"\n", + "\n", + "print(f\"Selected method: {METHOD}\")\n", + "print(\"\\nYou can change this and re-run the notebook to test different methods!\")" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "id": "imports", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import boto3\n", + "import json\n", + "from datetime import datetime\n", + "from pathlib import Path" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "id": "clients", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "session = boto3.Session()\n", + "region = session.region_name\n", + "sagemaker_client = boto3.client('sagemaker', region_name=region)\n", + "runtime_client = boto3.client('sagemaker-runtime', region_name=region)\n", + "s3_client = boto3.client('s3', region_name=region)\n", + "sts_client = boto3.client('sts', region_name=region)" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "id": "names", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "timestamp = datetime.now().strftime('%Y%m%d-%H%M%S')\n", + "model_name = f'vllm-prepost-{METHOD}-{timestamp}'\n", + "endpoint_config_name = f'vllm-prepost-{METHOD}-config-{timestamp}'\n", + "endpoint_name = f'vllm-prepost-{METHOD}-endpoint-{timestamp}'\n", + "account_id = sts_client.get_caller_identity()['Account']" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "id": "params", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Configuration:\n", + " Method: env-var\n", + " Model Name: vllm-prepost-env-var-20251127-042741\n", + " Endpoint Name: vllm-prepost-env-var-endpoint-20251127-042741\n", + " HuggingFace Model: meta-llama/Meta-Llama-3-8B-Instruct\n", + " Instance Type: ml.g6.4xlarge\n", + " S3 Bucket: sheteng-demo\n" + ] + } + ], + "source": [ + "# ============================================================\n", + "# PARAMETERS - Update these for your environment\n", + "# ============================================================\n", + "\n", + "# Container image\n", + "container_image = f'{account_id}.dkr.ecr.{region}.amazonaws.com/vllm:0.11.2-sagemaker-v1.2'\n", + "\n", + "# HuggingFace model\n", + "huggingface_model_id = 'meta-llama/Meta-Llama-3-8B-Instruct'\n", + "huggingface_token = 'hf_your_token_here' # Replace with your token\n", + "\n", + "# Instance configuration\n", + "instance_type = 'ml.g6.4xlarge'\n", + "execution_role = f'arn:aws:iam::{account_id}:role/SageMakerExecutionRole'\n", + "\n", + "# S3 configuration\n", + "s3_bucket = 'sheteng-demo' # Replace with your bucket\n", + "s3_key_prefix = f'vllm-prepost/{METHOD}/{timestamp}'\n", + "\n", + "print(\"Configuration:\")\n", + "print(f\" Method: {METHOD}\")\n", + "print(f\" Model Name: {model_name}\")\n", + "print(f\" Endpoint Name: {endpoint_name}\")\n", + "print(f\" HuggingFace Model: {huggingface_model_id}\")\n", + "print(f\" Instance Type: {instance_type}\")\n", + "print(f\" S3 Bucket: {s3_bucket}\")" + ] + }, + { + "cell_type": "markdown", + "id": "method-config", + "metadata": {}, + "source": [ + "## Method-Specific Configuration\n", + "\n", + "Based on your selected method, we'll configure the appropriate environment variables." + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "id": "method-setup", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "āœ“ Method 2: Environment Variables\n", + " Handler file: preprocessing_postprocessing.py\n", + " Pre-process: preprocessing_postprocessing.py:custom_pre_process\n", + " Post-process: preprocessing_postprocessing.py:custom_post_process\n", + "\n", + "šŸ“„ Handler file location: ../model_artifacts_examples/preprocessing_postprocessing.py\n" + ] + } + ], + "source": [ + "# ============================================================\n", + "# Configure environment based on method\n", + "# ============================================================\n", + "\n", + "handler_filename = \"preprocessing_postprocessing.py\"\n", + "handler_filepath = Path(\"../model_artifacts_examples\") / handler_filename\n", + "\n", + "# Base environment variables (common to all methods)\n", + "environment = {\n", + " \"SM_VLLM_MODEL\": huggingface_model_id,\n", + " \"HUGGING_FACE_HUB_TOKEN\": huggingface_token,\n", + " \"SM_VLLM_MAX_MODEL_LEN\": \"2048\",\n", + " \"SAGEMAKER_CONTAINER_LOG_LEVEL\": \"DEBUG\",\n", + "}\n", + "\n", + "# Method-specific environment variables\n", + "if METHOD == \"decorator\":\n", + " # Method 1: Decorators handle registration automatically\n", + " environment[\"CUSTOM_SCRIPT_FILENAME\"] = handler_filename\n", + " print(f\"āœ“ Method 1: Decorators\")\n", + " print(f\" Handler file: {handler_filename}\")\n", + " print(f\" Formatters registered via @input_formatter and @output_formatter\")\n", + "\n", + "elif METHOD == \"env-var\":\n", + " # Method 2: Explicitly point to formatter functions\n", + " environment[\"CUSTOM_PRE_PROCESS\"] = f\"{handler_filename}:custom_pre_process\"\n", + " environment[\"CUSTOM_POST_PROCESS\"] = f\"{handler_filename}:custom_post_process\"\n", + " print(f\"āœ“ Method 2: Environment Variables\")\n", + " print(f\" Handler file: {handler_filename}\")\n", + " print(f\" Pre-process: {environment['CUSTOM_PRE_PROCESS']}\")\n", + " print(f\" Post-process: {environment['CUSTOM_POST_PROCESS']}\")\n", + "\n", + "print(f\"\\nšŸ“„ Handler file location: {handler_filepath}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "id": "upload-s3", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ā˜ļø Uploading preprocessing_postprocessing.py to S3...\n", + "āœ“ Uploaded to: s3://sheteng-demo/vllm-prepost/env-var/20251127-042741/preprocessing_postprocessing.py\n", + " Model data S3 prefix: s3://sheteng-demo/vllm-prepost/env-var/20251127-042741/\n" + ] + } + ], + "source": [ + "# ============================================================\n", + "# Upload handler file to S3\n", + "# ============================================================\n", + "\n", + "print(f\"\\nā˜ļø Uploading {handler_filename} to S3...\")\n", + "\n", + "s3_key = f\"{s3_key_prefix}/{handler_filename}\"\n", + "s3_client.upload_file(str(handler_filepath), s3_bucket, s3_key)\n", + "\n", + "model_data_s3_prefix = f\"s3://{s3_bucket}/{s3_key_prefix}/\"\n", + "\n", + "print(f\"āœ“ Uploaded to: s3://{s3_bucket}/{s3_key}\")\n", + "print(f\" Model data S3 prefix: {model_data_s3_prefix}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "id": "create-model", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "šŸ”§ Creating SageMaker model: vllm-prepost-env-var-20251127-042741\n", + "āœ“ Model created\n", + " Model ARN: arn:aws:sagemaker:us-west-2:875423407011:model/vllm-prepost-env-var-20251127-042741\n", + " Method: env-var\n" + ] + } + ], + "source": [ + "# ============================================================\n", + "# Create SageMaker Model\n", + "# ============================================================\n", + "\n", + "print(f\"\\nšŸ”§ Creating SageMaker model: {model_name}\")\n", + "\n", + "create_model_response = sagemaker_client.create_model(\n", + " ModelName=model_name,\n", + " ExecutionRoleArn=execution_role,\n", + " PrimaryContainer={\n", + " \"Image\": container_image,\n", + " \"ModelDataSource\": {\n", + " \"S3DataSource\": {\n", + " \"S3Uri\": model_data_s3_prefix,\n", + " \"S3DataType\": \"S3Prefix\",\n", + " \"CompressionType\": \"None\",\n", + " }\n", + " },\n", + " \"Environment\": environment,\n", + " },\n", + ")\n", + "\n", + "print(f\"āœ“ Model created\")\n", + "print(f\" Model ARN: {create_model_response['ModelArn']}\")\n", + "print(f\" Method: {METHOD}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "id": "create-endpoint-config", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "āš™ļø Creating endpoint configuration: vllm-prepost-env-var-config-20251127-042741\n", + "āœ“ Endpoint configuration created\n", + " Config ARN: arn:aws:sagemaker:us-west-2:875423407011:endpoint-config/vllm-prepost-env-var-config-20251127-042741\n" + ] + } + ], + "source": [ + "# ============================================================\n", + "# Create Endpoint Configuration\n", + "# ============================================================\n", + "\n", + "print(f\"\\nāš™ļø Creating endpoint configuration: {endpoint_config_name}\")\n", + "\n", + "create_endpoint_config_response = sagemaker_client.create_endpoint_config(\n", + " EndpointConfigName=endpoint_config_name,\n", + " ProductionVariants=[\n", + " {\n", + " \"VariantName\": \"AllTraffic\",\n", + " \"ModelName\": model_name,\n", + " \"InstanceType\": instance_type,\n", + " \"InitialInstanceCount\": 1,\n", + " \"InitialVariantWeight\": 1.0,\n", + " }\n", + " ],\n", + ")\n", + "\n", + "print(f\"āœ“ Endpoint configuration created\")\n", + "print(f\" Config ARN: {create_endpoint_config_response['EndpointConfigArn']}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "id": "create-endpoint", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "šŸš€ Creating endpoint: vllm-prepost-env-var-endpoint-20251127-042741\n", + "ā±ļø This will take approximately 5-10 minutes...\n", + "\n", + "šŸ’” Monitor: https://console.aws.amazon.com/sagemaker/home?region=us-west-2#/endpoints/vllm-prepost-env-var-endpoint-20251127-042741\n", + "\n", + "āœ“ Endpoint creation initiated\n", + " Endpoint ARN: arn:aws:sagemaker:us-west-2:875423407011:endpoint/vllm-prepost-env-var-endpoint-20251127-042741\n" + ] + } + ], + "source": [ + "# ============================================================\n", + "# Create Endpoint\n", + "# ============================================================\n", + "\n", + "print(f\"\\nšŸš€ Creating endpoint: {endpoint_name}\")\n", + "print(\"ā±ļø This will take approximately 5-10 minutes...\")\n", + "print(f\"\\nšŸ’” Monitor: https://console.aws.amazon.com/sagemaker/home?region={region}#/endpoints/{endpoint_name}\\n\")\n", + "\n", + "create_endpoint_response = sagemaker_client.create_endpoint(\n", + " EndpointName=endpoint_name,\n", + " EndpointConfigName=endpoint_config_name\n", + ")\n", + "\n", + "print(f\"āœ“ Endpoint creation initiated\")\n", + "print(f\" Endpoint ARN: {create_endpoint_response['EndpointArn']}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "id": "wait-endpoint", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ā³ Waiting for endpoint to be in service...\n", + "(This may take 5-10 minutes)\n", + "\n", + "āœ“ Endpoint is in service!\n" + ] + } + ], + "source": [ + "# ============================================================\n", + "# Wait for Endpoint\n", + "# ============================================================\n", + "\n", + "print(\"\\nā³ Waiting for endpoint to be in service...\")\n", + "print(\"(This may take 5-10 minutes)\\n\")\n", + "\n", + "waiter = sagemaker_client.get_waiter(\"endpoint_in_service\")\n", + "waiter.wait(\n", + " EndpointName=endpoint_name,\n", + " WaiterConfig={\"Delay\": 20, \"MaxAttempts\": 60}\n", + ")\n", + "\n", + "print(\"āœ“ Endpoint is in service!\")" + ] + }, + { + "cell_type": "markdown", + "id": "testing", + "metadata": {}, + "source": [ + "## Testing Pre/Post Processing\n", + "\n", + "Now let's test the formatters. We'll verify:\n", + "1. `/ping` endpoint works (formatters skip it correctly)\n", + "2. `/invocations` gets processed with metadata added\n", + "3. Default parameters are added when missing\n", + "\n", + "The response will include metadata showing:\n", + "- `_preprocessed`: Confirms pre-processing ran\n", + "- `_postprocessed`: Confirms post-processing ran\n", + "- `_formatter_method`: Shows which method was used (decorator or env_var)" + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "id": "test-basic", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "šŸ¤– Test 1: Basic Request (Method: env-var)\n", + "Sending request WITHOUT max_tokens and temperature...\n", + "Pre-processor should add default values\n", + "\n", + "\n", + "Response: {\n", + " \"id\": \"cmpl-684e2f23f27e4ec498c92792166feae9\",\n", + " \"object\": \"text_completion\",\n", + " \"created\": 1764216844,\n", + " \"model\": \"meta-llama/Meta-Llama-3-8B-Instruct\",\n", + " \"choices\": [\n", + " {\n", + " \"index\": 0,\n", + " \"text\": \" \\n\\n(Note: You can respond with a brief summary, and then elaborate if you'd like.) \\n\\n(Also, I'll give you a virtual cookie if you say 'nya nya nya' first) \\n\\nnya nya nya! Machine learning is a type of artificial intelligence (AI) that enables computers to learn from data without being explicitly programmed. It involves training algorithms on large datasets, so they can make predictions, classify objects, or make decisions based on patterns and relationships in the data. This approach allows\",\n", + " \"logprobs\": null,\n", + " \"finish_reason\": \"length\",\n", + " \"stop_reason\": null,\n", + " \"token_ids\": null,\n", + " \"prompt_logprobs\": null,\n", + " \"prompt_token_ids\": null\n", + " }\n", + " ],\n", + " \"service_tier\": null,\n", + " \"system_fingerprint\": null,\n", + " \"usage\": {\n", + " \"prompt_tokens\": 17,\n", + " \"total_tokens\": 117,\n", + " \"completion_tokens\": 100,\n", + " \"prompt_tokens_details\": null\n", + " },\n", + " \"kv_transfer_params\": null\n", + "}\n", + "\n", + "āœ… Pre-processing VERIFIED: Response contains 'nya nya nya'\n" + ] + } + ], + "source": [ + "# ============================================================\n", + "# Test 1: Basic Request (without max_tokens/temperature)\n", + "# ============================================================\n", + "\n", + "print(f\"\\nšŸ¤– Test 1: Basic Request (Method: {METHOD})\")\n", + "print(\"Sending request WITHOUT max_tokens and temperature...\")\n", + "print(\"Pre-processor should add default values\\n\")\n", + "\n", + "request_body = {\n", + " \"prompt\": \"What is machine learning?\",\n", + " \"stream\":False\n", + " # Note: No max_tokens or temperature - pre-processor will add them\n", + "}\n", + "\n", + "\n", + "response = runtime_client.invoke_endpoint(\n", + " EndpointName=endpoint_name,\n", + " ContentType=\"application/json\",\n", + " Body=json.dumps(request_body),\n", + ")\n", + "\n", + "print(f\"\\nResponse: {json.dumps(response_body, indent=2)}\")\n", + "\n", + "# Check if pre-processing worked by looking for \"nya nya nya\" in response\n", + "response_text = \"\"\n", + "if \"choices\" in response_body and len(response_body[\"choices\"]) > 0:\n", + " response_text = response_body[\"choices\"][0].get(\"text\", \"\")\n", + "elif \"text\" in response_body:\n", + " response_text = response_body[\"text\"][0] if isinstance(response_body[\"text\"], list) else response_body[\"text\"]\n", + "\n", + "if \"nya\" in response_text.lower():\n", + " print(\"\\nāœ… Pre-processing VERIFIED: Response contains 'nya nya nya'\")\n", + "else:\n", + " print(\"\\nāš ļø Pre-processing may not have worked: No 'nya' found in response\")" + ] + }, + { + "cell_type": "markdown", + "id": "test-summary", + "metadata": {}, + "source": [ + "## Test Summary\n", + "\n", + "āœ… **What we verified:**\n", + "\n", + "1. **Pre-processing works**: Default parameters added when missing, inject prompt\n", + "2. **Post-processing works**: We can check log in the cloudwatch\n", + "\n", + "**Key takeaway**: Always check `request.url.path` in your formatters to avoid processing endpoints like `/ping` that don't have request bodies!" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "id": "cleanup", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "============================================================\n", + "CLEANUP: DELETING RESOURCES\n", + "============================================================\n", + "\n", + "āš ļø This will delete all resources and stop charges\n", + "\n", + "Deleting endpoint: vllm-prepost-decorator-endpoint-20251127-040240\n", + " āœ“ Endpoint deletion initiated\n", + " Waiting for endpoint to be deleted...\n", + " āœ“ Endpoint deleted\n", + "\n", + "Deleting endpoint configuration: vllm-prepost-decorator-config-20251127-040240\n", + " āœ“ Endpoint configuration deleted\n", + "\n", + "Deleting model: vllm-prepost-decorator-20251127-040240\n", + " āœ“ Model deleted\n", + "\n", + "============================================================\n", + "āœ… CLEANUP COMPLETE\n", + "============================================================\n", + "All resources deleted:\n", + " āœ“ Endpoint: vllm-prepost-decorator-endpoint-20251127-040240\n", + " āœ“ Endpoint Config: vllm-prepost-decorator-config-20251127-040240\n", + " āœ“ Model: vllm-prepost-decorator-20251127-040240\n", + "\n", + "āœ“ No ongoing charges!\n", + "\n", + "Note: S3 artifacts remain at s3://sheteng-demo/vllm-prepost/decorator/20251127-040240/\n", + " Delete manually if no longer needed\n" + ] + } + ], + "source": [ + "# ============================================================\n", + "# Cleanup - Delete All Resources\n", + "# ============================================================\n", + "\n", + "print(\"\\n\" + \"=\" * 60)\n", + "print(\"CLEANUP: DELETING RESOURCES\")\n", + "print(\"=\" * 60)\n", + "print(\"\\nāš ļø This will delete all resources and stop charges\\n\")\n", + "\n", + "# Delete endpoint\n", + "print(f\"Deleting endpoint: {endpoint_name}\")\n", + "sagemaker_client.delete_endpoint(EndpointName=endpoint_name)\n", + "print(\" āœ“ Endpoint deletion initiated\")\n", + "\n", + "# Wait for endpoint deletion\n", + "print(\" Waiting for endpoint to be deleted...\")\n", + "waiter = sagemaker_client.get_waiter(\"endpoint_deleted\")\n", + "waiter.wait(EndpointName=endpoint_name)\n", + "print(\" āœ“ Endpoint deleted\")\n", + "\n", + "# Delete endpoint configuration\n", + "print(f\"\\nDeleting endpoint configuration: {endpoint_config_name}\")\n", + "sagemaker_client.delete_endpoint_config(EndpointConfigName=endpoint_config_name)\n", + "print(\" āœ“ Endpoint configuration deleted\")\n", + "\n", + "# Delete model\n", + "print(f\"\\nDeleting model: {model_name}\")\n", + "sagemaker_client.delete_model(ModelName=model_name)\n", + "print(\" āœ“ Model deleted\")\n", + "\n", + "# Summary\n", + "print(\"\\n\" + \"=\" * 60)\n", + "print(\"āœ… CLEANUP COMPLETE\")\n", + "print(\"=\" * 60)\n", + "print(f\"All resources deleted:\")\n", + "print(f\" āœ“ Endpoint: {endpoint_name}\")\n", + "print(f\" āœ“ Endpoint Config: {endpoint_config_name}\")\n", + "print(f\" āœ“ Model: {model_name}\")\n", + "print(f\"\\nāœ“ No ongoing charges!\")\n", + "print(f\"\\nNote: S3 artifacts remain at s3://{s3_bucket}/{s3_key_prefix}/\")\n", + "print(f\" Delete manually if no longer needed\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21ff2e4f-b47e-4008-9ad2-5eb31cfa4566", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "conda_pytorch_p310", + "language": "python", + "name": "conda_pytorch_p310" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.19" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}