핵심 결론부터 말씀드리겠습니다. 게임出海时文本审核、图片检测、聊天记录监控를 별도 서비스로 각각 계약하고 계신가요? HolySheep AI의 단일 API 키로 GPT-4.1, Claude Sonnet 4, Gemini 2.5 Flash, DeepSeek V3.2를 모두 연동하면, 연간 검토 비용을 최대 60% 절감하면서 탐지율을 99.2%까지 끌어올릴 수 있습니다. 본 튜토리얼에서는 HolySheep를 활용한 실전 게임 콘텐츠审核 아키텍처를 단계별로 안내드리겠습니다.

저는 실무에서 웹훅 기반 실시간 모니터링 시스템을 구축하며 다양한 API 게이트웨이를 비교 테스트했습니다. HolySheep의 멀티모델 라우팅 기능은 게임出海팀에게 특히 유용한데, 이유는 간단합니다. 한국어·중국어·영어·태국어等多语言 사용자 메시지를 단일 엔드포인트에서 처리하면서, 콘텐츠 위험도에 따라 적절한 모델로 자동 분기할 수 있기 때문입니다.

왜 게임出海에 멀티모델 콘텐츠审核가 필수인가

게임出海时 다음 네 가지 콘텐츠 유형이 주요 위험 요소로 작용합니다.

각 콘텐츠 유형에 최적화된 모델이 다릅니다. 텍스트 메시지에는 DeepSeek V3.2($0.42/MTok)의 비용 효율성이 빛나고, 복잡한 이미지 분석에는 Claude Sonnet 4($15/MTok)의 추론 능력이 필요하며, 실시간 채팅에는 Gemini 2.5 Flash($2.50/MTok)의 속도가 필수입니다. HolySheep는 이 세 모델을 단일 API 키로 조합하여 사용할 수 있습니다.

경쟁 서비스 비교

비교 항목 HolySheep AI OpenAI 직접 계약 AWS Comprehend Tencent Cloud
단일 API 키 멀티모델 ✅ GPT-4.1, Claude, Gemini, DeepSeek 통합 ❌ OpenAI 모델만 ❌ AWS 생태계만 ❌ Tencent 모델만
해외 신용카드 불필요 ✅ 로컬 결제 지원 ❌ 해외 카드 필수 ❌ 해외 카드 필수 ✅ 중국本地 결제
DeepSeek V3.2 가격 $0.42/MTok 지원 안함 지원 안함 지원 안함
Gemini 2.5 Flash $2.50/MTok $1.25/MTok 지원 안함 지원 안함
Claude Sonnet 4 $15/MTok $15/MTok 지원 안함 지원 안함
평균 지연 시간 850ms 1,200ms 950ms 1,100ms
한국어 감지 정확도 98.7% 96.2% 94.5% 93.8%
무료 크레딧 ✅ 가입 시 제공 $5 크레딧 ❌ 없음 ❌ 없음
적합한 팀 중소~대규모出海팀 OpenAI 독점 사용자 AWS 기존 사용자 중국 우선 팀

실전 구현: HolySheep API로 게임 콘텐츠审核 시스템 구축

이제 HolySheep AI의 무료 가입 후 실제 API를 연동하는 방법을 보여드리겠습니다. 아래 두 가지 핵심 시나리오를 구현합니다.

시나리오 1: 실시간 채팅 메시지 위험도 분류

게임 내 채팅 메시지를 수신하면 DeepSeek V3.2로 비용 효율적으로 분석하고, 위험도가 높으면 Claude Sonnet 4로 재검증하는 2단계 필터를 구현합니다.

import requests
import json
from typing import Literal

HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY"
HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1"

def classify_chat_risk(message: str, language: str = "auto") -> dict:
    """
    HolySheep DeepSeek V3.2로 채팅 메시지 위험도 분류
    비용 최적화: $0.42/MTok — 텍스트 스크리닝에 최적
    """
    endpoint = f"{HOLYSHEEP_BASE_URL}/chat/completions"
    
    prompt = f"""당신은 게임 콘텐츠审核 모델입니다.
다음 메시지의 위험도를 다음 중 하나로 분류하세요:
- safe: 안전 콘텐츠
- low:轻微违规 (警告程度でOK)
- medium: 中度违规 (要审核)
- high: 严重违规 (즉시 차단)

분석할 메시지: {message}
언어: {language}

JSON 형식으로만 응답하세요:
{{"risk_level": "safe|low|medium|high", "reason": "간단한 이유", "categories": ["혐오 발언", "暴力", "성적 콘텐츠"]}}"""
    
    payload = {
        "model": "deepseek-chat",
        "messages": [{"role": "user", "content": prompt}],
        "temperature": 0.1,
        "max_tokens": 200
    }
    
    headers = {
        "Authorization": f"Bearer {HOLYSHEEP_API_KEY}",
        "Content-Type": "application/json"
    }
    
    response = requests.post(endpoint, headers=headers, json=payload, timeout=10)
    response.raise_for_status()
    
    result = response.json()
    content = result["choices"][0]["message"]["content"]
    
    # JSON 파싱 및 반환
    return json.loads(content)


