This document outlines the detailed, professional code deliverables for your data migration project. It includes schema definitions, field mapping with transformation logic, comprehensive validation scripts, robust rollback procedures, and initial timeline estimates. All code is designed to be clean, well-commented, and production-ready, ensuring a smooth and reliable migration process.
This section provides the Data Definition Language (DDL) for both your source and target systems. We've used a simplified Customers table example to illustrate potential schema differences that necessitate transformation.
Assumptions:
Customers Table)--- ### 2. Field Mapping and Transformation Logic (Python ETL Script Example) This Python script demonstrates the core ETL (Extract, Transform, Load) process. It connects to the source database, extracts data, applies a set of predefined transformation rules based on the schema differences, and loads the transformed data into the target database. **Key Features:** * Database connection using `psycopg2` (for PostgreSQL, easily adaptable to `pyodbc`, `mysql-connector-python`, etc.). * Batch processing for efficiency with large datasets. * Error handling and logging. * Clear comments for each transformation rule.
This comprehensive study plan is designed to equip professionals with the knowledge, skills, and best practices required to successfully plan, execute, and manage complex data migration projects. From initial data assessment to post-migration validation and support, this plan covers all critical aspects of a robust data migration strategy.
Introduction: Data migration is a critical, often complex, process involving the transfer of data between storage types, formats, or computer systems. A well-planned migration minimizes risk, ensures data integrity, and supports business continuity. This study plan provides a structured approach to understanding and mastering the key components of data migration planning, including field mapping, transformation rules, validation, and rollback procedures.
Overall Goal: Upon completion of this study plan, the learner will be able to:
This study plan is ideal for:
This 10-week schedule is designed for approximately 10-15 hours of study per week, balancing theoretical learning with practical exercises.
* Understand the definition, types, and common challenges of data migration.
* Familiarize with data migration lifecycle phases (assessment, design, execution, validation, cutover, post-migration).
* Learn project management fundamentals for data migration (stakeholder identification, risk assessment, communication planning).
* Identify key roles and responsibilities in a migration project.
* "The Data Migration Handbook" by John Morris (Chapters 1-3).
* Online articles on data migration strategies (e.g., from Gartner, Forrester).
* PMBOK Guide (relevant sections on project initiation and planning).
* Master techniques for identifying all relevant source data systems and formats.
* Learn to use data profiling tools and methods to understand data characteristics, quality, and anomalies.
* Identify data quality issues (duplicates, inconsistencies, missing values).
* Understand the importance of metadata in source analysis.
* "Data Quality: The Field Guide" by Thomas C. Redman (Chapters on data profiling).
* Tutorials for a chosen data profiling tool (e.g., SQL Server Data Tools, Talend Open Studio for Data Quality).
* Online courses on SQL for data analysis.
* Analyze the target system's architecture, data model, and business rules.
* Understand how to design or adapt target schemas to accommodate migrated data.
* Identify data type conversions and potential data loss implications.
* Collaborate with target system owners and business users to finalize requirements.
* "Data Modeling Essentials" by Graeme Simsion and Graham Witt (Chapters on logical and physical design).
* Documentation for common database systems (e.g., PostgreSQL, SQL Server, MongoDB).
* Articles on data governance best practices.
* Develop comprehensive field-level mapping documents from source to target.
* Handle complex data relationships and hierarchies during mapping.
* Address master data management (MDM) considerations and reference data mapping.
* Document mapping decisions and exceptions clearly.
* Templates for detailed field mapping documents (search online for "data migration mapping template").
* Case studies on MDM in data migration.
* Practical exercises on mapping complex datasets.
* Define precise data transformation rules (e.g., aggregation, concatenation, splitting, conditional logic, data type conversion).
* Understand the differences and use cases for ETL (Extract, Transform, Load) and ELT (Extract, Load, Transform) approaches.
* Gain an introductory understanding of common ETL/ELT tools.
* "Building a Data Warehouse with Examples in SQL Server" by Vincent Rainardi (Chapters on ETL design).
* Online tutorials for a chosen ETL/ELT tool (e.g., free versions of Talend Open Studio, SSIS basics).
* Articles comparing ETL vs. ELT.
* Implement data cleansing techniques (deduplication, standardization, parsing, validation).
* Develop strategies for data enrichment (e.g., geocoding, third-party data integration).
* Establish data governance policies for migration.
* Handle missing or inconsistent data effectively.
* "Data Quality Management: A Practitioner's Guide" by David Loshin (Chapters on cleansing and enrichment).
* Practical exercises using Python libraries (e.g., fuzzywuzzy, pandas) for data cleansing.
* Design comprehensive pre-migration, in-migration, and post-migration validation strategies.
* Develop SQL queries or scripting (Python/PowerShell) for data validation.
* Create reconciliation reports to compare source and target data counts, sums, and specific values.
* Define error handling and logging mechanisms.
* "SQL for Data Analysis" by Cathy O'Neil and Rachel Schutt (Chapters on advanced querying).
* Python scripting tutorials for data validation.
* Templates for data validation plans and reconciliation reports.
* Select appropriate migration approaches (big bang, phased, parallel run, trickle migration) based on project constraints.
* Develop a detailed cutover plan, including downtime estimation, communication, and resource allocation.
* Design robust rollback procedures and backup strategies to mitigate risks.
* Understand the importance of communication during cutover.
* Case studies of successful and failed data migrations.
* Articles on business continuity and disaster recovery.
* Project management templates for cutover plans.
* Identify and address performance bottlenecks in ETL processes and migration scripts.
* Understand different types of migration testing (unit, integration, system, user acceptance testing).
* Create effective test plans and test cases.
* Learn about performance testing and load testing for migration.
* "SQL Performance Explained" by Markus Winand.
* Software testing methodologies (e.g., ISTQB foundation).
* Articles on ETL performance tuning.
* Plan for post-migration monitoring, issue resolution, and ongoing data governance.
* Develop comprehensive handover documentation for support teams.
* Conduct
python
import os
import logging
from datetime import datetime
import psycopg2 # Example for PostgreSQL. Replace with your target DB driver.
SOURCE_DB_CONFIG = {
'host': os.getenv('SOURCE_DB_HOST', 'localhost'),
'database': os.getenv('SOURCE_DB_NAME', 'Legacy_CRM_DB'),
'user': os.getenv('SOURCE_DB_USER', 'legacy_user'),
'password': os.getenv('SOURCE_DB_PASSWORD', 'legacy_password'),
'port': os.getenv('SOURCE_DB_PORT', '5432')
}
TARGET_DB_CONFIG = {
'host': os.getenv('TARGET_DB_HOST', 'localhost'),
'database': os.getenv('TARGET_DB_NAME', 'New_CRM_DB'),
'user': os.getenv('TARGET_DB_USER', 'new_user'),
'password': os.getenv('TARGET_DB_PASSWORD', 'new_password'),
'port': os.getenv('TARGET_DB_PORT', '5432')
}
BATCH_SIZE = 1000 # Number of records to process in one transaction
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler("migration_log.log"),
logging.StreamHandler()
])
def connect_db(db_config, db_type='source'):
"""Establishes a database connection."""
try:
# Example for psycopg2 (PostgreSQL)
conn = psycopg2.connect(**db_config)
logging.info(f"Successfully connected to {db_type} database.")
return conn
except Exception as e:
logging.error(f"Error connecting to {db_type} database: {e}")
raise
def transform_customer_data(source_record: dict) -> dict:
"""
Applies transformation rules to a single customer record.
Args:
source_record (dict): A dictionary representing a row from the source database.
Returns:
dict: A dictionary representing the transformed row for the target database.
"""
transformed_record = {}
try:
# 1. Direct Mappings (no change needed)
transformed_record['CustomerID'] = source_record.get('CustomerID')
transformed_record['FirstName'] = source_record.get('FirstName')
transformed_record['LastName'] = source_record.get('LastName')
transformed_record['DateOfBirth'] = source_record.get('DateOfBirth') # Date types usually map directly
# 2. Renamed Fields
transformed_record['Email'] = source_record.get('EmailAddress')
transformed_record['Phone'] = source_record.get('PhoneNumber')
transformed_record['AddressLine1'] = source_record.get('StreetAddress')
transformed_record['PostalCode'] = source_record.get('ZipCode')
transformed_record['CustomerCategory'] = source_record.get('CustomerType')
transformed_record['RegisteredAt'] = source_record.get('RegistrationDate') # DATETIME to TIMESTAMP WITH TIME ZONE often implicit
# 3. Data Type/Format Conversions & Default Values
# StateCode (CHAR(2)) to StateProvince (VARCHAR(50)) - could be a lookup for full name
# For simplicity, we'll map directly, but a lookup could be implemented here.
transformed_record['StateProvince'] = source_record.get('StateCode')
# Country (VARCHAR(50)) to CountryCode (CHAR(3))
# Assuming 'USA' maps to 'USA', others might need a lookup table.
country = source_record.get('Country', 'USA').upper()
if country == 'USA' or country == 'UNITED STATES':
transformed_record['CountryCode'] = 'USA'
elif country == 'CANADA':
transformed_record['CountryCode'] = 'CAN'
else:
transformed_record['CountryCode'] = 'UNK' # Unknown or default
# LegacyStatusFlag (CHAR(1)) to IsActive (BOOLEAN)
legacy_status = source_record.get('LegacyStatusFlag', 'A')
transformed_record['IsActive'] = (legacy_status == 'A')
# 4. New Fields / Derived Fields (Target Only)
# FullName is a GENERATED ALWAYS field in the target, so we don't insert it.
# CreatedAt and UpdatedAt are handled by default values in the target schema.
# We can explicitly set them if needed, but for this example, rely on DB defaults.
# transformed_record['CreatedAt'] = datetime.now()
# transformed_record['UpdatedAt'] = datetime.now()
# 5. Handling NULLs and Defaults (if not handled by DB schema)
# Ensure Email is not NULL as per target schema
if not transformed_record.get('Email'):
# This is a critical transformation. If an email is missing,
# we might flag the record, skip it, or assign a placeholder.
# For this example, we'll use a placeholder if allowed, otherwise log and skip.
logging.warning(f"Customer ID {transformed_record['CustomerID']} has no Email. Assigning placeholder.")
transformed_record['Email'] = f"no_email_{transformed_record['CustomerID']}@example.com"
# Alternatively, raise an error or skip the record:
# raise ValueError(f"Missing Email for CustomerID {transformed_record['CustomerID']}")
# Ensure CustomerID is not NULL (primary key)
if transformed_record['CustomerID'] is None:
logging.error(f"Record with missing CustomerID found: {source_record}. Skipping.")
return None # Indicate this record should be skipped
except Exception as e:
logging.error(f"Error transforming record {source_record.get('CustomerID')}: {e}")
return None # Indicate transformation failed for this record
return transformed_record
def migrate_customers():
"""Main function to orchestrate the customer data migration."""
source_conn = None
target_conn = None
try:
source_conn = connect_db(SOURCE_DB_CONFIG, 'source')
target_conn = connect_db(TARGET_DB_CONFIG, 'target')
source_cursor = source_conn.cursor()
target_cursor = target_conn.cursor()
# SQL to select data from the source table
# Select specific columns to control the data extracted
source_select_sql = """
SELECT
CustomerID, FirstName, LastName, EmailAddress, PhoneNumber,
StreetAddress, City, StateCode, ZipCode, Country,
DateOfBirth, RegistrationDate, CustomerType, Notes, LegacyStatusFlag
FROM Legacy_CRM_DB.Customers
ORDER BY CustomerID;
"""
source_cursor.execute(source_select_sql)
logging.info("Starting data extraction and transformation...")
# Get column names from source cursor description
source_columns = [desc[0] for desc in source_cursor.description]
# SQL to insert data into the target table
# Ensure column order matches the transformed_record keys
target_insert_sql = """
INSERT INTO New_CRM_DB.Customers (
CustomerID, FirstName, LastName, Email, Phone,
AddressLine1, City, StateProvince, PostalCode, CountryCode,
DateOfBirth, RegisteredAt, CustomerCategory, IsActive
-- FullName, CreatedAt, UpdatedAt are handled by DB defaults/generated
) VALUES (
%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
This document outlines the comprehensive plan for the upcoming data migration, detailing critical aspects from field mapping and transformation rules to validation, rollback procedures, and timeline estimates. The objective is to ensure a smooth, secure, and accurate transfer of data from the designated source system to the target system, minimizing disruption and maintaining data integrity.
Document Version: 1.0
Date: October 26, 2023
Prepared For: [Customer Name/Organization]
Prepared By: PantheraHive Solutions Team
This Data Migration Plan details the strategy, procedures, and timelines required for successfully migrating data from [Source System Name] to [Target System Name]. The plan encompasses all critical phases, including pre-migration analysis, data extraction, transformation, loading (ETL), validation, and post-migration activities. Key components such as detailed field mappings, transformation rules, robust validation scripts, and comprehensive rollback procedures are defined to ensure data accuracy, integrity, and business continuity throughout the migration process. This document serves as a foundational guide for all stakeholders involved, aiming for a seamless transition and successful project completion.
The primary goal of this project is to migrate essential business data from the legacy [Source System Name] to the new, enhanced [Target System Name]. This migration is critical for [briefly state business reason, e.g., improving operational efficiency, consolidating systems, enabling new functionalities].
The migration will cover the following key data domains and associated tables/objects:
In-Scope Data Domains (Examples - To be specified with client):
Out-of-Scope Data Domains (Examples - To be specified with client):
A detailed inventory of data objects to be migrated, along with estimated record counts and storage sizes, is crucial for planning.
| Data Object / Table Name (Source) | Description | Estimated Record Count (Source) | Estimated Size (Source) | Dependencies | Notes |
| :-------------------------------- | :---------------------------------- | :------------------------------- | :---------------------- | :---------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
\n