diff --git a/.gitignore b/.gitignore index 4d50ae9..b7e0304 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -**/__pycache__/* .aider* +__pycache__ diff --git a/airflow/Dockerfile b/airflow/Dockerfile index 9a9d97e..a48a7cb 100644 --- a/airflow/Dockerfile +++ b/airflow/Dockerfile @@ -50,6 +50,12 @@ RUN FFMPEG_URL="https://github.com/yt-dlp/FFmpeg-Builds/releases/download/latest ln -sf /opt/ffmpeg/bin/ffprobe /usr/local/bin/ffprobe && \ rm -rf /tmp/ffmpeg.tar.xz +# Install s5cmd +RUN S5CMD_URL="https://github.com/peak/s5cmd/releases/download/v2.3.0/s5cmd_2.3.0_linux_amd64.deb" && \ + wget -qO /tmp/s5cmd.deb "$S5CMD_URL" && \ + dpkg -i /tmp/s5cmd.deb && \ + rm /tmp/s5cmd.deb + # Install yt-dlp from master # Temporarily rename pip to bypass the root check in the base image's pip wrapper, # ensuring a system-wide installation. @@ -72,7 +78,7 @@ RUN wget -q https://github.com/ginuerzh/gost/releases/download/v2.12.0/gost_2.12 rm gost_2.12.0_linux_amd64.tar.gz # Verify installations -RUN ffmpeg -version && deno --version && yt-dlp --version && aria2c --version && gost -V +RUN ffmpeg -version && deno --version && yt-dlp --version && aria2c --version && gost -V && s5cmd version # Create version information files RUN ( \ @@ -107,7 +113,8 @@ RUN mv /usr/local/bin/pip /usr/local/bin/pip.orig && \ "ffprobe3" \ "python-dotenv" \ "PyYAML" \ - "aria2p" && \ + "aria2p" \ + "s5cmdpy" && \ mv /usr/local/bin/pip.orig /usr/local/bin/pip # --- Install the custom yt_ops_services package --- @@ -141,6 +148,7 @@ RUN mv /usr/local/bin/pip /usr/local/bin/pip.orig && \ # This fixes permission issues that can occur if previous RUN commands created files in /home/airflow as root. # We also make it world-writable to accommodate running the container with a different user ID, which can # happen in some environments (e.g., OpenShift or with docker-compose user overrides). +RUN mkdir -p /home/airflow/.aws && chown -R airflow:airflow /home/airflow/.aws RUN chown -R airflow:airflow /home/airflow && chmod -R 777 /home/airflow # Switch to airflow user for all subsequent operations diff --git a/airflow/configs/docker-compose-dl.yaml.j2 b/airflow/configs/docker-compose-dl.yaml.j2 index 2adfcb5..07f46e9 100644 --- a/airflow/configs/docker-compose-dl.yaml.j2 +++ b/airflow/configs/docker-compose-dl.yaml.j2 @@ -54,8 +54,8 @@ x-airflow-common: # Remote Logging - connection is configured directly via environment variables #_PIP_ADDITIONAL_REQUIREMENTS: ${{ '{' }}_PIP_ADDITIONAL_REQUIREMENTS:- apache-airflow-providers-docker apache-airflow-providers-http thrift>=0.16.0,<=0.20.0 backoff>=2.2.1 python-dotenv==1.0.1 psutil>=5.9.0 apache-airflow-providers-amazon{{ '}' }} AIRFLOW__LOGGING__REMOTE_LOGGING: "True" - AIRFLOW__LOGGING__REMOTE_BASE_LOG_FOLDER: "s3://airflow-logs" - AIRFLOW__LOGGING__REMOTE_LOG_CONN_ID: minio_default + AIRFLOW__LOGGING__REMOTE_BASE_LOG_FOLDER: "s3://videos/airflow-logs" + AIRFLOW__LOGGING__REMOTE_LOG_CONN_ID: s3_delivery_connection AIRFLOW__LOGGING__ENCRYPT_S3_LOGS: "False" #AIRFLOW__LOGGING__LOG_ID_TEMPLATE: "{dag_id}-{task_id}-{run_id}-{try_number}" AIRFLOW__WEBSERVER__SECRET_KEY: 'qmALu5JCAW0518WGAqkVZQ==' @@ -121,6 +121,51 @@ services: - proxynet restart: always + airflow-worker-s3: + <<: *airflow-common + container_name: airflow-worker-s3-1 + hostname: ${HOSTNAME:-s3-001} + # The S3 worker listens on the generic s3 queue AND its own dedicated queue. + command: airflow celery worker -q queue-s3,queue-s3-${HOSTNAME:-s3-001} + deploy: + resources: + limits: + memory: ${AIRFLOW_WORKER_S3_MEM_LIMIT:-1G} + reservations: + memory: ${AIRFLOW_WORKER_S3_MEM_RESERV:-256M} + healthcheck: + test: + - "CMD-SHELL" + - 'celery --app airflow.providers.celery.executors.celery_executor.app inspect ping -d "worker-s3@$$(hostname)"' + interval: 30s + timeout: 30s + retries: 5 + start_period: 30s + environment: + <<: *airflow-common-env + S3_DELIVERY_AWS_ACCESS_KEY_ID: "{{ vault_s3_delivery_access_key_id }}" + S3_DELIVERY_AWS_SECRET_ACCESS_KEY: "{{ vault_s3_delivery_secret_access_key }}" + S3_DELIVERY_AWS_REGION: "{{ vault_s3_delivery_aws_region }}" + S3_DELIVERY_ENDPOINT: "{{ vault_s3_delivery_endpoint }}" + S3_DELIVERY_BUCKET: "{{ vault_s3_delivery_bucket }}" + HOSTNAME: ${HOSTNAME:-s3-001} + DUMB_INIT_SETSID: "0" + AIRFLOW__CELERY__WORKER_QUEUES: "queue-s3,queue-s3-${HOSTNAME:-s3-001}" + AIRFLOW__CELERY__WORKER_TAGS: "s3" + AIRFLOW__CELERY__WORKER_PREFETCH_MULTIPLIER: "1" + # S3 tasks are lightweight. + AIRFLOW__CELERY__WORKER_AUTOSCALE: "2,1" + AIRFLOW__CELERY__POOL: "prefork" + AIRFLOW__CELERY__TASK_ACKS_LATE: "False" + AIRFLOW__CELERY__OPERATION_TIMEOUT: "2.0" + AIRFLOW__CELERY__WORKER_NAME: "worker-s3@%h" + AIRFLOW__CELERY__WORKER_MAX_TASKS_PER_CHILD: "100" + AIRFLOW__CELERY__WORKER_MAX_MEMORY_PER_CHILD: "262144" # 256MB + networks: + - default + - proxynet + restart: always + airflow-worker-auth: <<: *airflow-common container_name: airflow-worker-auth-1 @@ -175,6 +220,46 @@ services: - /var/run/docker.sock:/var/run/docker.sock:ro restart: always + airflow-worker-mgmt: + <<: *airflow-common + container_name: airflow-worker-mgmt-1 + hostname: ${HOSTNAME:-mgmt001} + # The Mgmt worker listens on the generic mgmt queue AND its own dedicated queue. + command: airflow celery worker -q queue-mgmt,queue-mgmt-${HOSTNAME:-mgmt001} + deploy: + resources: + limits: + memory: ${AIRFLOW_WORKER_MGMT_MEM_LIMIT:-2G} + reservations: + memory: ${AIRFLOW_WORKER_MGMT_MEM_RESERV:-512M} + healthcheck: + test: + - "CMD-SHELL" + - 'celery --app airflow.providers.celery.executors.celery_executor.app inspect ping -d "worker-mgmt@$$(hostname)"' + interval: 30s + timeout: 30s + retries: 5 + start_period: 30s + environment: + <<: *airflow-common-env + HOSTNAME: ${HOSTNAME:-mgmt001} + DUMB_INIT_SETSID: "0" + AIRFLOW__CELERY__WORKER_QUEUES: "queue-mgmt,queue-mgmt-${HOSTNAME:-mgmt001}" + AIRFLOW__CELERY__WORKER_TAGS: "mgmt" + AIRFLOW__CELERY__WORKER_PREFETCH_MULTIPLIER: "1" + # Mgmt tasks are lightweight. + AIRFLOW__CELERY__WORKER_AUTOSCALE: "4,2" + AIRFLOW__CELERY__POOL: "prefork" + AIRFLOW__CELERY__TASK_ACKS_LATE: "False" + AIRFLOW__CELERY__OPERATION_TIMEOUT: "2.0" + AIRFLOW__CELERY__WORKER_NAME: "worker-mgmt@%h" + AIRFLOW__CELERY__WORKER_MAX_TASKS_PER_CHILD: "100" + AIRFLOW__CELERY__WORKER_MAX_MEMORY_PER_CHILD: "262144" # 256MB + networks: + - default + - proxynet + restart: always + networks: proxynet: name: airflow_proxynet diff --git a/airflow/configs/docker-compose-ytdlp-ops.yaml.j2 b/airflow/configs/docker-compose-ytdlp-ops.yaml.j2 index 92f7b3a..c55a31f 100644 --- a/airflow/configs/docker-compose-ytdlp-ops.yaml.j2 +++ b/airflow/configs/docker-compose-ytdlp-ops.yaml.j2 @@ -1,12 +1,4 @@ name: ytdlp-ops -{% if service_role is defined and service_role != 'management' %} -include: - # This automatically includes the generated camoufox service definitions and dependencies. - # It simplifies the docker-compose command, as you no longer need to specify both files with -f. - # The file is generated by the config-generator service and will be created even if empty. - - ./configs/docker-compose.camoufox.yaml -{% endif %} - services: bgutil-provider: image: brainicism/bgutil-ytdlp-pot-provider @@ -66,10 +58,6 @@ services: depends_on: context-prepper: condition: service_completed_successfully -{% if service_role is defined and service_role != 'management' %} - camoufox-group: - condition: service_started -{% endif %} # Ports are no longer exposed directly. Envoy will connect to them on the internal network. # entrypoint: # - /bin/sh diff --git a/airflow/configs/docker-compose.camoufox.yaml.j2 b/airflow/configs/docker-compose.camoufox.yaml.j2 index 7cd4cc4..cd92c27 100644 --- a/airflow/configs/docker-compose.camoufox.yaml.j2 +++ b/airflow/configs/docker-compose.camoufox.yaml.j2 @@ -54,22 +54,6 @@ services: - proxynet {% endfor %} -{% if camoufox_proxies %} - # This service is a dependency anchor. The main services depend on it, - # and it in turn depends on all camoufox instances. - camoufox-group: - image: alpine:latest - command: ["echo", "Camoufox group ready."] - restart: "no" - depends_on: -{% for proxy in camoufox_proxies %} -{% set proxy_port = _get_port_from_proxy_url(proxy.url) | int %} - - camoufox-{{ proxy_port }}-{{ loop.index }} -{% endfor %} - networks: - - proxynet -{% endif %} - volumes: {% for proxy in camoufox_proxies %} {% set proxy_port = _get_port_from_proxy_url(proxy.url) | int %} diff --git a/airflow/dags/ytdlp_mgmt_proxy_account.py b/airflow/dags/ytdlp_mgmt_proxy_account.py index 8436005..659fefd 100644 --- a/airflow/dags/ytdlp_mgmt_proxy_account.py +++ b/airflow/dags/ytdlp_mgmt_proxy_account.py @@ -788,6 +788,7 @@ def manage_system_callable(**context): with DAG( dag_id="ytdlp_mgmt_proxy_account", + default_args={"queue": "queue-mgmt"}, start_date=days_ago(1), schedule=None, catchup=False, diff --git a/airflow/dags/ytdlp_mgmt_queues.py b/airflow/dags/ytdlp_mgmt_queues.py index 272dd0b..cbc4b2c 100644 --- a/airflow/dags/ytdlp_mgmt_queues.py +++ b/airflow/dags/ytdlp_mgmt_queues.py @@ -591,6 +591,7 @@ with DAG( "owner": "airflow", "start_date": days_ago(1), "retries": 0, + "queue": "queue-mgmt", }, schedule=None, catchup=False, diff --git a/airflow/dags/ytdlp_ops_account_maintenance.py b/airflow/dags/ytdlp_ops_account_maintenance.py index 38828f0..fe1a1c3 100644 --- a/airflow/dags/ytdlp_ops_account_maintenance.py +++ b/airflow/dags/ytdlp_ops_account_maintenance.py @@ -27,7 +27,7 @@ from airflow.utils.dates import days_ago # Import utility functions and Thrift modules from utils.redis_utils import _get_redis_client -from pangramia.yt.tokens_ops import YTTokenOpService +from pangramia.yt.management import YTManagementService from thrift.protocol import TBinaryProtocol from thrift.transport import TSocket, TTransport @@ -36,14 +36,14 @@ logger = logging.getLogger(__name__) # Default settings from Airflow Variables or hardcoded fallbacks DEFAULT_REDIS_CONN_ID = 'redis_default' -DEFAULT_YT_AUTH_SERVICE_IP = Variable.get("YT_AUTH_SERVICE_IP", default_var="172.17.0.1") -DEFAULT_YT_AUTH_SERVICE_PORT = Variable.get("YT_AUTH_SERVICE_PORT", default_var=9980) +DEFAULT_MANAGEMENT_SERVICE_IP = Variable.get("MANAGEMENT_SERVICE_HOST", default_var="172.17.0.1") +DEFAULT_MANAGEMENT_SERVICE_PORT = Variable.get("MANAGEMENT_SERVICE_PORT", default_var=9080) DEFAULT_ARGS = { 'owner': 'airflow', 'retries': 1, 'retry_delay': 30, - 'queue': 'default', + 'queue': 'queue-mgmt', } @@ -55,7 +55,7 @@ def _get_thrift_client(host, port, timeout=60): transport.setTimeout(timeout * 1000) transport = TTransport.TFramedTransport(transport) protocol = TBinaryProtocol.TBinaryProtocol(transport) - client = YTTokenOpService.Client(protocol) + client = YTManagementService.Client(protocol) transport.open() logger.info(f"Connected to Thrift server at {host}:{port}") return client, transport @@ -72,8 +72,8 @@ def manage_account_states(**context): cooldown_duration_s = params['account_cooldown_duration_min'] * 60 ban_duration_s = params['account_ban_duration_hours'] * 3600 - host = DEFAULT_YT_AUTH_SERVICE_IP - port = int(DEFAULT_YT_AUTH_SERVICE_PORT) + host = DEFAULT_MANAGEMENT_SERVICE_IP + port = int(DEFAULT_MANAGEMENT_SERVICE_PORT) redis_conn_id = DEFAULT_REDIS_CONN_ID logger.info(f"Starting account maintenance. Service: {host}:{port}, Redis: {redis_conn_id}") logger.info(f"Using limits: Requests={requests_limit}, Cooldown={params['account_cooldown_duration_min']}m, Ban={params['account_ban_duration_hours']}h") @@ -230,8 +230,8 @@ with DAG( This process gives full control over time-based account lifecycle management to the Airflow orchestrator. """, params={ - 'account_requests_limit': Param(250, type="integer", description="Number of successful requests an account can make before it is rested."), - 'account_cooldown_duration_min': Param(60, type="integer", description="Duration in minutes an account must rest before being activated again. Default is 1 hour."), + 'account_requests_limit': Param(250, type="integer", description="Number of successful requests an account can make before it is rested. Default is 250."), + 'account_cooldown_duration_min': Param(60, type="integer", description="Duration in minutes an account must rest ('pause') before being activated again. Default is 60 minutes (1 hour)."), 'account_ban_duration_hours': Param(24, type="integer", description="Duration in hours an account stays banned before it can be un-banned."), } ) as dag: diff --git a/airflow/dags/ytdlp_ops_v01_orchestrator.py b/airflow/dags/ytdlp_ops_v01_orchestrator.py index 99d8460..7ce0064 100644 --- a/airflow/dags/ytdlp_ops_v01_orchestrator.py +++ b/airflow/dags/ytdlp_ops_v01_orchestrator.py @@ -411,6 +411,7 @@ with DAG( orchestrate_task = PythonOperator( task_id='start_worker_loops', python_callable=orchestrate_workers_ignition_callable, + queue='queue-mgmt', ) orchestrate_task.doc_md = """ ### Start Worker Loops diff --git a/airflow/dags/ytdlp_ops_v01_worker_per_url.py b/airflow/dags/ytdlp_ops_v01_worker_per_url.py index cd44013..cf6e632 100644 --- a/airflow/dags/ytdlp_ops_v01_worker_per_url.py +++ b/airflow/dags/ytdlp_ops_v01_worker_per_url.py @@ -37,6 +37,7 @@ import socket import time import traceback import uuid +import shutil # Import utility functions and Thrift modules from utils.redis_utils import _get_redis_client @@ -140,9 +141,14 @@ def _get_thrift_client(host, port, timeout): return client, transport def _extract_video_id(url): - """Extracts YouTube video ID from URL.""" + """Extracts YouTube video ID from a URL or returns the input if it's already a valid ID.""" if not url or not isinstance(url, str): return None + + # Check if the input is already a valid 11-character video ID + if re.fullmatch(r'[a-zA-Z0-9_-]{11}', url): + return url + patterns = [r'v=([a-zA-Z0-9_-]{11})', r'youtu\.be/([a-zA-Z0-9_-]{11})'] for pattern in patterns: match = re.search(pattern, url) @@ -299,7 +305,7 @@ def get_token(initial_data: dict, **context): account_id = initial_data['account_id'] url = initial_data['url_to_process'] - info_json_dir = Variable.get('DOWNLOADS_TEMP', '/opt/airflow/downloadfiles') + info_json_dir = os.path.join(Variable.get('DOWNLOADS_TEMP', '/opt/airflow/downloadfiles'), 'videos', 'in-progress') host, port = params['service_ip'], int(params['service_port']) machine_id = params.get('machine_id') or socket.gethostname() @@ -308,9 +314,11 @@ def get_token(initial_data: dict, **context): assigned_proxy_url = params.get('assigned_proxy_url') video_id = _extract_video_id(url) - os.makedirs(info_json_dir, exist_ok=True) timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") - info_json_path = os.path.join(info_json_dir, f"info_{video_id or 'unknown'}_{account_id}_{timestamp}.json") + job_dir_name = f"{timestamp}-{video_id or 'unknown'}" + job_dir_path = os.path.join(info_json_dir, job_dir_name) + os.makedirs(job_dir_path, exist_ok=True) + info_json_path = os.path.join(job_dir_path, f"info_{video_id or 'unknown'}_{account_id}_{timestamp}.json") cmd = [ 'ytops-client', 'get-info', @@ -375,6 +383,7 @@ def get_token(initial_data: dict, **context): return { 'info_json_path': info_json_path, + 'job_dir_path': job_dir_path, 'socks_proxy': proxy, 'ytdlp_command': None, 'successful_account_id': account_id, @@ -653,7 +662,10 @@ def download_and_probe(token_data: dict, available_formats: list[str], **context info_json_path = token_data.get('info_json_path') proxy = token_data.get('socks_proxy') original_url = token_data.get('original_url') - download_dir = Variable.get('DOWNLOADS_TEMP', '/opt/airflow/downloadfiles/video') + download_dir = token_data.get('job_dir_path') + if not download_dir: + # Fallback for older runs or if job_dir_path is missing + download_dir = os.path.dirname(info_json_path) format_preset = params.get('download_format_preset', 'best_audio') if format_preset == 'custom': @@ -678,6 +690,21 @@ def download_and_probe(token_data: dict, available_formats: list[str], **context if not (info_json_path and os.path.exists(info_json_path)): raise AirflowException(f"Error: info.json path is missing or file does not exist ({info_json_path}).") + # WORKAROUND: The auth service may inject a 'js_runtimes' key into the info.json + # that is incompatible with the yt-dlp library's expectations, causing a crash. + # We remove it here before passing it to the download tool. + try: + with open(info_json_path, 'r+', encoding='utf-8') as f: + info_data = json.load(f) + if 'js_runtimes' in info_data: + logger.info("Found 'js_runtimes' key in info.json. Removing it as a workaround for yt-dlp library incompatibility.") + del info_data['js_runtimes'] + f.seek(0) + json.dump(info_data, f) + f.truncate() + except Exception as e: + logger.warning(f"Could not process/remove 'js_runtimes' from info.json: {e}", exc_info=True) + def run_yt_dlp_command(format_selector: str): """Constructs and runs a yt-ops-client download command, returning a list of final filenames.""" downloader = params.get('downloader', 'py') @@ -690,20 +717,26 @@ def download_and_probe(token_data: dict, available_formats: list[str], **context cmd.extend(['--output-dir', download_dir]) # The 'py' tool maps many yt-dlp flags via --extra-ytdlp-args - # WORKAROUND: Due to an incompatibility between ytops-client and a recent yt-dlp - # library update, passing --extra-ytdlp-args to the 'py' downloader causes a crash. - # These arguments are being omitted until ytops-client is fixed. - # This affects: fragment_retries, limit_rate, socket_timeout, sleep_interval, - # max_sleep_interval, yt_dlp_test_mode, and the 'yt_dlp_extra_args' DAG param. - has_extra_args = ( - params.get('fragment_retries') or params.get('limit_rate') or - params.get('socket_timeout') or params.get('min_sleep_interval') or - params.get('max_sleep_interval') or params.get('yt_dlp_test_mode') or - params.get('yt_dlp_extra_args') - ) - if has_extra_args: - logger.warning("WORKAROUND: Omitting --extra-ytdlp-args for 'py' downloader due to a known incompatibility. " - "Some download parameters will be ignored.") + # The 'py' tool maps many yt-dlp flags via --extra-ytdlp-args + py_extra_args = [] + if params.get('fragment_retries'): + py_extra_args.extend(['--fragment-retries', str(params['fragment_retries'])]) + if params.get('limit_rate'): + py_extra_args.extend(['--limit-rate', params['limit_rate']]) + if params.get('socket_timeout'): + py_extra_args.extend(['--socket-timeout', str(params['socket_timeout'])]) + if params.get('min_sleep_interval'): + py_extra_args.extend(['--sleep-interval', str(params['min_sleep_interval'])]) + if params.get('max_sleep_interval'): + py_extra_args.extend(['--max-sleep-interval', str(params['max_sleep_interval'])]) + if params.get('yt_dlp_test_mode'): + py_extra_args.append('--test') + + existing_extra = shlex.split(params.get('yt_dlp_extra_args') or '') + final_extra_args_list = existing_extra + py_extra_args + if final_extra_args_list: + final_extra_args_str = shlex.join(final_extra_args_list) + cmd.extend(['--extra-ytdlp-args', final_extra_args_str]) elif downloader == 'aria-rpc': cmd.extend([ @@ -744,7 +777,10 @@ def download_and_probe(token_data: dict, available_formats: list[str], **context cmd.extend(['--extra-ytdlp-args', shlex.join(final_extra_args)]) copy_paste_cmd = ' '.join(shlex.quote(arg) for arg in cmd) - logger.info(f"Executing download command for format '{format_selector}': {copy_paste_cmd}") + logger.info(f"--- Preparing to execute ytops-client ---") + logger.info(f"Full ytops-client command for format '{format_selector}':") + logger.info(copy_paste_cmd) + logger.info(f"-----------------------------------------") process = subprocess.run(cmd, capture_output=True, text=True, timeout=3600) if process.stdout: @@ -855,9 +891,20 @@ def download_and_probe(token_data: dict, available_formats: list[str], **context final_formats_to_download = formats_to_download_initial else: for selector in formats_to_download_initial: - # A selector can be '140' or '299/298/137' + # A selector can be '140' or '299/298/137' or '140-dashy' individual_ids = re.split(r'[/+]', selector) - if any(fid in available_formats for fid in individual_ids): + + # Extract the numeric part of the format ID for checking against available_formats + is_available = False + for fid in individual_ids: + numeric_id_match = re.match(r'^\d+', fid) + if numeric_id_match: + numeric_id = numeric_id_match.group(0) + if numeric_id in available_formats: + is_available = True + break # Found a match, no need to check other parts of the selector + + if is_available: final_formats_to_download.append(selector) else: logger.warning(f"Requested format selector '{selector}' contains no available formats. Skipping.") @@ -872,54 +919,51 @@ def download_and_probe(token_data: dict, available_formats: list[str], **context logger.info(f"Test mode: yt-dlp returned {len(successful_files)} filenames. Skipping probe failure checks.") if not successful_files: raise AirflowException("Test run did not produce any filenames.") - return successful_files + # Do not return here. Proceed to the cleanup and move logic. - if not failed_files: - if not successful_files: - raise AirflowException("Download and probe process completed but produced no valid files.") - return successful_files + final_success_list = successful_files + if failed_files: + # --- Handle Probe Failures and Retry --- + if not retry_on_probe_failure: + raise AirflowException(f"Probe failed for {len(failed_files)} file(s) and retry is disabled: {failed_files}") - # --- Handle Probe Failures and Retry --- - if not retry_on_probe_failure: - raise AirflowException(f"Probe failed for {len(failed_files)} file(s) and retry is disabled: {failed_files}") + logger.warning(f"Probe failed for {len(failed_files)} file(s). Attempting one re-download for failed files...") + + format_ids_to_retry = [] + # Since each download is now for a specific selector and the output template + # includes the format_id, we can always attempt to extract the format_id + # from the failed filename for a targeted retry. + for f in failed_files: + match = re.search(r'\.f([\d]+)\.', f) + if match: + format_ids_to_retry.append(match.group(1)) + else: + logger.error(f"Could not extract format_id from failed file '{f}'. Cannot retry this specific file.") + formats_to_download_retry = format_ids_to_retry - logger.warning(f"Probe failed for {len(failed_files)} file(s). Attempting one re-download for failed files...") - - format_ids_to_retry = [] - # Since each download is now for a specific selector and the output template - # includes the format_id, we can always attempt to extract the format_id - # from the failed filename for a targeted retry. - for f in failed_files: - match = re.search(r'\.f([\d]+)\.', f) - if match: - format_ids_to_retry.append(match.group(1)) - else: - logger.error(f"Could not extract format_id from failed file '{f}'. Cannot retry this specific file.") - formats_to_download_retry = format_ids_to_retry + if not formats_to_download_retry: + raise AirflowException("Probe failed, but could not determine which formats to retry.") - if not formats_to_download_retry: - raise AirflowException("Probe failed, but could not determine which formats to retry.") + # Rename failed files to allow for a fresh download attempt + for f in failed_files: + try: + failed_path = f"{f}.probe_failed_{int(time.time())}" + os.rename(f, failed_path) + logger.info(f"Renamed corrupted file to {failed_path}") + except OSError as rename_err: + logger.error(f"Could not rename corrupted file '{f}': {rename_err}") - # Rename failed files to allow for a fresh download attempt - for f in failed_files: - try: - failed_path = f"{f}.probe_failed_{int(time.time())}" - os.rename(f, failed_path) - logger.info(f"Renamed corrupted file to {failed_path}") - except OSError as rename_err: - logger.error(f"Could not rename corrupted file '{f}': {rename_err}") + # --- Retry Download and Probe --- + retried_successful_files, retried_failed_files = _download_and_probe_formats(formats_to_download_retry) - # --- Retry Download and Probe --- - retried_successful_files, retried_failed_files = _download_and_probe_formats(formats_to_download_retry) + if retried_failed_files: + logger.error(f"Probe failed again for {len(retried_failed_files)} file(s) after retry: {retried_failed_files}") - if retried_failed_files: - logger.error(f"Probe failed again for {len(retried_failed_files)} file(s) after retry: {retried_failed_files}") + final_success_list = successful_files + retried_successful_files + logger.info(f"Retry complete. Final success count: {len(final_success_list)} file(s).") - final_success_list = successful_files + retried_successful_files if not final_success_list: - raise AirflowException("All files failed to download or probe correctly, even after retry.") - - logger.info(f"Retry complete. Final success count: {len(final_success_list)} file(s).") + raise AirflowException("Download and probe process completed but produced no valid files.") if params.get('yt_dlp_cleanup_mode', True): logger.info(f"Cleanup mode is enabled. Creating .empty files and deleting originals for {len(final_success_list)} files.") @@ -935,6 +979,35 @@ def download_and_probe(token_data: dict, available_formats: list[str], **context logger.error(f"Error during cleanup for file {f}: {e}", exc_info=True) # Do not fail the task for a cleanup error, just log it. + # --- Move completed job directory to final destination --- + try: + video_id = _extract_video_id(original_url) + if not video_id: + logger.error(f"Could not extract video_id from URL '{original_url}' for final move. Skipping.") + else: + source_dir = download_dir # This is the job_dir_path + + # Group downloads into 10-minute batch folders based on completion time. + now = datetime.now() + rounded_minute = (now.minute // 10) * 10 + timestamp_str = now.strftime('%Y%m%dT%H') + f"{rounded_minute:02d}" + + final_dir_base = os.path.join(Variable.get('DOWNLOADS_TEMP', '/opt/airflow/downloadfiles'), 'videos', 'ready', timestamp_str) + final_dir_path = os.path.join(final_dir_base, video_id) + + os.makedirs(final_dir_base, exist_ok=True) + + logger.info(f"Moving completed job from '{source_dir}' to final destination '{final_dir_path}'") + if os.path.exists(final_dir_path): + logger.warning(f"Destination '{final_dir_path}' already exists. It will be removed and replaced.") + shutil.rmtree(final_dir_path) + + shutil.move(source_dir, final_dir_path) + logger.info(f"Successfully moved job to '{final_dir_path}'.") + except Exception as e: + logger.error(f"Failed to move completed job directory: {e}", exc_info=True) + # Do not fail the task for a move error, just log it. + return final_success_list except Exception as e: if 'HTTP Error 403: Forbidden' in str(e): @@ -1464,7 +1537,7 @@ with DAG( 'assigned_proxy_url': Param(None, type=["string", "null"], title="[Worker Param] Assigned Proxy URL", description="A specific proxy URL to use for the request, overriding the server's proxy pool logic."), 'clients': Param('tv_simply', type="string", description="Comma-separated list of clients for token generation. e.g. mweb,tv,web_camoufox"), 'timeout': Param(DEFAULT_TIMEOUT, type="integer"), - 'output_path_template': Param("%(title)s [%(id)s].f%(format_id)s.%(ext)s", type="string", title="[Worker Param] Output Path Template", description="Output filename template for yt-dlp. It is highly recommended to include `%(format_id)s` to prevent filename collisions when downloading multiple formats."), + 'output_path_template': Param("%(id)s.f%(format_id)s.%(ext)s", type="string", title="[Worker Param] Output Path Template", description="Output filename template for yt-dlp. It is highly recommended to include `%(format_id)s` to prevent filename collisions when downloading multiple formats."), 'on_auth_failure': Param( 'retry_with_new_account', type="string", diff --git a/airflow/dags/ytdlp_ops_v02_orchestrator_auth.py b/airflow/dags/ytdlp_ops_v02_orchestrator_auth.py index ac7e352..434b751 100644 --- a/airflow/dags/ytdlp_ops_v02_orchestrator_auth.py +++ b/airflow/dags/ytdlp_ops_v02_orchestrator_auth.py @@ -322,6 +322,7 @@ with DAG( orchestrate_task = PythonOperator( task_id='start_worker_loops', python_callable=orchestrate_workers_ignition_callable, + queue='queue-mgmt', ) orchestrate_task.doc_md = """ ### Start Worker Loops diff --git a/airflow/dags/ytdlp_ops_v02_orchestrator_dl.py b/airflow/dags/ytdlp_ops_v02_orchestrator_dl.py index 2c87b2c..c54c5ad 100644 --- a/airflow/dags/ytdlp_ops_v02_orchestrator_dl.py +++ b/airflow/dags/ytdlp_ops_v02_orchestrator_dl.py @@ -290,6 +290,7 @@ with DAG( orchestrate_task = PythonOperator( task_id='start_worker_loops', python_callable=orchestrate_workers_ignition_callable, + queue='queue-mgmt', ) orchestrate_task.doc_md = """ ### Start Worker Loops diff --git a/airflow/dags/ytdlp_ops_v02_worker_per_url_auth.py b/airflow/dags/ytdlp_ops_v02_worker_per_url_auth.py index 82e6cc9..018f222 100644 --- a/airflow/dags/ytdlp_ops_v02_worker_per_url_auth.py +++ b/airflow/dags/ytdlp_ops_v02_worker_per_url_auth.py @@ -175,9 +175,14 @@ def _get_thrift_client(host, port, timeout): return client, transport def _extract_video_id(url): - """Extracts YouTube video ID from URL.""" + """Extracts YouTube video ID from a URL or returns the input if it's already a valid ID.""" if not url or not isinstance(url, str): return None + + # Check if the input is already a valid 11-character video ID + if re.fullmatch(r'[a-zA-Z0-9_-]{11}', url): + return url + patterns = [r'v=([a-zA-Z0-9_-]{11})', r'youtu\.be/([a-zA-Z0-9_-]{11})'] for pattern in patterns: match = re.search(pattern, url) @@ -389,7 +394,7 @@ def get_token(initial_data: dict, **context): account_id = initial_data['account_id'] url = initial_data['url_to_process'] - info_json_dir = Variable.get('DOWNLOADS_TEMP', '/opt/airflow/downloadfiles') + info_json_dir = os.path.join(Variable.get('DOWNLOADS_TEMP', '/opt/airflow/downloadfiles'), 'videos', 'in-progress') host, port = params['service_ip'], int(params['service_port']) machine_id = params.get('machine_id') or socket.gethostname() @@ -468,6 +473,7 @@ def get_token(initial_data: dict, **context): return { 'info_json_path': info_json_path, + 'job_dir_path': job_dir_path, 'socks_proxy': proxy, 'ytdlp_command': None, 'successful_account_id': account_id, diff --git a/airflow/dags/ytdlp_ops_v02_worker_per_url_dl.py b/airflow/dags/ytdlp_ops_v02_worker_per_url_dl.py index 39e3d3a..9c03d45 100644 --- a/airflow/dags/ytdlp_ops_v02_worker_per_url_dl.py +++ b/airflow/dags/ytdlp_ops_v02_worker_per_url_dl.py @@ -36,6 +36,7 @@ import socket import time import traceback import uuid +import shutil # Import utility functions and Thrift modules from utils.redis_utils import _get_redis_client @@ -128,9 +129,14 @@ DEFAULT_ARGS = { # --- Helper Functions --- def _extract_video_id(url): - """Extracts YouTube video ID from URL.""" + """Extracts YouTube video ID from a URL or returns the input if it's already a valid ID.""" if not url or not isinstance(url, str): return None + + # Check if the input is already a valid 11-character video ID + if re.fullmatch(r'[a-zA-Z0-9_-]{11}', url): + return url + patterns = [r'v=([a-zA-Z0-9_-]{11})', r'youtu\.be/([a-zA-Z0-9_-]{11})'] for pattern in patterns: match = re.search(pattern, url) @@ -288,7 +294,25 @@ def download_and_probe(token_data: dict, available_formats: list[str], **context if not (info_json_path and os.path.exists(info_json_path)): raise AirflowException(f"Error: info.json path is missing or file does not exist ({info_json_path}).") - download_dir = os.path.dirname(info_json_path) + # WORKAROUND: The auth service may inject a 'js_runtimes' key into the info.json + # that is incompatible with the yt-dlp library's expectations, causing a crash. + # We remove it here before passing it to the download tool. + try: + with open(info_json_path, 'r+', encoding='utf-8') as f: + info_data = json.load(f) + if 'js_runtimes' in info_data: + logger.info("Found 'js_runtimes' key in info.json. Removing it as a workaround for yt-dlp library incompatibility.") + del info_data['js_runtimes'] + f.seek(0) + json.dump(info_data, f) + f.truncate() + except Exception as e: + logger.warning(f"Could not process/remove 'js_runtimes' from info.json: {e}", exc_info=True) + + download_dir = token_data.get('job_dir_path') + if not download_dir: + # Fallback for older runs or if job_dir_path is missing + download_dir = os.path.dirname(info_json_path) format_preset = params.get('download_format_preset', 'best_audio') if format_preset == 'custom': @@ -322,20 +346,26 @@ def download_and_probe(token_data: dict, available_formats: list[str], **context cmd.extend(['--output-dir', download_dir]) # The 'py' tool maps many yt-dlp flags via --extra-ytdlp-args - # WORKAROUND: Due to an incompatibility between ytops-client and a recent yt-dlp - # library update, passing --extra-ytdlp-args to the 'py' downloader causes a crash. - # These arguments are being omitted until ytops-client is fixed. - # This affects: fragment_retries, limit_rate, socket_timeout, sleep_interval, - # max_sleep_interval, yt_dlp_test_mode, and the 'yt_dlp_extra_args' DAG param. - has_extra_args = ( - params.get('fragment_retries') or params.get('limit_rate') or - params.get('socket_timeout') or params.get('min_sleep_interval') or - params.get('max_sleep_interval') or params.get('yt_dlp_test_mode') or - params.get('yt_dlp_extra_args') - ) - if has_extra_args: - logger.warning("WORKAROUND: Omitting --extra-ytdlp-args for 'py' downloader due to a known incompatibility. " - "Some download parameters will be ignored.") + # The 'py' tool maps many yt-dlp flags via --extra-ytdlp-args + py_extra_args = [] + if params.get('fragment_retries'): + py_extra_args.extend(['--fragment-retries', str(params['fragment_retries'])]) + if params.get('limit_rate'): + py_extra_args.extend(['--limit-rate', params['limit_rate']]) + if params.get('socket_timeout'): + py_extra_args.extend(['--socket-timeout', str(params['socket_timeout'])]) + if params.get('min_sleep_interval'): + py_extra_args.extend(['--sleep-interval', str(params['min_sleep_interval'])]) + if params.get('max_sleep_interval'): + py_extra_args.extend(['--max-sleep-interval', str(params['max_sleep_interval'])]) + if params.get('yt_dlp_test_mode'): + py_extra_args.append('--test') + + existing_extra = shlex.split(params.get('yt_dlp_extra_args') or '') + final_extra_args_list = existing_extra + py_extra_args + if final_extra_args_list: + final_extra_args_str = shlex.join(final_extra_args_list) + cmd.extend(['--extra-ytdlp-args', final_extra_args_str]) elif downloader == 'aria-rpc': cmd.extend([ @@ -376,7 +406,10 @@ def download_and_probe(token_data: dict, available_formats: list[str], **context cmd.extend(['--extra-ytdlp-args', shlex.join(final_extra_args)]) copy_paste_cmd = ' '.join(shlex.quote(arg) for arg in cmd) - logger.info(f"Executing download command for format '{format_selector}': {copy_paste_cmd}") + logger.info(f"--- Preparing to execute ytops-client ---") + logger.info(f"Full ytops-client command for format '{format_selector}':") + logger.info(copy_paste_cmd) + logger.info(f"-----------------------------------------") process = subprocess.run(cmd, capture_output=True, text=True, timeout=3600) if process.stdout: @@ -487,9 +520,20 @@ def download_and_probe(token_data: dict, available_formats: list[str], **context final_formats_to_download = formats_to_download_initial else: for selector in formats_to_download_initial: - # A selector can be '140' or '299/298/137' + # A selector can be '140' or '299/298/137' or '140-dashy' individual_ids = re.split(r'[/+]', selector) - if any(fid in available_formats for fid in individual_ids): + + # Extract the numeric part of the format ID for checking against available_formats + is_available = False + for fid in individual_ids: + numeric_id_match = re.match(r'^\d+', fid) + if numeric_id_match: + numeric_id = numeric_id_match.group(0) + if numeric_id in available_formats: + is_available = True + break # Found a match, no need to check other parts of the selector + + if is_available: final_formats_to_download.append(selector) else: logger.warning(f"Requested format selector '{selector}' contains no available formats. Skipping.") @@ -504,54 +548,51 @@ def download_and_probe(token_data: dict, available_formats: list[str], **context logger.info(f"Test mode: yt-dlp returned {len(successful_files)} filenames. Skipping probe failure checks.") if not successful_files: raise AirflowException("Test run did not produce any filenames.") - return successful_files + # Do not return here. Proceed to the cleanup and move logic. - if not failed_files: - if not successful_files: - raise AirflowException("Download and probe process completed but produced no valid files.") - return successful_files + final_success_list = successful_files + if failed_files: + # --- Handle Probe Failures and Retry --- + if not retry_on_probe_failure: + raise AirflowException(f"Probe failed for {len(failed_files)} file(s) and retry is disabled: {failed_files}") - # --- Handle Probe Failures and Retry --- - if not retry_on_probe_failure: - raise AirflowException(f"Probe failed for {len(failed_files)} file(s) and retry is disabled: {failed_files}") + logger.warning(f"Probe failed for {len(failed_files)} file(s). Attempting one re-download for failed files...") + + format_ids_to_retry = [] + # Since each download is now for a specific selector and the output template + # includes the format_id, we can always attempt to extract the format_id + # from the failed filename for a targeted retry. + for f in failed_files: + match = re.search(r'\.f([\d]+)\.', f) + if match: + format_ids_to_retry.append(match.group(1)) + else: + logger.error(f"Could not extract format_id from failed file '{f}'. Cannot retry this specific file.") + formats_to_download_retry = format_ids_to_retry - logger.warning(f"Probe failed for {len(failed_files)} file(s). Attempting one re-download for failed files...") - - format_ids_to_retry = [] - # Since each download is now for a specific selector and the output template - # includes the format_id, we can always attempt to extract the format_id - # from the failed filename for a targeted retry. - for f in failed_files: - match = re.search(r'\.f([\d]+)\.', f) - if match: - format_ids_to_retry.append(match.group(1)) - else: - logger.error(f"Could not extract format_id from failed file '{f}'. Cannot retry this specific file.") - formats_to_download_retry = format_ids_to_retry + if not formats_to_download_retry: + raise AirflowException("Probe failed, but could not determine which formats to retry.") - if not formats_to_download_retry: - raise AirflowException("Probe failed, but could not determine which formats to retry.") + # Rename failed files to allow for a fresh download attempt + for f in failed_files: + try: + failed_path = f"{f}.probe_failed_{int(time.time())}" + os.rename(f, failed_path) + logger.info(f"Renamed corrupted file to {failed_path}") + except OSError as rename_err: + logger.error(f"Could not rename corrupted file '{f}': {rename_err}") - # Rename failed files to allow for a fresh download attempt - for f in failed_files: - try: - failed_path = f"{f}.probe_failed_{int(time.time())}" - os.rename(f, failed_path) - logger.info(f"Renamed corrupted file to {failed_path}") - except OSError as rename_err: - logger.error(f"Could not rename corrupted file '{f}': {rename_err}") + # --- Retry Download and Probe --- + retried_successful_files, retried_failed_files = _download_and_probe_formats(formats_to_download_retry) - # --- Retry Download and Probe --- - retried_successful_files, retried_failed_files = _download_and_probe_formats(formats_to_download_retry) + if retried_failed_files: + logger.error(f"Probe failed again for {len(retried_failed_files)} file(s) after retry: {retried_failed_files}") - if retried_failed_files: - logger.error(f"Probe failed again for {len(retried_failed_files)} file(s) after retry: {retried_failed_files}") + final_success_list = successful_files + retried_successful_files + logger.info(f"Retry complete. Final success count: {len(final_success_list)} file(s).") - final_success_list = successful_files + retried_successful_files if not final_success_list: - raise AirflowException("All files failed to download or probe correctly, even after retry.") - - logger.info(f"Retry complete. Final success count: {len(final_success_list)} file(s).") + raise AirflowException("Download and probe process completed but produced no valid files.") if params.get('yt_dlp_cleanup_mode', True): logger.info(f"Cleanup mode is enabled. Creating .empty files and deleting originals for {len(final_success_list)} files.") @@ -567,6 +608,35 @@ def download_and_probe(token_data: dict, available_formats: list[str], **context logger.error(f"Error during cleanup for file {f}: {e}", exc_info=True) # Do not fail the task for a cleanup error, just log it. + # --- Move completed job directory to final destination --- + try: + video_id = _extract_video_id(original_url) + if not video_id: + logger.error(f"Could not extract video_id from URL '{original_url}' for final move. Skipping.") + else: + source_dir = download_dir # This is the job_dir_path + + # Group downloads into 10-minute batch folders based on completion time. + now = datetime.now() + rounded_minute = (now.minute // 10) * 10 + timestamp_str = now.strftime('%Y%m%dT%H') + f"{rounded_minute:02d}" + + final_dir_base = os.path.join(Variable.get('DOWNLOADS_TEMP', '/opt/airflow/downloadfiles'), 'videos', 'ready', timestamp_str) + final_dir_path = os.path.join(final_dir_base, video_id) + + os.makedirs(final_dir_base, exist_ok=True) + + logger.info(f"Moving completed job from '{source_dir}' to final destination '{final_dir_path}'") + if os.path.exists(final_dir_path): + logger.warning(f"Destination '{final_dir_path}' already exists. It will be removed and replaced.") + shutil.rmtree(final_dir_path) + + shutil.move(source_dir, final_dir_path) + logger.info(f"Successfully moved job to '{final_dir_path}'.") + except Exception as e: + logger.error(f"Failed to move completed job directory: {e}", exc_info=True) + # Do not fail the task for a move error, just log it. + return final_success_list @task @@ -799,7 +869,7 @@ with DAG( 'redis_conn_id': Param(DEFAULT_REDIS_CONN_ID, type="string"), 'machine_id': Param(None, type=["string", "null"]), 'clients': Param('mweb,web_camoufox,tv', type="string", description="Comma-separated list of clients for token generation. e.g. mweb,tv,web_camoufox"), - 'output_path_template': Param("%(title)s [%(id)s].f%(format_id)s.%(ext)s", type="string", title="[Worker Param] Output Path Template", description="Output filename template for yt-dlp. It is highly recommended to include `%(format_id)s` to prevent filename collisions when downloading multiple formats."), + 'output_path_template': Param("%(id)s.f%(format_id)s.%(ext)s", type="string", title="[Worker Param] Output Path Template", description="Output filename template for yt-dlp. It is highly recommended to include `%(format_id)s` to prevent filename collisions when downloading multiple formats."), 'retry_on_probe_failure': Param(False, type="boolean"), 'skip_probe': Param(False, type="boolean", title="[Worker Param] Skip Probe", description="If True, skips the ffmpeg probe of downloaded files."), 'yt_dlp_cleanup_mode': Param(True, type="boolean", title="[Worker Param] yt-dlp Cleanup Mode", description="If True, creates a .empty file and deletes the original media file after successful download and probe."), diff --git a/airflow/dags/ytdlp_s3_uploader.py b/airflow/dags/ytdlp_s3_uploader.py new file mode 100644 index 0000000..a3ef030 --- /dev/null +++ b/airflow/dags/ytdlp_s3_uploader.py @@ -0,0 +1,417 @@ +# -*- coding: utf-8 -*- +""" +DAG to upload completed video directories to an S3-compatible service. +This DAG creates one long-running task for each configured S3 worker. +""" + +from __future__ import annotations + +import logging +import os +import shutil +import subprocess +import time +from datetime import datetime, timedelta + +from airflow.decorators import task +from airflow.exceptions import AirflowException +from airflow.models.dag import DAG +from airflow.models.param import Param +from airflow.models.variable import Variable +from airflow.operators.dummy import DummyOperator +from airflow.providers.amazon.aws.hooks.s3 import S3Hook +from airflow.utils.dates import days_ago + +logger = logging.getLogger(__name__) + +DEFAULT_ARGS = { + 'owner': 'airflow', + 'retries': 1, + 'retry_delay': timedelta(minutes=1), +} + +BASE_DOWNLOAD_PATH = '/opt/airflow/downloadfiles' +VIDEOS_PATH = os.path.join(BASE_DOWNLOAD_PATH, 'videos') +READY_PATH = os.path.join(VIDEOS_PATH, 'ready') + +def run_s3_upload_batch(**context): + """ + This function runs in a continuous loop to check for completed video directories and upload them to S3. + If no videos are found, it sleeps for a configurable interval before checking again. + Dry run mode is non-destructive and will pause briefly after checking to prevent tight loops. + """ + params = context['params'] + concurrency = params['concurrency'] + mode = params['mode'] + dry_run = params['dry_run'] + sleep_interval_min = params['sleep_if_no_videos_min'] + sleep_interval_sec = sleep_interval_min * 60 + s3_conn_id = params['s3_conn_id'] + + s3_access_key_id = None + s3_secret_access_key = None + s3_endpoint = None + s3_bucket = None + s3_region = None + config_source = "Unknown" + profile_name = "rusonyx" + + # --- Attempt 1: Get S3 Configuration from Airflow Connection --- + if s3_conn_id: + try: + logger.info(f"Attempting to load S3 configuration from Airflow connection '{s3_conn_id}'.") + s3_hook = S3Hook(aws_conn_id=s3_conn_id) + s3_conn = s3_hook.get_connection(s3_conn_id) + + s3_access_key_id = s3_conn.login + s3_secret_access_key = s3_conn.password + s3_endpoint = s3_conn.host + + extra_config = s3_conn.extra_dejson + s3_bucket = extra_config.get('bucket') + s3_region = extra_config.get('region_name') + + if not all([s3_access_key_id, s3_secret_access_key, s3_endpoint, s3_bucket, s3_region]): + logger.warning("S3 connection from Airflow is missing one or more required fields. Will attempt to fall back to environment variables.") + s3_access_key_id = s3_secret_access_key = s3_endpoint = s3_bucket = s3_region = None # Reset all + else: + config_source = f"Airflow Connection '{s3_conn_id}'" + profile_name = "rusonyx-airflow" + + except Exception as e: + logger.warning(f"Failed to load S3 configuration from Airflow connection '{s3_conn_id}': {e}. Will attempt to fall back to environment variables.") + + # --- Attempt 2: Fallback to Environment Variables --- + if not all([s3_access_key_id, s3_secret_access_key, s3_endpoint, s3_bucket, s3_region]): + try: + logger.info("Attempting to load S3 configuration from environment variables as a fallback.") + s3_access_key_id = os.environ['S3_DELIVERY_AWS_ACCESS_KEY_ID'] + s3_secret_access_key = os.environ['S3_DELIVERY_AWS_SECRET_ACCESS_KEY'] + s3_endpoint = os.environ['S3_DELIVERY_ENDPOINT'] + s3_bucket = os.environ['S3_DELIVERY_BUCKET'] + s3_region = os.environ['S3_DELIVERY_AWS_REGION'] + + if not all([s3_access_key_id, s3_secret_access_key, s3_endpoint, s3_bucket, s3_region]): + raise ValueError("One or more S3 configuration environment variables are empty.") + config_source = "Environment Variables" + profile_name = "rusonyx" + + except (KeyError, ValueError) as e: + logger.error(f"Having problems reading S3 configuration from environment variables: {e}", exc_info=True) + raise AirflowException("S3 configuration is missing. Could not load from Airflow connection or environment variables.") + + s3_destination = f"s3://{s3_bucket}/" + + logger.info(f"Starting S3 upload loop. Watching source '{READY_PATH}' for delivery to '{s3_destination}'.") + logger.info(f"Mode: {mode}, Dry Run: {dry_run}, Idle Sleep: {sleep_interval_min} min") + logger.info(f"S3 Config loaded from {config_source}: Endpoint='{s3_endpoint}', Bucket='{s3_bucket}', Region='{s3_region}', Profile='{profile_name}'") + + # --- Write credentials to file for s5cmd profile --- + aws_credentials_path = os.path.expanduser("~/.aws/credentials") + aws_config_path = os.path.expanduser("~/.aws/config") + + try: + os.makedirs(os.path.dirname(aws_credentials_path), exist_ok=True) + + with open(aws_credentials_path, 'w') as f: + f.write(f"[{profile_name}]\n") + f.write(f"aws_access_key_id = {s3_access_key_id}\n") + f.write(f"aws_secret_access_key = {s3_secret_access_key}\n") + logger.info(f"Wrote credentials for profile '{profile_name}' to {aws_credentials_path}") + + with open(aws_config_path, 'w') as f: + f.write(f"[profile {profile_name}]\n") + f.write(f"region = {s3_region}\n") + logger.info(f"Wrote config for profile '{profile_name}' to {aws_config_path}") + + except Exception as e: + logger.error(f"Failed to write AWS credentials/config file: {e}", exc_info=True) + raise AirflowException(f"Failed to write AWS credentials/config file: {e}") + + while True: + logger.info("--- Starting new S3 upload cycle ---") + + # --- Dry Run Logic (Non-destructive) --- + if dry_run: + logger.info("[DRY RUN] Checking for completed video batches...") + if not os.path.exists(READY_PATH): + logger.info(f"[DRY RUN] Source directory '{READY_PATH}' does not exist. Nothing to upload.") + else: + now = datetime.now() + wait_minutes = params['batch_completion_wait_min'] + cutoff_time = now - timedelta(minutes=wait_minutes) + rounded_minute = (cutoff_time.minute // 10) * 10 + cutoff_batch_ts = cutoff_time.strftime('%Y%m%dT%H') + f"{rounded_minute:02d}" + logger.info(f"[DRY RUN] Current time is {now.strftime('%H:%M:%S')}. With a {wait_minutes} min wait, processing batches up to and including '{cutoff_batch_ts}'.") + + all_video_dirs_to_process = [] + processed_batch_dirs = set() + all_batch_dirs = sorted([d for d in os.listdir(READY_PATH) if os.path.isdir(os.path.join(READY_PATH, d))]) + + for ts_dir in all_batch_dirs: + if ts_dir > cutoff_batch_ts: + continue + + batch_dir_path = os.path.join(READY_PATH, ts_dir) + video_dirs_in_batch = [os.path.join(batch_dir_path, d) for d in os.listdir(batch_dir_path) if os.path.isdir(os.path.join(batch_dir_path, d))] + + if video_dirs_in_batch: + all_video_dirs_to_process.extend(video_dirs_in_batch) + processed_batch_dirs.add(batch_dir_path) + else: + logger.info(f"[DRY RUN] Batch directory '{batch_dir_path}' is empty. Would remove it.") + + if all_video_dirs_to_process: + logger.info(f"[DRY RUN] Found {len(all_video_dirs_to_process)} total video director(y/ies) in {len(processed_batch_dirs)} batch(es) to process.") + + # Construct and log the command that would be run + cmd = [ + 's5cmd', '--endpoint-url', s3_endpoint, '--log', 'debug', '--no-verify-ssl', + '--use-list-objects-v1', '--profile', profile_name, '--stat', + '--numworkers', str(concurrency), 'run' + ] + cmd_str = ' '.join(cmd) + + # Construct the commands to be piped + commands_to_pipe = '\n'.join([f"cp \"{dir_path}\" \"{s3_destination}\"" for dir_path in all_video_dirs_to_process]) + + logger.info(f"[DRY RUN] The following command would be executed:\n{cmd_str}") + logger.info(f"[DRY RUN] The following commands would be piped to stdin:\n{commands_to_pipe}") + + if mode == 'mv': + logger.info(f"[DRY RUN] Mode is 'mv'. Would delete {len(processed_batch_dirs)} source batch directories after successful upload.") + + # Pause briefly in dry-run mode if videos are found to avoid a fast, noisy loop. + dry_run_pause_s = 10 + logger.info(f"[DRY RUN] Pausing for {dry_run_pause_s} seconds to prevent rapid re-listing of the same files (this is a short, fixed pause for dry-run only).") + time.sleep(dry_run_pause_s) + continue # Go to the start of the next cycle + else: + logger.info("[DRY RUN] No completed video batches found.") + + # If in dry-run and no videos are found, sleep for the main interval. + logger.info(f"[DRY RUN] Sleeping for {sleep_interval_min} minute(s)...") + time.sleep(sleep_interval_sec) + continue + + # --- Normal Operation Logic (Destructive) --- + work_done_in_cycle = False + try: + # --- 1. Find all videos to upload from all completed batches --- + if not os.path.exists(READY_PATH): + logger.info(f"Ready directory '{READY_PATH}' does not exist. Nothing to upload.") + else: + now = datetime.now() + wait_minutes = params['batch_completion_wait_min'] + cutoff_time = now - timedelta(minutes=wait_minutes) + rounded_minute = (cutoff_time.minute // 10) * 10 + cutoff_batch_ts = cutoff_time.strftime('%Y%m%dT%H') + f"{rounded_minute:02d}" + logger.info(f"Current time is {now.strftime('%H:%M:%S')}. With a {wait_minutes} min wait, processing batches up to and including '{cutoff_batch_ts}'.") + + all_video_dirs_to_process = [] + processed_batch_dirs = set() + all_batch_dirs = sorted([d for d in os.listdir(READY_PATH) if os.path.isdir(os.path.join(READY_PATH, d))]) + + for ts_dir in all_batch_dirs: + if ts_dir > cutoff_batch_ts: + continue # This batch is not old enough to be processed + + batch_dir_path = os.path.join(READY_PATH, ts_dir) + video_dirs_in_batch = [os.path.join(batch_dir_path, d) for d in os.listdir(batch_dir_path) if os.path.isdir(os.path.join(batch_dir_path, d))] + + if not video_dirs_in_batch: + logger.info(f"Batch directory '{batch_dir_path}' is empty. Removing it.") + try: + os.rmdir(batch_dir_path) + except OSError as e: + logger.error(f"Could not remove empty batch directory {batch_dir_path}: {e}") + continue # Move to the next batch + + all_video_dirs_to_process.extend(video_dirs_in_batch) + processed_batch_dirs.add(batch_dir_path) + + # --- 2. Upload All Found Videos in a Single Batch Command --- + if all_video_dirs_to_process: + work_done_in_cycle = True + logger.info(f"Found {len(all_video_dirs_to_process)} total video director(y/ies) in {len(processed_batch_dirs)} batch(es) to upload.") + + cmd = [ + 's5cmd', '--endpoint-url', s3_endpoint, '--log', 'debug', '--no-verify-ssl', + '--use-list-objects-v1', '--profile', profile_name, '--stat', + '--numworkers', str(concurrency), 'run' + ] + cmd_str = ' '.join(cmd) + + # Construct the commands to be piped to stdin + commands_to_pipe = '\n'.join([f"cp \"{dir_path}\" \"{s3_destination}\"" for dir_path in all_video_dirs_to_process]) + + logger.info(f"Executing s5cmd batch command:\n{cmd_str}") + logger.info(f"Piping {len(all_video_dirs_to_process)} 'cp' commands to stdin.") + + upload_start_time = time.time() + process = subprocess.run(cmd, check=True, capture_output=True, text=True, input=commands_to_pipe) + upload_duration = time.time() - upload_start_time + + logger.info(f"s5cmd STDOUT: {process.stdout}") + if process.stderr: + logger.info(f"s5cmd STDERR: {process.stderr}") + logger.info(f"Upload command completed successfully in {upload_duration:.2f} seconds.") + logger.info(f"Successfully copied {len(all_video_dirs_to_process)} director(y/ies) to S3.") + + # --- 3. Cleanup --- + if mode == 'mv': + logger.info(f"Mode is 'mv'. Cleaning up {len(processed_batch_dirs)} source batch director(y/ies).") + cleanup_start_time = time.time() + + # Create a temporary empty directory to use as a source for rsync deletion + empty_dir_for_rsync = os.path.join(READY_PATH, f"__empty_{int(time.time())}") + os.makedirs(empty_dir_for_rsync, exist_ok=True) + + try: + for batch_dir_path in processed_batch_dirs: + try: + # Use rsync with an empty source to efficiently delete the contents of the batch directory + # The trailing slash on both source and destination is important. + rsync_cmd = [ + 'rsync', + '-a', '--delete', + f'{empty_dir_for_rsync}/', + f'{batch_dir_path}/' + ] + subprocess.run(rsync_cmd, check=True, capture_output=True, text=True) + + # After the contents are deleted, remove the now-empty directory + os.rmdir(batch_dir_path) + logger.info(f"Successfully removed {batch_dir_path}") + except Exception as cleanup_e: + logger.error(f"Failed to remove directory {batch_dir_path}: {cleanup_e}", exc_info=True) + if isinstance(cleanup_e, subprocess.CalledProcessError): + logger.error(f"rsync STDERR: {cleanup_e.stderr}") + finally: + # Clean up the temporary empty directory + shutil.rmtree(empty_dir_for_rsync) + + cleanup_duration = time.time() - cleanup_start_time + logger.info(f"Cleanup complete in {cleanup_duration:.2f} seconds.") + else: # mode == 'cp' + logger.info(f"Mode is 'cp'. Source directories will be left for inspection.") + + if not work_done_in_cycle: + logger.info(f"No completed video batches found in '{READY_PATH}'.") + + except Exception as e: + logger.error(f"An error occurred during the S3 upload cycle: {e}", exc_info=True) + if isinstance(e, subprocess.CalledProcessError): + logger.error(f"s5cmd STDERR: {e.stderr}") + # On error, we do NOT clean up, to allow for investigation and retries. + # The failed directories will be picked up in the next cycle. + # Treat errors as "no work done" to trigger sleep and prevent fast failure loops + work_done_in_cycle = False + + # --- Loop Control --- + if not work_done_in_cycle: + logger.info(f"No work done in this cycle. Sleeping for {sleep_interval_min} minute(s)...") + time.sleep(sleep_interval_sec) + else: + logger.info("Work was completed in this cycle. Checking for more immediately.") + +with DAG( + dag_id='ytdlp_s3_uploader', + default_args=DEFAULT_ARGS, + schedule=None, + start_date=days_ago(1), + catchup=False, + tags=['ytdlp', 's3', 'upload'], + doc_md="""### S3 Uploader DAG + +1. This DAG creates dynamic uploader tasks with clear names depicting their worker machine (e.g., `upload_batch_on_dl001`). +2. Ansible updates an Airflow Variable named `s3_worker_hostnames` with a JSON list of all active uploader workers (typically dlXXX machines). Each worker listens to its own queue (e.g., `queue-dl-dl001`). +3. This DAG reads the variable on manual trigger or after a pause/resume cycle to create the dynamic tasks. This allows for easy inspection of per-worker logs and status from the Airflow UI. +4. Each dynamic task watches a shared folder (`/opt/airflow/downloadfiles/videos/ready`). Download workers place completed videos into timestamped sub-folders (e.g., `20241122T1050`). The uploader processes these 10-minute batches, copying them to S3 with `s5cmd` and then deleting the source directories. This design avoids race conditions and improves performance. + """, + params={ + 'mode': Param( + 'mv', type="string", enum=['cp', 'mv'], title="Operation Mode", + description="`mv` (move): After a successful upload, the temporary batch directory is deleted. This is the standard behavior. `cp` (copy): The temporary batch directory is left intact for debugging; it will be cleaned up on the next run." + ), + 'dry_run': Param( + True, type="boolean", title="Dry Run", + description="If True, the DAG will perform all steps except the actual upload and cleanup. `s5cmd` will be run with `--dry-run`, and the final directory removal will be skipped. Log messages will indicate what would have happened." + ), + 'concurrency': Param(10, type="integer", title="s5cmd Concurrency"), + 'sleep_if_no_videos_min': Param(10, type="integer", title="Sleep if Idle (minutes)", description="How many minutes the task should sleep if no videos are found to upload."), + 'batch_completion_wait_min': Param(0, type="integer", title="Batch Completion Wait (minutes)", description="How many minutes to wait after a 10-minute batch window closes before considering it for upload. Default is 0, which processes the current batch immediately. A value of 10 restores the old behavior of waiting for the next 10-minute window."), + 's3_conn_id': Param('s3_delivery_connection', type="string", title="S3 Connection ID", description="The Airflow connection ID for the S3-compatible storage. If this connection is invalid or missing, the task will fall back to environment variables."), + } +) as dag: + + # Dynamically create one task per S3 worker hostname + # IMPORTANT: The tasks are created when this DAG file is parsed by the Airflow Scheduler. + # If you add/change the 's3_worker_hostnames' Airflow Variable, you may need to + # wait a few minutes for the scheduler to re-parse the file and update the tasks. + # Forcing a re-parse can be done by pausing and un-pausing the DAG in the UI. + s3_worker_hostnames = [] # Initialize to be safe + try: + # The variable should be a JSON list of strings, e.g., ["s3-001", "s3-002"] + s3_worker_hostnames = Variable.get("s3_worker_hostnames", deserialize_json=True, default_var=[]) + logger.info(f"DAG 'ytdlp_s3_uploader' successfully loaded s3_worker_hostnames variable. Value: {s3_worker_hostnames}") + if not isinstance(s3_worker_hostnames, list): + logger.error(f"Airflow Variable 's3_worker_hostnames' is not a valid JSON list. Value: {s3_worker_hostnames}") + s3_worker_hostnames = [] # Reset to empty to prevent errors + except Exception as e: + logger.error( + f"Could not read or parse Airflow Variable 's3_worker_hostnames'. " + f"Please create it in the Airflow UI as a JSON list of your S3 worker hostnames (e.g., [\"s3-001\"]). " + f"No S3 worker tasks will be created. Error: {e}", + exc_info=True + ) + s3_worker_hostnames = [] + + @task(task_id='check_s3_worker_configuration') + def check_s3_worker_configuration_callable(): + """Logs the current value of the s3_worker_hostnames variable at runtime for debugging.""" + logger.info("--- S3 Worker Configuration Check (at runtime) ---") + try: + hostnames = Variable.get("s3_worker_hostnames", deserialize_json=True, default_var=None) + if hostnames is None: + logger.error("Airflow Variable 's3_worker_hostnames' is not defined.") + logger.info("Please create it in the Airflow UI (Admin -> Variables) as a JSON list of strings, e.g., [\"s3-worker-01\"]") + elif not isinstance(hostnames, list): + logger.error(f"Airflow Variable 's3_worker_hostnames' is not a valid JSON list. Current value: {hostnames}") + elif not hostnames: + logger.warning("Airflow Variable 's3_worker_hostnames' is defined but is an empty list []. No worker tasks will be run.") + else: + logger.info(f"Successfully read 's3_worker_hostnames'. It contains {len(hostnames)} worker(s): {hostnames}") + logger.info("If you see this task but no worker tasks in the UI, it means the DAG did not find these workers when it was parsed by the scheduler.") + logger.info("This can happen due to caching. Please wait a few minutes for the scheduler to re-parse the DAG file, or pause/un-pause the DAG.") + + except Exception as e: + logger.error(f"An error occurred while trying to read the 's3_worker_hostnames' variable at runtime: {e}", exc_info=True) + logger.info("--- End of Configuration Check ---") + + check_s3_worker_configuration_task = check_s3_worker_configuration_callable() + check_s3_worker_configuration_task.doc_md = """ + ### S3 Worker Configuration Check + + This task runs at the start of every DAG run to check the `s3_worker_hostnames` Airflow Variable. + + The dynamic worker tasks are created based on this variable *at the time the DAG is parsed by the scheduler*. + + **Check the logs for this task to see the current value of the variable as read at runtime.** This can help diagnose why worker tasks may not have been created. + + If the logs show the variable is correct but you don't see the worker tasks in the UI, you may need to wait for the scheduler to re-parse the DAG file. You can force this by pausing and un-pausing the DAG. + """ + if s3_worker_hostnames: + worker_tasks = [] + for hostname in s3_worker_hostnames: + # Sanitize hostname for task_id + task_id_hostname = hostname.replace('.', '_') + + # Create a task for each worker, pinned to its specific queue + upload_task = task( + task_id=f'upload_batch_on_{task_id_hostname}', + queue=f'queue-s3-{hostname}' + )(run_s3_upload_batch)() + worker_tasks.append(upload_task) + + check_s3_worker_configuration_task >> worker_tasks diff --git a/airflow/inputfiles/urls.rt.txt b/airflow/inputfiles/urls.rt.txt new file mode 100644 index 0000000..0f6d9a5 --- /dev/null +++ b/airflow/inputfiles/urls.rt.txt @@ -0,0 +1,3767 @@ +https://www.youtube.com/watch?v=W_ovLaoQ5pI +https://www.youtube.com/watch?v=KnDAl7BqOq0 +https://www.youtube.com/watch?v=Ixwy1_Y1wPE +https://www.youtube.com/watch?v=oYHN2vgcpls +https://www.youtube.com/watch?v=WwYtzky4mjs +https://www.youtube.com/watch?v=dc7-aDyAeL4 +https://www.youtube.com/watch?v=XQDrjYTFVfE +https://www.youtube.com/watch?v=F0s9IJR4CN4 +https://www.youtube.com/watch?v=qrZ7RVXHdzo +https://www.youtube.com/watch?v=gwOjcuexMWU +https://www.youtube.com/watch?v=B4gVYr_9XP4 +https://www.youtube.com/watch?v=9bjUH5xViPE +https://www.youtube.com/watch?v=kbVZoqBfjCo +https://www.youtube.com/watch?v=hWXnlqOatS8 +https://www.youtube.com/watch?v=0izQuMMfIIo +https://www.youtube.com/watch?v=1x32zwHrg8s +https://www.youtube.com/watch?v=uzU1fxHS2dU +https://www.youtube.com/watch?v=qckyrafr4W4 +https://www.youtube.com/watch?v=tuvMl-Gbs1E +https://www.youtube.com/watch?v=uByH48D79KI +https://www.youtube.com/watch?v=qJ9qia29Kwk +https://www.youtube.com/watch?v=17DIjWMYBNs +https://www.youtube.com/watch?v=Ex9z0iIVluU +https://www.youtube.com/watch?v=DJP67SSAM9A +https://www.youtube.com/watch?v=OUe2oNykheg +https://www.youtube.com/watch?v=CgpuKqQl1tU +https://www.youtube.com/watch?v=4RNiyOZexag +https://www.youtube.com/watch?v=d4d8B-axCJU +https://www.youtube.com/watch?v=AMkVydmdLDU +https://www.youtube.com/watch?v=s6D1xf3VCCs +https://www.youtube.com/watch?v=ns1u61Zrzzk +https://www.youtube.com/watch?v=Ysqesg9CQ94 +https://www.youtube.com/watch?v=_VvNRtc3K0w +https://www.youtube.com/watch?v=zt-wA67nfJA +https://www.youtube.com/watch?v=bProjpkgXn8 +https://www.youtube.com/watch?v=8Gb8ccijtxI +https://www.youtube.com/watch?v=iFJJ_7_SUns +https://www.youtube.com/watch?v=9HBlnMlGSpI +https://www.youtube.com/watch?v=ioTF6x9mhz0 +https://www.youtube.com/watch?v=k1pdrHKb3P4 +https://www.youtube.com/watch?v=wprhAP6S7MY +https://www.youtube.com/watch?v=WFKKd_o89wI +https://www.youtube.com/watch?v=w59IixVPPUs +https://www.youtube.com/watch?v=9XeYW0l7JKU +https://www.youtube.com/watch?v=HGSIM6WiIMo +https://www.youtube.com/watch?v=SGXZJ8z8QHg +https://www.youtube.com/watch?v=IsqDx71KLyo +https://www.youtube.com/watch?v=NXOHkWf_sTY +https://www.youtube.com/watch?v=ICYe8ZSy0LQ +https://www.youtube.com/watch?v=GMKd0gjPCsU +https://www.youtube.com/watch?v=fbZYCKUCJs4 +https://www.youtube.com/watch?v=br1jufv9rW0 +https://www.youtube.com/watch?v=Y_flpHI4uEw +https://www.youtube.com/watch?v=FlVTAEpf53s +https://www.youtube.com/watch?v=fN6olULFwTA +https://www.youtube.com/watch?v=EsXZIyx9fmc +https://www.youtube.com/watch?v=s-TQlPdyoiE +https://www.youtube.com/watch?v=GyczQSFPTfQ +https://www.youtube.com/watch?v=ER1qbc1pMzs +https://www.youtube.com/watch?v=ceyVCBX-wGc +https://www.youtube.com/watch?v=BcNvEGIWolk +https://www.youtube.com/watch?v=15idHcwUAfk +https://www.youtube.com/watch?v=WrC6SRasFnU +https://www.youtube.com/watch?v=lBzdu8tLe-I +https://www.youtube.com/watch?v=T7U3BOIwVNc +https://www.youtube.com/watch?v=o9wi6Tt4Z3w +https://www.youtube.com/watch?v=rDKH2dhVE_c +https://www.youtube.com/watch?v=hgzkDHhImoI +https://www.youtube.com/watch?v=3Nz1Vym36ak +https://www.youtube.com/watch?v=TCwcSAZkppc +https://www.youtube.com/watch?v=btS5Kzy_zB0 +https://www.youtube.com/watch?v=csimc-rbrhE +https://www.youtube.com/watch?v=TQymjBogMlw +https://www.youtube.com/watch?v=iMkXhj31UKQ +https://www.youtube.com/watch?v=T0Gdsnmffro +https://www.youtube.com/watch?v=2z6HSIypJ_w +https://www.youtube.com/watch?v=oX_3TTyEnKk +https://www.youtube.com/watch?v=89yqiHuBvQQ +https://www.youtube.com/watch?v=eLympVyGQQI +https://www.youtube.com/watch?v=Gy67TZyPn2Q +https://www.youtube.com/watch?v=qw8437Em-3k +https://www.youtube.com/watch?v=z7Y8KiT7bPk +https://www.youtube.com/watch?v=ojJhtn1mEGg +https://www.youtube.com/watch?v=D1Cic7Uc0ns +https://www.youtube.com/watch?v=-63519KiUqM +https://www.youtube.com/watch?v=qJfHfBR20-g +https://www.youtube.com/watch?v=QwbNv-bG9oA +https://www.youtube.com/watch?v=nwfiyKx9x18 +https://www.youtube.com/watch?v=L3aPsthTBW8 +https://www.youtube.com/watch?v=zjfCX6bpUFg +https://www.youtube.com/watch?v=2hdR_bpvjDM +https://www.youtube.com/watch?v=leoxUrT9DJg +https://www.youtube.com/watch?v=fongJ-r7Uac +https://www.youtube.com/watch?v=vas0e7e8bmI +https://www.youtube.com/watch?v=MRrUq0oqFmo +https://www.youtube.com/watch?v=lgWMCCYXqGg +https://www.youtube.com/watch?v=hwqXFvpujRs +https://www.youtube.com/watch?v=V3ZWVvrmPvw +https://www.youtube.com/watch?v=gP2QkIJaQHE +https://www.youtube.com/watch?v=7U1Q4tscmUU +https://www.youtube.com/watch?v=T5oO9HYyT_8 +https://www.youtube.com/watch?v=N7St23woljA +https://www.youtube.com/watch?v=_iWSQ3XD_eQ +https://www.youtube.com/watch?v=ev1urHanjCo +https://www.youtube.com/watch?v=ebvVkT_gHOQ +https://www.youtube.com/watch?v=IUrylOsLD6A +https://www.youtube.com/watch?v=aJ2DWpOhM98 +https://www.youtube.com/watch?v=HldN0Atn5LA +https://www.youtube.com/watch?v=f6eY71i7TfI +https://www.youtube.com/watch?v=m1A5aOGYGM8 +https://www.youtube.com/watch?v=US0in27JPv4 +https://www.youtube.com/watch?v=SWAWTrsXH5E +https://www.youtube.com/watch?v=0K6F8TJowCw +https://www.youtube.com/watch?v=O-uAmbRDCjQ +https://www.youtube.com/watch?v=TdqayW3Yhus +https://www.youtube.com/watch?v=mZ1Gieg2PbU +https://www.youtube.com/watch?v=D7DoRpB_p7g +https://www.youtube.com/watch?v=y2j03DYoC9k +https://www.youtube.com/watch?v=H6UwY_jvIkg +https://www.youtube.com/watch?v=jPHdMovcsno +https://www.youtube.com/watch?v=Ui9ioQhlYB8 +https://www.youtube.com/watch?v=16A9rW-bYOw +https://www.youtube.com/watch?v=0HjKLqPZlk8 +https://www.youtube.com/watch?v=KFcUjf9pJzE +https://www.youtube.com/watch?v=qslMthxSRWU +https://www.youtube.com/watch?v=Jt7haujk3sk +https://www.youtube.com/watch?v=MJK7NX0E2_4 +https://www.youtube.com/watch?v=OMdjNk3aQdk +https://www.youtube.com/watch?v=n4HCQrbYc_w +https://www.youtube.com/watch?v=3gFC-igZPr8 +https://www.youtube.com/watch?v=aqS6aduySeo +https://www.youtube.com/watch?v=ylLsucs0PRY +https://www.youtube.com/watch?v=-hIPIMAAk9E +https://www.youtube.com/watch?v=SHjD3xOkWac +https://www.youtube.com/watch?v=FxiWcpW1hOc +https://www.youtube.com/watch?v=s-wpgAK-fzg +https://www.youtube.com/watch?v=82XT7UQbF-w +https://www.youtube.com/watch?v=4bsjF-d9ODc +https://www.youtube.com/watch?v=LPfOH1_9gYU +https://www.youtube.com/watch?v=ITD6zT6SNZo +https://www.youtube.com/watch?v=mBSP343k7Xk +https://www.youtube.com/watch?v=SpXgj9PI1FI +https://www.youtube.com/watch?v=xkiqMGZEYbc +https://www.youtube.com/watch?v=ph2UXTChSsw +https://www.youtube.com/watch?v=Lq0cra_cqLc +https://www.youtube.com/watch?v=W1SS9Yt4PNI +https://www.youtube.com/watch?v=yV5g1sufBVI +https://www.youtube.com/watch?v=y7jNwdmysbo +https://www.youtube.com/watch?v=3i4Q9EgSuA8 +https://www.youtube.com/watch?v=-j7C5MfDXrA +https://www.youtube.com/watch?v=BkSglsAO7-w +https://www.youtube.com/watch?v=05dqwprWsnc +https://www.youtube.com/watch?v=b2xwjdv5nxY +https://www.youtube.com/watch?v=06RshyLtUic +https://www.youtube.com/watch?v=Mm1DH0lAtQs +https://www.youtube.com/watch?v=OfxsLW1ZUsk +https://www.youtube.com/watch?v=_AZs4CG7CbA +https://www.youtube.com/watch?v=RzZRssOgH7A +https://www.youtube.com/watch?v=Mqe8ZhqIISI +https://www.youtube.com/watch?v=6w0qYD46Afo +https://www.youtube.com/watch?v=YVtFh0283YU +https://www.youtube.com/watch?v=jCCH685ldpg +https://www.youtube.com/watch?v=Ut1_9Ma9fZg +https://www.youtube.com/watch?v=pjV_fCpJgLc +https://www.youtube.com/watch?v=a4NtRH9sZLk +https://www.youtube.com/watch?v=XjVj9wipu70 +https://www.youtube.com/watch?v=CWMhNCPMXeI +https://www.youtube.com/watch?v=MC9YYtWLadQ +https://www.youtube.com/watch?v=7yI1tP5oWQw +https://www.youtube.com/watch?v=wxh9zh-ygig +https://www.youtube.com/watch?v=Ul3JY18tiJ0 +https://www.youtube.com/watch?v=suj-r9RCMGY +https://www.youtube.com/watch?v=AbL6ZGOjc_M +https://www.youtube.com/watch?v=VGjHw351GdU +https://www.youtube.com/watch?v=32W16gzB3E8 +https://www.youtube.com/watch?v=PTujVtVZD-c +https://www.youtube.com/watch?v=SFbnmsMa_i0 +https://www.youtube.com/watch?v=X_FpFtE9mGM +https://www.youtube.com/watch?v=g6xy8KXaxDE +https://www.youtube.com/watch?v=UO6BR3rXpHs +https://www.youtube.com/watch?v=-a14SXc9ERk +https://www.youtube.com/watch?v=Hl73pJhS1Jk +https://www.youtube.com/watch?v=wXgLpByOcos +https://www.youtube.com/watch?v=FH3nQzkKc08 +https://www.youtube.com/watch?v=wFYAbEfajd0 +https://www.youtube.com/watch?v=zcyM1HzB4OY +https://www.youtube.com/watch?v=cLXZ9INHYyI +https://www.youtube.com/watch?v=Iq7Sjbcw5Ek +https://www.youtube.com/watch?v=kgX5IcFE2HE +https://www.youtube.com/watch?v=Dnq4p0BZ1zA +https://www.youtube.com/watch?v=bitMfdK4mAE +https://www.youtube.com/watch?v=HWqLp-gGOPw +https://www.youtube.com/watch?v=g6DFwFhfqSE +https://www.youtube.com/watch?v=81VXi1v_6Gg +https://www.youtube.com/watch?v=sCf09W7u_as +https://www.youtube.com/watch?v=MIRmwYQ0pnw +https://www.youtube.com/watch?v=dT0PJCDY-WY +https://www.youtube.com/watch?v=Tia6NFKI29c +https://www.youtube.com/watch?v=ZEH4XMI2gi0 +https://www.youtube.com/watch?v=JFC-hkuLwz8 +https://www.youtube.com/watch?v=xfjVsnGk92M +https://www.youtube.com/watch?v=aeF2hf_R2h0 +https://www.youtube.com/watch?v=D_j_k8nWY3g +https://www.youtube.com/watch?v=lvO8Dq1yORA +https://www.youtube.com/watch?v=tvovFzmiF6E +https://www.youtube.com/watch?v=KUsI9cxtJPU +https://www.youtube.com/watch?v=vgLVkrAnBLI +https://www.youtube.com/watch?v=M_ofMDC-FEQ +https://www.youtube.com/watch?v=O4gqva5ROqw +https://www.youtube.com/watch?v=DTgN-m3lAY4 +https://www.youtube.com/watch?v=bqgdyYcM4_Q +https://www.youtube.com/watch?v=hNCpvI-d6Fk +https://www.youtube.com/watch?v=va96DIxvE44 +https://www.youtube.com/watch?v=ZOwqc5DjkDk +https://www.youtube.com/watch?v=1i6UAXkjy9A +https://www.youtube.com/watch?v=gbaxWdn_Uq0 +https://www.youtube.com/watch?v=ygjE8I2k5m8 +https://www.youtube.com/watch?v=U6TUDhJ4KF4 +https://www.youtube.com/watch?v=-OSZqBAF-ck +https://www.youtube.com/watch?v=MXTnUTdBLaU +https://www.youtube.com/watch?v=38JAI9MIprU +https://www.youtube.com/watch?v=VE7TqzCQypI +https://www.youtube.com/watch?v=TdkXjlJiQq4 +https://www.youtube.com/watch?v=TTQ6N9GNeGo +https://www.youtube.com/watch?v=JnTv_K8ah0E +https://www.youtube.com/watch?v=kNI1tYegCZY +https://www.youtube.com/watch?v=Tc3A1vJf4Rg +https://www.youtube.com/watch?v=xBvINP1ddSo +https://www.youtube.com/watch?v=p-Z-cx-43eA +https://www.youtube.com/watch?v=0sqjAko-vgI +https://www.youtube.com/watch?v=W0i1_RaLrho +https://www.youtube.com/watch?v=2G3RFYBcHds +https://www.youtube.com/watch?v=Yirxj1qPBnU +https://www.youtube.com/watch?v=_e9JfXsM9ks +https://www.youtube.com/watch?v=V-UlKut8NbU +https://www.youtube.com/watch?v=C7D19AiYG4c +https://www.youtube.com/watch?v=Qj_u_rAgqDU +https://www.youtube.com/watch?v=ftObtlgqcFM +https://www.youtube.com/watch?v=wa02oKjBgvA +https://www.youtube.com/watch?v=yPjuAumM7g8 +https://www.youtube.com/watch?v=lpGq2LRqwAk +https://www.youtube.com/watch?v=jeD7tHfacHw +https://www.youtube.com/watch?v=CIxVCg71xZo +https://www.youtube.com/watch?v=gyKj3b-MbAQ +https://www.youtube.com/watch?v=yTCAjBGiUTg +https://www.youtube.com/watch?v=rNtMzj0thHg +https://www.youtube.com/watch?v=eDf4QdHkM5A +https://www.youtube.com/watch?v=KF7elMYIiyk +https://www.youtube.com/watch?v=tfoyuy5jQoc +https://www.youtube.com/watch?v=ZoXnm8dR3VU +https://www.youtube.com/watch?v=eGmo34B_OVo +https://www.youtube.com/watch?v=OR4pk7e4KbA +https://www.youtube.com/watch?v=cSVcsJ6jK4Y +https://www.youtube.com/watch?v=Ye1_bZGicWU +https://www.youtube.com/watch?v=n98hMqGK16k +https://www.youtube.com/watch?v=gXmfUJhgvAg +https://www.youtube.com/watch?v=ZHaZsBQzycY +https://www.youtube.com/watch?v=SfEQCvh6OmI +https://www.youtube.com/watch?v=xqe3MAkyGVc +https://www.youtube.com/watch?v=mc6BvRRyN8M +https://www.youtube.com/watch?v=wzPxLW7GZr0 +https://www.youtube.com/watch?v=zLJd9PBomIA +https://www.youtube.com/watch?v=DlLER38zpq4 +https://www.youtube.com/watch?v=lg9hBws5KS4 +https://www.youtube.com/watch?v=pSgRbPFNgj4 +https://www.youtube.com/watch?v=gX8tm4sP1qY +https://www.youtube.com/watch?v=-2EYqmuGLLM +https://www.youtube.com/watch?v=kKTq3Ndpu7E +https://www.youtube.com/watch?v=KvsOV5hHnq4 +https://www.youtube.com/watch?v=DPuK9pasFDA +https://www.youtube.com/watch?v=zQVSEIb4uJ4 +https://www.youtube.com/watch?v=AuupjeyKLnw +https://www.youtube.com/watch?v=-iDaJ1KO8A0 +https://www.youtube.com/watch?v=OheF39Zcees +https://www.youtube.com/watch?v=kqjOVTQlGrI +https://www.youtube.com/watch?v=QcLD4KdJkKA +https://www.youtube.com/watch?v=bHngc3m0Xdk +https://www.youtube.com/watch?v=Ti8ZnrOD5_0 +https://www.youtube.com/watch?v=dIUNVVnFC0U +https://www.youtube.com/watch?v=6Mc1Q7Ii55c +https://www.youtube.com/watch?v=kwxDk9nT9J4 +https://www.youtube.com/watch?v=B9WBEPkNf-w +https://www.youtube.com/watch?v=1Pt5Zrakvdg +https://www.youtube.com/watch?v=dsiu7kXFBI8 +https://www.youtube.com/watch?v=AQiIRKhgFHE +https://www.youtube.com/watch?v=geFIHaBoKaY +https://www.youtube.com/watch?v=QA4a9Db8m88 +https://www.youtube.com/watch?v=OIFU4k1f0Ec +https://www.youtube.com/watch?v=2iSBnEwWwjo +https://www.youtube.com/watch?v=VcWAOEoue1Y +https://www.youtube.com/watch?v=rdR7_4da4Js +https://www.youtube.com/watch?v=hOkvzOkipaM +https://www.youtube.com/watch?v=wLOR5mlx7VY +https://www.youtube.com/watch?v=PFcDLcK_zcY +https://www.youtube.com/watch?v=cP8Q7DIl3nI +https://www.youtube.com/watch?v=x_pJksDZSzU +https://www.youtube.com/watch?v=BeOF0c-EzIQ +https://www.youtube.com/watch?v=7PQ2uRSFd94 +https://www.youtube.com/watch?v=v_ZmsRnDmsw +https://www.youtube.com/watch?v=2Y-9Rznk8ug +https://www.youtube.com/watch?v=U6flSitpCM0 +https://www.youtube.com/watch?v=VVDf4mcyPAw +https://www.youtube.com/watch?v=m8jrjn64MVk +https://www.youtube.com/watch?v=rq8chzZeDpo +https://www.youtube.com/watch?v=e9c6Is5-XYM +https://www.youtube.com/watch?v=SxTrAm_2oT8 +https://www.youtube.com/watch?v=tSy7g2s9_eo +https://www.youtube.com/watch?v=zxs7UeUJr0s +https://www.youtube.com/watch?v=FvryEetPxrI +https://www.youtube.com/watch?v=o9qn_UHBKQ0 +https://www.youtube.com/watch?v=PBNpVOwoXLY +https://www.youtube.com/watch?v=PpMPvuSX1CY +https://www.youtube.com/watch?v=dqjASGYlWRU +https://www.youtube.com/watch?v=DGfo_K6NTwo +https://www.youtube.com/watch?v=WpUpTVFW3S4 +https://www.youtube.com/watch?v=dCgjywvszFE +https://www.youtube.com/watch?v=FuW3lMJF2zA +https://www.youtube.com/watch?v=bKaU95ceeUw +https://www.youtube.com/watch?v=Ynwqt_R3faM +https://www.youtube.com/watch?v=td70vUbqAgw +https://www.youtube.com/watch?v=9ZwKVhtzFM4 +https://www.youtube.com/watch?v=xAvwjZxkp_s +https://www.youtube.com/watch?v=FlwadWqd9jY +https://www.youtube.com/watch?v=grosmlJJpOQ +https://www.youtube.com/watch?v=8tj04EuSuR8 +https://www.youtube.com/watch?v=bCdkBP6nYrY +https://www.youtube.com/watch?v=9BbMwzKy7pY +https://www.youtube.com/watch?v=0A55FZ5R0MI +https://www.youtube.com/watch?v=S7Z5XDc5X3I +https://www.youtube.com/watch?v=sWO5gY7UbKM +https://www.youtube.com/watch?v=UrkAAASpCis +https://www.youtube.com/watch?v=iAiQBMEeeV4 +https://www.youtube.com/watch?v=XnRekopCpZ0 +https://www.youtube.com/watch?v=bnstqG8YJ-E +https://www.youtube.com/watch?v=dk5UlOS6IYI +https://www.youtube.com/watch?v=uelzEzmIhh0 +https://www.youtube.com/watch?v=gq1pUYxILOc +https://www.youtube.com/watch?v=OgXkB9S_GmA +https://www.youtube.com/watch?v=mvGD7RRehaI +https://www.youtube.com/watch?v=s3df_PR0x7Y +https://www.youtube.com/watch?v=mRDmsxKQurs +https://www.youtube.com/watch?v=bhKN_KOeWhI +https://www.youtube.com/watch?v=EStYpTS-TRU +https://www.youtube.com/watch?v=357YonN45w0 +https://www.youtube.com/watch?v=UGJfPbOpiCA +https://www.youtube.com/watch?v=1F6uYuHgOdI +https://www.youtube.com/watch?v=PvsqLRbCJlA +https://www.youtube.com/watch?v=P96IOk9mQgk +https://www.youtube.com/watch?v=M5EqG9d-3Ug +https://www.youtube.com/watch?v=R6eDBa6UjmY +https://www.youtube.com/watch?v=CZvUQEU2cvs +https://www.youtube.com/watch?v=giazbLbDdv0 +https://www.youtube.com/watch?v=JFoI12_47ck +https://www.youtube.com/watch?v=q5dZ396lYbk +https://www.youtube.com/watch?v=McPkR_D7zI0 +https://www.youtube.com/watch?v=774oBwazxHw +https://www.youtube.com/watch?v=-_5AipO_dfw +https://www.youtube.com/watch?v=MnlU4BPrLuk +https://www.youtube.com/watch?v=24LuuQH4hnc +https://www.youtube.com/watch?v=e4ivBc0l7Ok +https://www.youtube.com/watch?v=S4ff7HgfULA +https://www.youtube.com/watch?v=AxhJcEndmjs +https://www.youtube.com/watch?v=NdeCQFd2blY +https://www.youtube.com/watch?v=xgl4ltsE_8E +https://www.youtube.com/watch?v=in5xKqvxrAk +https://www.youtube.com/watch?v=TAU_0EpXBgQ +https://www.youtube.com/watch?v=3DbMqaactuU +https://www.youtube.com/watch?v=BWuY55TfChs +https://www.youtube.com/watch?v=41ecD9culo4 +https://www.youtube.com/watch?v=kYV8Q5UpDTw +https://www.youtube.com/watch?v=wOQlIDXHkD4 +https://www.youtube.com/watch?v=vMXVse5OuFI +https://www.youtube.com/watch?v=Fem5C3R60Sg +https://www.youtube.com/watch?v=OhySOErdxjM +https://www.youtube.com/watch?v=KC09gbct8u4 +https://www.youtube.com/watch?v=bJ4vPNkjRdE +https://www.youtube.com/watch?v=RvBrUzLugjA +https://www.youtube.com/watch?v=QuNxtlXivBk +https://www.youtube.com/watch?v=yz6OjqZfdLM +https://www.youtube.com/watch?v=CoOLkzZCcGE +https://www.youtube.com/watch?v=FecXRY-8IPw +https://www.youtube.com/watch?v=KUQBqesn-6M +https://www.youtube.com/watch?v=NAF9kveijEA +https://www.youtube.com/watch?v=hl4j6E-ICco +https://www.youtube.com/watch?v=yg5tpHvElvM +https://www.youtube.com/watch?v=ZddCBXb10hw +https://www.youtube.com/watch?v=hTKjjdN8MGQ +https://www.youtube.com/watch?v=X9hHQaYj7Lo +https://www.youtube.com/watch?v=P0B-L66ffLw +https://www.youtube.com/watch?v=5mQ4hc8Uvn8 +https://www.youtube.com/watch?v=KaPSeF592h0 +https://www.youtube.com/watch?v=xerdSyr3sSU +https://www.youtube.com/watch?v=ZW2jcFuHdhA +https://www.youtube.com/watch?v=ek3TqzF-KVE +https://www.youtube.com/watch?v=sMT8I7qIoZs +https://www.youtube.com/watch?v=hPvr-qxf52s +https://www.youtube.com/watch?v=__Ier-gibdA +https://www.youtube.com/watch?v=Wqs0Im26Bfg +https://www.youtube.com/watch?v=auk6LFmPgC8 +https://www.youtube.com/watch?v=OEX2aUVFYNI +https://www.youtube.com/watch?v=i_suF4tWuj4 +https://www.youtube.com/watch?v=Gmy9pDH26do +https://www.youtube.com/watch?v=ktXSBjJdd5Q +https://www.youtube.com/watch?v=p3kzKLus9yg +https://www.youtube.com/watch?v=tB2l4wTK4OE +https://www.youtube.com/watch?v=gm4XxHSJePc +https://www.youtube.com/watch?v=uy7z2ywGb8c +https://www.youtube.com/watch?v=OmfINsA961s +https://www.youtube.com/watch?v=8impJJlnKS8 +https://www.youtube.com/watch?v=aKCzJoP2bsY +https://www.youtube.com/watch?v=Q0jNgwJDXYk +https://www.youtube.com/watch?v=ratCJH1TN9Y +https://www.youtube.com/watch?v=kpiCo2tDedQ +https://www.youtube.com/watch?v=Jxsj2VSYp_I +https://www.youtube.com/watch?v=FeS1TqWJLqE +https://www.youtube.com/watch?v=xJJnQWo50lA +https://www.youtube.com/watch?v=FMqeu-2OCC8 +https://www.youtube.com/watch?v=wHaVTysBL9U +https://www.youtube.com/watch?v=lfmVNlorAV8 +https://www.youtube.com/watch?v=mD1d0YLwbHQ +https://www.youtube.com/watch?v=BZHKlc3N_wA +https://www.youtube.com/watch?v=7X4vxF9V9PE +https://www.youtube.com/watch?v=s_ftU_N-KAc +https://www.youtube.com/watch?v=LMXj3C2JhdA +https://www.youtube.com/watch?v=iq6sC58oSMo +https://www.youtube.com/watch?v=ZV3e4CtYltc +https://www.youtube.com/watch?v=TBB6xBg7isY +https://www.youtube.com/watch?v=majq3tuDPlg +https://www.youtube.com/watch?v=A62-iVYtkvg +https://www.youtube.com/watch?v=oH-hzXI7RzE +https://www.youtube.com/watch?v=OqAu24YGNKM +https://www.youtube.com/watch?v=YcgFu0urTjo +https://www.youtube.com/watch?v=L_qDQ2WALdc +https://www.youtube.com/watch?v=76nZ2RSxxik +https://www.youtube.com/watch?v=s4mnCMUrMV0 +https://www.youtube.com/watch?v=eAhZel9fdcE +https://www.youtube.com/watch?v=TXchNmKFu8I +https://www.youtube.com/watch?v=KqLLKx7jJxM +https://www.youtube.com/watch?v=wBkH4Sho9Uw +https://www.youtube.com/watch?v=3UeYut9Nm3E +https://www.youtube.com/watch?v=rNHZh5931hA +https://www.youtube.com/watch?v=fU6GFD3wNDs +https://www.youtube.com/watch?v=WAFiutRXPHU +https://www.youtube.com/watch?v=d9PoN3qbkUA +https://www.youtube.com/watch?v=jjbVZ6fPReI +https://www.youtube.com/watch?v=avHoMxrGh3c +https://www.youtube.com/watch?v=zxdhR5cBKYA +https://www.youtube.com/watch?v=XoK7nSXYmgQ +https://www.youtube.com/watch?v=ZhzwfaYrcvc +https://www.youtube.com/watch?v=-cHTdfy6CUI +https://www.youtube.com/watch?v=hJ6se5Ms3ko +https://www.youtube.com/watch?v=Zxfcj4uc0h4 +https://www.youtube.com/watch?v=yTG5zrbbxmg +https://www.youtube.com/watch?v=EH8BsC2MKNY +https://www.youtube.com/watch?v=fGXTLaO7aPo +https://www.youtube.com/watch?v=p2jo-VXkzr4 +https://www.youtube.com/watch?v=DN47veER2K0 +https://www.youtube.com/watch?v=h3dMZC3V_mA +https://www.youtube.com/watch?v=4KBB_CxKN6M +https://www.youtube.com/watch?v=nVoSg1NfPrE +https://www.youtube.com/watch?v=GHzS1ogWdMI +https://www.youtube.com/watch?v=r6Q8GLUGWY4 +https://www.youtube.com/watch?v=-t0U70j9DHY +https://www.youtube.com/watch?v=gHYAwsSXsNI +https://www.youtube.com/watch?v=XTGlxwURgJo +https://www.youtube.com/watch?v=Dj-Zrmh_a54 +https://www.youtube.com/watch?v=GNrt-iNaKvQ +https://www.youtube.com/watch?v=vrvYFPHxVMg +https://www.youtube.com/watch?v=bdlZlk0wvvo +https://www.youtube.com/watch?v=qd789Zfq5iU +https://www.youtube.com/watch?v=G4h-B9lI_vA +https://www.youtube.com/watch?v=HtJIvuVRR_s +https://www.youtube.com/watch?v=eiB4V7hSqa4 +https://www.youtube.com/watch?v=B_Ay09BH2qU +https://www.youtube.com/watch?v=jA-64XSM2s4 +https://www.youtube.com/watch?v=IzPqkrsEPSc +https://www.youtube.com/watch?v=pHJvLpyb2tA +https://www.youtube.com/watch?v=S3t3wvksx9U +https://www.youtube.com/watch?v=YdmaCruUVDM +https://www.youtube.com/watch?v=zlnoM_Le0C4 +https://www.youtube.com/watch?v=ppoa5SJDmA0 +https://www.youtube.com/watch?v=fD9Jz4GuSY4 +https://www.youtube.com/watch?v=DGzLoTmx6JQ +https://www.youtube.com/watch?v=dovFWM5KjLU +https://www.youtube.com/watch?v=ZvlXe9HEQXQ +https://www.youtube.com/watch?v=-69wodyyiVw +https://www.youtube.com/watch?v=ymd-9Mlusbg +https://www.youtube.com/watch?v=5NM8qn6Hz20 +https://www.youtube.com/watch?v=aZLq0ODPkJs +https://www.youtube.com/watch?v=E8idIfNUTGA +https://www.youtube.com/watch?v=9tLuJxoySL0 +https://www.youtube.com/watch?v=TAOo-sTxYWw +https://www.youtube.com/watch?v=6vqRtTHv2l8 +https://www.youtube.com/watch?v=u2-XFiAeZ0M +https://www.youtube.com/watch?v=GSevUSqfbKM +https://www.youtube.com/watch?v=ZAx17rgrhM4 +https://www.youtube.com/watch?v=beW0wPoKU08 +https://www.youtube.com/watch?v=ffi0bNkc7iw +https://www.youtube.com/watch?v=YN_bIXecRzk +https://www.youtube.com/watch?v=f5XA4-NaHfk +https://www.youtube.com/watch?v=41L2f8-Gp1E +https://www.youtube.com/watch?v=cyN4abf_cUQ +https://www.youtube.com/watch?v=kZwS6uracK0 +https://www.youtube.com/watch?v=ssJ2YAl-W60 +https://www.youtube.com/watch?v=Zn_ngvMUp8s +https://www.youtube.com/watch?v=of80gd4-_rU +https://www.youtube.com/watch?v=scj5d81nEWY +https://www.youtube.com/watch?v=24SMoy1JqxU +https://www.youtube.com/watch?v=SsqrVhVWBtQ +https://www.youtube.com/watch?v=qRuuDA3Oy1k +https://www.youtube.com/watch?v=E-II-TTGm1s +https://www.youtube.com/watch?v=a3kKG0hEbE4 +https://www.youtube.com/watch?v=UUi3KUyAJVw +https://www.youtube.com/watch?v=0f4Tl-y1SHY +https://www.youtube.com/watch?v=rNWD8g2gYlU +https://www.youtube.com/watch?v=E5KbVk6kFo8 +https://www.youtube.com/watch?v=9EQPXEvgaT0 +https://www.youtube.com/watch?v=VijmHIURpAg +https://www.youtube.com/watch?v=XZVeeC2MFps +https://www.youtube.com/watch?v=MU1izPlV7mE +https://www.youtube.com/watch?v=YzvEiKysxfI +https://www.youtube.com/watch?v=S-zswgmxRWk +https://www.youtube.com/watch?v=irR7K8QC5Mw +https://www.youtube.com/watch?v=8fboEbvBP4U +https://www.youtube.com/watch?v=Ehi60JJR6K8 +https://www.youtube.com/watch?v=unQ37i1fI3E +https://www.youtube.com/watch?v=Sl1xZIVwQzE +https://www.youtube.com/watch?v=EsgjQP8kc-4 +https://www.youtube.com/watch?v=-CS0ojb2VjA +https://www.youtube.com/watch?v=9_1qSUWAtzM +https://www.youtube.com/watch?v=H5_guRjO7qc +https://www.youtube.com/watch?v=GEi5YyVLB5M +https://www.youtube.com/watch?v=kMdZXT_6Jmo +https://www.youtube.com/watch?v=Kw1KahIAPkI +https://www.youtube.com/watch?v=sCat14cTzYA +https://www.youtube.com/watch?v=oQeBFLY3WL4 +https://www.youtube.com/watch?v=G0wp8-Il2RY +https://www.youtube.com/watch?v=PWlydfB627s +https://www.youtube.com/watch?v=aDUtimJ1GL8 +https://www.youtube.com/watch?v=vdaLx-wJ118 +https://www.youtube.com/watch?v=SggLcqRWUcU +https://www.youtube.com/watch?v=X_jKmYUcbmE +https://www.youtube.com/watch?v=DBi96HRvEug +https://www.youtube.com/watch?v=W-RrbD170uM +https://www.youtube.com/watch?v=z3JNl4ABEMU +https://www.youtube.com/watch?v=0vQu4oSMdQI +https://www.youtube.com/watch?v=s1Z1731q5e0 +https://www.youtube.com/watch?v=Et1ErNdiqXI +https://www.youtube.com/watch?v=b8HdEnMG9Mw +https://www.youtube.com/watch?v=4Jn35uhyAdU +https://www.youtube.com/watch?v=7g8nStM_XbM +https://www.youtube.com/watch?v=fNYdM_UWg_I +https://www.youtube.com/watch?v=EA2TyYTpMlQ +https://www.youtube.com/watch?v=-gqWADvlZ44 +https://www.youtube.com/watch?v=pjsMnKiyMmI +https://www.youtube.com/watch?v=-B8qoqH0i1Y +https://www.youtube.com/watch?v=nE-vyXDpjYU +https://www.youtube.com/watch?v=0Ok2fGNfbDU +https://www.youtube.com/watch?v=IXee870AMAs +https://www.youtube.com/watch?v=ye9lx_rbQ8o +https://www.youtube.com/watch?v=Ku8aWQaLIBQ +https://www.youtube.com/watch?v=junMQDztHck +https://www.youtube.com/watch?v=xngdVZtDh7I +https://www.youtube.com/watch?v=DARiF_HgHts +https://www.youtube.com/watch?v=jw7-9lEo1kc +https://www.youtube.com/watch?v=ODPGJPoga1A +https://www.youtube.com/watch?v=ZBybfxJyQuE +https://www.youtube.com/watch?v=mrPeOtu_6cU +https://www.youtube.com/watch?v=E3fxsRem3rA +https://www.youtube.com/watch?v=5Oa8Uec_eBg +https://www.youtube.com/watch?v=pcJxFJcHkuo +https://www.youtube.com/watch?v=Zl4Gbaun1pA +https://www.youtube.com/watch?v=EhKgh4N1AXc +https://www.youtube.com/watch?v=urGuSLPunlU +https://www.youtube.com/watch?v=4o0i3UFDJBA +https://www.youtube.com/watch?v=JXX3NQKvpIg +https://www.youtube.com/watch?v=EEwrQrEtivk +https://www.youtube.com/watch?v=FSxmGJBvYbU +https://www.youtube.com/watch?v=_eCnHwhXaTI +https://www.youtube.com/watch?v=xGtKzO7r0GI +https://www.youtube.com/watch?v=U5S9E6KMNns +https://www.youtube.com/watch?v=zF0yuAUI1F0 +https://www.youtube.com/watch?v=6lEE8tAk8YE +https://www.youtube.com/watch?v=dXrLLUqzlCM +https://www.youtube.com/watch?v=hOLrUvPyF68 +https://www.youtube.com/watch?v=aFwCB5VOk_c +https://www.youtube.com/watch?v=nKCjiJ5MJ9s +https://www.youtube.com/watch?v=il_9MesqVEw +https://www.youtube.com/watch?v=DhHrSXSJ9sQ +https://www.youtube.com/watch?v=vRshEolL8eM +https://www.youtube.com/watch?v=_UOmXO1t0ms +https://www.youtube.com/watch?v=_Lq0LKMTsTc +https://www.youtube.com/watch?v=1rZgsDAohi8 +https://www.youtube.com/watch?v=rZl1NAjtlr8 +https://www.youtube.com/watch?v=KFWegI-YGBw +https://www.youtube.com/watch?v=Nhqny-t2BoA +https://www.youtube.com/watch?v=rHf1PBmve8U +https://www.youtube.com/watch?v=Qhm3rTNuu1c +https://www.youtube.com/watch?v=_mGDcyryvuQ +https://www.youtube.com/watch?v=qo0cNivWHwI +https://www.youtube.com/watch?v=KjoN6pDVw7c +https://www.youtube.com/watch?v=hYLAZNqx9Sc +https://www.youtube.com/watch?v=Y4GEzEh4BDY +https://www.youtube.com/watch?v=SFfDx-SSDzo +https://www.youtube.com/watch?v=vt6I-SUokgs +https://www.youtube.com/watch?v=4Eqz9U1oEpE +https://www.youtube.com/watch?v=iBdn0aG6SCY +https://www.youtube.com/watch?v=5YGOwYF5zlE +https://www.youtube.com/watch?v=iqdS0qfA1iw +https://www.youtube.com/watch?v=S6SvIe3Kxa0 +https://www.youtube.com/watch?v=0JV0SuPtWwU +https://www.youtube.com/watch?v=UB-YooM-NIY +https://www.youtube.com/watch?v=4f7uOAxYQKk +https://www.youtube.com/watch?v=ODYcEncY9Z8 +https://www.youtube.com/watch?v=z1gsZhSRs_A +https://www.youtube.com/watch?v=lQHEDa6vDhk +https://www.youtube.com/watch?v=Y33t3LEoTlM +https://www.youtube.com/watch?v=SOk9ROkKPrA +https://www.youtube.com/watch?v=lxPy60KW3VY +https://www.youtube.com/watch?v=reT95LPQCoM +https://www.youtube.com/watch?v=jmrqWtANVm0 +https://www.youtube.com/watch?v=3TfciDvpMOU +https://www.youtube.com/watch?v=HW677VglUgs +https://www.youtube.com/watch?v=DtYkKDkGrqo +https://www.youtube.com/watch?v=128YFZf8DGo +https://www.youtube.com/watch?v=KujWR5rPJ1o +https://www.youtube.com/watch?v=RZ6g7zRVaOA +https://www.youtube.com/watch?v=3L_yf8TO1P0 +https://www.youtube.com/watch?v=RJuY4t_58Y0 +https://www.youtube.com/watch?v=DLTlIVuawAE +https://www.youtube.com/watch?v=QfF9mpVq_14 +https://www.youtube.com/watch?v=OqGD8MNJKnI +https://www.youtube.com/watch?v=O4BqK1cylmQ +https://www.youtube.com/watch?v=vu2FttWQKMg +https://www.youtube.com/watch?v=Yh2nT6crCiE +https://www.youtube.com/watch?v=dKbRkBvtohg +https://www.youtube.com/watch?v=D0eDZjIwAmI +https://www.youtube.com/watch?v=AD37qE7t0ck +https://www.youtube.com/watch?v=l3UU8A8JEE8 +https://www.youtube.com/watch?v=GshhMRTjwZs +https://www.youtube.com/watch?v=-R-0EKCgXNY +https://www.youtube.com/watch?v=WhXJJQzmlTQ +https://www.youtube.com/watch?v=x0Fx3YGbvrs +https://www.youtube.com/watch?v=P5T1dXkG7-I +https://www.youtube.com/watch?v=7VO6E6Nj75c +https://www.youtube.com/watch?v=CivVo4AbbVo +https://www.youtube.com/watch?v=MKrMnu22z9c +https://www.youtube.com/watch?v=2YgNc05_Z7E +https://www.youtube.com/watch?v=6HJi1cg-gBE +https://www.youtube.com/watch?v=felrJtLc3UY +https://www.youtube.com/watch?v=U8HIIF-W3zE +https://www.youtube.com/watch?v=EYwNAObexJk +https://www.youtube.com/watch?v=iq4lpHbGQ60 +https://www.youtube.com/watch?v=ANpWkCGe6Zk +https://www.youtube.com/watch?v=a7W0t-Q5cFs +https://www.youtube.com/watch?v=9oDYxrEfVzM +https://www.youtube.com/watch?v=okbFZMnxoGQ +https://www.youtube.com/watch?v=Npb88SaLOPc +https://www.youtube.com/watch?v=S6u-py6UlX4 +https://www.youtube.com/watch?v=FXmNHhFOUuM +https://www.youtube.com/watch?v=q9p7i0Jb4rg +https://www.youtube.com/watch?v=6ZaG2I7mXcM +https://www.youtube.com/watch?v=ojDYVBeK_d4 +https://www.youtube.com/watch?v=HisWu1kZcTI +https://www.youtube.com/watch?v=WXm5T0AWE04 +https://www.youtube.com/watch?v=6mI2rvHbCQE +https://www.youtube.com/watch?v=hEYARh2flvc +https://www.youtube.com/watch?v=MVTmbHpeQwg +https://www.youtube.com/watch?v=DN7Pp-qdKY8 +https://www.youtube.com/watch?v=nGLB3uIhvdA +https://www.youtube.com/watch?v=VDq2whjVOQ8 +https://www.youtube.com/watch?v=2uFJkQJHX7s +https://www.youtube.com/watch?v=fRJrdKVfA4E +https://www.youtube.com/watch?v=JXtbeBL7iog +https://www.youtube.com/watch?v=1HUZpi6Kx5g +https://www.youtube.com/watch?v=j-UII0WaS-w +https://www.youtube.com/watch?v=HMjlEN2YgLg +https://www.youtube.com/watch?v=9TqFfzAzbNE +https://www.youtube.com/watch?v=GZSslRRYJg8 +https://www.youtube.com/watch?v=sR123A-THRs +https://www.youtube.com/watch?v=bt3X8MJgJWo +https://www.youtube.com/watch?v=NXEmtBe3R2c +https://www.youtube.com/watch?v=Aw7KY5ryvNo +https://www.youtube.com/watch?v=iIyfFJZuxSs +https://www.youtube.com/watch?v=JR2R1yTcUyk +https://www.youtube.com/watch?v=ID2HSLcAKmE +https://www.youtube.com/watch?v=sxuixFTH4Y8 +https://www.youtube.com/watch?v=4veS9jm-utw +https://www.youtube.com/watch?v=-bNr6-8xHhE +https://www.youtube.com/watch?v=mLscN6cV89k +https://www.youtube.com/watch?v=cZlMf1khndo +https://www.youtube.com/watch?v=FXWA9qKxhXM +https://www.youtube.com/watch?v=Gen3Ng42Md4 +https://www.youtube.com/watch?v=AqYhwYiXmvM +https://www.youtube.com/watch?v=rUnmd1j4mkM +https://www.youtube.com/watch?v=b3C6X_DUwbs +https://www.youtube.com/watch?v=I7xIcND2oBs +https://www.youtube.com/watch?v=grkcZZo9nXE +https://www.youtube.com/watch?v=rF3gnarthUE +https://www.youtube.com/watch?v=ft-hzWHU9ac +https://www.youtube.com/watch?v=w4tasjBq9pI +https://www.youtube.com/watch?v=JiCFWNxWwAs +https://www.youtube.com/watch?v=DpaZOzMXHnI +https://www.youtube.com/watch?v=2OwwoTVQ7Uc +https://www.youtube.com/watch?v=MdqKCXXXRBs +https://www.youtube.com/watch?v=bZgOyRXBqMM +https://www.youtube.com/watch?v=dmAteOuRBfQ +https://www.youtube.com/watch?v=h_e-al5r4gk +https://www.youtube.com/watch?v=pi3N_wQS2n0 +https://www.youtube.com/watch?v=4SD-hsZ2Cso +https://www.youtube.com/watch?v=mtd2vwD7t5I +https://www.youtube.com/watch?v=0zj6do0S0rc +https://www.youtube.com/watch?v=sO_hQgkul_w +https://www.youtube.com/watch?v=p3nf7CuskI4 +https://www.youtube.com/watch?v=Ck-RlFjl6UA +https://www.youtube.com/watch?v=GWg_lkXHg6A +https://www.youtube.com/watch?v=_I34dV-BhaA +https://www.youtube.com/watch?v=SWpRsRAAyXE +https://www.youtube.com/watch?v=uXZqwKp255E +https://www.youtube.com/watch?v=60Tt-BZ2QF4 +https://www.youtube.com/watch?v=acBMw3OL_8k +https://www.youtube.com/watch?v=aZpKNjN-mnA +https://www.youtube.com/watch?v=eQ9LWl_NpxE +https://www.youtube.com/watch?v=QbVtkJI56x4 +https://www.youtube.com/watch?v=0S4iduG2DoY +https://www.youtube.com/watch?v=5IAD-EFqgX4 +https://www.youtube.com/watch?v=hVAanRQ6kmI +https://www.youtube.com/watch?v=GKMr408YsLI +https://www.youtube.com/watch?v=trrwQ2_mr10 +https://www.youtube.com/watch?v=EN-mjnSO8rU +https://www.youtube.com/watch?v=ssujDv_dWCQ +https://www.youtube.com/watch?v=0gZCi6hZjqc +https://www.youtube.com/watch?v=ueATjovo5TM +https://www.youtube.com/watch?v=l5nzkdMPeTM +https://www.youtube.com/watch?v=ejxUiHoZqoo +https://www.youtube.com/watch?v=jK04XF1iK3g +https://www.youtube.com/watch?v=7M33poh57dg +https://www.youtube.com/watch?v=gwfCxfvMQuQ +https://www.youtube.com/watch?v=RxX_q9ra7XM +https://www.youtube.com/watch?v=5qFfbpA6hjg +https://www.youtube.com/watch?v=PbFKX8EZGAM +https://www.youtube.com/watch?v=Lc_SsKBQqMs +https://www.youtube.com/watch?v=unsrEUNXxGQ +https://www.youtube.com/watch?v=VKLI2iMY7v4 +https://www.youtube.com/watch?v=ymgo_bReR9A +https://www.youtube.com/watch?v=DOruZP0mpNc +https://www.youtube.com/watch?v=TndhOZv6ejE +https://www.youtube.com/watch?v=Ex_5kLFxpHk +https://www.youtube.com/watch?v=5Oga5OYv-sU +https://www.youtube.com/watch?v=fzEcs1s1jNk +https://www.youtube.com/watch?v=kKjY7Pj4K3o +https://www.youtube.com/watch?v=-OTZxe3IZ0Y +https://www.youtube.com/watch?v=rnUxkSviq0w +https://www.youtube.com/watch?v=u9ob0AOX3DE +https://www.youtube.com/watch?v=HWplP9yPSrk +https://www.youtube.com/watch?v=bi4qdsDEQk4 +https://www.youtube.com/watch?v=K-dvZrLMPFg +https://www.youtube.com/watch?v=05OF14NhSVQ +https://www.youtube.com/watch?v=56T4a3FoWxc +https://www.youtube.com/watch?v=dJr-KpDS86M +https://www.youtube.com/watch?v=d8lGr1e7rHc +https://www.youtube.com/watch?v=DoCiNSlYEuM +https://www.youtube.com/watch?v=pHhIGaECBIU +https://www.youtube.com/watch?v=jbNxu-lkamQ +https://www.youtube.com/watch?v=Mu3klSAn8_M +https://www.youtube.com/watch?v=GaqU6VbRfjA +https://www.youtube.com/watch?v=fq4Q90CjxFw +https://www.youtube.com/watch?v=oSXLaLC6zks +https://www.youtube.com/watch?v=Y8jW2jm6Rho +https://www.youtube.com/watch?v=uRAc3_UsXs8 +https://www.youtube.com/watch?v=W1n5dvzGph0 +https://www.youtube.com/watch?v=uWhiz9or3PA +https://www.youtube.com/watch?v=_A-3gkPVmc0 +https://www.youtube.com/watch?v=huVwqWg2vM4 +https://www.youtube.com/watch?v=_P6k6AdXts4 +https://www.youtube.com/watch?v=OcMnLtgMHEY +https://www.youtube.com/watch?v=r87feQvLfLI +https://www.youtube.com/watch?v=39A9XqLgtsk +https://www.youtube.com/watch?v=f5D79JWJq20 +https://www.youtube.com/watch?v=M6znxNv8TvI +https://www.youtube.com/watch?v=9rv04oK-PSo +https://www.youtube.com/watch?v=6KWq6lNjdQ8 +https://www.youtube.com/watch?v=sZWHJvC847c +https://www.youtube.com/watch?v=Jzoc9dyaOZ8 +https://www.youtube.com/watch?v=6253hY1D0oY +https://www.youtube.com/watch?v=TpRAHZun_wo +https://www.youtube.com/watch?v=EX8y8u2nTJQ +https://www.youtube.com/watch?v=ZEbobft1Awo +https://www.youtube.com/watch?v=SFe1RqTiAYc +https://www.youtube.com/watch?v=5KM9hc1V_qw +https://www.youtube.com/watch?v=G9B-P8msN74 +https://www.youtube.com/watch?v=-3zkv6CKMfU +https://www.youtube.com/watch?v=Cckr3dhQOLI +https://www.youtube.com/watch?v=Gy2NB2ncaMU +https://www.youtube.com/watch?v=gN44tf6nx78 +https://www.youtube.com/watch?v=ShdOISVUjHw +https://www.youtube.com/watch?v=Lm5IFC9ALfk +https://www.youtube.com/watch?v=_rZYSwKpLX0 +https://www.youtube.com/watch?v=L92zNi0MNRM +https://www.youtube.com/watch?v=n0UoWuP9OiA +https://www.youtube.com/watch?v=vg335u2KZy4 +https://www.youtube.com/watch?v=HlwRYcXoM-A +https://www.youtube.com/watch?v=DyaWG0Pff6w +https://www.youtube.com/watch?v=J4t265zWn04 +https://www.youtube.com/watch?v=Z66kRbSH_uU +https://www.youtube.com/watch?v=oKuaW6z16EA +https://www.youtube.com/watch?v=vLN3Vy3BRDk +https://www.youtube.com/watch?v=pnDDrLoNjvE +https://www.youtube.com/watch?v=sfKcuh-4KXk +https://www.youtube.com/watch?v=MUV2tbTe-gk +https://www.youtube.com/watch?v=SeHGsjnTjGY +https://www.youtube.com/watch?v=4p1_h_-HEPs +https://www.youtube.com/watch?v=57yQ1qJhJe0 +https://www.youtube.com/watch?v=17HNRtQyAGU +https://www.youtube.com/watch?v=C-bvICeWw_M +https://www.youtube.com/watch?v=kQ7hd-68au4 +https://www.youtube.com/watch?v=s6o2AtE-kUI +https://www.youtube.com/watch?v=YoMMu1gBahs +https://www.youtube.com/watch?v=VNfm4RT431g +https://www.youtube.com/watch?v=rrYlQlJwkus +https://www.youtube.com/watch?v=oonEB-IPBaU +https://www.youtube.com/watch?v=Dcac2B3qvWg +https://www.youtube.com/watch?v=HZqKKzn2UFs +https://www.youtube.com/watch?v=AM-FGYVsoBc +https://www.youtube.com/watch?v=5OX7CLr4PLE +https://www.youtube.com/watch?v=HAWvUl5dyDk +https://www.youtube.com/watch?v=1eqqdP0K4Vg +https://www.youtube.com/watch?v=aDPG1-baku0 +https://www.youtube.com/watch?v=smJio-3-LIM +https://www.youtube.com/watch?v=sBr1clm9xdI +https://www.youtube.com/watch?v=ULzPldjmoYM +https://www.youtube.com/watch?v=7tW7QBkGQrc +https://www.youtube.com/watch?v=FXmWRe2FQU8 +https://www.youtube.com/watch?v=ZyJ6Mx_j8go +https://www.youtube.com/watch?v=8HeODJvg2cc +https://www.youtube.com/watch?v=0nQQpVvH01k +https://www.youtube.com/watch?v=7_Qw2VsZ_fE +https://www.youtube.com/watch?v=4rLiF8ROqgQ +https://www.youtube.com/watch?v=lSdrRidKmRI +https://www.youtube.com/watch?v=9BoyIFnQvlo +https://www.youtube.com/watch?v=YXxUEgD9g5E +https://www.youtube.com/watch?v=HOGUAI-kJFc +https://www.youtube.com/watch?v=67oQXgK7Vz8 +https://www.youtube.com/watch?v=co8DCZR_0s4 +https://www.youtube.com/watch?v=hb6j3L0RDaE +https://www.youtube.com/watch?v=6ZtkrtIPo4Q +https://www.youtube.com/watch?v=0LZmbG61eDY +https://www.youtube.com/watch?v=JOgjRV8K5lc +https://www.youtube.com/watch?v=LxYu4xXKfyw +https://www.youtube.com/watch?v=N8MJhB4L8v4 +https://www.youtube.com/watch?v=n4bkV1s-PPY +https://www.youtube.com/watch?v=4Wa6XJEDYH4 +https://www.youtube.com/watch?v=n4udGJAqe6c +https://www.youtube.com/watch?v=zFNTtZXUvhc +https://www.youtube.com/watch?v=FtvVf23ZDjY +https://www.youtube.com/watch?v=Aqv3MX-dHT4 +https://www.youtube.com/watch?v=4uqg6MuwNc0 +https://www.youtube.com/watch?v=f18SkV6hFvo +https://www.youtube.com/watch?v=ZAD5eCOWIS8 +https://www.youtube.com/watch?v=0CUF13oxaVE +https://www.youtube.com/watch?v=yHiVYkb5eWo +https://www.youtube.com/watch?v=vyNo6dW7XrI +https://www.youtube.com/watch?v=EwMMdVKF22I +https://www.youtube.com/watch?v=6YpC-pGDRyQ +https://www.youtube.com/watch?v=y2NixaBN6xw +https://www.youtube.com/watch?v=TCyvJv6qv10 +https://www.youtube.com/watch?v=ubsYhOEBmWI +https://www.youtube.com/watch?v=ul5Xai16hjE +https://www.youtube.com/watch?v=QKC8cerBW-s +https://www.youtube.com/watch?v=_v9sKsaDJ0s +https://www.youtube.com/watch?v=fJM0M7I4bmM +https://www.youtube.com/watch?v=dmeajYLmHOQ +https://www.youtube.com/watch?v=9DtM-zA1_0Y +https://www.youtube.com/watch?v=20NI7mGf0kE +https://www.youtube.com/watch?v=UfLuPlzcq1o +https://www.youtube.com/watch?v=7xT1b0AzI1Y +https://www.youtube.com/watch?v=SaiyvwevIno +https://www.youtube.com/watch?v=L8RX2_DVKqY +https://www.youtube.com/watch?v=K2VRYB9PSIY +https://www.youtube.com/watch?v=z1iBdDvIXKg +https://www.youtube.com/watch?v=TjRiRF8nXEo +https://www.youtube.com/watch?v=UKS0YrXoRdA +https://www.youtube.com/watch?v=did4sI6zq_A +https://www.youtube.com/watch?v=wf5-HRTKg-E +https://www.youtube.com/watch?v=nB6y1x4pbi4 +https://www.youtube.com/watch?v=9JsoIuIxopQ +https://www.youtube.com/watch?v=DsuREQMVjNY +https://www.youtube.com/watch?v=z5GgUQak-us +https://www.youtube.com/watch?v=yiVAyD9ozCo +https://www.youtube.com/watch?v=roHXzgobmnw +https://www.youtube.com/watch?v=XaOHdTuxuPM +https://www.youtube.com/watch?v=PNlmaXsixvQ +https://www.youtube.com/watch?v=PCxRTU3rBTE +https://www.youtube.com/watch?v=e3BCGTYsDOs +https://www.youtube.com/watch?v=QRv90i58W_E +https://www.youtube.com/watch?v=33PovAKeH0E +https://www.youtube.com/watch?v=FlGvWltFCmA +https://www.youtube.com/watch?v=b-ffdH8Hg08 +https://www.youtube.com/watch?v=Si0KHefiKaM +https://www.youtube.com/watch?v=2dgFiwdcorY +https://www.youtube.com/watch?v=cFVF-6pX9R0 +https://www.youtube.com/watch?v=OUkHgcG2v2M +https://www.youtube.com/watch?v=gm9LqOfnZOI +https://www.youtube.com/watch?v=_UQO2LM1WPw +https://www.youtube.com/watch?v=LKwG21IEWUw +https://www.youtube.com/watch?v=S4hoDHN_wQY +https://www.youtube.com/watch?v=8MV8Yy5GImE +https://www.youtube.com/watch?v=oF2HTr_XgVM +https://www.youtube.com/watch?v=CH9JaEBW83Y +https://www.youtube.com/watch?v=pxjDuq3r4iI +https://www.youtube.com/watch?v=3dUJdTxxCiE +https://www.youtube.com/watch?v=HcfxxE__Xjc +https://www.youtube.com/watch?v=GqVZLE5yxtY +https://www.youtube.com/watch?v=FfrhxtShg5s +https://www.youtube.com/watch?v=j6_gXJ54OFA +https://www.youtube.com/watch?v=UZ-qB0EKdEM +https://www.youtube.com/watch?v=SOgvMA1G7_M +https://www.youtube.com/watch?v=S5abWlkirvU +https://www.youtube.com/watch?v=3MXfmTMJ_SI +https://www.youtube.com/watch?v=hT8KURdMMi4 +https://www.youtube.com/watch?v=UoIr_9J12RY +https://www.youtube.com/watch?v=dPCNW1dFigg +https://www.youtube.com/watch?v=IWc4RArypJs +https://www.youtube.com/watch?v=ZghfaSSd3dQ +https://www.youtube.com/watch?v=H_YFW94w_FQ +https://www.youtube.com/watch?v=PJv9mk5hltM +https://www.youtube.com/watch?v=7XV_gsf8yow +https://www.youtube.com/watch?v=8NukH9vc2JI +https://www.youtube.com/watch?v=tlNi-QfnOTc +https://www.youtube.com/watch?v=fc77CExfyvA +https://www.youtube.com/watch?v=YDZPIg6K1X4 +https://www.youtube.com/watch?v=BBrIcZ8VT4E +https://www.youtube.com/watch?v=yFGpm9oLs20 +https://www.youtube.com/watch?v=G81ehUvbzrU +https://www.youtube.com/watch?v=NJARNmRC1NY +https://www.youtube.com/watch?v=LZNmPPirbFQ +https://www.youtube.com/watch?v=ZqZN7qNyQso +https://www.youtube.com/watch?v=X6bFHcU6u9w +https://www.youtube.com/watch?v=Ej4LIXsaLag +https://www.youtube.com/watch?v=7T0ntzJQAO8 +https://www.youtube.com/watch?v=VwOk7Y7n_0k +https://www.youtube.com/watch?v=m5IERpTJLaw +https://www.youtube.com/watch?v=_irlrf9Qhl0 +https://www.youtube.com/watch?v=sNeSgwgyjPA +https://www.youtube.com/watch?v=tVoFvkB2weE +https://www.youtube.com/watch?v=p4T-uoIF_6Y +https://www.youtube.com/watch?v=qNZRvUK_ogw +https://www.youtube.com/watch?v=0nHJXFiFtnk +https://www.youtube.com/watch?v=wSwPs-6WdfY +https://www.youtube.com/watch?v=ONWWw-hSbsg +https://www.youtube.com/watch?v=lxM_a7xvYGc +https://www.youtube.com/watch?v=ENz1DI-xv08 +https://www.youtube.com/watch?v=VYOpiHVztCE +https://www.youtube.com/watch?v=Sj1mr1vZ1zg +https://www.youtube.com/watch?v=fNfY53BPSmg +https://www.youtube.com/watch?v=vuuQKCbAIjk +https://www.youtube.com/watch?v=z3M-xV_oem4 +https://www.youtube.com/watch?v=pfOYokoGVb0 +https://www.youtube.com/watch?v=HejkqCQe0D8 +https://www.youtube.com/watch?v=7jQUzT2M8X0 +https://www.youtube.com/watch?v=kAA_7GG1LQI +https://www.youtube.com/watch?v=yRXo1l6gRX4 +https://www.youtube.com/watch?v=PULxfbCW1bM +https://www.youtube.com/watch?v=Ow1zVOUxQ3E +https://www.youtube.com/watch?v=09_ieUyQD8s +https://www.youtube.com/watch?v=delIGj2LDts +https://www.youtube.com/watch?v=ir4fhBd9PW8 +https://www.youtube.com/watch?v=lQ9smpWZ_dQ +https://www.youtube.com/watch?v=9XkO3mye-1w +https://www.youtube.com/watch?v=KVzjmF3sFxs +https://www.youtube.com/watch?v=0VusddXJIsI +https://www.youtube.com/watch?v=6_ssgMPsgbI +https://www.youtube.com/watch?v=VbZw9HweTeo +https://www.youtube.com/watch?v=00SImiNjHyM +https://www.youtube.com/watch?v=dO6JKS6wbAA +https://www.youtube.com/watch?v=wpqMNn1IhDw +https://www.youtube.com/watch?v=sSv3ihsOxvM +https://www.youtube.com/watch?v=6mFcIil6_z0 +https://www.youtube.com/watch?v=Sgx-2mDqSzc +https://www.youtube.com/watch?v=A8AB7TpQxEs +https://www.youtube.com/watch?v=KS7eqksUg9o +https://www.youtube.com/watch?v=QF343yGE3CY +https://www.youtube.com/watch?v=T7XOVJRUa-0 +https://www.youtube.com/watch?v=-D0ZbmuNZR4 +https://www.youtube.com/watch?v=SZ5uMY2BnjI +https://www.youtube.com/watch?v=Wz2OGaWFY0E +https://www.youtube.com/watch?v=Wz6ofYXGc88 +https://www.youtube.com/watch?v=gbG5N1WxE3Q +https://www.youtube.com/watch?v=htET1lBbmBI +https://www.youtube.com/watch?v=rKTMv0Em8XY +https://www.youtube.com/watch?v=73tgi-8FxGI +https://www.youtube.com/watch?v=io8FePn3Z6A +https://www.youtube.com/watch?v=SptD8UmCrRM +https://www.youtube.com/watch?v=WvcDTzX0vr8 +https://www.youtube.com/watch?v=-_5rhG_EjTg +https://www.youtube.com/watch?v=1UAwlk6sRZo +https://www.youtube.com/watch?v=DCQmVzOifcg +https://www.youtube.com/watch?v=3cT4Sw_Dkhg +https://www.youtube.com/watch?v=pfdcN2FcKug +https://www.youtube.com/watch?v=JHD5Jt9J41U +https://www.youtube.com/watch?v=4WjBo5p6eTw +https://www.youtube.com/watch?v=Hl6AB6oViQs +https://www.youtube.com/watch?v=5XNQo4CC9dM +https://www.youtube.com/watch?v=Fnr1v1wYy60 +https://www.youtube.com/watch?v=2sKHlRpOMMo +https://www.youtube.com/watch?v=Ou6UEeUGIDA +https://www.youtube.com/watch?v=x6pX2rT-SqM +https://www.youtube.com/watch?v=dINr88UYHgc +https://www.youtube.com/watch?v=S3UOmaM-PpU +https://www.youtube.com/watch?v=8pXy8bh0Q0Q +https://www.youtube.com/watch?v=jhJFYfacwAc +https://www.youtube.com/watch?v=Hy67pOxlTgQ +https://www.youtube.com/watch?v=64-sAuJ8K7Y +https://www.youtube.com/watch?v=xaGWnjP7NVQ +https://www.youtube.com/watch?v=vYu3tkfaEcc +https://www.youtube.com/watch?v=6kO7vguhv2M +https://www.youtube.com/watch?v=rZjpxCSbu9w +https://www.youtube.com/watch?v=F4SZ4kNkX0c +https://www.youtube.com/watch?v=MeMR02kR3gE +https://www.youtube.com/watch?v=hm9vnD7gsCQ +https://www.youtube.com/watch?v=MaKkOahuC78 +https://www.youtube.com/watch?v=mc1FhpTls-A +https://www.youtube.com/watch?v=7XOxmV4ddNI +https://www.youtube.com/watch?v=b2o7a0D1ALs +https://www.youtube.com/watch?v=_oSutnfDUf8 +https://www.youtube.com/watch?v=taiQxc18xk0 +https://www.youtube.com/watch?v=kI6lgu9OL9I +https://www.youtube.com/watch?v=UNE-Himotz0 +https://www.youtube.com/watch?v=uD70OQniXTQ +https://www.youtube.com/watch?v=vs72Ng_jodU +https://www.youtube.com/watch?v=yanyMgdNfWU +https://www.youtube.com/watch?v=sGtTSEDc_w8 +https://www.youtube.com/watch?v=p-tCzjrh52Q +https://www.youtube.com/watch?v=PMQJ3dHi-JQ +https://www.youtube.com/watch?v=zIt66_3zYfM +https://www.youtube.com/watch?v=8mAMPRNl7ZQ +https://www.youtube.com/watch?v=ktFVOeYnwJI +https://www.youtube.com/watch?v=sKfIsBA_k60 +https://www.youtube.com/watch?v=y2axw12xLlc +https://www.youtube.com/watch?v=yDPEq8ObtXg +https://www.youtube.com/watch?v=tjJX5oB4EF0 +https://www.youtube.com/watch?v=WERFogub0MY +https://www.youtube.com/watch?v=JfN1S9Cil1I +https://www.youtube.com/watch?v=OUY9hCLQ6s8 +https://www.youtube.com/watch?v=kpg0Q0KEvyU +https://www.youtube.com/watch?v=AxgSz2gh6WE +https://www.youtube.com/watch?v=sKRDjWd4KCw +https://www.youtube.com/watch?v=mBl2wOUv5RA +https://www.youtube.com/watch?v=-i_xeg7jssk +https://www.youtube.com/watch?v=OG2kKOmey4Q +https://www.youtube.com/watch?v=mbHsmGm0F8c +https://www.youtube.com/watch?v=pn2D3Wd5Lc4 +https://www.youtube.com/watch?v=8MFvpgA6ylk +https://www.youtube.com/watch?v=BKC7rXf54-k +https://www.youtube.com/watch?v=Q7Q5ygmO3mU +https://www.youtube.com/watch?v=WwbqQ3TPeok +https://www.youtube.com/watch?v=_1GYGOaMCes +https://www.youtube.com/watch?v=jCJ-nEx2ko0 +https://www.youtube.com/watch?v=nxQ8UPOk4tc +https://www.youtube.com/watch?v=13m9TxErPRI +https://www.youtube.com/watch?v=IRcFyWNZeAA +https://www.youtube.com/watch?v=UL6kx-t_xM8 +https://www.youtube.com/watch?v=9gtn2fmvRlA +https://www.youtube.com/watch?v=xJjpIjfEPoc +https://www.youtube.com/watch?v=-sXNKkOsMNs +https://www.youtube.com/watch?v=883w-T9wHBs +https://www.youtube.com/watch?v=a1EQBbKRfoc +https://www.youtube.com/watch?v=b7_7qpLvKpQ +https://www.youtube.com/watch?v=r2abEcxai08 +https://www.youtube.com/watch?v=VEzH8V7Tt80 +https://www.youtube.com/watch?v=-Zt0PiwL0Wo +https://www.youtube.com/watch?v=5L_hjw0y9WU +https://www.youtube.com/watch?v=oLpS-692p_Y +https://www.youtube.com/watch?v=c0IiK5jpg_I +https://www.youtube.com/watch?v=JZcpGbm4FX4 +https://www.youtube.com/watch?v=RVvUTayv2L8 +https://www.youtube.com/watch?v=mKx9CJ2B-Us +https://www.youtube.com/watch?v=6AWS08oFmO4 +https://www.youtube.com/watch?v=6VNQ91IAE1U +https://www.youtube.com/watch?v=YdITVnpEOiA +https://www.youtube.com/watch?v=z67zFn_E94g +https://www.youtube.com/watch?v=NduD3p7MugA +https://www.youtube.com/watch?v=aMPTcld2R50 +https://www.youtube.com/watch?v=4rsm7Xjv_Hw +https://www.youtube.com/watch?v=cKKi-s6xvGQ +https://www.youtube.com/watch?v=fa8yHVDha9A +https://www.youtube.com/watch?v=2ocd6oVbfSk +https://www.youtube.com/watch?v=xd6BSNRjS9s +https://www.youtube.com/watch?v=kXPkpDzTKUI +https://www.youtube.com/watch?v=TeTxAhmjZDc +https://www.youtube.com/watch?v=pIsznwhTFzA +https://www.youtube.com/watch?v=TX2duib2HvQ +https://www.youtube.com/watch?v=2lSOhcBa1cE +https://www.youtube.com/watch?v=aBHO9vEqeg0 +https://www.youtube.com/watch?v=6kNnsU01z6s +https://www.youtube.com/watch?v=AgXkWyfudCY +https://www.youtube.com/watch?v=63LvptDiyn0 +https://www.youtube.com/watch?v=mpls4RO2Sew +https://www.youtube.com/watch?v=FQQOy3gK0aM +https://www.youtube.com/watch?v=iElhQSrK_gQ +https://www.youtube.com/watch?v=06rJ3VU5XuY +https://www.youtube.com/watch?v=f1uAhp8G2iY +https://www.youtube.com/watch?v=rEolrC_dWCc +https://www.youtube.com/watch?v=XQBl29RFtRw +https://www.youtube.com/watch?v=gGmKewwq_G4 +https://www.youtube.com/watch?v=Ktv_YSp1T48 +https://www.youtube.com/watch?v=1s8kzflWSuI +https://www.youtube.com/watch?v=Yt7Gtls0Rpc +https://www.youtube.com/watch?v=0xHg1q2dybA +https://www.youtube.com/watch?v=D9l-LOBMYTA +https://www.youtube.com/watch?v=hw7fxmn8lJk +https://www.youtube.com/watch?v=uvvAIuFptXw +https://www.youtube.com/watch?v=ds2JXnt5xXs +https://www.youtube.com/watch?v=xkWirP51bFU +https://www.youtube.com/watch?v=-jkmgcbf2AQ +https://www.youtube.com/watch?v=mH8Qrii8EOQ +https://www.youtube.com/watch?v=367pqLOIXcM +https://www.youtube.com/watch?v=3jJDsO137Wc +https://www.youtube.com/watch?v=RDGRu99HgWQ +https://www.youtube.com/watch?v=l4W1EeLdpAg +https://www.youtube.com/watch?v=NjZVHcoxgjY +https://www.youtube.com/watch?v=5UncrLkE6rA +https://www.youtube.com/watch?v=01rfz1uMDP0 +https://www.youtube.com/watch?v=RN6a6FNGbUI +https://www.youtube.com/watch?v=WZIYfMpDXCY +https://www.youtube.com/watch?v=mvrpON9NTk4 +https://www.youtube.com/watch?v=ywM_kpE6x08 +https://www.youtube.com/watch?v=ygPlWXqHsig +https://www.youtube.com/watch?v=mAcwJmv-lCc +https://www.youtube.com/watch?v=IPFFvQDYaf4 +https://www.youtube.com/watch?v=zurAzTl_h38 +https://www.youtube.com/watch?v=fiauZn74bak +https://www.youtube.com/watch?v=uuiFxk428WI +https://www.youtube.com/watch?v=HqayuXwuL3w +https://www.youtube.com/watch?v=E6beeQe7NQA +https://www.youtube.com/watch?v=tKH2QqmekxA +https://www.youtube.com/watch?v=z1T1ObFO_P0 +https://www.youtube.com/watch?v=pk_wGZjE4ZM +https://www.youtube.com/watch?v=I8AFTCfTCNU +https://www.youtube.com/watch?v=ef7YgE16fko +https://www.youtube.com/watch?v=XX9gQ5ogYM0 +https://www.youtube.com/watch?v=jfwJxQHBuYQ +https://www.youtube.com/watch?v=19Rv6AuPQ2g +https://www.youtube.com/watch?v=0tIXPDwJves +https://www.youtube.com/watch?v=3YPohsVqHU0 +https://www.youtube.com/watch?v=mfJXdvV92jI +https://www.youtube.com/watch?v=mSemBOoh2Yo +https://www.youtube.com/watch?v=0l20ILvAwt4 +https://www.youtube.com/watch?v=qEYFI_z0K3E +https://www.youtube.com/watch?v=280uzhCRR7s +https://www.youtube.com/watch?v=UNJ3S8ivbTQ +https://www.youtube.com/watch?v=FJm_yAT4yDc +https://www.youtube.com/watch?v=skpWa0r4bUI +https://www.youtube.com/watch?v=W8PJbBAcyV0 +https://www.youtube.com/watch?v=TmJS6aj3-dw +https://www.youtube.com/watch?v=k_w_TzpeZxI +https://www.youtube.com/watch?v=K_F3yqv7CJE +https://www.youtube.com/watch?v=QXmlNXcMySE +https://www.youtube.com/watch?v=A1vAAOVmbP0 +https://www.youtube.com/watch?v=PaBqH6VD55E +https://www.youtube.com/watch?v=ucAoopysUAI +https://www.youtube.com/watch?v=vjshLjye-qE +https://www.youtube.com/watch?v=XgQBNjTQ3Is +https://www.youtube.com/watch?v=pF7-2QwXHKc +https://www.youtube.com/watch?v=jctNS45TWpU +https://www.youtube.com/watch?v=PKorRRGUyHw +https://www.youtube.com/watch?v=2v8TzB8-LoI +https://www.youtube.com/watch?v=3VatPXxfjaM +https://www.youtube.com/watch?v=omeKGD5FdIA +https://www.youtube.com/watch?v=u4zV6mXmmKs +https://www.youtube.com/watch?v=YYee20a-QqI +https://www.youtube.com/watch?v=SZ9mdXqtwd8 +https://www.youtube.com/watch?v=zKYRTjUywaY +https://www.youtube.com/watch?v=-9e4GCOOmp8 +https://www.youtube.com/watch?v=6xFLANoml_Q +https://www.youtube.com/watch?v=feMq5y8UB3Q +https://www.youtube.com/watch?v=qZ6tlyBMUqE +https://www.youtube.com/watch?v=fnNqGTWMYBM +https://www.youtube.com/watch?v=Ry8Z5solATY +https://www.youtube.com/watch?v=fnbiyF0buBU +https://www.youtube.com/watch?v=9WXa1LNNe2o +https://www.youtube.com/watch?v=z8UZZZxFeUc +https://www.youtube.com/watch?v=JXaJXwwOJ4Y +https://www.youtube.com/watch?v=uIWXP5jcBv4 +https://www.youtube.com/watch?v=bFyGBhVyiMo +https://www.youtube.com/watch?v=QTzobwv3Yw0 +https://www.youtube.com/watch?v=8Jbm7SL7s74 +https://www.youtube.com/watch?v=jdeZXWw3Nwo +https://www.youtube.com/watch?v=_KtVSsqSl4A +https://www.youtube.com/watch?v=j37CI3fhAwI +https://www.youtube.com/watch?v=IKoQFXPCVL4 +https://www.youtube.com/watch?v=b136ue2BxBo +https://www.youtube.com/watch?v=_p2DNkef5RM +https://www.youtube.com/watch?v=2vo7ix3_jYQ +https://www.youtube.com/watch?v=FuuMOebTHGQ +https://www.youtube.com/watch?v=ZBc6NpA__FY +https://www.youtube.com/watch?v=nP4Vzfp4U4g +https://www.youtube.com/watch?v=xYW0e8Vjpb4 +https://www.youtube.com/watch?v=YMEov5dJ3Ac +https://www.youtube.com/watch?v=2DYzzjwoqNM +https://www.youtube.com/watch?v=wO89RZgChCU +https://www.youtube.com/watch?v=hK4mdtUs9ZE +https://www.youtube.com/watch?v=QdlEzZKJFqc +https://www.youtube.com/watch?v=Fu0E9CLeHhU +https://www.youtube.com/watch?v=XJ_UDNWXYas +https://www.youtube.com/watch?v=2MYqr8atWKQ +https://www.youtube.com/watch?v=GjhNPl6S3cs +https://www.youtube.com/watch?v=GffJ3Yibndo +https://www.youtube.com/watch?v=SoIAPMCaDHI +https://www.youtube.com/watch?v=2IM9mIWhB0E +https://www.youtube.com/watch?v=qSS_73nlO1s +https://www.youtube.com/watch?v=S7RktiWIF5A +https://www.youtube.com/watch?v=eRGC_P3YV2s +https://www.youtube.com/watch?v=etnv3-g0aHk +https://www.youtube.com/watch?v=shW4hoJwg5c +https://www.youtube.com/watch?v=PokWotcGy8g +https://www.youtube.com/watch?v=xzvv4FnuSok +https://www.youtube.com/watch?v=bX5b98wVpoU +https://www.youtube.com/watch?v=51i8HuB2stg +https://www.youtube.com/watch?v=G2jFSnScYKs +https://www.youtube.com/watch?v=I6ImYrILAHU +https://www.youtube.com/watch?v=VbIR9XG6EFk +https://www.youtube.com/watch?v=1j__nRqiSmg +https://www.youtube.com/watch?v=TdGi6CgQuW8 +https://www.youtube.com/watch?v=1gQ99t8InuA +https://www.youtube.com/watch?v=Y-8nqbbFUWQ +https://www.youtube.com/watch?v=P9aHdSdql94 +https://www.youtube.com/watch?v=Omb0ipW_Ojo +https://www.youtube.com/watch?v=SKgjRyfg69Y +https://www.youtube.com/watch?v=h1iIlc-bdeM +https://www.youtube.com/watch?v=Bemw7-CrC-Q +https://www.youtube.com/watch?v=kc0VX29APG8 +https://www.youtube.com/watch?v=bN7Si1lY_Oo +https://www.youtube.com/watch?v=2NrgIhlGMss +https://www.youtube.com/watch?v=9nQ_Qs8gilE +https://www.youtube.com/watch?v=sFvJOjgA4bA +https://www.youtube.com/watch?v=w1biOJ2oKQw +https://www.youtube.com/watch?v=zF5cN9P5_aU +https://www.youtube.com/watch?v=_cqBSZPGwfw +https://www.youtube.com/watch?v=2T7hTrXKQIM +https://www.youtube.com/watch?v=icaEyu5gfbI +https://www.youtube.com/watch?v=6tIMyrKyupM +https://www.youtube.com/watch?v=lM4tb6fQ_nU +https://www.youtube.com/watch?v=_go14KzQA8A +https://www.youtube.com/watch?v=QgQFc4DL_yg +https://www.youtube.com/watch?v=BixPQs8sCuc +https://www.youtube.com/watch?v=s3jUI9QawCQ +https://www.youtube.com/watch?v=h31v70v8Usw +https://www.youtube.com/watch?v=QKbHkqK1gnk +https://www.youtube.com/watch?v=zGOQhVS8q_I +https://www.youtube.com/watch?v=W-DwBR0wHD8 +https://www.youtube.com/watch?v=en4Lom0HTVQ +https://www.youtube.com/watch?v=6-TM3WHpXk8 +https://www.youtube.com/watch?v=l-a1tra_LJY +https://www.youtube.com/watch?v=xEheck5jDss +https://www.youtube.com/watch?v=pxOjDtsSaPo +https://www.youtube.com/watch?v=ESDlq4Uza68 +https://www.youtube.com/watch?v=l3599LD9ot0 +https://www.youtube.com/watch?v=jo1Gcx33xg8 +https://www.youtube.com/watch?v=DcADJQWk9AE +https://www.youtube.com/watch?v=DV0mS4OiPv8 +https://www.youtube.com/watch?v=Lk_A8heCZUI +https://www.youtube.com/watch?v=PxMAWsZMmSQ +https://www.youtube.com/watch?v=6lZiUc4LLA8 +https://www.youtube.com/watch?v=Sa9-Is51Wn8 +https://www.youtube.com/watch?v=1RHu2Vfw3v0 +https://www.youtube.com/watch?v=aac2UFmgA-Y +https://www.youtube.com/watch?v=lrzdn6syTrM +https://www.youtube.com/watch?v=xUaZZ6Yr6KI +https://www.youtube.com/watch?v=Njm0h38ljqs +https://www.youtube.com/watch?v=npIwOKtj2yM +https://www.youtube.com/watch?v=sX45wetKJq4 +https://www.youtube.com/watch?v=E1wRBaIFY3c +https://www.youtube.com/watch?v=akmjJAfy0xM +https://www.youtube.com/watch?v=kB62dvTOFhA +https://www.youtube.com/watch?v=LX3VH1I9Qg4 +https://www.youtube.com/watch?v=wSod3-xDe90 +https://www.youtube.com/watch?v=xFHN_xIN-eU +https://www.youtube.com/watch?v=LTtc10Iom6o +https://www.youtube.com/watch?v=-bKFpzTM-MA +https://www.youtube.com/watch?v=BjTO2n_c5eQ +https://www.youtube.com/watch?v=G1dNIRpqZJg +https://www.youtube.com/watch?v=xr_Wgs0BHY8 +https://www.youtube.com/watch?v=zpvmWlkl74s +https://www.youtube.com/watch?v=-dNDoy2sA1c +https://www.youtube.com/watch?v=q55uhizppEk +https://www.youtube.com/watch?v=ms2xZYmhN7E +https://www.youtube.com/watch?v=I1mXIlzbTNQ +https://www.youtube.com/watch?v=OLgjdd4VYCU +https://www.youtube.com/watch?v=flBo_rqbRqc +https://www.youtube.com/watch?v=vgEke8PTzWo +https://www.youtube.com/watch?v=d9Npvs3YUEA +https://www.youtube.com/watch?v=nB8UexTjlts +https://www.youtube.com/watch?v=1YkCgyAttcY +https://www.youtube.com/watch?v=pNLXjgQbKVA +https://www.youtube.com/watch?v=UI9Ay3sP-Ic +https://www.youtube.com/watch?v=fAMtvFi6JBQ +https://www.youtube.com/watch?v=RSjVB0h5TD8 +https://www.youtube.com/watch?v=6PZAVZ4EZVE +https://www.youtube.com/watch?v=1enPX90IDjU +https://www.youtube.com/watch?v=PRHYrtgdz70 +https://www.youtube.com/watch?v=qkP5pjASL3o +https://www.youtube.com/watch?v=37zGf0w1Dug +https://www.youtube.com/watch?v=-2SoH9C0tbo +https://www.youtube.com/watch?v=P_1iWnR-tkA +https://www.youtube.com/watch?v=y4dQ6DTWURU +https://www.youtube.com/watch?v=4mPP8uWwxr8 +https://www.youtube.com/watch?v=7q8aLzdUXd8 +https://www.youtube.com/watch?v=CGoej1jmNbQ +https://www.youtube.com/watch?v=rHCqTxAEOOM +https://www.youtube.com/watch?v=LcGqzVfw85M +https://www.youtube.com/watch?v=iTxzkv8kEWI +https://www.youtube.com/watch?v=j1cRaYMlJmQ +https://www.youtube.com/watch?v=U_bg7CNrAZc +https://www.youtube.com/watch?v=rNUFnOO2rXs +https://www.youtube.com/watch?v=voi8bgF1Ijw +https://www.youtube.com/watch?v=3Xbyc8sbpCI +https://www.youtube.com/watch?v=W61OfSeoWBI +https://www.youtube.com/watch?v=RpcYEFBZMnY +https://www.youtube.com/watch?v=UdATWjLvZ10 +https://www.youtube.com/watch?v=1sPiqba_w-c +https://www.youtube.com/watch?v=NGLASxoC4SA +https://www.youtube.com/watch?v=LqYJRx81E6w +https://www.youtube.com/watch?v=kVQqM2w8sm4 +https://www.youtube.com/watch?v=rP4AjhcVIMQ +https://www.youtube.com/watch?v=Ptpl65Z_Q0M +https://www.youtube.com/watch?v=aVnv7Iy_QtE +https://www.youtube.com/watch?v=Kl7o4k6CfXw +https://www.youtube.com/watch?v=M6G1BAa8E9c +https://www.youtube.com/watch?v=fkNCVh4HIBA +https://www.youtube.com/watch?v=8gbRco5_2rg +https://www.youtube.com/watch?v=b2UIhsD2Cvg +https://www.youtube.com/watch?v=tqdQ6W-01FM +https://www.youtube.com/watch?v=Li4PMmYFjOg +https://www.youtube.com/watch?v=LM2_eKw2nw4 +https://www.youtube.com/watch?v=k8Z3_QVcxQA +https://www.youtube.com/watch?v=Sfo6fW-QJys +https://www.youtube.com/watch?v=c06bh8Gjtk8 +https://www.youtube.com/watch?v=mRx56SFQ8QA +https://www.youtube.com/watch?v=6QocZNp2Djo +https://www.youtube.com/watch?v=BbhrHJH4KRI +https://www.youtube.com/watch?v=lNCy7BO37hg +https://www.youtube.com/watch?v=ZF4t_BtIARA +https://www.youtube.com/watch?v=l3A4dHyW0Hk +https://www.youtube.com/watch?v=N5w-HfJdOIE +https://www.youtube.com/watch?v=vWttLvxA-08 +https://www.youtube.com/watch?v=TEGB8sgm5S4 +https://www.youtube.com/watch?v=dOB9cKSCXZo +https://www.youtube.com/watch?v=7fYHm-70kCs +https://www.youtube.com/watch?v=6do1PrNrhks +https://www.youtube.com/watch?v=lz2hNSk2Trc +https://www.youtube.com/watch?v=awCoKx8VNx0 +https://www.youtube.com/watch?v=_IC0X1jsWQg +https://www.youtube.com/watch?v=BfWfOZ8-4Vk +https://www.youtube.com/watch?v=5JxfZDHexes +https://www.youtube.com/watch?v=QKv2dlecwE4 +https://www.youtube.com/watch?v=bbFqfVHlOQs +https://www.youtube.com/watch?v=7FwB8-UtSTY +https://www.youtube.com/watch?v=Z6UZ2Est_Rk +https://www.youtube.com/watch?v=lsXrjvmhyGc +https://www.youtube.com/watch?v=yQmff118iG0 +https://www.youtube.com/watch?v=5zZCVYX46oA +https://www.youtube.com/watch?v=hakUmmty_Ls +https://www.youtube.com/watch?v=gO7qwdewGL8 +https://www.youtube.com/watch?v=N4bChET_zcE +https://www.youtube.com/watch?v=km06-0psWps +https://www.youtube.com/watch?v=vYG3_0iwY6Q +https://www.youtube.com/watch?v=NfW7ugCXq-E +https://www.youtube.com/watch?v=-N6YZYPjyG4 +https://www.youtube.com/watch?v=MTqLhhYDQsg +https://www.youtube.com/watch?v=iNnrMwskCt0 +https://www.youtube.com/watch?v=cy1hAIofwTA +https://www.youtube.com/watch?v=ssPwz0YCqsA +https://www.youtube.com/watch?v=nPG8_5O1urE +https://www.youtube.com/watch?v=M6sy9m93Kcc +https://www.youtube.com/watch?v=69m-cyniT0Y +https://www.youtube.com/watch?v=JPy5s_vVTFs +https://www.youtube.com/watch?v=KfrQlDAog3Q +https://www.youtube.com/watch?v=x-7MZ-iGoQk +https://www.youtube.com/watch?v=H7IlCQnvU0I +https://www.youtube.com/watch?v=Yy19s2yBsVU +https://www.youtube.com/watch?v=2G5XeSGDPyc +https://www.youtube.com/watch?v=B1oYCHvADZY +https://www.youtube.com/watch?v=fSH7eaRQuJU +https://www.youtube.com/watch?v=95rnBvsZbZU +https://www.youtube.com/watch?v=pKRvuwn9GfI +https://www.youtube.com/watch?v=il0j0nQnK20 +https://www.youtube.com/watch?v=x3aishDTjeI +https://www.youtube.com/watch?v=1oGsN1mVgsM +https://www.youtube.com/watch?v=mBVYIXRAkHM +https://www.youtube.com/watch?v=6Z51tXq54zc +https://www.youtube.com/watch?v=-_gyejedS14 +https://www.youtube.com/watch?v=FF5ttCY898w +https://www.youtube.com/watch?v=xCGaVzXoBvo +https://www.youtube.com/watch?v=qt7lOLl8GAc +https://www.youtube.com/watch?v=WrjgF6hjfxY +https://www.youtube.com/watch?v=7AyxprXTsIg +https://www.youtube.com/watch?v=SyR5yRwWtNo +https://www.youtube.com/watch?v=-WIOayHCDPo +https://www.youtube.com/watch?v=y0JtoZERkhQ +https://www.youtube.com/watch?v=lqdbxTKrTS8 +https://www.youtube.com/watch?v=KUuJH5WSN_c +https://www.youtube.com/watch?v=vGUHmGWFgiA +https://www.youtube.com/watch?v=zDuvYbU6giQ +https://www.youtube.com/watch?v=D-KvhXV9qdM +https://www.youtube.com/watch?v=-NAcOMzY2qk +https://www.youtube.com/watch?v=Dysjq3qtI1c +https://www.youtube.com/watch?v=U-zJ0YVOeac +https://www.youtube.com/watch?v=50F6NBek_uE +https://www.youtube.com/watch?v=yNpIqZkaGXs +https://www.youtube.com/watch?v=CrbeAD8S8hU +https://www.youtube.com/watch?v=b4dHqUw9s98 +https://www.youtube.com/watch?v=RxRwInWoNCA +https://www.youtube.com/watch?v=QO8aek7VgOw +https://www.youtube.com/watch?v=Yk1y0z0Lz-Q +https://www.youtube.com/watch?v=fndst7rrz90 +https://www.youtube.com/watch?v=_sROrMglc7s +https://www.youtube.com/watch?v=NT8WIkntDBQ +https://www.youtube.com/watch?v=8xO0nrxYhtU +https://www.youtube.com/watch?v=VZJSRmgH7Ww +https://www.youtube.com/watch?v=nsejs-Vj6VA +https://www.youtube.com/watch?v=_cRazf-kuh0 +https://www.youtube.com/watch?v=p_JrAn10AsE +https://www.youtube.com/watch?v=8fDFFLoY08s +https://www.youtube.com/watch?v=TKfE2xHLcJU +https://www.youtube.com/watch?v=zY1UHAhvZNY +https://www.youtube.com/watch?v=eJZKJUvWPV0 +https://www.youtube.com/watch?v=0REjPqvjFwc +https://www.youtube.com/watch?v=oMVoj6hkt7Q +https://www.youtube.com/watch?v=gog3F-MRaBA +https://www.youtube.com/watch?v=qdDWjoy4g4o +https://www.youtube.com/watch?v=fzVtPI0WTgQ +https://www.youtube.com/watch?v=dceFJd55ZRs +https://www.youtube.com/watch?v=fAUydLncMlQ +https://www.youtube.com/watch?v=6hcoparO0AY +https://www.youtube.com/watch?v=R-OXwsnZkhg +https://www.youtube.com/watch?v=HMyZGhCNWEs +https://www.youtube.com/watch?v=sATiSokDMsE +https://www.youtube.com/watch?v=XrghP79kpjU +https://www.youtube.com/watch?v=Bgo5eBUIG70 +https://www.youtube.com/watch?v=iCA8zfIS57s +https://www.youtube.com/watch?v=H1TZCRXBus4 +https://www.youtube.com/watch?v=quMnDQBXzA8 +https://www.youtube.com/watch?v=dbkiHJyEWEU +https://www.youtube.com/watch?v=NBp4QUN77eg +https://www.youtube.com/watch?v=HZyOQzDS678 +https://www.youtube.com/watch?v=teOOvPRSuc8 +https://www.youtube.com/watch?v=rC9-woyHDKw +https://www.youtube.com/watch?v=CzDZv3upREs +https://www.youtube.com/watch?v=xkz6y4-I538 +https://www.youtube.com/watch?v=hP6-1XpmvW4 +https://www.youtube.com/watch?v=nHOMo4L4j_Y +https://www.youtube.com/watch?v=TH2UrUpWakY +https://www.youtube.com/watch?v=Qs1mQA4TRbg +https://www.youtube.com/watch?v=jn-N9NEZybs +https://www.youtube.com/watch?v=3BZsAQC6Prw +https://www.youtube.com/watch?v=i90tbQDY3eo +https://www.youtube.com/watch?v=vmyi7L6xDdU +https://www.youtube.com/watch?v=Yd7P73qLD3c +https://www.youtube.com/watch?v=zOUsPwjhph8 +https://www.youtube.com/watch?v=37yUKFtz_BI +https://www.youtube.com/watch?v=WU8iL0D2nY4 +https://www.youtube.com/watch?v=MTrIygjBiWk +https://www.youtube.com/watch?v=pNp85sYhcEs +https://www.youtube.com/watch?v=M72QlvVS39I +https://www.youtube.com/watch?v=xQy30Iikl9g +https://www.youtube.com/watch?v=TQq6CE-_zF4 +https://www.youtube.com/watch?v=bStpz3_WPuU +https://www.youtube.com/watch?v=lC51HTZjQeY +https://www.youtube.com/watch?v=_gljvpWvjdY +https://www.youtube.com/watch?v=KZUFuALvKSc +https://www.youtube.com/watch?v=-Kr4Ft2fCDc +https://www.youtube.com/watch?v=KcwYIQ8AAOs +https://www.youtube.com/watch?v=c5hjPFgf1DU +https://www.youtube.com/watch?v=w7aabeoAIns +https://www.youtube.com/watch?v=rb5NKtj2fn0 +https://www.youtube.com/watch?v=aJFnftIgpVg +https://www.youtube.com/watch?v=0poCn5r1wDc +https://www.youtube.com/watch?v=ygfFlVvBu4o +https://www.youtube.com/watch?v=MSI6bKsLH0s +https://www.youtube.com/watch?v=HbJd4DGdRXo +https://www.youtube.com/watch?v=0u2UXvR4yVI +https://www.youtube.com/watch?v=0TIqoSR1Mfk +https://www.youtube.com/watch?v=nlYkvu2-8_8 +https://www.youtube.com/watch?v=y7uOkbMqEjI +https://www.youtube.com/watch?v=V5UrsV1PU3Y +https://www.youtube.com/watch?v=kmw1YaOkfjE +https://www.youtube.com/watch?v=dOuyoV-9aHQ +https://www.youtube.com/watch?v=E0NbvW2TFLg +https://www.youtube.com/watch?v=q-jUCA5Rm28 +https://www.youtube.com/watch?v=YrueIOPs5L0 +https://www.youtube.com/watch?v=IHkP6Syj82s +https://www.youtube.com/watch?v=iIFl1qX7CoY +https://www.youtube.com/watch?v=0cKhemqjgQ8 +https://www.youtube.com/watch?v=dcHvwaI5bAg +https://www.youtube.com/watch?v=Pezn6Ru5fi0 +https://www.youtube.com/watch?v=Wf_BnBmT5_E +https://www.youtube.com/watch?v=34Uc06b-yQ4 +https://www.youtube.com/watch?v=lnbpEfRQwyc +https://www.youtube.com/watch?v=Ilh90vut7jo +https://www.youtube.com/watch?v=CHc1Bu8A9QM +https://www.youtube.com/watch?v=73Ie5z5aBw8 +https://www.youtube.com/watch?v=k8PJC1YTelY +https://www.youtube.com/watch?v=iGZ-i6c2OGU +https://www.youtube.com/watch?v=Tj96vlZBPUs +https://www.youtube.com/watch?v=KDE2s9B1eDo +https://www.youtube.com/watch?v=d2E2x-BSKO0 +https://www.youtube.com/watch?v=Vvnq-f43v20 +https://www.youtube.com/watch?v=OP0TPyBjq7c +https://www.youtube.com/watch?v=sjZ-dbd7FQ0 +https://www.youtube.com/watch?v=Z1Z6KPzy0p4 +https://www.youtube.com/watch?v=vg0Ko4LnYh4 +https://www.youtube.com/watch?v=f0djA_P2rQ8 +https://www.youtube.com/watch?v=cC3q0aHIYCU +https://www.youtube.com/watch?v=LHcJTxccNXE +https://www.youtube.com/watch?v=JA7VdwocB6I +https://www.youtube.com/watch?v=Nhmlm15C4eA +https://www.youtube.com/watch?v=rY_suqSxWV8 +https://www.youtube.com/watch?v=pI29BFeSmuI +https://www.youtube.com/watch?v=KOgfzQxYIsI +https://www.youtube.com/watch?v=0D5Tc8Op_n4 +https://www.youtube.com/watch?v=CxcEWMHNePE +https://www.youtube.com/watch?v=obijefFzq7A +https://www.youtube.com/watch?v=WU5ULpORl3A +https://www.youtube.com/watch?v=IHZwGNq5tb4 +https://www.youtube.com/watch?v=EKFqRJUEjEA +https://www.youtube.com/watch?v=I4eb7P9atas +https://www.youtube.com/watch?v=lLxGNWraT4s +https://www.youtube.com/watch?v=zgr98z06KBA +https://www.youtube.com/watch?v=125ox0n1NeQ +https://www.youtube.com/watch?v=fH22LI57SHY +https://www.youtube.com/watch?v=sGTrqDst1Dc +https://www.youtube.com/watch?v=OBg_Li5ErIU +https://www.youtube.com/watch?v=sQIt0HHZ8fw +https://www.youtube.com/watch?v=M6zNwBAYKSM +https://www.youtube.com/watch?v=Qspv6ZH29FA +https://www.youtube.com/watch?v=WuHPgV2Yxbs +https://www.youtube.com/watch?v=hu8khi3clIY +https://www.youtube.com/watch?v=ds5tz7yWBCk +https://www.youtube.com/watch?v=A7xqGo4oeec +https://www.youtube.com/watch?v=FFJDWDhFybQ +https://www.youtube.com/watch?v=YPHA89-RDqg +https://www.youtube.com/watch?v=bUvul182gWs +https://www.youtube.com/watch?v=3gyX7S8dwq0 +https://www.youtube.com/watch?v=4wmE8_0odtY +https://www.youtube.com/watch?v=FpTyGD4M-Cs +https://www.youtube.com/watch?v=NinU97Irqi8 +https://www.youtube.com/watch?v=m3YF4PTVOWI +https://www.youtube.com/watch?v=IgytzDONMS8 +https://www.youtube.com/watch?v=ccOx041__PE +https://www.youtube.com/watch?v=Go_H4eFwDXk +https://www.youtube.com/watch?v=nw2U2V7o_cg +https://www.youtube.com/watch?v=idtYG-SAps4 +https://www.youtube.com/watch?v=O8tSaYoR_40 +https://www.youtube.com/watch?v=wFeSbJySSfA +https://www.youtube.com/watch?v=BaToTsaDkl4 +https://www.youtube.com/watch?v=Qnytk6loeJQ +https://www.youtube.com/watch?v=vr_mAzDD_fA +https://www.youtube.com/watch?v=Pc_EupD2jSA +https://www.youtube.com/watch?v=hku9k2Xvl6E +https://www.youtube.com/watch?v=tovKGVUwfcA +https://www.youtube.com/watch?v=uVW458DyeOM +https://www.youtube.com/watch?v=0Yijhh3Krb4 +https://www.youtube.com/watch?v=jLywttFVo54 +https://www.youtube.com/watch?v=LNI382U5WH0 +https://www.youtube.com/watch?v=4iGXG127GyE +https://www.youtube.com/watch?v=jEec64BueAw +https://www.youtube.com/watch?v=JQT8tGBCX3U +https://www.youtube.com/watch?v=gFqUAiDSLKc +https://www.youtube.com/watch?v=yO-hte4ubig +https://www.youtube.com/watch?v=OaCaeatGiHg +https://www.youtube.com/watch?v=9lKTASGr6aI +https://www.youtube.com/watch?v=_868vk4OPPA +https://www.youtube.com/watch?v=Z97QM0Yx6uk +https://www.youtube.com/watch?v=jVLhMwjkbf0 +https://www.youtube.com/watch?v=4oascqjiSJw +https://www.youtube.com/watch?v=Unf3oPkNIzw +https://www.youtube.com/watch?v=-G_-x2tOFCA +https://www.youtube.com/watch?v=pbc5kBSATt0 +https://www.youtube.com/watch?v=1MEbuepe0-I +https://www.youtube.com/watch?v=jWqjpi7hcSQ +https://www.youtube.com/watch?v=WWz-VmWIizU +https://www.youtube.com/watch?v=osNDWp5Lxs4 +https://www.youtube.com/watch?v=GRr_a8MjmMc +https://www.youtube.com/watch?v=sBgB3iMc0fU +https://www.youtube.com/watch?v=h7SGCGAwSY0 +https://www.youtube.com/watch?v=AxUVWd86vLA +https://www.youtube.com/watch?v=Wc_G3GAFyqA +https://www.youtube.com/watch?v=Cxj3ZRJ7NLY +https://www.youtube.com/watch?v=D_jP3ib6XQE +https://www.youtube.com/watch?v=ouFJwOQrPuM +https://www.youtube.com/watch?v=_xpQyzECcCY +https://www.youtube.com/watch?v=Z7k81eWYy_Y +https://www.youtube.com/watch?v=zj4X_Fyxc2o +https://www.youtube.com/watch?v=P30NDHxamLw +https://www.youtube.com/watch?v=VEa0RiU5aeU +https://www.youtube.com/watch?v=4QaomQeGxoo +https://www.youtube.com/watch?v=FSc6ZUeihNw +https://www.youtube.com/watch?v=b4Rc4ReDb0E +https://www.youtube.com/watch?v=Lpe9IxDT7Mg +https://www.youtube.com/watch?v=GOi9s_z1F1I +https://www.youtube.com/watch?v=Uo64UC9rTcE +https://www.youtube.com/watch?v=ddHwQHOtKZc +https://www.youtube.com/watch?v=S-L86KKvXCQ +https://www.youtube.com/watch?v=JjX-TRYRu4c +https://www.youtube.com/watch?v=2rrPI0swTN4 +https://www.youtube.com/watch?v=6cqdOXZ-p1k +https://www.youtube.com/watch?v=WgA9Mp5g3Y4 +https://www.youtube.com/watch?v=U0HUrZYx6ac +https://www.youtube.com/watch?v=IBcTbZEV4Fo +https://www.youtube.com/watch?v=AG8OpUezp7c +https://www.youtube.com/watch?v=ItFoZ46tqxQ +https://www.youtube.com/watch?v=GaxaPI3Gu28 +https://www.youtube.com/watch?v=lKT2fxbijRY +https://www.youtube.com/watch?v=cVA0grbN7hQ +https://www.youtube.com/watch?v=fHe2-hRyTmY +https://www.youtube.com/watch?v=U8rSmAOKTcQ +https://www.youtube.com/watch?v=aNnFRhE4j9Y +https://www.youtube.com/watch?v=sVnFzhkmtHk +https://www.youtube.com/watch?v=S3iZ3Tc-Hnc +https://www.youtube.com/watch?v=2GtgoycXGvY +https://www.youtube.com/watch?v=oWK6Udr2Nh4 +https://www.youtube.com/watch?v=kF5t6C41LEk +https://www.youtube.com/watch?v=s9Zp4qz4Vu0 +https://www.youtube.com/watch?v=9EOzw3C1BrM +https://www.youtube.com/watch?v=go17ulKugwQ +https://www.youtube.com/watch?v=f0XhiUgMPfA +https://www.youtube.com/watch?v=F73sFEJferQ +https://www.youtube.com/watch?v=OHI6BTcdMBw +https://www.youtube.com/watch?v=AichQ8Wk4ac +https://www.youtube.com/watch?v=CFx6yBhkciU +https://www.youtube.com/watch?v=VjLtkPPksUY +https://www.youtube.com/watch?v=ft07E4HZJ7Q +https://www.youtube.com/watch?v=mcF-bO_Odq4 +https://www.youtube.com/watch?v=64y2g7ahof4 +https://www.youtube.com/watch?v=aDsKWg_YM7s +https://www.youtube.com/watch?v=0fRpmAYWgJE +https://www.youtube.com/watch?v=Ddp9uGyjtt4 +https://www.youtube.com/watch?v=dx-9vznjBSg +https://www.youtube.com/watch?v=mQ7b1Q_KJfU +https://www.youtube.com/watch?v=0tJR95pgM3o +https://www.youtube.com/watch?v=iY3MxLzEQKI +https://www.youtube.com/watch?v=sSXyzOrkdfs +https://www.youtube.com/watch?v=s4RJntKPU1I +https://www.youtube.com/watch?v=zgqUFmzI54E +https://www.youtube.com/watch?v=woiJ0Pbo1b0 +https://www.youtube.com/watch?v=KgT9XrH94Nk +https://www.youtube.com/watch?v=oNxu5lt2efw +https://www.youtube.com/watch?v=E2l9L0m1EUA +https://www.youtube.com/watch?v=ZhJE6t9PlZM +https://www.youtube.com/watch?v=qQD13r8kMOQ +https://www.youtube.com/watch?v=oKe6LVmuan4 +https://www.youtube.com/watch?v=XJtLW-hPD7w +https://www.youtube.com/watch?v=q3vqX_pVTZs +https://www.youtube.com/watch?v=GjmR9wnd_Dw +https://www.youtube.com/watch?v=bhKcw0w8fNo +https://www.youtube.com/watch?v=2-p0IXWzGrc +https://www.youtube.com/watch?v=IQRoXoiJKQ4 +https://www.youtube.com/watch?v=gJl8gVq6Gpo +https://www.youtube.com/watch?v=oXAszTqnnYk +https://www.youtube.com/watch?v=HfihwpdJjBU +https://www.youtube.com/watch?v=r6dI7depuDc +https://www.youtube.com/watch?v=9Us8X93IpHI +https://www.youtube.com/watch?v=eP9ivGVw7kI +https://www.youtube.com/watch?v=A0deapksgiA +https://www.youtube.com/watch?v=ZLpoV5OTtZk +https://www.youtube.com/watch?v=k4jWWF4BetA +https://www.youtube.com/watch?v=35KOQ4uRIRs +https://www.youtube.com/watch?v=gJ7ROX5Y8hc +https://www.youtube.com/watch?v=tHbkzGWUZog +https://www.youtube.com/watch?v=WWd3g6tHso8 +https://www.youtube.com/watch?v=0663OUVIskw +https://www.youtube.com/watch?v=oy-JVwHPaUI +https://www.youtube.com/watch?v=y6G8S8lOUrA +https://www.youtube.com/watch?v=W78no98uQ-U +https://www.youtube.com/watch?v=BA2PP-MGGwE +https://www.youtube.com/watch?v=tTDpFJ1uuPg +https://www.youtube.com/watch?v=0BfC_7PcJB0 +https://www.youtube.com/watch?v=0h02m6TUzf8 +https://www.youtube.com/watch?v=siHWunTXQ0A +https://www.youtube.com/watch?v=BYC1R04F2Hk +https://www.youtube.com/watch?v=7w-ozZaEyP8 +https://www.youtube.com/watch?v=o7dKrpL7BpM +https://www.youtube.com/watch?v=IQyYk7FFCbw +https://www.youtube.com/watch?v=f_Gqgl6cFr0 +https://www.youtube.com/watch?v=G3QblS_YOms +https://www.youtube.com/watch?v=DoLGVksNpdM +https://www.youtube.com/watch?v=TT4yzCS4PeY +https://www.youtube.com/watch?v=RIGkw6nxLcc +https://www.youtube.com/watch?v=cWJgvi3UelE +https://www.youtube.com/watch?v=crtRlS9I3ro +https://www.youtube.com/watch?v=6dvBUPqj59c +https://www.youtube.com/watch?v=IfI6GnYGM0I +https://www.youtube.com/watch?v=QnLmgFuVg6w +https://www.youtube.com/watch?v=reouaReX7C4 +https://www.youtube.com/watch?v=s1pLvWNsh44 +https://www.youtube.com/watch?v=smmhlt3_lws +https://www.youtube.com/watch?v=QgTKDo-NbU8 +https://www.youtube.com/watch?v=rOvksymiKqs +https://www.youtube.com/watch?v=l1rVxcAzh1M +https://www.youtube.com/watch?v=_fFuQXF-t3k +https://www.youtube.com/watch?v=BH7R_yuIFKQ +https://www.youtube.com/watch?v=-s89hDTLSjs +https://www.youtube.com/watch?v=4IMfpToOWSo +https://www.youtube.com/watch?v=B0oMlBTEh1U +https://www.youtube.com/watch?v=ylNM15gPhsk +https://www.youtube.com/watch?v=M8ONaAxZ3MU +https://www.youtube.com/watch?v=V51CE9jO4O0 +https://www.youtube.com/watch?v=R1Lo5BZtlQw +https://www.youtube.com/watch?v=uqceJK_Iao4 +https://www.youtube.com/watch?v=XeSUzWSVk9o +https://www.youtube.com/watch?v=bhenb5eG--I +https://www.youtube.com/watch?v=dpTjA8MrLhI +https://www.youtube.com/watch?v=G2yTkeufjds +https://www.youtube.com/watch?v=o-R_DGU9hpM +https://www.youtube.com/watch?v=L2KUBIDfscI +https://www.youtube.com/watch?v=uLr35eZdFTA +https://www.youtube.com/watch?v=2zIvsCI88hI +https://www.youtube.com/watch?v=zOsscfwC0Mg +https://www.youtube.com/watch?v=c2kh0n2dD7Q +https://www.youtube.com/watch?v=U2nd48Sl3T4 +https://www.youtube.com/watch?v=WD99krTKdF4 +https://www.youtube.com/watch?v=gfcFr3jruGg +https://www.youtube.com/watch?v=fsnTn1XqBic +https://www.youtube.com/watch?v=SwyLoyzuKm0 +https://www.youtube.com/watch?v=pDBToCyX1JE +https://www.youtube.com/watch?v=JNnDcvOlWJc +https://www.youtube.com/watch?v=7FVXJ9nSJhw +https://www.youtube.com/watch?v=j_ndVX1nTWo +https://www.youtube.com/watch?v=twN8USkFwaI +https://www.youtube.com/watch?v=N4P7vW2JA80 +https://www.youtube.com/watch?v=YzOTPqp0DQM +https://www.youtube.com/watch?v=aMpYQZTwIi8 +https://www.youtube.com/watch?v=H_lzWZl-VEk +https://www.youtube.com/watch?v=OXVeAoTdjHA +https://www.youtube.com/watch?v=17Oin61Mqc4 +https://www.youtube.com/watch?v=Cd0ciobBDcM +https://www.youtube.com/watch?v=rgU_5zaM0GU +https://www.youtube.com/watch?v=ll9LATC7_Ec +https://www.youtube.com/watch?v=K89lQsMwKpk +https://www.youtube.com/watch?v=mWcuuWJxLBs +https://www.youtube.com/watch?v=sc9q7JKLAmk +https://www.youtube.com/watch?v=bsu_n3Kljrw +https://www.youtube.com/watch?v=AWT5Itr4iIM +https://www.youtube.com/watch?v=TUbEiHEhahQ +https://www.youtube.com/watch?v=85CB_SgFNE8 +https://www.youtube.com/watch?v=rZeEP1suY7Q +https://www.youtube.com/watch?v=aNzVTdaHlpY +https://www.youtube.com/watch?v=QhWVwhe088c +https://www.youtube.com/watch?v=Rrjgb8ug144 +https://www.youtube.com/watch?v=ZS1VzG8pMz0 +https://www.youtube.com/watch?v=dwqX1IOBO1s +https://www.youtube.com/watch?v=gzq_ipnKzHc +https://www.youtube.com/watch?v=nrbiBE-GOVE +https://www.youtube.com/watch?v=DiPGzyMGw_A +https://www.youtube.com/watch?v=E827rlTAs3o +https://www.youtube.com/watch?v=sZ7HVucYRFM +https://www.youtube.com/watch?v=DJObJpK_wwU +https://www.youtube.com/watch?v=gXj3a_Ldagc +https://www.youtube.com/watch?v=8K5-CDvnefA +https://www.youtube.com/watch?v=AmphO8KrvZU +https://www.youtube.com/watch?v=7cDa5ZVXyRo +https://www.youtube.com/watch?v=NrFI656OE04 +https://www.youtube.com/watch?v=-dfb8v4dyts +https://www.youtube.com/watch?v=XHSL4tSuT-0 +https://www.youtube.com/watch?v=LUWic9zqq1M +https://www.youtube.com/watch?v=9X04dHWyu3Y +https://www.youtube.com/watch?v=FZmutKzxPhM +https://www.youtube.com/watch?v=Qznqxnn6YM0 +https://www.youtube.com/watch?v=CJzeNfEkEdE +https://www.youtube.com/watch?v=Rc2SS3dIFkk +https://www.youtube.com/watch?v=fYNqL3tgPj0 +https://www.youtube.com/watch?v=VC42A4FZSWw +https://www.youtube.com/watch?v=tew6A1xC5G4 +https://www.youtube.com/watch?v=06x_heN_39g +https://www.youtube.com/watch?v=cPOXcOs2cGg +https://www.youtube.com/watch?v=PyRvVKbbO68 +https://www.youtube.com/watch?v=ggOvUskvz9k +https://www.youtube.com/watch?v=BozqO_Ogy5w +https://www.youtube.com/watch?v=wmdb0RzvG7c +https://www.youtube.com/watch?v=FaxJYMPJ-pg +https://www.youtube.com/watch?v=ZpMzEGafoNw +https://www.youtube.com/watch?v=MP5VOBvP1Fg +https://www.youtube.com/watch?v=9EHHxVYRjiY +https://www.youtube.com/watch?v=0ApIbLKs-JU +https://www.youtube.com/watch?v=TWGRgM4fk4M +https://www.youtube.com/watch?v=eevPwoV7RvA +https://www.youtube.com/watch?v=brisSYFS31M +https://www.youtube.com/watch?v=SazhBlQTUhU +https://www.youtube.com/watch?v=3fscCoTP1iU +https://www.youtube.com/watch?v=pVwrZXsiCgE +https://www.youtube.com/watch?v=ztYTv43GvOg +https://www.youtube.com/watch?v=gPnyId2TCyQ +https://www.youtube.com/watch?v=RugwiGqJD60 +https://www.youtube.com/watch?v=DAdf7ikSE2M +https://www.youtube.com/watch?v=zHlWqwuktK8 +https://www.youtube.com/watch?v=t1JHMHPLJ54 +https://www.youtube.com/watch?v=iZC1L2uf-2I +https://www.youtube.com/watch?v=gnyv8uapleQ +https://www.youtube.com/watch?v=HH-oQrhhbgY +https://www.youtube.com/watch?v=8rOfqKXa7F4 +https://www.youtube.com/watch?v=yOGlDAJZH2M +https://www.youtube.com/watch?v=JngRtwK7gy4 +https://www.youtube.com/watch?v=zZ-oreEX2qo +https://www.youtube.com/watch?v=j690eWDthBo +https://www.youtube.com/watch?v=HBqG4BtYxRo +https://www.youtube.com/watch?v=q2NzF5hj1yw +https://www.youtube.com/watch?v=_Pnm5SJA4E0 +https://www.youtube.com/watch?v=mWKP6lmKtew +https://www.youtube.com/watch?v=ktCKwqFdaUU +https://www.youtube.com/watch?v=V4x5yOm9BFk +https://www.youtube.com/watch?v=uEIDIppWvAY +https://www.youtube.com/watch?v=R5KOBpyJmVs +https://www.youtube.com/watch?v=JFzm9o9l-4Y +https://www.youtube.com/watch?v=uf4ybmScHUQ +https://www.youtube.com/watch?v=fjLNYgfoYqs +https://www.youtube.com/watch?v=IWVscbhcsho +https://www.youtube.com/watch?v=zDSLWV9KypM +https://www.youtube.com/watch?v=vZyB77TU1zU +https://www.youtube.com/watch?v=608BY6toahw +https://www.youtube.com/watch?v=WHGPRC2K7mY +https://www.youtube.com/watch?v=3pEd0wcg_C4 +https://www.youtube.com/watch?v=AtzcGUWPwII +https://www.youtube.com/watch?v=ePUebx75iRQ +https://www.youtube.com/watch?v=IWdM9uq3ikk +https://www.youtube.com/watch?v=TeYCOtEecYU +https://www.youtube.com/watch?v=ncOWfpeYXFY +https://www.youtube.com/watch?v=x1RUjs9k-1c +https://www.youtube.com/watch?v=hS5VMbTEd1c +https://www.youtube.com/watch?v=XkMM9BQBDCQ +https://www.youtube.com/watch?v=zh-rpPHJWG4 +https://www.youtube.com/watch?v=bnVm7K8e1WY +https://www.youtube.com/watch?v=o8nHQ3JXnaY +https://www.youtube.com/watch?v=OLC4IeYEEjI +https://www.youtube.com/watch?v=2sE2osCi4JU +https://www.youtube.com/watch?v=lHFz0A8uiec +https://www.youtube.com/watch?v=H4zDTRO9Z58 +https://www.youtube.com/watch?v=IiDRZtiSqiM +https://www.youtube.com/watch?v=Ao7U1fB_yP8 +https://www.youtube.com/watch?v=qe6vAkiGXac +https://www.youtube.com/watch?v=QWsUmDesiJc +https://www.youtube.com/watch?v=ZLMHYYFGT4g +https://www.youtube.com/watch?v=dXKBgnRpfj4 +https://www.youtube.com/watch?v=CFyw49Fk_4U +https://www.youtube.com/watch?v=qd0Ksf1gO14 +https://www.youtube.com/watch?v=taUnDYQ6UI8 +https://www.youtube.com/watch?v=L7HY6r3C9T0 +https://www.youtube.com/watch?v=sTl6GtA20_M +https://www.youtube.com/watch?v=diL-9EB0TyM +https://www.youtube.com/watch?v=ymIOTE1PjZg +https://www.youtube.com/watch?v=_ZbtbsVaOPU +https://www.youtube.com/watch?v=9sGDtfUiktk +https://www.youtube.com/watch?v=vlVzSCef55I +https://www.youtube.com/watch?v=Y7tG3GrQvJ4 +https://www.youtube.com/watch?v=9JyI1FWv5yM +https://www.youtube.com/watch?v=obKqJaSnQK0 +https://www.youtube.com/watch?v=XR426H2wVgU +https://www.youtube.com/watch?v=Vu2C1pbIFWA +https://www.youtube.com/watch?v=XA4Ile920PA +https://www.youtube.com/watch?v=6qHXBy9EJvQ +https://www.youtube.com/watch?v=0WdmMfk0e6Q +https://www.youtube.com/watch?v=andVPsILYqw +https://www.youtube.com/watch?v=4Ttoi0W-wAM +https://www.youtube.com/watch?v=TID0TW7QRm0 +https://www.youtube.com/watch?v=p4L5_JfbL7w +https://www.youtube.com/watch?v=DUj29F5ZhEE +https://www.youtube.com/watch?v=9T8dkxDC42c +https://www.youtube.com/watch?v=ECCQhQTZ1SE +https://www.youtube.com/watch?v=JfrYNOJMvRg +https://www.youtube.com/watch?v=FJcrRD8yI4E +https://www.youtube.com/watch?v=N85iiQTKsXw +https://www.youtube.com/watch?v=Yyc6vE-0OgI +https://www.youtube.com/watch?v=-z9Kye8DBM0 +https://www.youtube.com/watch?v=ulSEa7ZOhWA +https://www.youtube.com/watch?v=SE52l6y7slI +https://www.youtube.com/watch?v=oErU3HKAilo +https://www.youtube.com/watch?v=NEYsomAIa1g +https://www.youtube.com/watch?v=4H5fsY5_MiA +https://www.youtube.com/watch?v=Lo5z_qGuQSI +https://www.youtube.com/watch?v=V2jfRLJsMCE +https://www.youtube.com/watch?v=aZxQruhKMDY +https://www.youtube.com/watch?v=ZMRcCmN25sA +https://www.youtube.com/watch?v=O-XsiSCIK7c +https://www.youtube.com/watch?v=-wl21uhUEx4 +https://www.youtube.com/watch?v=WfbrXc-EW54 +https://www.youtube.com/watch?v=M0yCTg5daZI +https://www.youtube.com/watch?v=UhT2sev4HK8 +https://www.youtube.com/watch?v=4v1AraoTz3w +https://www.youtube.com/watch?v=zTTU1MEiIbY +https://www.youtube.com/watch?v=pHb2ZMXtAiY +https://www.youtube.com/watch?v=mDUf4T5lv8E +https://www.youtube.com/watch?v=-OYTrvsnRSQ +https://www.youtube.com/watch?v=HR-iLG6B8ds +https://www.youtube.com/watch?v=Gjtg8xAMbdU +https://www.youtube.com/watch?v=AKWX1wR4sy4 +https://www.youtube.com/watch?v=TTmAZRt8nK0 +https://www.youtube.com/watch?v=o242B-tnea8 +https://www.youtube.com/watch?v=wg7AyXZYbrs +https://www.youtube.com/watch?v=VSbWDAER9_A +https://www.youtube.com/watch?v=k20mrsFg9-Y +https://www.youtube.com/watch?v=vtkwDMx-tV8 +https://www.youtube.com/watch?v=4dvawM7D0hI +https://www.youtube.com/watch?v=eD0JzemrL20 +https://www.youtube.com/watch?v=etqVGZkJ2Bg +https://www.youtube.com/watch?v=LEactpOVdSM +https://www.youtube.com/watch?v=IAro_PZ6BQo +https://www.youtube.com/watch?v=RbW6o64ROvo +https://www.youtube.com/watch?v=RRoinZOWSS4 +https://www.youtube.com/watch?v=KQCfiswxjZI +https://www.youtube.com/watch?v=WqXw1Fpqpg8 +https://www.youtube.com/watch?v=WdueCBIyAfQ +https://www.youtube.com/watch?v=r1KdHltNgaY +https://www.youtube.com/watch?v=RryMChxFH58 +https://www.youtube.com/watch?v=A8wuUQt1Wik +https://www.youtube.com/watch?v=rCof-kGXOhk +https://www.youtube.com/watch?v=XX8ZxKFqoms +https://www.youtube.com/watch?v=T28iUbhDyZc +https://www.youtube.com/watch?v=F94negmd_Zg +https://www.youtube.com/watch?v=GjKANaIYvio +https://www.youtube.com/watch?v=XHI4mfWv0NU +https://www.youtube.com/watch?v=IKF_ZKhrxd4 +https://www.youtube.com/watch?v=al6SGQh0e0w +https://www.youtube.com/watch?v=SSCnx2HXSSw +https://www.youtube.com/watch?v=wSL896yNi_g +https://www.youtube.com/watch?v=XHugXebbTkw +https://www.youtube.com/watch?v=TtWI3cg-97I +https://www.youtube.com/watch?v=CIi5Khk0w-E +https://www.youtube.com/watch?v=5zitlGXm7i4 +https://www.youtube.com/watch?v=RTGPniQnj-4 +https://www.youtube.com/watch?v=PygTOgWy9NM +https://www.youtube.com/watch?v=08jdDCM1Jt4 +https://www.youtube.com/watch?v=s5mWxWlfmpE +https://www.youtube.com/watch?v=Oz5TobEFC_M +https://www.youtube.com/watch?v=jbdsSlo6EeE +https://www.youtube.com/watch?v=sUeJ4XDEQPA +https://www.youtube.com/watch?v=-QNIsfH1W6o +https://www.youtube.com/watch?v=khefdNkdrUA +https://www.youtube.com/watch?v=RerdE3DEPZk +https://www.youtube.com/watch?v=axSJE2GJCMY +https://www.youtube.com/watch?v=TalhxWW_AWo +https://www.youtube.com/watch?v=wlYmRMxqrKs +https://www.youtube.com/watch?v=tQtalMb-yi0 +https://www.youtube.com/watch?v=N2zw3_qroes +https://www.youtube.com/watch?v=f2ul_dsl4YM +https://www.youtube.com/watch?v=Dn-l3hv54dg +https://www.youtube.com/watch?v=Tmk-kKInF1Y +https://www.youtube.com/watch?v=dN6FD2RQXxQ +https://www.youtube.com/watch?v=BZKnqQYvwcE +https://www.youtube.com/watch?v=YB0P9HLgQuI +https://www.youtube.com/watch?v=LCP6qXwwOM4 +https://www.youtube.com/watch?v=c7xf3Ojj7KU +https://www.youtube.com/watch?v=gUg5WFE1UQg +https://www.youtube.com/watch?v=oG4j-rydlt0 +https://www.youtube.com/watch?v=NqKi-3E9W1Y +https://www.youtube.com/watch?v=mcFkcokKCNo +https://www.youtube.com/watch?v=U9pvsdkU3OE +https://www.youtube.com/watch?v=irL__2bmVBI +https://www.youtube.com/watch?v=aBwkS_wA9nM +https://www.youtube.com/watch?v=JBM5DEEyL-o +https://www.youtube.com/watch?v=H5rMXNG3gyc +https://www.youtube.com/watch?v=Y-03XzLAUDw +https://www.youtube.com/watch?v=xsHtpbobVkM +https://www.youtube.com/watch?v=hITnd7BSG-U +https://www.youtube.com/watch?v=LdKGVfUmpYk +https://www.youtube.com/watch?v=QtBGTQZYNyk +https://www.youtube.com/watch?v=BNF8-3G8vas +https://www.youtube.com/watch?v=B6aT-u__gJo +https://www.youtube.com/watch?v=oIGTEmHwjLg +https://www.youtube.com/watch?v=0VmIV7q34fM +https://www.youtube.com/watch?v=0dSCNkc1va4 +https://www.youtube.com/watch?v=98lsZ-wo1ek +https://www.youtube.com/watch?v=8U8nVbfNxlg +https://www.youtube.com/watch?v=9VVVNWk92d4 +https://www.youtube.com/watch?v=Ci04JrlD4us +https://www.youtube.com/watch?v=mx-AwWwdQKQ +https://www.youtube.com/watch?v=miNPNWSCQE0 +https://www.youtube.com/watch?v=FaJshsUefyQ +https://www.youtube.com/watch?v=TdvGEDxdsv4 +https://www.youtube.com/watch?v=1Hrb0g9LTsY +https://www.youtube.com/watch?v=1gERK4_AMgU +https://www.youtube.com/watch?v=6F36ChawCh8 +https://www.youtube.com/watch?v=7fCT8l5PA-0 +https://www.youtube.com/watch?v=35qUGqnd3nE +https://www.youtube.com/watch?v=SCQenAiVYBA +https://www.youtube.com/watch?v=MhGh_mCqrJU +https://www.youtube.com/watch?v=bOdjMBx60R0 +https://www.youtube.com/watch?v=N8gNk6u7nYQ +https://www.youtube.com/watch?v=Y0_-D9Ox9ng +https://www.youtube.com/watch?v=1GPTxwVbwvY +https://www.youtube.com/watch?v=Ewd0UuOEjPY +https://www.youtube.com/watch?v=Qw5oiYJFuSk +https://www.youtube.com/watch?v=55EaCTJ1pmE +https://www.youtube.com/watch?v=cuSZk8Pa8OI +https://www.youtube.com/watch?v=Xmu8YF0Bjyw +https://www.youtube.com/watch?v=ObyY3uEp7pA +https://www.youtube.com/watch?v=SB2092RkzhQ +https://www.youtube.com/watch?v=Xt-GvsySsOM +https://www.youtube.com/watch?v=FdyYRbOf0mQ +https://www.youtube.com/watch?v=9j4iaA9FcMg +https://www.youtube.com/watch?v=9Qi5sQpZGME +https://www.youtube.com/watch?v=d5qyho0ensI +https://www.youtube.com/watch?v=smlSGLoB8eI +https://www.youtube.com/watch?v=fJeDDk9Nzpk +https://www.youtube.com/watch?v=LfXLNUNqCOY +https://www.youtube.com/watch?v=ZEEY7AEA3z8 +https://www.youtube.com/watch?v=lEXGzNQtVGw +https://www.youtube.com/watch?v=MXv1fBNlMB0 +https://www.youtube.com/watch?v=7p5MNHXFTik +https://www.youtube.com/watch?v=d_4APkAy8Zk +https://www.youtube.com/watch?v=l6DpX3Bszh8 +https://www.youtube.com/watch?v=rc01sE8tfjo +https://www.youtube.com/watch?v=DY8BBLB_OuY +https://www.youtube.com/watch?v=NaJxE3R6fZU +https://www.youtube.com/watch?v=TeWVHkxx4C4 +https://www.youtube.com/watch?v=vbfYhTkX2FE +https://www.youtube.com/watch?v=TJmm555VGaU +https://www.youtube.com/watch?v=aunY-e-Jim8 +https://www.youtube.com/watch?v=HnLAm7OeJZc +https://www.youtube.com/watch?v=BTihVgB3j5U +https://www.youtube.com/watch?v=5Fh8bkdgIvM +https://www.youtube.com/watch?v=T9aj6Hc7tCI +https://www.youtube.com/watch?v=bJNjCcAhajI +https://www.youtube.com/watch?v=7dfLVKKRQ2U +https://www.youtube.com/watch?v=zXZSnUKaQt8 +https://www.youtube.com/watch?v=i6ZSMTAD1fQ +https://www.youtube.com/watch?v=koczyZ9jaGA +https://www.youtube.com/watch?v=uatoQB05WBY +https://www.youtube.com/watch?v=Xk1cUTg-1CY +https://www.youtube.com/watch?v=kGZS4pyqzOM +https://www.youtube.com/watch?v=jbyfwRF3qt8 +https://www.youtube.com/watch?v=i8VG_QT81cI +https://www.youtube.com/watch?v=0j8h1RiYMRA +https://www.youtube.com/watch?v=bhAej3dGUf8 +https://www.youtube.com/watch?v=KVMWvlI_Clg +https://www.youtube.com/watch?v=1zZwJRC7MRU +https://www.youtube.com/watch?v=e3nXSZAqVuM +https://www.youtube.com/watch?v=g_z_q-ylqBs +https://www.youtube.com/watch?v=TUklrg9ecVU +https://www.youtube.com/watch?v=uwwGeFOwabw +https://www.youtube.com/watch?v=zNyTvA0rMVs +https://www.youtube.com/watch?v=1xCZZGySdjY +https://www.youtube.com/watch?v=WoDEdNe_JDg +https://www.youtube.com/watch?v=-r01Nyjmltc +https://www.youtube.com/watch?v=ilN94X3Qmug +https://www.youtube.com/watch?v=3Zi2-g42lio +https://www.youtube.com/watch?v=MiLjhVl2FCY +https://www.youtube.com/watch?v=oZ9bdUqbKIU +https://www.youtube.com/watch?v=1mCjN-v4jvo +https://www.youtube.com/watch?v=oiRQ8weGi88 +https://www.youtube.com/watch?v=IVYU6O6uFJQ +https://www.youtube.com/watch?v=IGZGomDqxCE +https://www.youtube.com/watch?v=qlc7mEH_BHs +https://www.youtube.com/watch?v=GBcCT2bKgjY +https://www.youtube.com/watch?v=Gd3OZTuPeuc +https://www.youtube.com/watch?v=UQftIucKJyE +https://www.youtube.com/watch?v=viPomNeDwb4 +https://www.youtube.com/watch?v=eL3kOZqhl1Y +https://www.youtube.com/watch?v=0qo2q_lJpyc +https://www.youtube.com/watch?v=aNQS7XwI4uw +https://www.youtube.com/watch?v=lTa_0IrgL0k +https://www.youtube.com/watch?v=Nqvu51Z_uLc +https://www.youtube.com/watch?v=QEZ30dVgqyE +https://www.youtube.com/watch?v=G_4jcOwjjOI +https://www.youtube.com/watch?v=EXs553jIi-M +https://www.youtube.com/watch?v=e56_vnN12G4 +https://www.youtube.com/watch?v=uBfhO0pMiv0 +https://www.youtube.com/watch?v=ehG4FOaLqS0 +https://www.youtube.com/watch?v=tQ6qgJwN1m8 +https://www.youtube.com/watch?v=Qs8kAzVmaCA +https://www.youtube.com/watch?v=8ucB_qu1Inw +https://www.youtube.com/watch?v=OuiJhSc7r74 +https://www.youtube.com/watch?v=o4ozyDZugJc +https://www.youtube.com/watch?v=io4Ym8HqI2o +https://www.youtube.com/watch?v=bpstDSeSls4 +https://www.youtube.com/watch?v=vn9I2-twWKE +https://www.youtube.com/watch?v=-LZeoEcLXlk +https://www.youtube.com/watch?v=-I1qtCjwaBE +https://www.youtube.com/watch?v=AR3YQYvmMwE +https://www.youtube.com/watch?v=eQT4GZ_EqhQ +https://www.youtube.com/watch?v=i7voHoNZM9M +https://www.youtube.com/watch?v=Op1UJ5zciPk +https://www.youtube.com/watch?v=wMVX8tpg4nA +https://www.youtube.com/watch?v=izjTgLIYYs0 +https://www.youtube.com/watch?v=Pu1nRr-iZ6A +https://www.youtube.com/watch?v=PGex6tbXQPE +https://www.youtube.com/watch?v=H7HR796PVWg +https://www.youtube.com/watch?v=WZJccvWFoNo +https://www.youtube.com/watch?v=JLibrVW9_T4 +https://www.youtube.com/watch?v=7K1FnxElCug +https://www.youtube.com/watch?v=_iZ47vuEtaY +https://www.youtube.com/watch?v=5aafY8hGrUc +https://www.youtube.com/watch?v=3oxXxruuuuM +https://www.youtube.com/watch?v=eXRuojc_GLA +https://www.youtube.com/watch?v=d_qfc4o1RUI +https://www.youtube.com/watch?v=pvB1S3KVFhE +https://www.youtube.com/watch?v=_1X7caqbvkA +https://www.youtube.com/watch?v=XmjibdYAvLo +https://www.youtube.com/watch?v=aGsl9NGHh-E +https://www.youtube.com/watch?v=R_Z4sTgCK4k +https://www.youtube.com/watch?v=v7KHGsg6w4s +https://www.youtube.com/watch?v=aX6aGQufM3w +https://www.youtube.com/watch?v=yQZ94f7WMhc +https://www.youtube.com/watch?v=6i975zYY6eE +https://www.youtube.com/watch?v=RbbFCphAh0c +https://www.youtube.com/watch?v=wN_S8q03iOI +https://www.youtube.com/watch?v=GlhNWhIxzOE +https://www.youtube.com/watch?v=N7GlgQjNEOw +https://www.youtube.com/watch?v=Dyo7vQvXW_w +https://www.youtube.com/watch?v=1vHGsrpdRT8 +https://www.youtube.com/watch?v=hQhAIi1TT3s +https://www.youtube.com/watch?v=uJ5DmRIYGNo +https://www.youtube.com/watch?v=zT7ScFhOymY +https://www.youtube.com/watch?v=8SP-XcTntTI +https://www.youtube.com/watch?v=Wh8UZ0DNmmc +https://www.youtube.com/watch?v=IMo-p2hQVcc +https://www.youtube.com/watch?v=yHJ50ZRTN3E +https://www.youtube.com/watch?v=25JPZbxyfn4 +https://www.youtube.com/watch?v=BzqkagVVqN8 +https://www.youtube.com/watch?v=IBdX5dleUMg +https://www.youtube.com/watch?v=nAqV1-LO8n0 +https://www.youtube.com/watch?v=SFFe8JThkeg +https://www.youtube.com/watch?v=Kr5xy7Pqe9s +https://www.youtube.com/watch?v=r1kBEMb3wx8 +https://www.youtube.com/watch?v=Nc-iL85MTs8 +https://www.youtube.com/watch?v=ULC2AExXG4k +https://www.youtube.com/watch?v=kPoBOD3qbR8 +https://www.youtube.com/watch?v=_lZ91R7KZpQ +https://www.youtube.com/watch?v=rCpUpTozlbE +https://www.youtube.com/watch?v=6xG55KCOw9c +https://www.youtube.com/watch?v=THIhR42o5Yo +https://www.youtube.com/watch?v=PueGS2ovb1k +https://www.youtube.com/watch?v=3ULU8ygv2uI +https://www.youtube.com/watch?v=vwmzA7puaag +https://www.youtube.com/watch?v=REdLuU2aKlE +https://www.youtube.com/watch?v=MmrsXGdjCN4 +https://www.youtube.com/watch?v=xkwPcTLBNYM +https://www.youtube.com/watch?v=-IBaWMv16RU +https://www.youtube.com/watch?v=Sq9QEsAOTkM +https://www.youtube.com/watch?v=V2EGLGgqYkI +https://www.youtube.com/watch?v=QDafrUdxXpM +https://www.youtube.com/watch?v=LOP7GVSzlcY +https://www.youtube.com/watch?v=uZoyBTh10S8 +https://www.youtube.com/watch?v=tX8jPSql8YU +https://www.youtube.com/watch?v=hiOy1Gf-3qY +https://www.youtube.com/watch?v=7piyNpPpESg +https://www.youtube.com/watch?v=zbLPgrDB3yI +https://www.youtube.com/watch?v=bIZIXRHyqoo +https://www.youtube.com/watch?v=JUv89Ehkoj0 +https://www.youtube.com/watch?v=Hi2L2OXSPMQ +https://www.youtube.com/watch?v=CiIFLJPAzx4 +https://www.youtube.com/watch?v=EFvv5hl9Cbo +https://www.youtube.com/watch?v=6SybA6YL2Dk +https://www.youtube.com/watch?v=diesIlZaYwg +https://www.youtube.com/watch?v=f9fQ-3ZKMW4 +https://www.youtube.com/watch?v=g3gIt_8pNFw +https://www.youtube.com/watch?v=WOOlnWuo5cc +https://www.youtube.com/watch?v=6saf_WUItTs +https://www.youtube.com/watch?v=yDTQvqANLwA +https://www.youtube.com/watch?v=2rTMHKBYkak +https://www.youtube.com/watch?v=tT3W6GP6cCA +https://www.youtube.com/watch?v=tz9GT0P0ryA +https://www.youtube.com/watch?v=eojre2rUMqw +https://www.youtube.com/watch?v=0Zzl3HzhYz0 +https://www.youtube.com/watch?v=vTp1auScNMk +https://www.youtube.com/watch?v=oBWZjKR9ZeQ +https://www.youtube.com/watch?v=Kk1xwtIV8vs +https://www.youtube.com/watch?v=v80YwdDGoeA +https://www.youtube.com/watch?v=RTwCoLuVEkk +https://www.youtube.com/watch?v=O_eVwq5srVs +https://www.youtube.com/watch?v=4y6sP0QP9fw +https://www.youtube.com/watch?v=8175ZvSPjtI +https://www.youtube.com/watch?v=p5uEXSimNHw +https://www.youtube.com/watch?v=tx_ezJgB-1U +https://www.youtube.com/watch?v=d61Y1IQjREI +https://www.youtube.com/watch?v=rjA6vEh2VcM +https://www.youtube.com/watch?v=M922Dq0aAMo +https://www.youtube.com/watch?v=kr__8j-30GI +https://www.youtube.com/watch?v=O9QntgWyKMw +https://www.youtube.com/watch?v=X3T-yVZnSwE +https://www.youtube.com/watch?v=cu32CcPzNG4 +https://www.youtube.com/watch?v=EFksUEbPBSg +https://www.youtube.com/watch?v=b_ZTwMM5wU0 +https://www.youtube.com/watch?v=g5QLW6LeJ3Q +https://www.youtube.com/watch?v=IxhhDb0Ap1g +https://www.youtube.com/watch?v=Hk0rRNw6Hao +https://www.youtube.com/watch?v=Zsm80SgJRBQ +https://www.youtube.com/watch?v=DpWBCMbE7aE +https://www.youtube.com/watch?v=6LWXnVr-9t8 +https://www.youtube.com/watch?v=8qWVLCpRShE +https://www.youtube.com/watch?v=AbHEP5JHusQ +https://www.youtube.com/watch?v=rbRn3rUhX4E +https://www.youtube.com/watch?v=8b5_qEwmUu8 +https://www.youtube.com/watch?v=gsKssuz8tPA +https://www.youtube.com/watch?v=pwEtEXQ6PVw +https://www.youtube.com/watch?v=v7rFBX9QOpE +https://www.youtube.com/watch?v=oxxRgi8a120 +https://www.youtube.com/watch?v=LRtEUdjrQqg +https://www.youtube.com/watch?v=unkTCzy1qrA +https://www.youtube.com/watch?v=Cd7912woWsE +https://www.youtube.com/watch?v=w5LMl9o3Ofs +https://www.youtube.com/watch?v=_dqILnERIXQ +https://www.youtube.com/watch?v=s9RnwZ7IaaA +https://www.youtube.com/watch?v=ftksxfcG4V0 +https://www.youtube.com/watch?v=ZWr0tbXySlg +https://www.youtube.com/watch?v=e-BCNcMv2j0 +https://www.youtube.com/watch?v=mewfu8lafy8 +https://www.youtube.com/watch?v=VWG7L3c_5J8 +https://www.youtube.com/watch?v=JXZXNFLQMHE +https://www.youtube.com/watch?v=fb3zbGCVL6M +https://www.youtube.com/watch?v=uN4p8E-AZF0 +https://www.youtube.com/watch?v=SgFtJaJoX8Y +https://www.youtube.com/watch?v=WvAs0s7DVYg +https://www.youtube.com/watch?v=t799a5XUSAU +https://www.youtube.com/watch?v=ljyY1LjK_ZE +https://www.youtube.com/watch?v=ArD55SLC62E +https://www.youtube.com/watch?v=cvpGOFUsVnI +https://www.youtube.com/watch?v=SZXg328Mzsk +https://www.youtube.com/watch?v=-BoZ1gEAC6g +https://www.youtube.com/watch?v=VQzU4Sy-cQQ +https://www.youtube.com/watch?v=73lYz3r3XZY +https://www.youtube.com/watch?v=JFrABFhjAMk +https://www.youtube.com/watch?v=sN6qndqz0KQ +https://www.youtube.com/watch?v=s0_MmWg2m8A +https://www.youtube.com/watch?v=I0GtLj2q5kQ +https://www.youtube.com/watch?v=3tJ0S7ciHRg +https://www.youtube.com/watch?v=hc_7bu1togM +https://www.youtube.com/watch?v=gFbL3pzkNEM +https://www.youtube.com/watch?v=I8R94gDqiGE +https://www.youtube.com/watch?v=TdErMRIxRqY +https://www.youtube.com/watch?v=49JqAHear9E +https://www.youtube.com/watch?v=Y6IbKjhHFSg +https://www.youtube.com/watch?v=-DluaoC73Oo +https://www.youtube.com/watch?v=6GAc1HfTQX8 +https://www.youtube.com/watch?v=zdGkKCiKYuE +https://www.youtube.com/watch?v=1oUH8LWmM0I +https://www.youtube.com/watch?v=TNf_8J8LoM0 +https://www.youtube.com/watch?v=kXcjZ2BkE2Y +https://www.youtube.com/watch?v=dgK8hbT2D3Y +https://www.youtube.com/watch?v=H1sdanVzblg +https://www.youtube.com/watch?v=Y4HSgvsz-AI +https://www.youtube.com/watch?v=YvBfHVPpBmw +https://www.youtube.com/watch?v=sSxhG5qH38Q +https://www.youtube.com/watch?v=x4zz7xAa-fM +https://www.youtube.com/watch?v=nOPm3XAlxZg +https://www.youtube.com/watch?v=7Yor7ci8noM +https://www.youtube.com/watch?v=BnJ4BDxlgSM +https://www.youtube.com/watch?v=j4otcsHfzrE +https://www.youtube.com/watch?v=lIHDioyC4Q4 +https://www.youtube.com/watch?v=e40TGdOO1JU +https://www.youtube.com/watch?v=iKnbegCExns +https://www.youtube.com/watch?v=ao1TeLrOPPQ +https://www.youtube.com/watch?v=Lx_UnKWJyLE +https://www.youtube.com/watch?v=nDtgGczwIPY +https://www.youtube.com/watch?v=0bJ2mfxtmjg +https://www.youtube.com/watch?v=cbG1GetVqyw +https://www.youtube.com/watch?v=gIONn9bp8_w +https://www.youtube.com/watch?v=vePMmBM-IVU +https://www.youtube.com/watch?v=xP9cwmJ5dog +https://www.youtube.com/watch?v=uxYeke3bLMk +https://www.youtube.com/watch?v=eCze8sLvmcE +https://www.youtube.com/watch?v=EcBx2S-x3Hs +https://www.youtube.com/watch?v=zO3rfSDuBFg +https://www.youtube.com/watch?v=0RtavDSBnt4 +https://www.youtube.com/watch?v=8EojjO04ahA +https://www.youtube.com/watch?v=UbWPWyl8xWQ +https://www.youtube.com/watch?v=Ocwj3RfhTwI +https://www.youtube.com/watch?v=8EOo1DTKT98 +https://www.youtube.com/watch?v=7Rh7MjD6LLQ +https://www.youtube.com/watch?v=_C3FNmY1IxI +https://www.youtube.com/watch?v=yvQXwo4w3_0 +https://www.youtube.com/watch?v=PNVWUdB653k +https://www.youtube.com/watch?v=-DWQIrKbrEc +https://www.youtube.com/watch?v=1MgfOJ9ILCo +https://www.youtube.com/watch?v=og-mP2_bjcE +https://www.youtube.com/watch?v=Gar0-Yc_gpY +https://www.youtube.com/watch?v=OAyBcaFI56I +https://www.youtube.com/watch?v=5T1AD2jE6Kg +https://www.youtube.com/watch?v=sECZvLhjvPQ +https://www.youtube.com/watch?v=f1YdQbcFe3k +https://www.youtube.com/watch?v=B00d1ZrHlgc +https://www.youtube.com/watch?v=s05OP79dB28 +https://www.youtube.com/watch?v=6e-ID8Wxbjo +https://www.youtube.com/watch?v=64Uihh-m0LE +https://www.youtube.com/watch?v=hDc6FPsH7h4 +https://www.youtube.com/watch?v=HDiJLqx3Luk +https://www.youtube.com/watch?v=wcy3iNJXAJs +https://www.youtube.com/watch?v=rV39f1xY040 +https://www.youtube.com/watch?v=A8oTnrChwoc +https://www.youtube.com/watch?v=xmjPzr1PQG8 +https://www.youtube.com/watch?v=SlYjBVi4LeM +https://www.youtube.com/watch?v=m7hq3HU1x1c +https://www.youtube.com/watch?v=Ycdfq5SVgYs +https://www.youtube.com/watch?v=Lgy5IT6V1II +https://www.youtube.com/watch?v=ivPrbp3Ef0M +https://www.youtube.com/watch?v=xS8T1nXqibQ +https://www.youtube.com/watch?v=DWXBC9Ud32Y +https://www.youtube.com/watch?v=ZQdxYJkbD6s +https://www.youtube.com/watch?v=xkB7ra_ZcCM +https://www.youtube.com/watch?v=ugCKpZwt7-Q +https://www.youtube.com/watch?v=CHXI5J4V4AE +https://www.youtube.com/watch?v=Jt7_FFHd1Uw +https://www.youtube.com/watch?v=3aKlZpFAI3w +https://www.youtube.com/watch?v=i_Y7of6rGy8 +https://www.youtube.com/watch?v=YUp3RSlqBnk +https://www.youtube.com/watch?v=zRmm0-IMV-0 +https://www.youtube.com/watch?v=9IlBbSIQQes +https://www.youtube.com/watch?v=LhaDO3MwY08 +https://www.youtube.com/watch?v=GIMPGEcvats +https://www.youtube.com/watch?v=tJjwfD-adPE +https://www.youtube.com/watch?v=tCyYgZr6CHA +https://www.youtube.com/watch?v=O2IuSn7abLQ +https://www.youtube.com/watch?v=vWAIK55GrSQ +https://www.youtube.com/watch?v=X0Pwphld4l8 +https://www.youtube.com/watch?v=Men_VTPKzRk +https://www.youtube.com/watch?v=4N1QO35qeAw +https://www.youtube.com/watch?v=mDyz1zC5mV4 +https://www.youtube.com/watch?v=IwOpp57oQa8 +https://www.youtube.com/watch?v=rpBONirrpFY +https://www.youtube.com/watch?v=1nPRqTVWcXo +https://www.youtube.com/watch?v=qflzvf0P8Go +https://www.youtube.com/watch?v=TbLnKnd55KI +https://www.youtube.com/watch?v=jA3nz1RGhoQ +https://www.youtube.com/watch?v=mqx4w9RxyC8 +https://www.youtube.com/watch?v=mqoJr3qL98Q +https://www.youtube.com/watch?v=KTxnalxOBq4 +https://www.youtube.com/watch?v=ghOcpZ_n3ck +https://www.youtube.com/watch?v=dReCYPaWB28 +https://www.youtube.com/watch?v=XY79-cpbFME +https://www.youtube.com/watch?v=jwVwgGtdoAc +https://www.youtube.com/watch?v=wpGu13Xt_w0 +https://www.youtube.com/watch?v=5NRyHwCPfgY +https://www.youtube.com/watch?v=zTYxYSTDBjM +https://www.youtube.com/watch?v=QQj4uFa05N4 +https://www.youtube.com/watch?v=1GMgjlp4Yps +https://www.youtube.com/watch?v=kUo37zZhNxE +https://www.youtube.com/watch?v=Jz5CGd0dsaU +https://www.youtube.com/watch?v=iLQS_HPWO9c +https://www.youtube.com/watch?v=_lApBJu9gUY +https://www.youtube.com/watch?v=M1XwLmDpElY +https://www.youtube.com/watch?v=JT5HaX5yVPc +https://www.youtube.com/watch?v=PmQc2_9cux8 +https://www.youtube.com/watch?v=wQMkJ47gTto +https://www.youtube.com/watch?v=arYXHRmVUSQ +https://www.youtube.com/watch?v=hC_KKWCju34 +https://www.youtube.com/watch?v=dYi51VQyqWM +https://www.youtube.com/watch?v=tN_qiCQU8mE +https://www.youtube.com/watch?v=ilm532-pJ6k +https://www.youtube.com/watch?v=5uo1Ir6X_r8 +https://www.youtube.com/watch?v=-M5YASO4Qo8 +https://www.youtube.com/watch?v=Jg0yPEiD5uk +https://www.youtube.com/watch?v=GIgOpPFcNlU +https://www.youtube.com/watch?v=ttJtmEsjeik +https://www.youtube.com/watch?v=IuoT4lj5320 +https://www.youtube.com/watch?v=0_zqq0BXwfk +https://www.youtube.com/watch?v=sK6VuV8mgPk +https://www.youtube.com/watch?v=z0JQaxqXlic +https://www.youtube.com/watch?v=W06m5BF4bZA +https://www.youtube.com/watch?v=tGZJWiETVto +https://www.youtube.com/watch?v=09u2R0LZ1YU +https://www.youtube.com/watch?v=_OqomCppv30 +https://www.youtube.com/watch?v=wf8tUgUCPac +https://www.youtube.com/watch?v=lczFvGhUfts +https://www.youtube.com/watch?v=kFx3-0pNPWc +https://www.youtube.com/watch?v=JZfuvcVU91E +https://www.youtube.com/watch?v=xT5JEhTo7Rc +https://www.youtube.com/watch?v=mTinH8GAflM +https://www.youtube.com/watch?v=3srlxHfZLm4 +https://www.youtube.com/watch?v=clv601ldGA4 +https://www.youtube.com/watch?v=bHPY6Nn9QMs +https://www.youtube.com/watch?v=9y5aeZ33w_4 +https://www.youtube.com/watch?v=yhUxI5phmO8 +https://www.youtube.com/watch?v=VbE2CU9nA1k +https://www.youtube.com/watch?v=It-PLAJt_zQ +https://www.youtube.com/watch?v=9SekDfrN-X4 +https://www.youtube.com/watch?v=T0pnbDrW1CI +https://www.youtube.com/watch?v=XBYyXyvW6tE +https://www.youtube.com/watch?v=XFep6Dhx-Fs +https://www.youtube.com/watch?v=W8iTykaPSLM +https://www.youtube.com/watch?v=z3YrrXDQDyY +https://www.youtube.com/watch?v=9KU33u28EtI +https://www.youtube.com/watch?v=kvDMgzLZR2k +https://www.youtube.com/watch?v=_xWION4vOgM +https://www.youtube.com/watch?v=70zAbdwD9yY +https://www.youtube.com/watch?v=59ZG0Hjf5Us +https://www.youtube.com/watch?v=ZnI-KMjlrgA +https://www.youtube.com/watch?v=0-HtNtzR3HY +https://www.youtube.com/watch?v=G5UwFimUH_k +https://www.youtube.com/watch?v=UQ9YjPBUgII +https://www.youtube.com/watch?v=TtO1czEGERI +https://www.youtube.com/watch?v=s_1O1UJtMtQ +https://www.youtube.com/watch?v=Cq9XGcbsNRA +https://www.youtube.com/watch?v=dWsO8_oHeAo +https://www.youtube.com/watch?v=xF8HGuSfoYE +https://www.youtube.com/watch?v=nIuZdHv6chU +https://www.youtube.com/watch?v=pfbdEHVtBz4 +https://www.youtube.com/watch?v=OJWP4kft7NI +https://www.youtube.com/watch?v=1ZRrg52B81w +https://www.youtube.com/watch?v=cPtg_qRa59w +https://www.youtube.com/watch?v=W4WZjoUiKr8 +https://www.youtube.com/watch?v=70niBZ6GLSs +https://www.youtube.com/watch?v=auTIwWeByuw +https://www.youtube.com/watch?v=VaXHkSUlEdI +https://www.youtube.com/watch?v=PbelNpfEJQc +https://www.youtube.com/watch?v=R2VIfDPxX3M +https://www.youtube.com/watch?v=aTv5h7kqPp0 +https://www.youtube.com/watch?v=A7Vh8ZemNkc +https://www.youtube.com/watch?v=zn7dx98XomI +https://www.youtube.com/watch?v=DyLVTThUXBc +https://www.youtube.com/watch?v=zdNxMHSVkFg +https://www.youtube.com/watch?v=MXp2LFunRFc +https://www.youtube.com/watch?v=gE1RoN6ChBs +https://www.youtube.com/watch?v=cFcnz9rCD-o +https://www.youtube.com/watch?v=JueaSBXghD0 +https://www.youtube.com/watch?v=03de7Gcpz_4 +https://www.youtube.com/watch?v=Ij33PqNmbro +https://www.youtube.com/watch?v=57iQZerkh0o +https://www.youtube.com/watch?v=N1b7xZdVtRw +https://www.youtube.com/watch?v=M4gLxvcaBYU +https://www.youtube.com/watch?v=yGuH6jx7xkI +https://www.youtube.com/watch?v=AeopuNMkQt8 +https://www.youtube.com/watch?v=QKzE7lsCPw8 +https://www.youtube.com/watch?v=uZn0PIJ_k9E +https://www.youtube.com/watch?v=bxJ4-3W6LwE +https://www.youtube.com/watch?v=2MJPj6oWIKo +https://www.youtube.com/watch?v=yujj2p2dGWk +https://www.youtube.com/watch?v=-bXdzATNQKw +https://www.youtube.com/watch?v=xN3nXJX9vJs +https://www.youtube.com/watch?v=zwgm4a5OugI +https://www.youtube.com/watch?v=NBNN0lqZ8tU +https://www.youtube.com/watch?v=5e460FHKV64 +https://www.youtube.com/watch?v=hsbCYJIvq3o +https://www.youtube.com/watch?v=_qsfagfYAVs +https://www.youtube.com/watch?v=ZNl4FVK9-yQ +https://www.youtube.com/watch?v=2-TYgeGNTQk +https://www.youtube.com/watch?v=Zin6ZIfdTAY +https://www.youtube.com/watch?v=sn7XKfA4W-0 +https://www.youtube.com/watch?v=gmRYrsutXEo +https://www.youtube.com/watch?v=1jhOFw6GrLg +https://www.youtube.com/watch?v=PxzOVCQU-4U +https://www.youtube.com/watch?v=BlHNshJh9zM +https://www.youtube.com/watch?v=LVmH60yo0JI +https://www.youtube.com/watch?v=o-Tzlp_nG70 +https://www.youtube.com/watch?v=njuIKmM2xDM +https://www.youtube.com/watch?v=4zwQ88zMyio +https://www.youtube.com/watch?v=E3Wr6GWkRzA +https://www.youtube.com/watch?v=aypLuo7UXWE +https://www.youtube.com/watch?v=TANbVyW6x1k +https://www.youtube.com/watch?v=oNcdsp12pag +https://www.youtube.com/watch?v=qv7QFzRqf34 +https://www.youtube.com/watch?v=cYK9aTSRtbE +https://www.youtube.com/watch?v=7kmaoLaQlF8 +https://www.youtube.com/watch?v=st1zEAlNPic +https://www.youtube.com/watch?v=2XQnxn39yj4 +https://www.youtube.com/watch?v=gUbA8Zn8YPQ +https://www.youtube.com/watch?v=Uny3t9woExo +https://www.youtube.com/watch?v=lCaIfb8B5Mo +https://www.youtube.com/watch?v=jEkQ0RZObiI +https://www.youtube.com/watch?v=Beo6jYwuZpc +https://www.youtube.com/watch?v=KILWCT_Zzoc +https://www.youtube.com/watch?v=fb2VzDSf7S0 +https://www.youtube.com/watch?v=4a_oIbAhCgo +https://www.youtube.com/watch?v=eCLS2lWR1us +https://www.youtube.com/watch?v=MS01ipsrJCA +https://www.youtube.com/watch?v=3zqIIJhiyoo +https://www.youtube.com/watch?v=R3KOub_thmc +https://www.youtube.com/watch?v=ZQadO6LiP9s +https://www.youtube.com/watch?v=pzhhzPhwYh8 +https://www.youtube.com/watch?v=kLkNcyM0gNA +https://www.youtube.com/watch?v=yHpVRxZJyMg +https://www.youtube.com/watch?v=DZlfy7Eeeu0 +https://www.youtube.com/watch?v=b9Ao1j5bDXU +https://www.youtube.com/watch?v=vfPEVcXrO2c +https://www.youtube.com/watch?v=TK3gpctWmy8 +https://www.youtube.com/watch?v=Gn9_FWSU32Y +https://www.youtube.com/watch?v=zrSrLrBZ_eA +https://www.youtube.com/watch?v=5CS4NAkSjeM +https://www.youtube.com/watch?v=bbNkX9AWRbM +https://www.youtube.com/watch?v=03Yi0nl6N8Y +https://www.youtube.com/watch?v=moANh2cUXzw +https://www.youtube.com/watch?v=X4MNSJQ3jxk +https://www.youtube.com/watch?v=Eh7IdlNdcjk +https://www.youtube.com/watch?v=HNR4pmJ_YPs +https://www.youtube.com/watch?v=QIzmK6U41yc +https://www.youtube.com/watch?v=i7Tsz0bTzv4 +https://www.youtube.com/watch?v=U2Qz2Uz38Ds +https://www.youtube.com/watch?v=I6G_ojX3FO0 +https://www.youtube.com/watch?v=gQOsKTlMr9w +https://www.youtube.com/watch?v=LBC0msJZofU +https://www.youtube.com/watch?v=gHRicolSA8Y +https://www.youtube.com/watch?v=v8roAb048Us +https://www.youtube.com/watch?v=P_RIqP_sjZ8 +https://www.youtube.com/watch?v=e9E-fnJZObk +https://www.youtube.com/watch?v=UDRyL9EH5Bs +https://www.youtube.com/watch?v=EG77Z0p17Hc +https://www.youtube.com/watch?v=EW8OrhKu6ac +https://www.youtube.com/watch?v=swGrHB6VYF0 +https://www.youtube.com/watch?v=1KSp_Hr0_8g +https://www.youtube.com/watch?v=WqyHn7p90ws +https://www.youtube.com/watch?v=8rASZi0V6hI +https://www.youtube.com/watch?v=JPX0c4vmMbk +https://www.youtube.com/watch?v=DDstXkeEY5k +https://www.youtube.com/watch?v=lIWpl1rISOU +https://www.youtube.com/watch?v=w3t-AhvtwIY +https://www.youtube.com/watch?v=bCPOPg9Jxko +https://www.youtube.com/watch?v=M4CIPaK4CzU +https://www.youtube.com/watch?v=sSWYhKIPK_w +https://www.youtube.com/watch?v=DL9orOzONFM +https://www.youtube.com/watch?v=zV1mn041-MY +https://www.youtube.com/watch?v=u9fKGIZEOZc +https://www.youtube.com/watch?v=nwW_2C1VQRA +https://www.youtube.com/watch?v=xyjIpsJ9C_E +https://www.youtube.com/watch?v=zv3JJeoNWpw +https://www.youtube.com/watch?v=yFh-pd4K8kM +https://www.youtube.com/watch?v=helJykjI5Ks +https://www.youtube.com/watch?v=O5grg4BhmwA +https://www.youtube.com/watch?v=hxqqPMdeWlk +https://www.youtube.com/watch?v=aBfY4EXizl4 +https://www.youtube.com/watch?v=uXbTAyacm-o +https://www.youtube.com/watch?v=EHchyDF5mPA +https://www.youtube.com/watch?v=8hN6tFyXtMM +https://www.youtube.com/watch?v=ytaFppE2PrQ +https://www.youtube.com/watch?v=H7T79men-54 +https://www.youtube.com/watch?v=wobBUFvj6vw +https://www.youtube.com/watch?v=JCkSb2SHIY8 +https://www.youtube.com/watch?v=DbdV9vauV_8 +https://www.youtube.com/watch?v=WY7F2paiokM +https://www.youtube.com/watch?v=7_XKe5nL3j4 +https://www.youtube.com/watch?v=ImQPrZx6ZHw +https://www.youtube.com/watch?v=D4Of5F5CDLA +https://www.youtube.com/watch?v=piL1B00ekBE +https://www.youtube.com/watch?v=etOwU2jh5vo +https://www.youtube.com/watch?v=jqceDCEbuds +https://www.youtube.com/watch?v=NBJgtpZxRks +https://www.youtube.com/watch?v=Rztv9EWij4Y +https://www.youtube.com/watch?v=Mb3C2fSxLdI +https://www.youtube.com/watch?v=vK2LAKvrzPo +https://www.youtube.com/watch?v=w0JpfEd31AM +https://www.youtube.com/watch?v=mYSaT9V4324 +https://www.youtube.com/watch?v=3979ONO_DOk +https://www.youtube.com/watch?v=5li6iJy_DYs +https://www.youtube.com/watch?v=wA9RT0MBe3s +https://www.youtube.com/watch?v=NEeLktfngjQ +https://www.youtube.com/watch?v=es24xo9ju7U +https://www.youtube.com/watch?v=OaGCZ8SsKG4 +https://www.youtube.com/watch?v=lQsBzd952xk +https://www.youtube.com/watch?v=neD2PEqr-Po +https://www.youtube.com/watch?v=vHqIYvrKwks +https://www.youtube.com/watch?v=1A6qbKM5vgE +https://www.youtube.com/watch?v=zxPStAHlg4E +https://www.youtube.com/watch?v=jZCfL7fblMM +https://www.youtube.com/watch?v=TAccYcmvQ0k +https://www.youtube.com/watch?v=kzbyykGWN9U +https://www.youtube.com/watch?v=Jzj8TyuuvzQ +https://www.youtube.com/watch?v=ruQVatMNzto +https://www.youtube.com/watch?v=4tOse6iLVs0 +https://www.youtube.com/watch?v=3l_25zyd-s8 +https://www.youtube.com/watch?v=Cu0D682ezDU +https://www.youtube.com/watch?v=ZkHmWMl_rfo +https://www.youtube.com/watch?v=qcI0TSXWzVs +https://www.youtube.com/watch?v=THdAow8-nG8 +https://www.youtube.com/watch?v=53FiW6nOJfQ +https://www.youtube.com/watch?v=w52Vjf2dphk +https://www.youtube.com/watch?v=O3buBB-zkw4 +https://www.youtube.com/watch?v=qsRb4sFg7iE +https://www.youtube.com/watch?v=B36mO34Yaj8 +https://www.youtube.com/watch?v=apgTsYIOZks +https://www.youtube.com/watch?v=uONZRzmh3xc +https://www.youtube.com/watch?v=FTY3sC1ad-8 +https://www.youtube.com/watch?v=OfFoZQsS0qI +https://www.youtube.com/watch?v=SlE1uDWGMuI +https://www.youtube.com/watch?v=rDZYOsRB_DE +https://www.youtube.com/watch?v=iWUNJPVzTT0 +https://www.youtube.com/watch?v=hfEwesszkvI +https://www.youtube.com/watch?v=Tk1zk4xikrk +https://www.youtube.com/watch?v=kbqKifCiUFo +https://www.youtube.com/watch?v=H4oCces6L-I +https://www.youtube.com/watch?v=dZc0Wi1l0L0 +https://www.youtube.com/watch?v=_DRdlJnx2Vo +https://www.youtube.com/watch?v=uoyvZlIQ_-I +https://www.youtube.com/watch?v=gCrKVixw7Tk +https://www.youtube.com/watch?v=IVk6qntdVzk +https://www.youtube.com/watch?v=ZK3n2LCqRio +https://www.youtube.com/watch?v=ZzKNrl5kyF4 +https://www.youtube.com/watch?v=Gld-GRwARlA +https://www.youtube.com/watch?v=tcqDUEhgT_g +https://www.youtube.com/watch?v=fPh0SGZHbTk +https://www.youtube.com/watch?v=rAsmd_5SfII +https://www.youtube.com/watch?v=8Dotiqbtvoo +https://www.youtube.com/watch?v=Q1bJaVlV-84 +https://www.youtube.com/watch?v=CBQ5qbYV3XM +https://www.youtube.com/watch?v=pOsgKiHqKt0 +https://www.youtube.com/watch?v=HC-e2wj7ePc +https://www.youtube.com/watch?v=JiBb2n5UEG8 +https://www.youtube.com/watch?v=INNL2cWTgmI +https://www.youtube.com/watch?v=nEiX-U8P4H4 +https://www.youtube.com/watch?v=azXdNflZL28 +https://www.youtube.com/watch?v=8GxjkvKfRh4 +https://www.youtube.com/watch?v=HH71IKNVVYk +https://www.youtube.com/watch?v=807yt9yhd6I +https://www.youtube.com/watch?v=El7pa-DsJ7w +https://www.youtube.com/watch?v=nIZUoHkJNH0 +https://www.youtube.com/watch?v=v8EuLwLPF1I +https://www.youtube.com/watch?v=VXvqZQBGF5A +https://www.youtube.com/watch?v=tTkxj7PJ6Ss +https://www.youtube.com/watch?v=Brraz_ZKUIA +https://www.youtube.com/watch?v=BEjJRVVD0d4 +https://www.youtube.com/watch?v=Kw52RfKqX5Q +https://www.youtube.com/watch?v=Tj1CYEYIZI8 +https://www.youtube.com/watch?v=R6sRU0cLwcg +https://www.youtube.com/watch?v=HYN-BL55NyI +https://www.youtube.com/watch?v=4xRSfFe0aA4 +https://www.youtube.com/watch?v=qcT3I4Fhod8 +https://www.youtube.com/watch?v=FhR_Fc6I-Es +https://www.youtube.com/watch?v=5kQI69iDZEI +https://www.youtube.com/watch?v=eiQUC22MT0o +https://www.youtube.com/watch?v=mVNsumhm0bk +https://www.youtube.com/watch?v=5kyt-4p0qpw +https://www.youtube.com/watch?v=kdWxc8hDPbA +https://www.youtube.com/watch?v=VK8oMBYr9AE +https://www.youtube.com/watch?v=KHIe0adNnPw +https://www.youtube.com/watch?v=WSRrChHFR2I +https://www.youtube.com/watch?v=eWyU5N5oGUw +https://www.youtube.com/watch?v=OTF26cgxS5A +https://www.youtube.com/watch?v=AyOrNze3SE4 +https://www.youtube.com/watch?v=0bShQ01DxnY +https://www.youtube.com/watch?v=jal3Rr0TPpM +https://www.youtube.com/watch?v=IvwSs1j6sL0 +https://www.youtube.com/watch?v=rbvJbvdspoU +https://www.youtube.com/watch?v=gSqq_vuW0es +https://www.youtube.com/watch?v=EY7KAbarSnk +https://www.youtube.com/watch?v=oCZ5BJlh6Jo +https://www.youtube.com/watch?v=veVrB1DNV-c +https://www.youtube.com/watch?v=Jl0MB13-zK8 +https://www.youtube.com/watch?v=qfYc2z7cvC4 +https://www.youtube.com/watch?v=J8NH9qAkys4 +https://www.youtube.com/watch?v=bBpcF-hnKz0 +https://www.youtube.com/watch?v=3JsODEZl5lo +https://www.youtube.com/watch?v=I5CFgz1qeSc +https://www.youtube.com/watch?v=LIKcI1MBnto +https://www.youtube.com/watch?v=79wzDxJu0UE +https://www.youtube.com/watch?v=gHS0Lf8TyF8 +https://www.youtube.com/watch?v=oqgrcgRkunw +https://www.youtube.com/watch?v=mWJC1eL_OR0 +https://www.youtube.com/watch?v=41cWX4W1vEI +https://www.youtube.com/watch?v=8mO3yxKHU1E +https://www.youtube.com/watch?v=cR2EZ9b2AYw +https://www.youtube.com/watch?v=wyPYWkVKQyw +https://www.youtube.com/watch?v=MuUsmsfwizg +https://www.youtube.com/watch?v=9Y18qV1UCRM +https://www.youtube.com/watch?v=hd9jxasd-60 +https://www.youtube.com/watch?v=WEVdhWKG2x8 +https://www.youtube.com/watch?v=csq261RPA2I +https://www.youtube.com/watch?v=8pmocmq8Z_Y +https://www.youtube.com/watch?v=OFUVP1sDMhQ +https://www.youtube.com/watch?v=YZnULU8-WiY +https://www.youtube.com/watch?v=bkUEPqEqMOc +https://www.youtube.com/watch?v=fgxaU6KA4kI +https://www.youtube.com/watch?v=6XziyFQ2qb0 +https://www.youtube.com/watch?v=71QrG4wEY_g +https://www.youtube.com/watch?v=wJXJTliyR98 +https://www.youtube.com/watch?v=lDw7qM3lCOU +https://www.youtube.com/watch?v=ONpSx6GGlTE +https://www.youtube.com/watch?v=W3tNcsdWzv4 +https://www.youtube.com/watch?v=Sq7SBO1VqKc +https://www.youtube.com/watch?v=PEmiEWUb1uo +https://www.youtube.com/watch?v=Mw1Du8gYMiE +https://www.youtube.com/watch?v=H4u0uhldLJQ +https://www.youtube.com/watch?v=fEDVDvIWfZE +https://www.youtube.com/watch?v=1tgrLHWLhBs +https://www.youtube.com/watch?v=VDgp3h8bAu8 +https://www.youtube.com/watch?v=8ZcZAL3C928 +https://www.youtube.com/watch?v=0Zpivy32UGU +https://www.youtube.com/watch?v=u-m-BBQQ9Tw +https://www.youtube.com/watch?v=cvHvX8mFTJE +https://www.youtube.com/watch?v=L-o5p75Q-cg +https://www.youtube.com/watch?v=ZfORukYHkGA +https://www.youtube.com/watch?v=t9sbedJUdUc +https://www.youtube.com/watch?v=zBoHq5-w5UY +https://www.youtube.com/watch?v=q50-whddP7Y +https://www.youtube.com/watch?v=D1PiHzL703U +https://www.youtube.com/watch?v=voQEUBq8q_A +https://www.youtube.com/watch?v=Ps2HyJCINyw +https://www.youtube.com/watch?v=kzco7k86Unw +https://www.youtube.com/watch?v=YE2zr2lV50M +https://www.youtube.com/watch?v=pU_MuwLZeAc +https://www.youtube.com/watch?v=PC5NoUQMOhA +https://www.youtube.com/watch?v=KGm_VKYfTMI +https://www.youtube.com/watch?v=duUThrCj7Lk +https://www.youtube.com/watch?v=n5UaEOcC5G4 +https://www.youtube.com/watch?v=gjEmu6h_lpE +https://www.youtube.com/watch?v=en1KyArCG6w +https://www.youtube.com/watch?v=bRPWouCfF7I +https://www.youtube.com/watch?v=lXnIwNH8vGo +https://www.youtube.com/watch?v=xmPqK9T_yEU +https://www.youtube.com/watch?v=PYUNAbge9Xw +https://www.youtube.com/watch?v=J39cA-10XcE +https://www.youtube.com/watch?v=1BJD7Rv7iS8 +https://www.youtube.com/watch?v=D6WdfQDXRsw +https://www.youtube.com/watch?v=g6-v4pwo2ik +https://www.youtube.com/watch?v=UCgHBFhO7FM +https://www.youtube.com/watch?v=ALNUXWNvEZY +https://www.youtube.com/watch?v=0Qx13_oyycg +https://www.youtube.com/watch?v=1KeCeqkwnTs +https://www.youtube.com/watch?v=JmQd29Q6-s8 +https://www.youtube.com/watch?v=5eE9eTDjII0 +https://www.youtube.com/watch?v=-kPpPTIYpeY +https://www.youtube.com/watch?v=n7IfbF48Jqo +https://www.youtube.com/watch?v=HXG-qjuDkPE +https://www.youtube.com/watch?v=77sKr6xPbW8 +https://www.youtube.com/watch?v=w9uEnYCbmno +https://www.youtube.com/watch?v=M9B2M5rGOqE +https://www.youtube.com/watch?v=g-6eEKHMT4A +https://www.youtube.com/watch?v=0k6rcvts1FM +https://www.youtube.com/watch?v=3Glq6IgKJ-g +https://www.youtube.com/watch?v=dl_kgfUid_E +https://www.youtube.com/watch?v=RpBgeBWcw4I +https://www.youtube.com/watch?v=WiyI1U6HfJ8 +https://www.youtube.com/watch?v=CvPD5zHvxpE +https://www.youtube.com/watch?v=H5aghJz-6-0 +https://www.youtube.com/watch?v=hvGwiRk9qFI +https://www.youtube.com/watch?v=kP5en-KOZak +https://www.youtube.com/watch?v=Lt9z2PZxTA8 +https://www.youtube.com/watch?v=ZAN2gg3Bf88 +https://www.youtube.com/watch?v=dfcoKxlL9zo +https://www.youtube.com/watch?v=6G-zWuGwXwE +https://www.youtube.com/watch?v=IFOgQYDqCDg +https://www.youtube.com/watch?v=fN1ASoQVOtc +https://www.youtube.com/watch?v=nDvvyndocg0 +https://www.youtube.com/watch?v=YS2do-ydhsE +https://www.youtube.com/watch?v=5IL47nns0R4 +https://www.youtube.com/watch?v=A3BueGvC0dU +https://www.youtube.com/watch?v=qE5_I54Onsg +https://www.youtube.com/watch?v=1QA_KBw3bpM +https://www.youtube.com/watch?v=H2ms1CuhCAQ +https://www.youtube.com/watch?v=zh7AyRCjMK8 +https://www.youtube.com/watch?v=oklOIfwaIm4 +https://www.youtube.com/watch?v=2_m2D7BlCSY +https://www.youtube.com/watch?v=AOh3iLuvEx0 +https://www.youtube.com/watch?v=qt6rxatB78k +https://www.youtube.com/watch?v=CCLgvay1AJg +https://www.youtube.com/watch?v=2CJsz7yfWVQ +https://www.youtube.com/watch?v=mXr5R4PybQ8 +https://www.youtube.com/watch?v=FPJUY3OG1j4 +https://www.youtube.com/watch?v=AxZSX649ZQM +https://www.youtube.com/watch?v=vAqqcajeLyw +https://www.youtube.com/watch?v=wT50rGqJi-A +https://www.youtube.com/watch?v=bURXdJK5yDo +https://www.youtube.com/watch?v=Ci-jKDX2Utc +https://www.youtube.com/watch?v=4jNOtUpzcsM +https://www.youtube.com/watch?v=9F1xYw3-wC0 +https://www.youtube.com/watch?v=-wgG-UKu6P4 +https://www.youtube.com/watch?v=RA0QPohN8OA +https://www.youtube.com/watch?v=swaAAvGIVkQ +https://www.youtube.com/watch?v=E2cttPQLTmU +https://www.youtube.com/watch?v=7u_HP6AjgNM +https://www.youtube.com/watch?v=-o7z8zDigKw +https://www.youtube.com/watch?v=2iDzZRY4nFg +https://www.youtube.com/watch?v=TvauDXRHRQM +https://www.youtube.com/watch?v=gm0CbvYTfyU +https://www.youtube.com/watch?v=aVH30g7M7-s +https://www.youtube.com/watch?v=SaRJpKcMpIc +https://www.youtube.com/watch?v=VME8ViM9p_E +https://www.youtube.com/watch?v=Ob1gwjj03-g +https://www.youtube.com/watch?v=Kx8QHsFjzdo +https://www.youtube.com/watch?v=k0MXRrhoGzw +https://www.youtube.com/watch?v=iQpIcy-iINQ +https://www.youtube.com/watch?v=iIegaxZamds +https://www.youtube.com/watch?v=nKgS3q8Eixw +https://www.youtube.com/watch?v=Vu53Y9-u6OQ +https://www.youtube.com/watch?v=A-1xFilVGKA +https://www.youtube.com/watch?v=NzXu-1jdv2w +https://www.youtube.com/watch?v=dN0sAUTPOo0 +https://www.youtube.com/watch?v=KhKqvIa4KPI +https://www.youtube.com/watch?v=7EQlStjqPXk +https://www.youtube.com/watch?v=GvGYuLtTpI4 +https://www.youtube.com/watch?v=socM2vLFAXw +https://www.youtube.com/watch?v=4Lf0s5sF6Ps +https://www.youtube.com/watch?v=O0SNpN9bA7M +https://www.youtube.com/watch?v=_1B1Unp8rzQ +https://www.youtube.com/watch?v=2Pxto4fr8fU +https://www.youtube.com/watch?v=-wnCY6-C_LE +https://www.youtube.com/watch?v=Jyo0daMS_FI +https://www.youtube.com/watch?v=6Mv190DEO5Q +https://www.youtube.com/watch?v=A3vqXUImxmo +https://www.youtube.com/watch?v=jTavkw3fHCU +https://www.youtube.com/watch?v=wO_IP_UBHSE +https://www.youtube.com/watch?v=eK76eyqZLuI +https://www.youtube.com/watch?v=fGq8t2S9A4Y +https://www.youtube.com/watch?v=kwgTZ7Kx1j0 +https://www.youtube.com/watch?v=QpR8PIGCI6A +https://www.youtube.com/watch?v=wP6eLrWucEU +https://www.youtube.com/watch?v=c8wcjZjYUKk +https://www.youtube.com/watch?v=3jqtAd3ms6s +https://www.youtube.com/watch?v=yQJxa2y3RMU +https://www.youtube.com/watch?v=xq46z38tXds +https://www.youtube.com/watch?v=N5xZyUxRJBM +https://www.youtube.com/watch?v=seeZtr3lYz8 +https://www.youtube.com/watch?v=DtoINgJb8NM +https://www.youtube.com/watch?v=Q1by2tU9Rp4 +https://www.youtube.com/watch?v=X7Ho48iO098 +https://www.youtube.com/watch?v=Nxs8sYQ6D4Y +https://www.youtube.com/watch?v=ePktyiVhM9Y +https://www.youtube.com/watch?v=FHAjPjwINDM +https://www.youtube.com/watch?v=iog13CSQsBE +https://www.youtube.com/watch?v=JC_7WZnqqYI +https://www.youtube.com/watch?v=qzar3W-wKdA +https://www.youtube.com/watch?v=JaLalK-3Ll0 +https://www.youtube.com/watch?v=L-VBIZ1lxZ8 +https://www.youtube.com/watch?v=z6LqQAbFZ5U +https://www.youtube.com/watch?v=V4sIhzXF5mw +https://www.youtube.com/watch?v=XaZskPC2CH8 +https://www.youtube.com/watch?v=N-sgaV4nP_c +https://www.youtube.com/watch?v=g4S3tejwVBQ +https://www.youtube.com/watch?v=uq7Wh078eUg +https://www.youtube.com/watch?v=zSmiH1Gbpp8 +https://www.youtube.com/watch?v=6WSy_8fjh3Y +https://www.youtube.com/watch?v=KRxe3BiApmU +https://www.youtube.com/watch?v=bO-OsMybcdY +https://www.youtube.com/watch?v=Tl9lNbchXKU +https://www.youtube.com/watch?v=MIGsaLyquMI +https://www.youtube.com/watch?v=clfJqj03TEs +https://www.youtube.com/watch?v=0Wpkb1L4pYw +https://www.youtube.com/watch?v=qtIP2ieotyk +https://www.youtube.com/watch?v=jm3t-hXP1Eo +https://www.youtube.com/watch?v=KU5QuYzEte0 +https://www.youtube.com/watch?v=r5iLqBt3TkE +https://www.youtube.com/watch?v=8vFMbZEma7w +https://www.youtube.com/watch?v=Q6SgU9w7XbY +https://www.youtube.com/watch?v=y9nZZxnsoTw +https://www.youtube.com/watch?v=y1VjxqY8BrI +https://www.youtube.com/watch?v=cVy39nbbSB4 +https://www.youtube.com/watch?v=JJDOUA_9TnU +https://www.youtube.com/watch?v=5fh0g4j0JPM +https://www.youtube.com/watch?v=4bp7st-p2Ns +https://www.youtube.com/watch?v=Vka_RHl8NBg +https://www.youtube.com/watch?v=C7mEj7LsxDM +https://www.youtube.com/watch?v=oU3xk3oaIWs +https://www.youtube.com/watch?v=Vc80-qcAYTI +https://www.youtube.com/watch?v=6jdO7Z0IA9s +https://www.youtube.com/watch?v=M624f51E6TU +https://www.youtube.com/watch?v=a2zb_vffseo +https://www.youtube.com/watch?v=kjJSsR7G-yA +https://www.youtube.com/watch?v=HTfUdUUB2sY +https://www.youtube.com/watch?v=clDTNsCoAt0 +https://www.youtube.com/watch?v=EtlQ36lNezM +https://www.youtube.com/watch?v=LvXVwrrsMjE +https://www.youtube.com/watch?v=lmC8nB3Sx0Y +https://www.youtube.com/watch?v=UgJMzy12jEk +https://www.youtube.com/watch?v=mqrZu6fiOlA +https://www.youtube.com/watch?v=cxyHJSC6qDI +https://www.youtube.com/watch?v=yJOvKMfMy9Q +https://www.youtube.com/watch?v=74eDPvsPc58 +https://www.youtube.com/watch?v=OVuJECLWkQQ +https://www.youtube.com/watch?v=V35MoqZdaKU +https://www.youtube.com/watch?v=5VVSyz8DYH8 +https://www.youtube.com/watch?v=DJz78yI9zvg +https://www.youtube.com/watch?v=Qs5ynEowGp0 +https://www.youtube.com/watch?v=PeRX98IZhJM +https://www.youtube.com/watch?v=GiVe7i3bY74 +https://www.youtube.com/watch?v=WOsmZel1tUQ +https://www.youtube.com/watch?v=6HyYFW4KAjE +https://www.youtube.com/watch?v=T40pRAlLPFI +https://www.youtube.com/watch?v=ESJ4fEsc3E8 +https://www.youtube.com/watch?v=JrmW9FXdiqg +https://www.youtube.com/watch?v=nfCY1Y2wCaE +https://www.youtube.com/watch?v=QDA8tjQeGa0 +https://www.youtube.com/watch?v=VNWFVRESr9k +https://www.youtube.com/watch?v=FwzDqhHNZq4 +https://www.youtube.com/watch?v=otevRZLVIns +https://www.youtube.com/watch?v=QbbaZPVWjZ0 +https://www.youtube.com/watch?v=NThxpgYS54k +https://www.youtube.com/watch?v=GzqvU_H3cjs +https://www.youtube.com/watch?v=aINHgBzBAsc +https://www.youtube.com/watch?v=dFLilVIP6v0 +https://www.youtube.com/watch?v=NQ_VXw5C5_g +https://www.youtube.com/watch?v=NlwOF78qdkM +https://www.youtube.com/watch?v=W8-8ZfmTIw8 +https://www.youtube.com/watch?v=_rSM6kDk6jU +https://www.youtube.com/watch?v=Tr38d3eLXf8 +https://www.youtube.com/watch?v=YhIXV4DWhIA +https://www.youtube.com/watch?v=-nfJpVRjRM0 +https://www.youtube.com/watch?v=kosQ_XMUtDI +https://www.youtube.com/watch?v=D7OYw3vhtlQ +https://www.youtube.com/watch?v=3Xnmt2Ymii4 +https://www.youtube.com/watch?v=bM2Lw4iDWMs +https://www.youtube.com/watch?v=lVeTpIpFTuI +https://www.youtube.com/watch?v=Bxb6m5jVs4k +https://www.youtube.com/watch?v=rh8Zo8ZCw8w +https://www.youtube.com/watch?v=7C0wdkJH4tw +https://www.youtube.com/watch?v=TOOHa3M_3_A +https://www.youtube.com/watch?v=P0gfEojLMmY +https://www.youtube.com/watch?v=OcS5i4b94fE +https://www.youtube.com/watch?v=6K_SzWye5tE +https://www.youtube.com/watch?v=pVlrX8hakyE +https://www.youtube.com/watch?v=zIrG0Wt6CcA +https://www.youtube.com/watch?v=EjXQbmbgxhQ +https://www.youtube.com/watch?v=MmvWYXp1PNM +https://www.youtube.com/watch?v=lLx3Z3c7mV8 +https://www.youtube.com/watch?v=73ykZR11zes +https://www.youtube.com/watch?v=WHYrfpgtm6U +https://www.youtube.com/watch?v=b8xrtcAyyw0 +https://www.youtube.com/watch?v=SNFeZyokO6o +https://www.youtube.com/watch?v=sre-OE94un8 +https://www.youtube.com/watch?v=q28um1cqF4Q +https://www.youtube.com/watch?v=phgtPLyP97w +https://www.youtube.com/watch?v=jlUkuRkYFZU +https://www.youtube.com/watch?v=3G3m2BTXUQw +https://www.youtube.com/watch?v=te2LYx1SVBE +https://www.youtube.com/watch?v=JACfOF38Ffk +https://www.youtube.com/watch?v=ZKb43WnjoiU +https://www.youtube.com/watch?v=Qel0DXeISN0 +https://www.youtube.com/watch?v=9FekdRZPIpQ +https://www.youtube.com/watch?v=L3E45I283ZU +https://www.youtube.com/watch?v=ZpKcW61Y3zI +https://www.youtube.com/watch?v=SiJmWpuQhNQ +https://www.youtube.com/watch?v=sYe2vx6p_T4 +https://www.youtube.com/watch?v=eJEGgi8ZkRQ +https://www.youtube.com/watch?v=V--wYltJnB4 +https://www.youtube.com/watch?v=z8EMf_9wUzc +https://www.youtube.com/watch?v=2vuVM43MRiA +https://www.youtube.com/watch?v=Sc88FJQw-8A +https://www.youtube.com/watch?v=2lB9s3y-6eA +https://www.youtube.com/watch?v=vNkYcCV7S4U +https://www.youtube.com/watch?v=F3ls751u5o0 +https://www.youtube.com/watch?v=oFo8wPllZu8 +https://www.youtube.com/watch?v=Ku9lKfjZU30 +https://www.youtube.com/watch?v=3Yq8fNNHB1Y +https://www.youtube.com/watch?v=Sk3dVf0H9C0 +https://www.youtube.com/watch?v=w99cGM_y4Og +https://www.youtube.com/watch?v=jm0Zv6ydHeo +https://www.youtube.com/watch?v=5X2g_qbEgEs +https://www.youtube.com/watch?v=MYTQew8auIY +https://www.youtube.com/watch?v=GOy_-PzLf8g +https://www.youtube.com/watch?v=YUkd_TZQZKk +https://www.youtube.com/watch?v=hzeo2pDrtLk +https://www.youtube.com/watch?v=wEabH0TyYwM +https://www.youtube.com/watch?v=SlL6VTxaCog +https://www.youtube.com/watch?v=s6ZflJj1p34 +https://www.youtube.com/watch?v=TMTHkY8hCx8 +https://www.youtube.com/watch?v=cRBj61eBjhQ +https://www.youtube.com/watch?v=DTL3G1h2SdQ +https://www.youtube.com/watch?v=NCI6-NWq6DY +https://www.youtube.com/watch?v=lIvSjlKUvCg +https://www.youtube.com/watch?v=6r7Ubc_dEQk +https://www.youtube.com/watch?v=IFdEerP9z4Q +https://www.youtube.com/watch?v=JbBGMq-wBHM +https://www.youtube.com/watch?v=RIYSRqBseLI +https://www.youtube.com/watch?v=2v_UzrgNwpo +https://www.youtube.com/watch?v=iX_vynlyrC8 +https://www.youtube.com/watch?v=ZBjsh2p80sY +https://www.youtube.com/watch?v=AK6dg9YJz70 +https://www.youtube.com/watch?v=AMAzK-IjtW0 +https://www.youtube.com/watch?v=PfaI57gHTkU +https://www.youtube.com/watch?v=Cn9asaKJkP8 +https://www.youtube.com/watch?v=GWDOcK-GHUo +https://www.youtube.com/watch?v=FdrM63-sL5E +https://www.youtube.com/watch?v=Ni15untE9lc +https://www.youtube.com/watch?v=ZXiNG_wc3cs +https://www.youtube.com/watch?v=a1NjiQlF_QU +https://www.youtube.com/watch?v=aKlFxKwlJCI +https://www.youtube.com/watch?v=ncyhGHY-J8s +https://www.youtube.com/watch?v=Nsl6F3KD68I +https://www.youtube.com/watch?v=y-MVI2HeAb8 +https://www.youtube.com/watch?v=lDmo3DvHSoQ +https://www.youtube.com/watch?v=_nO4GwwK7a0 +https://www.youtube.com/watch?v=JNV0Bs_Z2rY +https://www.youtube.com/watch?v=QCs8H3xMCCg +https://www.youtube.com/watch?v=xSlTzHlfJy0 +https://www.youtube.com/watch?v=2eVxtYA-1jI +https://www.youtube.com/watch?v=a9Ma4IjuWvM +https://www.youtube.com/watch?v=8vaxMejObcY +https://www.youtube.com/watch?v=SR6dOkauvIo +https://www.youtube.com/watch?v=Pudto3Xw_NY +https://www.youtube.com/watch?v=6EIjFdz_344 +https://www.youtube.com/watch?v=Q30ETlsokl0 +https://www.youtube.com/watch?v=4RJNa-Dj68I +https://www.youtube.com/watch?v=KoNzY_CeeKw +https://www.youtube.com/watch?v=7xNd2lPYR68 +https://www.youtube.com/watch?v=Bowfz2gZ2Sk +https://www.youtube.com/watch?v=X32vDZjnIWc +https://www.youtube.com/watch?v=GLP9CuTWUlk +https://www.youtube.com/watch?v=JDsMfCdDUfk +https://www.youtube.com/watch?v=VKynMQrBM7E +https://www.youtube.com/watch?v=ejB1lm7jDzw +https://www.youtube.com/watch?v=8B4Sg9xIGTQ +https://www.youtube.com/watch?v=_rB2YS9t63M +https://www.youtube.com/watch?v=KJyvaMvan9I +https://www.youtube.com/watch?v=ZcdhsUEd6TU +https://www.youtube.com/watch?v=NCPYSEYoF1c +https://www.youtube.com/watch?v=EgupaPnIeMM +https://www.youtube.com/watch?v=TqPRCGbHSjw +https://www.youtube.com/watch?v=Hi62GOTWGI8 +https://www.youtube.com/watch?v=dHcZffZjYB0 +https://www.youtube.com/watch?v=Pvnqhkywbxc +https://www.youtube.com/watch?v=UceBEWYa13w +https://www.youtube.com/watch?v=AgRH2C5yPjQ +https://www.youtube.com/watch?v=dXM5zpjqtOc +https://www.youtube.com/watch?v=a4Sb42va86Q +https://www.youtube.com/watch?v=JSZdE83PiRQ +https://www.youtube.com/watch?v=mWi5mU1bPPg +https://www.youtube.com/watch?v=ZTVH8aYSwjQ +https://www.youtube.com/watch?v=e_3WleCGJbc +https://www.youtube.com/watch?v=woMgT3A_71Q +https://www.youtube.com/watch?v=771kiAizO8g +https://www.youtube.com/watch?v=7PYkf420f9c +https://www.youtube.com/watch?v=AgE4Ke5nNoY +https://www.youtube.com/watch?v=ZD-UOCrU6Fg +https://www.youtube.com/watch?v=WnNpg4LRzHI +https://www.youtube.com/watch?v=guKqHIuxq90 +https://www.youtube.com/watch?v=WZ89NCgdvII +https://www.youtube.com/watch?v=e9r2o7MRyMQ +https://www.youtube.com/watch?v=1xdaVv0qb0I +https://www.youtube.com/watch?v=l5SYopn7vSg +https://www.youtube.com/watch?v=5xiKlm6vG5w +https://www.youtube.com/watch?v=iKAtkHSVfjU +https://www.youtube.com/watch?v=xQHmDw2ayNw +https://www.youtube.com/watch?v=PsWWUiANTfo +https://www.youtube.com/watch?v=tQIIhH7A9FE +https://www.youtube.com/watch?v=6EkM3Fvirq0 +https://www.youtube.com/watch?v=mQ-kLX_NRwU +https://www.youtube.com/watch?v=QR6WfdodfDU +https://www.youtube.com/watch?v=Xb4ZZ6T50vM +https://www.youtube.com/watch?v=E0HGtjMKljg +https://www.youtube.com/watch?v=tbtPMw1BNA4 +https://www.youtube.com/watch?v=eFJlQBkjEqw +https://www.youtube.com/watch?v=vJ4Ue81SyQw +https://www.youtube.com/watch?v=dXkf-O-ByOQ +https://www.youtube.com/watch?v=zIfZxrswlEY +https://www.youtube.com/watch?v=A5vdyzU-0zg +https://www.youtube.com/watch?v=2ajukBAGGuU +https://www.youtube.com/watch?v=WTZ4zCezHUU +https://www.youtube.com/watch?v=XWi8rXiRq9E +https://www.youtube.com/watch?v=qpMl2erxOgU +https://www.youtube.com/watch?v=VwbO60gjWoA +https://www.youtube.com/watch?v=7IuipODNcRE +https://www.youtube.com/watch?v=HfMHDL0SgZ0 +https://www.youtube.com/watch?v=yv5mcmNEwdU +https://www.youtube.com/watch?v=xma0nVpBjZo +https://www.youtube.com/watch?v=TKxNwoYM5ec +https://www.youtube.com/watch?v=hiKwAlTM1Ys +https://www.youtube.com/watch?v=KG-30LxX-qs +https://www.youtube.com/watch?v=_6Ms_SJmQn4 +https://www.youtube.com/watch?v=0tdXaee9o6k +https://www.youtube.com/watch?v=J9FCafzAuaE +https://www.youtube.com/watch?v=7jTrdi5t83Y +https://www.youtube.com/watch?v=WIky8XG3SP4 +https://www.youtube.com/watch?v=0iv6pKiKzL4 +https://www.youtube.com/watch?v=ZfWDeOgVSQo +https://www.youtube.com/watch?v=7QdQ7z3mFr4 +https://www.youtube.com/watch?v=JfjXBXIvd-8 +https://www.youtube.com/watch?v=YyOK4Lau-xY +https://www.youtube.com/watch?v=klgdpFMajjY +https://www.youtube.com/watch?v=I-ar6huKQ_c +https://www.youtube.com/watch?v=vkL_zAcnkI8 +https://www.youtube.com/watch?v=tgMX2SfF5lI +https://www.youtube.com/watch?v=4FrSX37DoTU +https://www.youtube.com/watch?v=ERX--LGwC10 +https://www.youtube.com/watch?v=t_2kZnBl9i0 +https://www.youtube.com/watch?v=YnhdkKajmRA +https://www.youtube.com/watch?v=7nfJO1rJYMo +https://www.youtube.com/watch?v=B4bd4HcRo0Q +https://www.youtube.com/watch?v=BOs7CVyGyGg +https://www.youtube.com/watch?v=OZyMlE-yy3U +https://www.youtube.com/watch?v=SvbS2IALKmo +https://www.youtube.com/watch?v=U-IdboWZNiA +https://www.youtube.com/watch?v=msjiKwDbsaM +https://www.youtube.com/watch?v=dmZ1pWgxZn0 +https://www.youtube.com/watch?v=utGMKcJtuPo +https://www.youtube.com/watch?v=sGseachRqQs +https://www.youtube.com/watch?v=s_7soIjx_sk +https://www.youtube.com/watch?v=QiFpIIF7-4g +https://www.youtube.com/watch?v=EFCcOOuWWc8 +https://www.youtube.com/watch?v=ORAwIWpC3Gw +https://www.youtube.com/watch?v=nB5njVbYF_k +https://www.youtube.com/watch?v=nfz__ppKnHM +https://www.youtube.com/watch?v=9y9YPN5mclI +https://www.youtube.com/watch?v=knEbE0conCs +https://www.youtube.com/watch?v=uuoZinaXlAs +https://www.youtube.com/watch?v=HATcwbvQEac +https://www.youtube.com/watch?v=9B5bfAzqT6A +https://www.youtube.com/watch?v=Spa5Hstqe9c +https://www.youtube.com/watch?v=RX8-5eZZH-g +https://www.youtube.com/watch?v=FhNZRjWbV88 +https://www.youtube.com/watch?v=4iOXfE5mrOs +https://www.youtube.com/watch?v=v2ZKFLsJh44 +https://www.youtube.com/watch?v=Im7IqqmDmwE +https://www.youtube.com/watch?v=ldQM2aFCLAY +https://www.youtube.com/watch?v=wNqXAjJtZG0 +https://www.youtube.com/watch?v=etSP1c6XQF8 +https://www.youtube.com/watch?v=Kz7tHkNSXnU +https://www.youtube.com/watch?v=YurbIFCKqHo +https://www.youtube.com/watch?v=UspvXAlQ26o +https://www.youtube.com/watch?v=JYvEggbevBw +https://www.youtube.com/watch?v=TJpGFfXl4Rg +https://www.youtube.com/watch?v=T59N1dRRAtw +https://www.youtube.com/watch?v=sdW6jwBctac +https://www.youtube.com/watch?v=jTWH3Rb72rI +https://www.youtube.com/watch?v=OT5UFvRabSg +https://www.youtube.com/watch?v=N7uyjA7i7SI +https://www.youtube.com/watch?v=D2z8w4MNnOI +https://www.youtube.com/watch?v=PGaSqod7xJ8 +https://www.youtube.com/watch?v=W0RtLCRayZI +https://www.youtube.com/watch?v=9d_fnwE-P3g +https://www.youtube.com/watch?v=Y_nKb8qDnS4 +https://www.youtube.com/watch?v=mSqdcFxU-BE +https://www.youtube.com/watch?v=dh8voXLq30Q +https://www.youtube.com/watch?v=j34tBBPPO7k +https://www.youtube.com/watch?v=Z39BEKY6r2g +https://www.youtube.com/watch?v=tV48lHlCO_E +https://www.youtube.com/watch?v=9AdxIIwBwD8 +https://www.youtube.com/watch?v=sgYKkmO4Y9k +https://www.youtube.com/watch?v=g38X9lWrCvM +https://www.youtube.com/watch?v=qeZX32QWR5I +https://www.youtube.com/watch?v=t949upp1nAc +https://www.youtube.com/watch?v=FQG5G5yuhkI +https://www.youtube.com/watch?v=vqArE3Ddjp0 +https://www.youtube.com/watch?v=kWD8zGU-sHs +https://www.youtube.com/watch?v=UKpJ07-Fdco +https://www.youtube.com/watch?v=yCTY7L58M0c +https://www.youtube.com/watch?v=Eg9kwoacM_Q +https://www.youtube.com/watch?v=TYh4lXx57b4 +https://www.youtube.com/watch?v=KkQGpeabUmc +https://www.youtube.com/watch?v=alqtdG-lH20 +https://www.youtube.com/watch?v=LhUFVnK5IBU +https://www.youtube.com/watch?v=SKxio1UECBA +https://www.youtube.com/watch?v=OkZQdhgToL4 +https://www.youtube.com/watch?v=tSyp0B5KLIc +https://www.youtube.com/watch?v=X2l_P0KN4FE +https://www.youtube.com/watch?v=Rw6YwelbmPU +https://www.youtube.com/watch?v=QucIkabx540 +https://www.youtube.com/watch?v=R6a2CRSeq4I +https://www.youtube.com/watch?v=S_pCLiKX1jQ +https://www.youtube.com/watch?v=B_uOj6ZaGjU +https://www.youtube.com/watch?v=pMxjV14wEaQ +https://www.youtube.com/watch?v=hSCD7O2zZqs +https://www.youtube.com/watch?v=MT7JYGXHvsg +https://www.youtube.com/watch?v=Z7eUu3-vcXA +https://www.youtube.com/watch?v=Pk2cph6j3Qk +https://www.youtube.com/watch?v=hionali1f8Q +https://www.youtube.com/watch?v=RFkfq59Q6Jc +https://www.youtube.com/watch?v=ZIZVTRYCGWM +https://www.youtube.com/watch?v=QFMoiOAY6i4 +https://www.youtube.com/watch?v=6uRUgR7azzc +https://www.youtube.com/watch?v=76sAQCo9Ao0 +https://www.youtube.com/watch?v=vEjnuOJadpA +https://www.youtube.com/watch?v=T5qyH3fO_NQ +https://www.youtube.com/watch?v=HIHiwfUj8_Y +https://www.youtube.com/watch?v=oMnMBFHzO2A +https://www.youtube.com/watch?v=AsRDIaqn-b0 +https://www.youtube.com/watch?v=u1VSkXNGAM0 +https://www.youtube.com/watch?v=ys3q0YCAtWA +https://www.youtube.com/watch?v=zCfWIxAIo2A +https://www.youtube.com/watch?v=5hgHNqbMovk +https://www.youtube.com/watch?v=JQGubPbpwp0 +https://www.youtube.com/watch?v=np2aMq-duMA +https://www.youtube.com/watch?v=MsKvbsmxSEk +https://www.youtube.com/watch?v=xOOUaiwdY98 +https://www.youtube.com/watch?v=gxJsp3I9PvQ +https://www.youtube.com/watch?v=cpFV2AxmEeY +https://www.youtube.com/watch?v=42mSq6e5ns0 +https://www.youtube.com/watch?v=ZcMv4sje3Vw +https://www.youtube.com/watch?v=tNTzPVJoMKQ +https://www.youtube.com/watch?v=NQRZXINtEhs +https://www.youtube.com/watch?v=aTG1pNOSYro +https://www.youtube.com/watch?v=ZoTtMmX1oz8 +https://www.youtube.com/watch?v=ulUenhoi__M +https://www.youtube.com/watch?v=tT-3k4barTQ +https://www.youtube.com/watch?v=QtMoPqXYXDk +https://www.youtube.com/watch?v=HEftQMgt4rg +https://www.youtube.com/watch?v=b4r4XexQLrM +https://www.youtube.com/watch?v=1yFwBLcBFRQ +https://www.youtube.com/watch?v=WKHlvJ6x1LA +https://www.youtube.com/watch?v=xSOIjsEekWA +https://www.youtube.com/watch?v=62akyr7rzxI +https://www.youtube.com/watch?v=XIIJpCoCm4Q +https://www.youtube.com/watch?v=BbtWZWOoACk +https://www.youtube.com/watch?v=ijyJWAgGWG0 +https://www.youtube.com/watch?v=ACHMYMusnKo +https://www.youtube.com/watch?v=trsCBMyuyLI +https://www.youtube.com/watch?v=iSaF1n0cbuQ +https://www.youtube.com/watch?v=10j3GH59eL4 +https://www.youtube.com/watch?v=mIwhMVo7GJs +https://www.youtube.com/watch?v=1cB4HhI47Jg +https://www.youtube.com/watch?v=H94hOHN2rVw +https://www.youtube.com/watch?v=rGnMrpcgUjE +https://www.youtube.com/watch?v=Tg15phZM9MA +https://www.youtube.com/watch?v=ayPZx_IUoos +https://www.youtube.com/watch?v=hKq0g55QaM4 +https://www.youtube.com/watch?v=NrAW-afOBqM +https://www.youtube.com/watch?v=kQa5hKggcjw +https://www.youtube.com/watch?v=yEymLHO3CQ4 +https://www.youtube.com/watch?v=0NsTlre-PPA +https://www.youtube.com/watch?v=mELSxoR-zCU +https://www.youtube.com/watch?v=yEVXuFCUjXw +https://www.youtube.com/watch?v=hMFcuOFDCcg +https://www.youtube.com/watch?v=6MeAaGtWp9s +https://www.youtube.com/watch?v=jKvNdMDukcc +https://www.youtube.com/watch?v=8KS0CHgvI1A +https://www.youtube.com/watch?v=AKvX7ah_hOw +https://www.youtube.com/watch?v=GuLbIe2cF2w +https://www.youtube.com/watch?v=sY-zWrNqkOE +https://www.youtube.com/watch?v=3iC097rvS_o +https://www.youtube.com/watch?v=wGZtL-gaazM +https://www.youtube.com/watch?v=Er1FX6IMfqQ +https://www.youtube.com/watch?v=1jvJ3DMJAlg +https://www.youtube.com/watch?v=c85Fh_WDU3A +https://www.youtube.com/watch?v=wtiG7C87QX4 +https://www.youtube.com/watch?v=eACzH5r_Ma8 +https://www.youtube.com/watch?v=9ypHGzE6Di8 +https://www.youtube.com/watch?v=EvcvCsNF0-g +https://www.youtube.com/watch?v=zEp3EOVlRFE +https://www.youtube.com/watch?v=ZMVgFtRVSuQ +https://www.youtube.com/watch?v=YELUbjJS280 +https://www.youtube.com/watch?v=ViNvarsfuNQ +https://www.youtube.com/watch?v=bITtNQSvWfc +https://www.youtube.com/watch?v=bg0YLrDhXgQ +https://www.youtube.com/watch?v=TF2weikuHEo +https://www.youtube.com/watch?v=Lw55m9XNSaQ +https://www.youtube.com/watch?v=NNCTs-K7U38 +https://www.youtube.com/watch?v=lgLixSq9wS4 +https://www.youtube.com/watch?v=2ZMLHS7l5NU +https://www.youtube.com/watch?v=TVfRO7hn3bs +https://www.youtube.com/watch?v=wByimVu-hFs +https://www.youtube.com/watch?v=amk_ol9sb3M +https://www.youtube.com/watch?v=S6QvzexdgfY +https://www.youtube.com/watch?v=yFvRdCOe_Ss +https://www.youtube.com/watch?v=ghvU3NQvb-4 +https://www.youtube.com/watch?v=-R5HMIcBxNo +https://www.youtube.com/watch?v=xksdvTH0fA4 +https://www.youtube.com/watch?v=VwlX1fGTOio +https://www.youtube.com/watch?v=luTcIoSJooo +https://www.youtube.com/watch?v=zyQoz35pRN4 +https://www.youtube.com/watch?v=1ijOjx54_8k +https://www.youtube.com/watch?v=Q57suljQVtE +https://www.youtube.com/watch?v=f6Wpgyakg4Q +https://www.youtube.com/watch?v=SmZwenV25hI +https://www.youtube.com/watch?v=438S8whO7sM +https://www.youtube.com/watch?v=GJwGamIG_2o +https://www.youtube.com/watch?v=RBEjeQf3eUA +https://www.youtube.com/watch?v=0Bm0VrVWTVM +https://www.youtube.com/watch?v=ELO3tyx76R0 +https://www.youtube.com/watch?v=2RjdVnvMtZk +https://www.youtube.com/watch?v=6zyz3lHLlh0 +https://www.youtube.com/watch?v=gAjmL2hgjVA +https://www.youtube.com/watch?v=UxD-eeezwz8 +https://www.youtube.com/watch?v=FQ1Qj5tiAfU +https://www.youtube.com/watch?v=ApE2rPgtQ04 +https://www.youtube.com/watch?v=wp-d1_jUCS8 +https://www.youtube.com/watch?v=6Y22VyY5h1A +https://www.youtube.com/watch?v=CQgucWUHzS8 +https://www.youtube.com/watch?v=5_7mObtXbvc +https://www.youtube.com/watch?v=xMAkXgaG1LY +https://www.youtube.com/watch?v=haNnYV72rKw +https://www.youtube.com/watch?v=DELqUJkPXPg +https://www.youtube.com/watch?v=pX7s8Xw5YCc +https://www.youtube.com/watch?v=9vr04dqyX98 +https://www.youtube.com/watch?v=dYLPqsSQpcU +https://www.youtube.com/watch?v=ljQZiwqYqi8 +https://www.youtube.com/watch?v=JASbtU-NIYE +https://www.youtube.com/watch?v=DrTj3YdT_S8 +https://www.youtube.com/watch?v=3E_M5GC5me0 +https://www.youtube.com/watch?v=Wz74VDYVpO4 +https://www.youtube.com/watch?v=BseyjmC39x8 +https://www.youtube.com/watch?v=IHaqsz_LDBE +https://www.youtube.com/watch?v=X9y2thI8n-g +https://www.youtube.com/watch?v=Tvt1-4bA0ZU +https://www.youtube.com/watch?v=PX-Z916sh_Q +https://www.youtube.com/watch?v=k0pCbTE11jE +https://www.youtube.com/watch?v=Rut5u78laS8 +https://www.youtube.com/watch?v=6e9y8HP9-Qs +https://www.youtube.com/watch?v=lpfomwG5Jb0 +https://www.youtube.com/watch?v=hJVfabvgg7g +https://www.youtube.com/watch?v=ot5N-kaB86g +https://www.youtube.com/watch?v=I8W2eJ6lMv8 +https://www.youtube.com/watch?v=iK489f6qZhw +https://www.youtube.com/watch?v=7m7GdAaDUJk +https://www.youtube.com/watch?v=b9-QhEhWCMg +https://www.youtube.com/watch?v=1NPHHtZobWA +https://www.youtube.com/watch?v=md4EimJIMxU +https://www.youtube.com/watch?v=0cxc5iVzavo +https://www.youtube.com/watch?v=EShwg_-8gBQ +https://www.youtube.com/watch?v=jBNU3d1APAk +https://www.youtube.com/watch?v=X5s3aQD2vTg +https://www.youtube.com/watch?v=pg4PFn1a3w4 +https://www.youtube.com/watch?v=j25u9KdduTI +https://www.youtube.com/watch?v=1G2a1FOdBX4 +https://www.youtube.com/watch?v=cnAz3Tz6KM0 +https://www.youtube.com/watch?v=x4RzM8MpYQs +https://www.youtube.com/watch?v=1zan33JDOaU +https://www.youtube.com/watch?v=e2qGGGcaNbE +https://www.youtube.com/watch?v=KxKh-ey1anM +https://www.youtube.com/watch?v=sY33ut-4q5U +https://www.youtube.com/watch?v=Yhy_9B-W1Bc +https://www.youtube.com/watch?v=HVjLcXoWdr0 +https://www.youtube.com/watch?v=EDk4aURqdt0 +https://www.youtube.com/watch?v=f69aszkNSrA +https://www.youtube.com/watch?v=ArP-iJnxr3g +https://www.youtube.com/watch?v=cSMlgnD9Uf4 +https://www.youtube.com/watch?v=VvpHCEq3ETg +https://www.youtube.com/watch?v=Uh3-23diDuQ +https://www.youtube.com/watch?v=0h5fjDk4Fxk +https://www.youtube.com/watch?v=w729MixxpsY +https://www.youtube.com/watch?v=2JQv7_ijvHs +https://www.youtube.com/watch?v=lmBbDkhNtfU +https://www.youtube.com/watch?v=HdCoCj7DNlM +https://www.youtube.com/watch?v=LikXRzpPYEw +https://www.youtube.com/watch?v=tU9heYibc_4 +https://www.youtube.com/watch?v=PXbkzMxmd_Q +https://www.youtube.com/watch?v=4Wrgvzh9oF8 +https://www.youtube.com/watch?v=jBY7nHRdFuY +https://www.youtube.com/watch?v=WFxITA-cPn0 +https://www.youtube.com/watch?v=iZXtblrH3E0 +https://www.youtube.com/watch?v=21n1QM1E5Tg +https://www.youtube.com/watch?v=ore2ZKBFVIE +https://www.youtube.com/watch?v=DJPjz4TM-r8 +https://www.youtube.com/watch?v=Uz13MyjVlI0 +https://www.youtube.com/watch?v=M734Drp7DEk +https://www.youtube.com/watch?v=nG_dAIdROnA +https://www.youtube.com/watch?v=5S5i0RcG4JU +https://www.youtube.com/watch?v=nhP6k9XeJj8 +https://www.youtube.com/watch?v=T00fMHYd4xg +https://www.youtube.com/watch?v=5btdrrWIPj8 +https://www.youtube.com/watch?v=-0Dy7ZB5Tp0 +https://www.youtube.com/watch?v=cbRqV5Nczs0 +https://www.youtube.com/watch?v=wnWfEALwfrw +https://www.youtube.com/watch?v=hrMmDB735d8 +https://www.youtube.com/watch?v=-T5viJt_NeY +https://www.youtube.com/watch?v=NbifCHxb1kU +https://www.youtube.com/watch?v=xUJKjeIknXY +https://www.youtube.com/watch?v=rGUN31cV2Hg +https://www.youtube.com/watch?v=2HRQDPQkntU +https://www.youtube.com/watch?v=QuidE5bynlg +https://www.youtube.com/watch?v=OzTDb4Vslkg +https://www.youtube.com/watch?v=u-t0Dm4Jx6s +https://www.youtube.com/watch?v=QQn7WjVq35M +https://www.youtube.com/watch?v=UcsqZ0r43xQ +https://www.youtube.com/watch?v=hcIdB-l3c_U +https://www.youtube.com/watch?v=4KF3dnURKaU +https://www.youtube.com/watch?v=km_2AcH-76A +https://www.youtube.com/watch?v=GG1lxGKvFZo +https://www.youtube.com/watch?v=4gM4ngPf-Ug +https://www.youtube.com/watch?v=CQrUmMTaCss +https://www.youtube.com/watch?v=fgkJpaPp6Ho +https://www.youtube.com/watch?v=Sa1h5lFB2oo +https://www.youtube.com/watch?v=JPxdXpn8pU8 +https://www.youtube.com/watch?v=OiDz8w9nSC8 +https://www.youtube.com/watch?v=Ka9PvuYAdm0 +https://www.youtube.com/watch?v=_qr5dg7jIN0 +https://www.youtube.com/watch?v=_PYpZwH1Goo +https://www.youtube.com/watch?v=lk9E49BqUkQ +https://www.youtube.com/watch?v=rcreLiAZGL0 +https://www.youtube.com/watch?v=ieic-zav9Fk +https://www.youtube.com/watch?v=CwCpNXBF6js +https://www.youtube.com/watch?v=LlvC2Kj2pFo +https://www.youtube.com/watch?v=prErUmVPO3A +https://www.youtube.com/watch?v=StNr4Qo5QxI +https://www.youtube.com/watch?v=DwXPj__Wm5E +https://www.youtube.com/watch?v=z3tA2nrhIuk +https://www.youtube.com/watch?v=oKGM6yhysMw +https://www.youtube.com/watch?v=bXNjW_I_1Qo +https://www.youtube.com/watch?v=LPmoYOBnVR0 +https://www.youtube.com/watch?v=GyI9lJELbEk +https://www.youtube.com/watch?v=_C6t5mf4lbo +https://www.youtube.com/watch?v=OiGxqjZfbJc +https://www.youtube.com/watch?v=KCPW6EXa8-o +https://www.youtube.com/watch?v=W8yWWK0C8yg +https://www.youtube.com/watch?v=_obpK8FSh0M +https://www.youtube.com/watch?v=IChe3vDfRiI +https://www.youtube.com/watch?v=Bl_ph6AMXz8 +https://www.youtube.com/watch?v=xReRVPK97SE +https://www.youtube.com/watch?v=w3UZJ21mpS8 +https://www.youtube.com/watch?v=50ilwSLjqPQ +https://www.youtube.com/watch?v=k1gJ787wdR4 +https://www.youtube.com/watch?v=6onGbYzhrks +https://www.youtube.com/watch?v=JzdOP-4lSAM +https://www.youtube.com/watch?v=25ey_nTjFXM +https://www.youtube.com/watch?v=JHwghzfAkNM +https://www.youtube.com/watch?v=c2N-wMntv7o +https://www.youtube.com/watch?v=wvTkHp8yWQA +https://www.youtube.com/watch?v=ekx12gwN35o +https://www.youtube.com/watch?v=3Dmwk7vH5aE +https://www.youtube.com/watch?v=37oU7XZqHKQ +https://www.youtube.com/watch?v=p7cRbQwQLIU +https://www.youtube.com/watch?v=O5WZy3lgUwk +https://www.youtube.com/watch?v=xwQ7heyQDU0 +https://www.youtube.com/watch?v=Ioc2DzR36eg +https://www.youtube.com/watch?v=_Ws5CLQAZiY +https://www.youtube.com/watch?v=0eWGo4d061o +https://www.youtube.com/watch?v=w0gwOfOspWM +https://www.youtube.com/watch?v=kuBIKagXlD0 +https://www.youtube.com/watch?v=MxUVYfjSKUo +https://www.youtube.com/watch?v=Gm2rAs40jCU +https://www.youtube.com/watch?v=5_jbqEeWdqY +https://www.youtube.com/watch?v=_vCLPKftFsk +https://www.youtube.com/watch?v=sLzyP0g3Tz0 +https://www.youtube.com/watch?v=6_ALpSHwsyU +https://www.youtube.com/watch?v=iyChl-zsg8I +https://www.youtube.com/watch?v=n-tgxts1qTQ +https://www.youtube.com/watch?v=xwIoQ7aHASA +https://www.youtube.com/watch?v=kWDWFGZcPn0 +https://www.youtube.com/watch?v=Z3WZ8IYnx6o +https://www.youtube.com/watch?v=6grKBi186q0 +https://www.youtube.com/watch?v=yzmSXl428lo +https://www.youtube.com/watch?v=-7aDUxmsbho +https://www.youtube.com/watch?v=2E15vQEUh3Y +https://www.youtube.com/watch?v=-gTJpdOSKdE +https://www.youtube.com/watch?v=1BgHKfpGqxQ +https://www.youtube.com/watch?v=CGG8-6y82Dc +https://www.youtube.com/watch?v=OYWFQagB5SA +https://www.youtube.com/watch?v=v2ejcHqbB9M +https://www.youtube.com/watch?v=Ui8eW_bQI-c +https://www.youtube.com/watch?v=Df43IR-Y2pg +https://www.youtube.com/watch?v=8SxFtbjJLIY +https://www.youtube.com/watch?v=_CzzsdbwVvU +https://www.youtube.com/watch?v=1zQ_pVzAWmQ +https://www.youtube.com/watch?v=Zx7l88BnZq4 +https://www.youtube.com/watch?v=8D7cgnCRg9M +https://www.youtube.com/watch?v=1mmOlk_6KiY +https://www.youtube.com/watch?v=f9yuepxqoI8 +https://www.youtube.com/watch?v=WzwdRsbyrsE +https://www.youtube.com/watch?v=O0PK3YdZ6Gs +https://www.youtube.com/watch?v=y5sBj8J1zXE +https://www.youtube.com/watch?v=Erg0E8MkI8g +https://www.youtube.com/watch?v=V2XpuzU9qKc +https://www.youtube.com/watch?v=iO6Td9WZl8Q +https://www.youtube.com/watch?v=Ve6hXGghGDU +https://www.youtube.com/watch?v=XQkWto6o-zE +https://www.youtube.com/watch?v=jU7HHOjHIHI +https://www.youtube.com/watch?v=y8U0G8Yp5As +https://www.youtube.com/watch?v=hK3dOOeJYeQ +https://www.youtube.com/watch?v=3XwUV_IIeAY +https://www.youtube.com/watch?v=-H7oKDmsJBA +https://www.youtube.com/watch?v=ax2sbkIwsbs +https://www.youtube.com/watch?v=emBuYmGX9pA +https://www.youtube.com/watch?v=bYnSsdt-EwQ +https://www.youtube.com/watch?v=xWH-3s6ae6g +https://www.youtube.com/watch?v=bGwSw06nHlI +https://www.youtube.com/watch?v=XzfATljHtZA +https://www.youtube.com/watch?v=vHEpEVrULj8 +https://www.youtube.com/watch?v=Vw9VQqB9nZY +https://www.youtube.com/watch?v=Zo8DB-WiT8o +https://www.youtube.com/watch?v=118Qmc4PW94 +https://www.youtube.com/watch?v=mqjvTCW28wA +https://www.youtube.com/watch?v=COOUsA8sgzw +https://www.youtube.com/watch?v=nJjZWvoIXno +https://www.youtube.com/watch?v=Un-iP21XLcY +https://www.youtube.com/watch?v=ndqEvSH28sE +https://www.youtube.com/watch?v=ROTsUIJFFAI +https://www.youtube.com/watch?v=sjtU9ZJ1kl4 +https://www.youtube.com/watch?v=-l6aB5-5IGo +https://www.youtube.com/watch?v=B2zGJdhw7Qk +https://www.youtube.com/watch?v=Hq-agpSNVvk +https://www.youtube.com/watch?v=9Kmah0OdmfQ +https://www.youtube.com/watch?v=G3pd86ahuIk +https://www.youtube.com/watch?v=Z4zFfpUWFjc +https://www.youtube.com/watch?v=uCXKbn0_LYU +https://www.youtube.com/watch?v=Mm4CsHQ7jEY +https://www.youtube.com/watch?v=gzDj9vQhM3U +https://www.youtube.com/watch?v=nYBMPcWh6io +https://www.youtube.com/watch?v=sTIi-NkM_4o +https://www.youtube.com/watch?v=Mid_00T8OzY +https://www.youtube.com/watch?v=O74uCOmq-5w +https://www.youtube.com/watch?v=5czh6hr5ZCU +https://www.youtube.com/watch?v=Seu6J2umwKg +https://www.youtube.com/watch?v=aYtahgqJzGM +https://www.youtube.com/watch?v=hOGbqy4YQbc +https://www.youtube.com/watch?v=5hBzDL7E9yk +https://www.youtube.com/watch?v=cOY9GMP_fyA +https://www.youtube.com/watch?v=S7pF2ggDLM4 +https://www.youtube.com/watch?v=eTDWGdCwEsU +https://www.youtube.com/watch?v=9CyB887wkHs +https://www.youtube.com/watch?v=PnKwZK96xOQ +https://www.youtube.com/watch?v=1bnsQ6waGm8 +https://www.youtube.com/watch?v=ezJJzX7F57E +https://www.youtube.com/watch?v=abgJBju9UhE +https://www.youtube.com/watch?v=Gb_CTWcoscs +https://www.youtube.com/watch?v=XK70iPIeAnY +https://www.youtube.com/watch?v=bpROcbyQOdc +https://www.youtube.com/watch?v=Pvyi1ldhlVQ +https://www.youtube.com/watch?v=a8ABcZWicB0 +https://www.youtube.com/watch?v=STXjofgjHMo +https://www.youtube.com/watch?v=yKUAqlCUFx4 +https://www.youtube.com/watch?v=aE3IkzploxM +https://www.youtube.com/watch?v=0BNLKVNMeuo +https://www.youtube.com/watch?v=HcoKqF60cO8 +https://www.youtube.com/watch?v=kj7UFFcXVlQ +https://www.youtube.com/watch?v=E30v2guQPJg +https://www.youtube.com/watch?v=_L01csO4Nek +https://www.youtube.com/watch?v=p3uH5LA0IdM +https://www.youtube.com/watch?v=cEnSOZhGdfo +https://www.youtube.com/watch?v=P97y46gLFOk +https://www.youtube.com/watch?v=iayw8uf6DM8 +https://www.youtube.com/watch?v=hrUZrC6OplE +https://www.youtube.com/watch?v=F36GPTHUyXU +https://www.youtube.com/watch?v=QPc0595_s28 +https://www.youtube.com/watch?v=kl9hYdYQy0g +https://www.youtube.com/watch?v=_BucBOfiyLg +https://www.youtube.com/watch?v=PWwNGu-AaqA +https://www.youtube.com/watch?v=HQhgyMKvBSY +https://www.youtube.com/watch?v=VNCQU3dRY64 +https://www.youtube.com/watch?v=bG4ByNMW5ds +https://www.youtube.com/watch?v=L8tcS2e3rfk +https://www.youtube.com/watch?v=g39DLsLdXTE +https://www.youtube.com/watch?v=4d4aeRHTdTo +https://www.youtube.com/watch?v=RgdhZCq19ZQ +https://www.youtube.com/watch?v=I9NHi6EmkTk +https://www.youtube.com/watch?v=6CcpmLOWyMk +https://www.youtube.com/watch?v=IB7E41G2CtI +https://www.youtube.com/watch?v=6O-Aef1Gn4c +https://www.youtube.com/watch?v=uxfL1LRpbW4 +https://www.youtube.com/watch?v=FCpcyBHurFw +https://www.youtube.com/watch?v=CygnT11F_ZI +https://www.youtube.com/watch?v=cHVGidgy71o +https://www.youtube.com/watch?v=bGtQwp5ixTA +https://www.youtube.com/watch?v=voeKD_enQTo +https://www.youtube.com/watch?v=G05pwijaK3A +https://www.youtube.com/watch?v=B44UzfY3Xsc +https://www.youtube.com/watch?v=p8E-1M3hZSo +https://www.youtube.com/watch?v=pxWm1Pfzy1w +https://www.youtube.com/watch?v=PWN2vaiAdrE +https://www.youtube.com/watch?v=TRapAZa9UgQ +https://www.youtube.com/watch?v=JaopWs4FnpU +https://www.youtube.com/watch?v=Bm1xne0yK08 +https://www.youtube.com/watch?v=UrbDu6--eyY +https://www.youtube.com/watch?v=0uxmUb8_bYQ +https://www.youtube.com/watch?v=xEPT6rceiaE +https://www.youtube.com/watch?v=OcWYreMBLHE +https://www.youtube.com/watch?v=74Hh1nJJRXs +https://www.youtube.com/watch?v=kxH_bu7oWEQ +https://www.youtube.com/watch?v=xLZQHETWRCM +https://www.youtube.com/watch?v=QLNurv0bgDs +https://www.youtube.com/watch?v=Xa_JupHC-BY +https://www.youtube.com/watch?v=5AdEUJ_bA-w +https://www.youtube.com/watch?v=CumOhS7DldM +https://www.youtube.com/watch?v=w4rRYaRB5T0 +https://www.youtube.com/watch?v=FjvPtUvZZRE +https://www.youtube.com/watch?v=iII9kszf9-E +https://www.youtube.com/watch?v=7hyi0F6EEGg +https://www.youtube.com/watch?v=ilQMJ-kwMAU +https://www.youtube.com/watch?v=SJOP-f5pvlY +https://www.youtube.com/watch?v=LhBc8ElIf_Y +https://www.youtube.com/watch?v=w_koXhVD1uc +https://www.youtube.com/watch?v=HCoR_bmy-lA +https://www.youtube.com/watch?v=vKPezUzvTjg +https://www.youtube.com/watch?v=Gy3teXRZc3M +https://www.youtube.com/watch?v=4FqSKCGo_yQ +https://www.youtube.com/watch?v=hoY7RZV1W4Y +https://www.youtube.com/watch?v=vKyKEcq44uw +https://www.youtube.com/watch?v=g0LBa1CxhDc +https://www.youtube.com/watch?v=4Je1Q5SioSQ +https://www.youtube.com/watch?v=141sUnI0Z8o +https://www.youtube.com/watch?v=RssoSCiTvcQ +https://www.youtube.com/watch?v=gNmiJWksHV0 +https://www.youtube.com/watch?v=-sht8xDsM_4 +https://www.youtube.com/watch?v=q9npqzOrkXQ +https://www.youtube.com/watch?v=0e1tKLUdWc0 +https://www.youtube.com/watch?v=FWa3LA5diUA +https://www.youtube.com/watch?v=iANrNIqlfEU +https://www.youtube.com/watch?v=HoQgL7JmzYE +https://www.youtube.com/watch?v=m4xFa51_qTw +https://www.youtube.com/watch?v=JEtPhrfEZTc +https://www.youtube.com/watch?v=GV6PNirTB5Q +https://www.youtube.com/watch?v=ymOwuN4Icbw +https://www.youtube.com/watch?v=z-PZegRllLE +https://www.youtube.com/watch?v=_FmUv2AX36Q +https://www.youtube.com/watch?v=NytoPxQXGFk +https://www.youtube.com/watch?v=yX05hYFyiBY +https://www.youtube.com/watch?v=JcdVC9wJX9g +https://www.youtube.com/watch?v=Zm1o6Uvqt6w +https://www.youtube.com/watch?v=1_3XNdOEHB4 +https://www.youtube.com/watch?v=iERK93l5S4U +https://www.youtube.com/watch?v=bzQGeM-Adpk +https://www.youtube.com/watch?v=hEPeQWP9gq8 +https://www.youtube.com/watch?v=kdxXsrO-_2o +https://www.youtube.com/watch?v=O0kH3wOwfyM +https://www.youtube.com/watch?v=7MT3LwhuYjo +https://www.youtube.com/watch?v=3rrT4hwjRiE +https://www.youtube.com/watch?v=h1Zx3W0OtAk +https://www.youtube.com/watch?v=Nor0KPVPImQ +https://www.youtube.com/watch?v=_eWaSkmUP-Q +https://www.youtube.com/watch?v=RYF5UYJC6Mk +https://www.youtube.com/watch?v=OUgecZ8n-dk +https://www.youtube.com/watch?v=PD-okljVoz8 +https://www.youtube.com/watch?v=t1lDjE6zGR8 +https://www.youtube.com/watch?v=QRcFSOOIR04 +https://www.youtube.com/watch?v=W3E5IOtsz68 +https://www.youtube.com/watch?v=qZlW5AeLKaA +https://www.youtube.com/watch?v=A8wb1LtJzbA +https://www.youtube.com/watch?v=-83bTbd6Vb4 +https://www.youtube.com/watch?v=gaZ6nCFyT-E +https://www.youtube.com/watch?v=JCmlbmA9seQ +https://www.youtube.com/watch?v=66zl23CVyBE +https://www.youtube.com/watch?v=enjb-u5GS0E +https://www.youtube.com/watch?v=zQ7DZ_ZKLQ0 +https://www.youtube.com/watch?v=cltTMwuk-Y0 +https://www.youtube.com/watch?v=od41NVjN6Uc +https://www.youtube.com/watch?v=6XVgwxF8bU8 +https://www.youtube.com/watch?v=KIAv3ZQ1gks +https://www.youtube.com/watch?v=4yzSoM9ZJoc +https://www.youtube.com/watch?v=mKM_Hve4PSM +https://www.youtube.com/watch?v=EabCNrEsgXY +https://www.youtube.com/watch?v=ObwEO_jK9_g +https://www.youtube.com/watch?v=Y19eeNT0hNQ +https://www.youtube.com/watch?v=OBvGnwg4WeY +https://www.youtube.com/watch?v=blwClcLpTZA +https://www.youtube.com/watch?v=e5FHL3Gl56k +https://www.youtube.com/watch?v=om0sYjy7eT8 +https://www.youtube.com/watch?v=GG1uIMTZA30 +https://www.youtube.com/watch?v=bW5lxEe9Qqg +https://www.youtube.com/watch?v=cbwxE8eZBhw +https://www.youtube.com/watch?v=kMzNX0j4NO8 +https://www.youtube.com/watch?v=q5XBM4-OVJg +https://www.youtube.com/watch?v=Ip67Pcwm-8c +https://www.youtube.com/watch?v=ietAfH6O3IE +https://www.youtube.com/watch?v=0CBUwyVhssQ +https://www.youtube.com/watch?v=WocIrnJHCks +https://www.youtube.com/watch?v=Vu2sP1rBSuQ +https://www.youtube.com/watch?v=ypxZjDVLPd8 +https://www.youtube.com/watch?v=v1O8jVvuDZE +https://www.youtube.com/watch?v=0gVYLElHyuU +https://www.youtube.com/watch?v=efx7G2vGiWc +https://www.youtube.com/watch?v=i907BKtWzKM +https://www.youtube.com/watch?v=Bru4dK_5cJk +https://www.youtube.com/watch?v=JSNrp0VfFxM +https://www.youtube.com/watch?v=cKvtjYtK_Zs +https://www.youtube.com/watch?v=xkWrdzoqOHc +https://www.youtube.com/watch?v=gU8Q4qhtWT8 +https://www.youtube.com/watch?v=uFOs71VYSXQ +https://www.youtube.com/watch?v=9kb7VxErS64 +https://www.youtube.com/watch?v=jzmHWb1uKFY +https://www.youtube.com/watch?v=g6ZEep0YEe8 +https://www.youtube.com/watch?v=ARKY-HjGuio +https://www.youtube.com/watch?v=0Yr6CwKNorQ +https://www.youtube.com/watch?v=B0tA10cAXZw +https://www.youtube.com/watch?v=WsGUy4_LiEU +https://www.youtube.com/watch?v=-ndIAbqBYgk +https://www.youtube.com/watch?v=QbKhTZKEarU +https://www.youtube.com/watch?v=HOuePkn2qeI +https://www.youtube.com/watch?v=rDajxgZA5NU +https://www.youtube.com/watch?v=_0aMs9sWoeQ +https://www.youtube.com/watch?v=fPHFbYqK7kc +https://www.youtube.com/watch?v=2_wU4yl4LAY +https://www.youtube.com/watch?v=4xuBM4deE6g +https://www.youtube.com/watch?v=LmYgj8A2Tdk +https://www.youtube.com/watch?v=1WzMTIcIsJo +https://www.youtube.com/watch?v=3qCYB7CVewo +https://www.youtube.com/watch?v=GaflSBOX4Bw +https://www.youtube.com/watch?v=WzzoHmeVfEg +https://www.youtube.com/watch?v=ggY8ruNAJaM +https://www.youtube.com/watch?v=8JpXJQN3Q4U +https://www.youtube.com/watch?v=zahEfgHltAQ +https://www.youtube.com/watch?v=PidO06KgJgM +https://www.youtube.com/watch?v=ahkrZU7dbwg +https://www.youtube.com/watch?v=_6Uf0Wef5lk +https://www.youtube.com/watch?v=NtakSrWF8qw +https://www.youtube.com/watch?v=KPB550JDKvs +https://www.youtube.com/watch?v=a9b8E1cFAcg +https://www.youtube.com/watch?v=lVlxJHf9Uz0 +https://www.youtube.com/watch?v=3wB7hOa6pTI +https://www.youtube.com/watch?v=4rT8sKSoHYg +https://www.youtube.com/watch?v=315qa9cu8NM +https://www.youtube.com/watch?v=eXInviPnnZA +https://www.youtube.com/watch?v=hiis-ugAa6Y +https://www.youtube.com/watch?v=vZy7LUVqK4I +https://www.youtube.com/watch?v=_Y8mWMbYcKk +https://www.youtube.com/watch?v=bIZrrGvkcaE +https://www.youtube.com/watch?v=kvgZc-q7K08 +https://www.youtube.com/watch?v=4uiqIjIzJqg +https://www.youtube.com/watch?v=g2P3KlzZ_bc +https://www.youtube.com/watch?v=i6c47ojZ1gU +https://www.youtube.com/watch?v=J-WVFLD5z4E +https://www.youtube.com/watch?v=ViKKvVgHQro +https://www.youtube.com/watch?v=n-QbtsYb3ao +https://www.youtube.com/watch?v=4buYFi4RHXM +https://www.youtube.com/watch?v=h_-2AKl9mEU +https://www.youtube.com/watch?v=RKirt5pR5s4 +https://www.youtube.com/watch?v=vQQDv11dLZo +https://www.youtube.com/watch?v=pw-v-Af0Zt4 +https://www.youtube.com/watch?v=yyAUCuj_rfU +https://www.youtube.com/watch?v=5FSqDMjwFLQ +https://www.youtube.com/watch?v=J3m8gQKj9ls +https://www.youtube.com/watch?v=FiYgnqVWeD0 +https://www.youtube.com/watch?v=35M5N22WEAw +https://www.youtube.com/watch?v=BrKHrNWU7fw +https://www.youtube.com/watch?v=CEVUU_s8Pk8 +https://www.youtube.com/watch?v=p2l0QYUNsLw +https://www.youtube.com/watch?v=hGbyVDtuKlU +https://www.youtube.com/watch?v=5iPFMlxPSTc +https://www.youtube.com/watch?v=GVlVCSWeJL4 +https://www.youtube.com/watch?v=WdVYt8PL0Po +https://www.youtube.com/watch?v=p2P_A9TqH78 +https://www.youtube.com/watch?v=LQ-Kt4arMu8 +https://www.youtube.com/watch?v=0ygsfbMtrZA +https://www.youtube.com/watch?v=5hQEI4jGEao +https://www.youtube.com/watch?v=0HG6LF7hsPk +https://www.youtube.com/watch?v=JqR_R4EvsNs +https://www.youtube.com/watch?v=YTS9r3aQ2Rw +https://www.youtube.com/watch?v=UDfjPR3XxGI +https://www.youtube.com/watch?v=eJhUqThVeTU +https://www.youtube.com/watch?v=eSFea0F4pM4 +https://www.youtube.com/watch?v=Iumi423BMsY +https://www.youtube.com/watch?v=ix_lu8DoqVM +https://www.youtube.com/watch?v=YQMsHKAftA8 +https://www.youtube.com/watch?v=YvdY-vk_qXo +https://www.youtube.com/watch?v=v5S1NeyK4zo +https://www.youtube.com/watch?v=T6eYlq568q8 +https://www.youtube.com/watch?v=LHncOi0gLVo +https://www.youtube.com/watch?v=JzNhRNPs-zs +https://www.youtube.com/watch?v=fh1cW1xt6Hs +https://www.youtube.com/watch?v=96pUYEFNtbw +https://www.youtube.com/watch?v=3iav7GPapME +https://www.youtube.com/watch?v=ifeg0nKnYAc +https://www.youtube.com/watch?v=TSOGNwPdJC0 +https://www.youtube.com/watch?v=Vdb-LAifVgw +https://www.youtube.com/watch?v=N8MzHelGeZA +https://www.youtube.com/watch?v=8lDLi6KL3NE +https://www.youtube.com/watch?v=AzesbB6B-Pw +https://www.youtube.com/watch?v=rCsByru8q80 +https://www.youtube.com/watch?v=KFCIJ6HAefo +https://www.youtube.com/watch?v=gZm2T-9vQgA +https://www.youtube.com/watch?v=urdmi5PF9tk +https://www.youtube.com/watch?v=uwdnq5BHelM +https://www.youtube.com/watch?v=Npojrebk8K4 +https://www.youtube.com/watch?v=hF8nxFrWEBM +https://www.youtube.com/watch?v=8ZP8Tmej3qI +https://www.youtube.com/watch?v=5LT6yyfblKU +https://www.youtube.com/watch?v=rwQdepyLhIc +https://www.youtube.com/watch?v=dJf0WhYGC-A +https://www.youtube.com/watch?v=LEADj_2kk5M +https://www.youtube.com/watch?v=rqklugKUZf0 +https://www.youtube.com/watch?v=toYKzDsIlM0 +https://www.youtube.com/watch?v=u8DoguzNFlE +https://www.youtube.com/watch?v=6A14Z3bVKxk +https://www.youtube.com/watch?v=Hx6V61dT9-c +https://www.youtube.com/watch?v=WbkkdqZtHhw +https://www.youtube.com/watch?v=FTTp__BIL6c +https://www.youtube.com/watch?v=2NIPuIbmeBg +https://www.youtube.com/watch?v=63Q5WLMF0lU +https://www.youtube.com/watch?v=KioksPhg_78 +https://www.youtube.com/watch?v=zMJ27qdfGAI +https://www.youtube.com/watch?v=q9biOLIba28 +https://www.youtube.com/watch?v=7RPWlQI1HFY +https://www.youtube.com/watch?v=Z2fPu9NX3DE +https://www.youtube.com/watch?v=_H3X_k7z7Iw +https://www.youtube.com/watch?v=0YPBfRGXejQ +https://www.youtube.com/watch?v=xUVwAIJu40g +https://www.youtube.com/watch?v=50GV67qKcSM +https://www.youtube.com/watch?v=DuVy41rot60 +https://www.youtube.com/watch?v=4GXF7gItY6g +https://www.youtube.com/watch?v=mNuPUraHMMM +https://www.youtube.com/watch?v=OE5R-dxhktY +https://www.youtube.com/watch?v=wO52Mj2dOvk +https://www.youtube.com/watch?v=T10wxcDWchE +https://www.youtube.com/watch?v=qh9FHZ1-ihg +https://www.youtube.com/watch?v=n5R7te2NUDo +https://www.youtube.com/watch?v=xMK-jrM9KKM +https://www.youtube.com/watch?v=iQsw6tnDWUw +https://www.youtube.com/watch?v=QzGwqKSJp1Q +https://www.youtube.com/watch?v=2aTk7l-SBjc +https://www.youtube.com/watch?v=pF3fZ9Uv-hQ +https://www.youtube.com/watch?v=XZeKA5WRGkY +https://www.youtube.com/watch?v=kLsZ4t2a6Ts +https://www.youtube.com/watch?v=Zw8SxU02ZIk +https://www.youtube.com/watch?v=OplKfLEIq6w +https://www.youtube.com/watch?v=cXyk40-MWZA +https://www.youtube.com/watch?v=wlMw3dhuicc +https://www.youtube.com/watch?v=wFyVmtInX04 diff --git a/ansible/group_vars/all/vault.yml b/ansible/group_vars/all/vault.yml index 5de67e6..6845281 100644 --- a/ansible/group_vars/all/vault.yml +++ b/ansible/group_vars/all/vault.yml @@ -8,3 +8,8 @@ vault_ss_password_2: "tgtQcfjJp/A3F01g4woO0bEQoxij3CAOK/iR1OTPuF4=" vault_dockerhub_password: "dckr_pat_DmFFqwFEdXFvZlgngGY9ooBaq6o" vault_s3_access_key_id: "admin" vault_s3_secret_access_key: "0153093693-0009" +vault_s3_delivery_access_key_id: "4d33e37e87c945718478e8003f6e93fb" +vault_s3_delivery_secret_access_key: "33b155c5d2ea4fccb0faeeefb420d7ac" +vault_s3_delivery_endpoint: "https://s3.rusonyxcloud.ru" +vault_s3_delivery_bucket: "videos" +vault_s3_delivery_aws_region: "ru-msk" diff --git a/ansible/playbook-depricated.dl.yml b/ansible/playbook-depricated.dl.yml index 107973e..94bf8dd 100644 --- a/ansible/playbook-depricated.dl.yml +++ b/ansible/playbook-depricated.dl.yml @@ -2,8 +2,8 @@ - name: Deploy Airflow DL Worker Stack hosts: airflow_workers vars_files: - - group_vars/all.yml - - group_vars/all/vault.yml + - "{{ inventory_dir }}/group_vars/all/vault.yml" + - "{{ inventory_dir }}/group_vars/all/generated_vars.yml" pre_tasks: - name: Announce fast deploy mode if enabled debug: @@ -17,13 +17,17 @@ path: "{{ airflow_worker_dir }}" state: directory owner: "{{ ansible_user }}" - group: "{{ ansible_user }}" + group: "{{ deploy_group }}" + mode: '0755' + become: yes - - name: Template .env.worker + - name: Template .env file for worker template: - src: templates/.env.worker.j2 + src: templates/.env.j2 dest: "{{ airflow_worker_dir }}/.env" mode: '0600' + vars: + service_role: "worker" - name: Template docker-compose file for Airflow worker template: @@ -31,6 +35,34 @@ dest: "{{ airflow_worker_dir }}/configs/docker-compose-dl.yaml" mode: '0644' + - name: Ensure configs directory exists for config generator + file: + path: "{{ airflow_worker_dir }}/configs" + state: directory + owner: "{{ ansible_user }}" + group: "{{ deploy_group }}" + mode: '0755' + become: yes + + - name: Sync config generator script + ansible.posix.synchronize: + src: ../airflow/generate_envoy_config.py + dest: "{{ airflow_worker_dir }}/" + archive: yes + rsync_path: "sudo rsync" + + - name: Sync config generator templates + ansible.posix.synchronize: + src: ../airflow/configs/{{ item }} + dest: "{{ airflow_worker_dir }}/configs/" + archive: yes + rsync_path: "sudo rsync" + loop: + - docker-compose.config-generate.yaml + - envoy.yaml.j2 + - docker-compose.camoufox.yaml.j2 + - docker-compose-ytdlp-ops.yaml.j2 + - name: Build Airflow worker image from local Dockerfile community.docker.docker_image: name: "{{ airflow_image_name }}" @@ -50,7 +82,7 @@ - name: Generate dynamic configs (camoufox + envoy) shell: - cmd: "docker compose -f configs/docker-compose.config-generate.yaml run --rm config-generator" + cmd: "docker compose --project-directory . -f configs/docker-compose.config-generate.yaml run --rm config-generator" chdir: "{{ airflow_worker_dir }}" - name: Start worker services @@ -59,6 +91,7 @@ files: - configs/docker-compose-dl.yaml - configs/docker-compose-ytdlp-ops.yaml + - configs/docker-compose.camoufox.yaml state: present remove_orphans: true pull: "{{ 'never' if fast_deploy | default(false) else 'missing' }}" diff --git a/ansible/playbook-dl.yml b/ansible/playbook-dl.yml index 9541c4a..1a81ebf 100644 --- a/ansible/playbook-dl.yml +++ b/ansible/playbook-dl.yml @@ -2,14 +2,30 @@ - name: Deploy Airflow DL Worker Stack hosts: airflow_workers vars_files: - - group_vars/all.yml - - group_vars/all/vault.yml + - "{{ inventory_dir }}/group_vars/all/vault.yml" + - "{{ inventory_dir }}/group_vars/all/generated_vars.yml" pre_tasks: - name: Announce fast deploy mode if enabled debug: msg: "🚀 FAST DEPLOY MODE ENABLED: Skipping Docker image builds and pulls. 🚀" when: fast_deploy | default(false) run_once: true + + - name: Install python3-pip + ansible.builtin.apt: + name: python3-pip + state: present + become: yes + + - name: Install required python packages for ytops-client on host + ansible.builtin.pip: + name: + - thrift + - aria2p + - PyYAML + state: present + extra_args: --break-system-packages + become: yes tasks: - name: Ensure worker directory exists @@ -17,13 +33,17 @@ path: "{{ airflow_worker_dir }}" state: directory owner: "{{ ansible_user }}" - group: "{{ ansible_user }}" + group: "{{ deploy_group }}" + mode: '0755' + become: yes - - name: Template .env.worker + - name: Template .env file for worker template: - src: templates/.env.worker.j2 + src: templates/.env.j2 dest: "{{ airflow_worker_dir }}/.env" mode: '0600' + vars: + service_role: "worker" - name: Template docker-compose file for Airflow worker template: @@ -31,6 +51,34 @@ dest: "{{ airflow_worker_dir }}/configs/docker-compose-dl.yaml" mode: '0644' + - name: Ensure configs directory exists for config generator + file: + path: "{{ airflow_worker_dir }}/configs" + state: directory + owner: "{{ ansible_user }}" + group: "{{ deploy_group }}" + mode: '0755' + become: yes + + - name: Sync config generator script + ansible.posix.synchronize: + src: ../airflow/generate_envoy_config.py + dest: "{{ airflow_worker_dir }}/" + archive: yes + rsync_path: "sudo rsync" + + - name: Sync config generator templates + ansible.posix.synchronize: + src: ../airflow/configs/{{ item }} + dest: "{{ airflow_worker_dir }}/configs/" + archive: yes + rsync_path: "sudo rsync" + loop: + - docker-compose.config-generate.yaml + - envoy.yaml.j2 + - docker-compose.camoufox.yaml.j2 + - docker-compose-ytdlp-ops.yaml.j2 + - name: Build Airflow worker image from local Dockerfile community.docker.docker_image: name: "{{ airflow_image_name }}" @@ -49,7 +97,7 @@ - name: Generate dynamic configs (camoufox + envoy) shell: - cmd: "docker compose -f configs/docker-compose.config-generate.yaml run --rm config-generator" + cmd: "docker compose --project-directory . -f configs/docker-compose.config-generate.yaml run --rm config-generator" chdir: "{{ airflow_worker_dir }}" - name: Start worker services @@ -61,3 +109,22 @@ state: present remove_orphans: true pull: "{{ 'never' if fast_deploy | default(false) else 'missing' }}" + + - name: Stop camoufox services (deprecated) + community.docker.docker_compose_v2: + project_src: "{{ airflow_worker_dir }}" + files: + - configs/docker-compose.camoufox.yaml + state: absent + ignore_errors: true + + - name: Update Airflow variable with S3 worker hostnames + ansible.builtin.command: > + docker compose exec -T airflow-scheduler + airflow variables set s3_worker_hostnames + '{{ groups["airflow_workers"] | map("regex_replace", "\\..*", "") | list | to_json }}' + args: + chdir: "{{ airflow_master_dir }}" + become: yes + delegate_to: "{{ groups['airflow_master'][0] }}" + run_once: true diff --git a/ansible/playbook-full.yml b/ansible/playbook-full.yml index 0853efd..613d487 100644 --- a/ansible/playbook-full.yml +++ b/ansible/playbook-full.yml @@ -189,6 +189,17 @@ - name: Restart Airflow worker on WORKER to apply hook when: inventory_hostname in groups['airflow_workers'] ansible.builtin.command: - cmd: "docker compose restart airflow-worker-dl airflow-worker-auth" + cmd: "docker compose restart airflow-worker-dl airflow-worker-auth airflow-worker-mgmt airflow-worker-s3" chdir: "{{ airflow_worker_dir }}" become: yes + + - name: Update Airflow variable with S3 worker hostnames + ansible.builtin.command: > + docker compose exec -T airflow-scheduler + airflow variables set s3_worker_hostnames + '{{ groups["airflow_workers"] | map("regex_replace", "\\..*", "") | list | to_json }}' + args: + chdir: "{{ airflow_master_dir }}" + become: yes + when: inventory_hostname in groups['airflow_master'] + run_once: true diff --git a/ansible/playbook-hook.yml b/ansible/playbook-hook.yml index 8580b45..d69a7d9 100644 --- a/ansible/playbook-hook.yml +++ b/ansible/playbook-hook.yml @@ -68,6 +68,6 @@ - name: Restart Airflow worker on WORKER when: inventory_hostname in groups['airflow_workers'] ansible.builtin.command: - cmd: "docker compose restart airflow-worker-dl airflow-worker-auth" + cmd: "docker compose restart airflow-worker-dl airflow-worker-auth airflow-worker-mgmt airflow-worker-s3" chdir: "{{ airflow_worker_dir }}" become: yes diff --git a/ansible/playbook-master.yml b/ansible/playbook-master.yml index 434ebe1..5056bd1 100644 --- a/ansible/playbook-master.yml +++ b/ansible/playbook-master.yml @@ -13,6 +13,22 @@ debug: msg: "Starting deployment for Airflow Master: {{ inventory_hostname }} ({{ ansible_host }})" + - name: Install python3-pip + ansible.builtin.apt: + name: python3-pip + state: present + become: yes + + - name: Install required python packages + ansible.builtin.pip: + name: + - thrift + - aria2p + - PyYAML + - apache-airflow-providers-amazon + state: present + become: yes + - name: Configure Redis memory overcommit setting copy: src: "configs/etc/sysctl.d/99-redis-overcommit.conf" @@ -156,6 +172,20 @@ mode: '0755' become: yes + - name: Ensure runtime data directories exist with correct ownership + ansible.builtin.file: + path: "{{ airflow_master_dir }}/{{ item }}" + state: directory + owner: "{{ ansible_user }}" + group: "{{ deploy_group }}" + mode: '0775' + recurse: yes + loop: + - "downloadfiles" + - "inputfiles" + - "dumps" + become: yes + - name: Sync python packages to master for build context ansible.posix.synchronize: src: "../{{ item }}/" @@ -249,14 +279,58 @@ var: config_generator_result.stdout_lines when: config_generator_result.changed + - name: Start ytdlp-ops services on master + community.docker.docker_compose_v2: + project_src: "{{ airflow_master_dir }}" + files: + - configs/docker-compose-ytdlp-ops.yaml + state: present + remove_orphans: true + pull: "{{ 'never' if fast_deploy | default(false) else 'missing' }}" + roles: - ytdlp-master - airflow-master post_tasks: - - name: Include camoufox verification tasks - include_tasks: tasks/verify_camoufox.yml - when: not fast_deploy | default(false) + - name: Delete existing Airflow redis_default connection to ensure an idempotent update + ansible.builtin.command: > + docker compose exec -T airflow-scheduler + airflow connections delete redis_default + args: + chdir: "{{ airflow_master_dir }}" + register: delete_redis_conn + retries: 5 + delay: 10 + until: delete_redis_conn.rc == 0 or 'not found' in delete_redis_conn.stderr + changed_when: "'was deleted successfully' in delete_redis_conn.stdout" + failed_when: + - delete_redis_conn.rc != 0 + - "'not found' not in delete_redis_conn.stderr" + become: yes + become_user: "{{ ansible_user }}" + + - name: Add Airflow redis_default connection + ansible.builtin.command: > + docker compose exec -T airflow-scheduler + airflow connections add redis_default + --conn-uri 'redis://:{{ vault_redis_password }}@{{ ansible_host }}:{{ redis_port }}/{{ redis_db_celery_broker | default(1) }}' + args: + chdir: "{{ airflow_master_dir }}" + register: add_redis_conn + retries: 5 + delay: 10 + until: add_redis_conn.rc == 0 + changed_when: "'was successfully added' in add_redis_conn.stdout" + become: yes + become_user: "{{ ansible_user }}" + + - name: Update S3 delivery connection + ansible.builtin.import_playbook: playbook-update-s3-vars.yml + + # - name: Include camoufox verification tasks + # include_tasks: tasks/verify_camoufox.yml + # when: not fast_deploy | default(false) - name: Run regression test command: > diff --git a/ansible/playbook-update-s3-vars.yml b/ansible/playbook-update-s3-vars.yml new file mode 100644 index 0000000..c7bddd6 --- /dev/null +++ b/ansible/playbook-update-s3-vars.yml @@ -0,0 +1,58 @@ +--- +- name: Update S3 Delivery Airflow Connection + hosts: airflow_master + vars_files: + - "{{ inventory_dir }}/group_vars/all/vault.yml" + - "{{ inventory_dir }}/group_vars/all/generated_vars.yml" + tasks: + - name: Delete existing s3_delivery_connection to ensure an idempotent update + ansible.builtin.command: > + docker compose exec -T airflow-scheduler + airflow connections delete s3_delivery_connection + args: + chdir: "{{ airflow_master_dir }}" + register: delete_s3_conn + retries: 5 + delay: 10 + until: delete_s3_conn.rc == 0 or 'Did not find a connection' in delete_s3_conn.stderr + changed_when: "'was deleted successfully' in delete_s3_conn.stdout" + failed_when: + - delete_s3_conn.rc != 0 + - "'Did not find a connection' not in delete_s3_conn.stderr" + become: yes + become_user: "{{ ansible_user }}" + + - name: Add/Update s3_delivery_connection + ansible.builtin.command: + argv: + - docker + - compose + - exec + - -T + - airflow-scheduler + - airflow + - connections + - add + - s3_delivery_connection + - --conn-type + - aws + - --conn-login + - "{{ vault_s3_delivery_access_key_id }}" + - --conn-password + - "{{ vault_s3_delivery_secret_access_key }}" + - --conn-host + - "{{ vault_s3_delivery_endpoint }}" + - --conn-extra + - "{{ s3_extra_dict | to_json }}" + chdir: "{{ airflow_master_dir }}" + vars: + s3_extra_dict: + bucket: "{{ vault_s3_delivery_bucket }}" + region_name: "{{ vault_s3_delivery_aws_region }}" + register: add_s3_conn + retries: 5 + delay: 10 + until: add_s3_conn.rc == 0 + changed_when: "'was successfully added' in add_s3_conn.stdout" + become: yes + become_user: "{{ ansible_user }}" diff --git a/ansible/playbook-worker.yml b/ansible/playbook-worker.yml index 6a81aaf..f07c166 100644 --- a/ansible/playbook-worker.yml +++ b/ansible/playbook-worker.yml @@ -147,6 +147,23 @@ mode: '0755' become: yes + - name: Ensure runtime data directories exist with correct ownership + ansible.builtin.file: + path: "{{ airflow_worker_dir }}/{{ item }}" + state: directory + owner: "{{ ansible_user }}" + group: "{{ deploy_group }}" + mode: '0775' + recurse: yes + loop: + - "downloadfiles" + - "downloadfiles/videos" + - "downloadfiles/videos/in-progress" + - "downloadfiles/videos/ready" + - "inputfiles" + - "dumps" + become: yes + - name: Create .dockerignore on worker to exclude runtime data from build context ansible.builtin.copy: dest: "{{ airflow_worker_dir }}/.dockerignore" diff --git a/ansible/templates/.env.j2 b/ansible/templates/.env.j2 index ab5c478..e7ab80c 100644 --- a/ansible/templates/.env.j2 +++ b/ansible/templates/.env.j2 @@ -57,8 +57,8 @@ YTDLP_TIMEOUT=600 # --- Camoufox (Browser) Configuration --- CAMOUFOX_PROXIES="{{ (worker_proxies | default([])) | join(',') }}" VNC_PASSWORD="{{ vault_vnc_password }}" -CAMOUFOX_BASE_VNC_PORT={{ camoufox_base_vnc_port }} -CAMOUFOX_PORT={{ camoufox_base_port }} +CAMOUFOX_BASE_VNC_PORT={{ camoufox_base_vnc_port | default(5901) }} +CAMOUFOX_PORT={{ camoufox_base_port | default(9070) }} # --- Account Manager Configuration --- ACCOUNT_ACTIVE_DURATION_MIN={{ account_active_duration_min | default(7) }} diff --git a/cli.config b/cli.config index a6a64fe..2703daa 100644 --- a/cli.config +++ b/cli.config @@ -18,8 +18,9 @@ # Retry fragments 10 times --fragment-retries 10 -# Limit download rate to 5M ---limit-rate 5M +# Use a fixed buffer size to stabilize throughput and avoid traffic shaping +--no-resize-buffer +--buffer-size 4M # Socket timeout --socket-timeout 15 @@ -31,5 +32,10 @@ # Progress --progress +# Merge to mp4 by default +--merge-output-format mp4 + +# Don't use "NA" in filenames if metadata is missing +--output-na-placeholder "" --no-part diff --git a/policies/4_custom_scenarios.yaml b/policies/4_custom_scenarios.yaml new file mode 100644 index 0000000..520333b --- /dev/null +++ b/policies/4_custom_scenarios.yaml @@ -0,0 +1,58 @@ +# This file contains custom policies for specific testing scenarios. + +--- +# Policy: Fetch info.json with visitor ID rotation. +# This policy uses a single worker to fetch info.json files for a list of URLs. +# It simulates user churn by creating a new profile (and thus a new visitor_id and POT) +# every 250 requests. A short sleep is used between requests. +name: fetch_with_visitor_id_rotation + +settings: + mode: fetch_only + urls_file: "urls.txt" # Placeholder, should be overridden with --set + info_json_script: "bin/ytops-client get-info" + save_info_json_dir: "fetched_info_jsons/visitor_id_rotation" + # Use the modern profile management system to rotate visitor_id. + profile_mode: per_worker_with_rotation + profile_management: + prefix: "visitor_rotator" + # Rotate to a new profile generation after 250 requests. + max_requests_per_profile: 250 + +execution_control: + run_until: { cycles: 1 } # Run through the URL list once. + workers: 1 # Run with a single worker thread. + # A short, fixed sleep between each info.json request. + sleep_between_tasks: { min_seconds: 0.75, max_seconds: 0.75 } + +info_json_generation_policy: + # Use a standard client. The server will handle token generation. + client: web + +--- +# Policy: Test download specific DASH formats from a folder of info.jsons. +# This policy uses a single worker to test-download a list of video-only DASH +# formats from a directory of existing info.json files. It only downloads the +# first 10KB of each format and sleeps between each file. +name: download_dashy_formats_test + +settings: + mode: download_only + # Directory of info.json files to process. + info_json_dir: "fetched_info_jsons/visitor_id_rotation" # Assumes output from the above policy + +execution_control: + run_until: { cycles: 1 } # Run through the info.json directory once. + workers: 1 # Run with a single worker thread. + # A longer, randomized sleep between processing each info.json file. + sleep_between_tasks: { min_seconds: 5, max_seconds: 10 } + +download_policy: + # A specific list of video-only DASH formats to test. + # The "-dashy" suffix is illustrative; the format IDs must exist in the info.json. + formats: "299-dashy/298-dashy/137-dashy/136-dashy/135-dashy/134-dashy/133-dashy" + # Use the native Python downloader for better performance and control. + downloader: "native-py" + # Pass extra arguments to yt-dlp to perform a "test" download (first 10KB). + extra_args: '--download-sections "*0-10240"' + output_dir: "downloads/dash_test" diff --git a/thrift_model/.gitignore b/thrift_model/.gitignore index 6afe395..2f7896d 100644 --- a/thrift_model/.gitignore +++ b/thrift_model/.gitignore @@ -1,2 +1 @@ -__py_cache__ target/ diff --git a/ytops_client/download_native_py_tool.py b/ytops_client/download_native_py_tool.py index 74f3f4d..1f00383 100644 --- a/ytops_client/download_native_py_tool.py +++ b/ytops_client/download_native_py_tool.py @@ -179,13 +179,63 @@ def main_download_native_py(args): ydl_opts = {} if base_opts_args: try: - # This is an internal API, but it's the most accurate way to parse CLI args - # into the ydl_opts dictionary format. - # yt-dlp's parse_options can return 3 or 4 values. We only need the `opts` namespace (second value). - _parser, opts, _args, *_ = yt_dlp.parse_options(base_opts_args) - ydl_opts = vars(opts) + logger.info(f"Parsing {len(base_opts_args)} arguments from config/extra_args...") + i = 0 + while i < len(base_opts_args): + arg = base_opts_args[i] + if not arg.startswith('--'): + logger.warning(f"Skipping non-option argument in extra args: {arg}") + i += 1 + continue + + key = arg.lstrip('-').replace('-', '_') + + # Handle flags (no value) + is_flag = i + 1 >= len(base_opts_args) or base_opts_args[i + 1].startswith('--') + + if is_flag: + if key.startswith('no_'): + # Handle --no-foo flags + ydl_opts[key[3:]] = False + else: + ydl_opts[key] = True + logger.debug(f"Parsed flag: {key} = {ydl_opts.get(key[3:] if key.startswith('no_') else key)}") + i += 1 + # Handle options with values + else: + value = base_opts_args[i + 1] + # Try to convert values to numbers, which yt-dlp expects. + # This includes parsing byte suffixes like 'K', 'M', 'G'. + if isinstance(value, str): + original_value = value + value_upper = value.upper() + multipliers = {'K': 1024, 'M': 1024**2, 'G': 1024**3, 'T': 1024**4} + + if value_upper and value_upper[-1] in multipliers: + try: + num = float(value[:-1]) + value = int(num * multipliers[value_upper[-1]]) + except (ValueError, TypeError): + value = original_value # fallback + else: + try: + value = int(value) + except (ValueError, TypeError): + try: + value = float(value) + except (ValueError, TypeError): + value = original_value # fallback + + # Special handling for keys that differ from CLI arg, e.g. --limit-rate -> ratelimit + if key == 'limit_rate': + key = 'ratelimit' + + ydl_opts[key] = value + logger.debug(f"Parsed option: {key} = {value}") + i += 2 + logger.info("Successfully parsed extra yt-dlp options.") except Exception as e: - logger.error(f"Failed to parse options from config/extra_args: {e}") + logger.error(f"Failed to parse options from config/extra_args: {e}", exc_info=True) return 1 # Now, layer the script's explicit arguments on top, as they have higher precedence.