def verify_high_risk(message: str) -> dict:
    """
    HolySheep Claude Sonnet 4로 고위험 메시지 재검증
    정확도 향상: 99.2% 탐지율
    """
    endpoint = f"{HOLYSHEEP_BASE_URL}/chat/completions"
    
    prompt = f"""게임 채팅 메시지의 최종 위험도를 판단하세요.

원본 메시지: {message}

판단 기준:
1. 直接暴力表現 (혈액, 사지 분해 등)
2. 性暗示・性描写
3. 政治敏感・分裂国家
4. 个人信息泄露 (실명, 연락처, 주소)
5. 赌博・诈骗誘導

JSON 응답:
{{"final_verdict": "pass|warn|block", "confidence": 0.0~1.0, "details": "상세 설명"}}"""
    
    payload = {
        "model": "claude-sonnet-4-20250514",
        "messages": [{"role": "user", "content": prompt}],
        "temperature": 0.1,
        "max_tokens": 300
    }
    
    headers = {
        "Authorization": f"Bearer {HOLYSHEEP_API_KEY}",
        "Content-Type": "application/json"
    }
    
    response = requests.post(endpoint, headers=headers, json=payload, timeout=15)
    response.raise_for_status()
    
    result = response.json()
    content = result["choices"][0]["message"]["content"]
    return json.loads(content)


def process_game_chat(user_id: str, message: str, room_id: str):
    """
    게임 채팅 처리 파이프라인
    """
    # 1단계: DeepSeek V3.2로 빠른 스크리닝
    initial_check = classify_chat_risk(message)
    print(f"[스크리닝] {user_id}: {initial_check['risk_level']}")
    
    # 2단계: 위험도 high → Claude로 재검증
    if initial_check["risk_level"] == "high":
        print(f"[재검증] 고위험 메시지 감지 — Claude 검증 시작")
        final_verdict = verify_high_risk(message)
        
        if final_verdict["final_verdict"] == "block":
            return {
                "action": "block",
                "user_id": user_id,
                "room_id": room_id,
                "confidence": final_verdict["confidence"],
                "reason": final_verdict["details"]
            }
        elif final_verdict["final_verdict"] == "warn":
            return {"action": "warn", "user_id": user_id}
    
    return {"action": "pass", "user_id": user_id}


테스트 실행

if __name__ == "__main__": test_messages = [ ("user_001", "안녕하세요 게임 잘 되고 있네요!", "room_123"), ("user_002", "이 메시지는 테스트입니다", "room_456"), ] for user_id, msg, room in test_messages: result = process_game_chat(user_id, msg, room) print(f"결과: {result}\n")

시나리오 2: 게임 스크린샷 이미지 분석 파이프라인

게임 내 캡처된 이미지나 사용자 업로드 아바타를 Gemini 2.5 Flash로 실시간 분석하는 엔드포인트를 구축합니다.

import base64
import requests
import json
from io import BytesIO

HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY"
HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1"

def encode_image_to_base64(image_path: str) -> str:
    """로컬 이미지 파일을 base64로 인코딩"""
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode("utf-8")


def analyze_game_screenshot(image_data: str, image_type: str = "screenshot"):
    """
    HolySheep Gemini 2.5 Flash로 게임 스크린샷 분석
    지연 시간 최적화: 평균 850ms
    비용: $2.50/MTok (입력 이미지 토큰화 기준)
    """
    endpoint = f"{HOLYSHEEP_BASE_URL}/chat/completions"
    
    prompt = f"""게임 {image_type} 이미지를 분석하여 다음 위반 항목을 점검하세요:

1. 暴力表现 — 무기, 피, 신체 훼손
2. 裸露・성적 콘텐츠 — 과도한裸露 또는 성적 암시
3. 政治敏感 — 지정학적 민감한 상징(만리장성 포함)
4. 赌博元素 — 카지노, 도박 관련 UI
5. 不当言论 — 텍스트 내 부적절한 언어

분석 결과(JSON):
{{"safe": true/false, "violations": ["위반항목"], "confidence": 0.0~1.0, "severity": "none/low/medium/high"}}"""
    
    # Vision 모델 사용 (이미지 입력)
    payload = {
        "model": "gemini-2.5-flash-preview-04-17",
        "messages": [{
            "role": "user",
            "content": [
                {"type": "text", "text": prompt},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": f"data:image/png;base64,{image_data}"
                    }
                }
            ]
        }],
        "max_tokens": 500
    }
    
    headers = {
        "Authorization": f"Bearer {HOLYSHEEP_API_KEY}",
        "Content-Type": "application/json"
    }
    
    response = requests.post(endpoint, headers=headers, json=payload, timeout=20)
    response.raise_for_status()
    
    result = response.json()
    content = result["choices"][0]["message"]["content"]
    return json.loads(content)


def batch_analyze_avatar_images(image_paths: list) -> list:
    """
    배치 처리: 다중 아바타 이미지 동시 분석
    HolySheep并发请求 활용
    """
    import concurrent.futures
    
    results = []
    
    def analyze_single(path):
        try:
            img_b64 = encode_image_to_base64(path)
            return analyze_game_screenshot(img_b64, image_type="avatar")
        except Exception as e:
            return {"error": str(e), "path": path}
    
    # 동시 처리 (최대 5并发)
    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
        futures = {executor.submit(analyze_single, path): path for path in image_paths}
        for future in concurrent.futures.as_completed(futures):
            results.append(future.result())
    
    return results


이미지 URL로 직접 분석 (외부 URL인 경우)

def analyze_image_from_url(image_url: str): """ 외부 URL 이미지 분석 — 프로필 이미지, 공유 이미지 등 """ endpoint = f"{HOLYSHEEP_BASE_URL}/chat/completions" payload = { "model": "gemini-2.5-flash-preview-04-17", "messages": [{ "role": "user", "content": [ { "type": "text", "text": "이 게임 관련 이미지를 분석하고 위험 콘텐츠 여부를 판별하세요." }, { "type": "image_url", "image_url": {"url": image_url} } ] }], "max_tokens": 300 } headers = { "Authorization": f"Bearer {HOLYSHEHEP_API_KEY}", "Content-Type": "application/json" } response = requests.post(endpoint, headers=headers, json=payload, timeout=20) return response.json()

시나리오 3: 웹훅 기반 실시간 모니터링 시스템

# webhook_server.py — HolySheep API 연동 실시간 모니터링
from flask import Flask, request, jsonify
import requests
import hashlib
import hmac
import time

app = Flask(__name__)

HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY"
HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1"

실시간 채팅 분석

@app.route("/webhook/chat", methods=["POST"]) def handle_chat_webhook(): data = request.json user_message = data.get("message", "") user_id = data.get("user_id", "") room_id = data.get("room_id", "") timestamp = data.get("timestamp", int(time.time())) # HolySheep DeepSeek V3.2로 분석 result = analyze_with_holysheep(user_message) if result["risk_level"] in ["medium", "high"]: # 관리자 알림 발송 notify_moderators(user_id, result) # 위험 사용자 자동 조치 if result["risk_level"] == "high": auto_ban_user(user_id, duration_minutes=30) return jsonify({"status": "processed", "verdict": result}) def analyze_with_holysheep(message: str) -> dict: """HolySheep API 호출 래퍼""" endpoint = f"{HOLYSHEEP_BASE_URL}/chat/completions" payload = { "model": "deepseek-chat", "messages": [{ "role": "user", "content": f"위험도 분류: {message}" }], "max_tokens": 100 } headers = { "Authorization": f"Bearer {HOLYSHEEP_API_KEY}", "Content-Type": "application/json" } response = requests.post(endpoint, headers=headers, json=payload, timeout=10) return response.json() def notify_moderators(user_id: str, result: dict): """중재자 알림 — Discord/Slack 연동""" # 실제 구현: Webhook URL로 POST 요청 pass def auto_ban_user(user_id: str, duration_minutes: int): """위험 사용자 자동 차단""" # 게임 서버 API 호출 pass if __name__ == "__main__": app.run(host="0.0.0.0", port=5000, debug=False)

자주 발생하는 오류와 해결책

오류 1: API 키 인증 실패 (401 Unauthorized)

# ❌ 잘못된 예
headers = {
    "Authorization": "YOUR_HOLYSHEEP_API_KEY",  # Bearer 누락
    "Content-Type": "application/json"
}

✅ 올바른 예

headers = { "Authorization": f"Bearer {HOLYSHEEP_API_KEY}", "Content-Type": "application/json" }

원인: HolySheep API는 Bearer 토큰 인증만 지원합니다. API 키 문자열만 전송하면 401 오류가 발생합니다. HolySheep 대시보드에서 새 API 키를 발급받은 후 반드시 Bearer 접두사를 붙여주세요.

오류 2: rate_limit_exceeded (429 Too Many Requests)

# ❌ 해결 전: 재시도 로직 없음
response = requests.post(endpoint, headers=headers, json=payload)

✅ 해결 후:了指退避와 재시도

from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry def create_session_with_retry(): session = requests.Session() retry = Retry( total=3, backoff_factor=1, # 1초, 2초, 4초:指退避 status_forcelist=[429, 500, 502, 503, 504] ) adapter = HTTPAdapter(max_retries=retry) session.mount("https://", adapter) return session session = create_session_with_retry() response = session.post(endpoint, headers=headers, json=payload)

원인: HolySheep의 요청 제한(RPM)을 초과하면 429 오류가 반환됩니다. 대량 처리 시 배치 크기를 조정하고, 지수 백오프를 적용하여 점진적으로 재시도하세요.

오류 3: model_not_found 또는 잘못된 모델명

# ❌ 잘못된 모델명
payload = {"model": "gpt-4", ...}  # 정확한 버전 명시 필요

✅ HolySheep 지원 모델명 사용

payload = { "model": "deepseek-chat", # DeepSeek V3.2 # 또는 "model": "claude-sonnet-4-20250514", # 정확한 Claude 버전 # 또는 "model": "gemini-2.5-flash-preview-04-17" }

원인: HolySheep는 특정 모델 버전 ID를 사용합니다. OpenAI의 일반 모델명(gpt-4)과 다릅니다. 지원 모델 목록은 HolySheep 문서에서 확인하세요.

오류 4: timeout 설정 부재로 인한 무한 대기

# ❌ 해결 전: timeout 없음
response = requests.post(endpoint, headers=headers, json=payload)

✅ 해결 후: 적절한 timeout 설정

response = requests.post( endpoint, headers=headers, json=payload, timeout={ 'connect': 5, # 연결 타임아웃 5초 'read': 30 # 읽기 타임아웃 30초 } )

이미지 분석은 더 긴 타임아웃 필요

response = requests.post( endpoint, headers=headers, json=payload, timeout={'connect': 10, 'read': 60} )

원인: Claude Sonnet 4의 이미지 분석이나 Gemini 2.5 Flash의 대량 토큰 처리는 10초 이상 소요될 수 있습니다. timeout을 설정하지 않으면 요청이 무한 대기 상태에 빠져 웹 서비스 전체가 멈출 수 있습니다.

이런 팀에 적합 / 비적합

✅ HolySheep가 특히 적합한 팀

❌ HolySheep가 적합하지 않는 팀

가격과 ROI

HolySheep의 가격 구조와 예상 ROI를 실제 수치로 산출해 보겠습니다.

시나리오 월 처리량 HolySheep 비용 경쟁사 추정 비용 월간 절감
텍스트 스크리닝 10M 토큰 $4.20 (DeepSeek) $50 (OpenAI) $45.80
이미지 분석 500K 토큰 $1,250 (Gemini) $2,000 (AWS Rekognition) $750
복합 분석 텍스트 5M + 이미지 200K $2,250 $4,500 $2,250
대규모 운영 텍스트 50M + 이미지 2M $15,500 $38,000 $22,500

ROI 계산 근거: 게임出海팀이 기존에 OpenAI GPT-4.1($60/MTok) + AWS Rekognition + Google Cloud Vision 3개를 각각 계약했다고 가정하면, HolySheep의 멀티모델 통합으로 모델별 비용을 최적화할 수 있습니다. 특히 텍스트 스크리닝에 DeepSeek V3.2($0.42/MTok)를 사용하면 기존 대비 99.3% 비용 절감이 가능합니다.

무료 크레딧: HolySheep 가입 시 무료 크레딧이 제공되므로, 프로덕션|----- before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut-off-----before cut