欢迎来到四方洲!

MCJ_CHY 2026-10-07 23:22:37

这期神了 嗯,反正就是制作了一个网页游戏 这个链接点进去是这个游戏官网

四方洲行动

制作人员名单

妙脆角程序员

CHY

请勿骚扰

简介

此游戏由CHY提供技术支持与网站管理,妙脆角程序员负责编辑改变以及制作

游戏为3D,角色建模和很多东西都需要改进->因为学业暂时无法更新

(角色是个圆柱)

tips

不要尝试任何旧版本 不要下载任何py服务器,把下面这个复制了即可

以下是联机服务器技术代码

v2.0

不建议使用

/*------------Python联机------------*/
/*--------------tips---------------*/
/*--作为.txt类文件后要将后缀改为.py--*/
/*转换后并启用即可*/
# ============================================================================
# 四方洲行动 · 联机服务器(Python 零依赖版,仅用标准库 asyncio + 手写 WebSocket)
# 运行:python server.py   (可选环境变量 PORT 覆盖端口,默认 3210)
# 该服务器只负责「房间管理 + 状态转发」,不直接模拟游戏世界;
# 每个客户端各自模拟自己的玩家与敌人,服务器把其他玩家的状态广播出去。
# 与 server.js 协议完全一致,前端无需任何改动。
# ============================================================================
import asyncio
import base64
import hashlib
import json
import os
import random
import socket
import string
import time

PORT = int(os.environ.get('PORT', 3210))
HOST = os.environ.get('HOST', '0.0.0.0')
WS_GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'

# rooms: code -> {'host': id, 'players': {id: player}}
# player: {id, conn, name, x, z, yaw, hp, armor, ammo, reloading, running, weapon, mode, last}
rooms = {}
next_id = 1


def gen_code():
    chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'  # 去掉易混淆字符
    while True:
        c = ''.join(random.choice(chars) for _ in range(4))
        if c not in rooms:
            return c


def local_ips():
    """获取本机所有局域网 IPv4 地址(客户端自动搜索房间时用来纠正扫描网段)"""
    ips = []
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(('8.8.8.8', 80))          # 不真正发包,仅取路由出口 IP
        ip = s.getsockname()[0]
        s.close()
        if ip.startswith(('192.168.', '10.', '172.')) and ip not in ips:
            ips.append(ip)
    except Exception:
        pass
    try:
        for info in socket.getaddrinfo(socket.gethostname(), None, socket.AF_INET):
            ip = info[4][0]
            if ip.startswith(('192.168.', '10.', '172.')) and ip not in ips:
                ips.append(ip)
    except Exception:
        pass
    return ips


def public_state(p):
    return {
        'id': p['id'], 'name': p['name'], 'x': p['x'], 'z': p['z'], 'yaw': p['yaw'],
        'hp': p['hp'], 'armor': p['armor'], 'ammo': p['ammo'],
        'reloading': p['reloading'], 'running': p['running'],
        'weapon': p['weapon'], 'mode': p['mode'],
    }


# ----------------------------- 帧编码(服务端 -> 客户端,不加掩码) -----------------------------
def encode_frame(text):
    payload = text.encode('utf-8')
    n = len(payload)
    if n < 126:
        header = bytes([0x81, n])
    elif n < 65536:
        header = bytes([0x81, 126]) + n.to_bytes(2, 'big')
    else:
        header = bytes([0x81, 127]) + n.to_bytes(8, 'big')
    return header + payload


# ----------------------------- 帧解码(客户端 -> 服务端,必带掩码) -----------------------------
def decode_frames(buf):
    messages = []
    offset = 0
    while offset + 2 <= len(buf):
        b0 = buf[offset]
        b1 = buf[offset + 1]
        opcode = b0 & 0x0F
        masked = (b1 & 0x80) == 0x80
        length = b1 & 0x7F
        p = offset + 2
        if length == 126:
            if p + 2 > len(buf):
                break
            length = int.from_bytes(buf[p:p + 2], 'big')
            p += 2
        elif length == 127:
            if p + 8 > len(buf):
                break
            length = int.from_bytes(buf[p:p + 8], 'big')
            p += 8
        mask_key = None
        if masked:
            if p + 4 > len(buf):
                break
            mask_key = buf[p:p + 4]
            p += 4
        if p + length > len(buf):
            break
        payload = buf[p:p + length]
        if masked and mask_key:
            payload = bytes(payload[i] ^ mask_key[i & 3] for i in range(length))
        offset = p + length
        if opcode == 0x8:
            messages.append(('close', b''))
        elif opcode == 0x9:
            messages.append(('ping', payload))
        elif opcode == 0x1:
            messages.append(('text', payload.decode('utf-8', errors='replace')))
        # 0xA pong / 0x0 续帧:本 MVP 不处理(浏览器短消息均为单帧)
    return messages, buf[offset:]


# ----------------------------- 发送 / 广播 / 离开 -----------------------------
def send(conn, obj):
    try:
        conn.writer.write(encode_frame(json.dumps(obj)))
    except Exception:
        pass


def broadcast(code, obj, except_id=None):
    r = rooms.get(code)
    if not r:
        return
    for pid, p in list(r['players'].items()):
        if pid != except_id:
            send(p['conn'], obj)


def leave_room(conn):
    code = conn.room
    if not code or code not in rooms:
        conn.room = None
        return
    r = rooms[code]
    if conn.id in r['players']:
        del r['players'][conn.id]
    if not r['players']:
        del rooms[code]
        print(f'[room closed] {code}', flush=True)
    else:
        if r['host'] == conn.id:
            r['host'] = next(iter(r['players'].keys()))
            broadcast(code, {'t': 'host', 'host': r['host']})
        broadcast(code, {'t': 'peerLeave', 'id': conn.id})
    print(f'[leave] #{conn.id} left room {code} ({len(r["players"])} left)', flush=True)
    conn.room = None


# ----------------------------- 消息处理 -----------------------------
def handle_message(conn, text):
    global next_id
    try:
        m = json.loads(text)
    except Exception:
        return
    t = m.get('t')
    conn.is_alive = True

    if t == 'join':
        code = (m.get('room') or '').upper().strip()
        name = str(m.get('name') or '玩家')[:12]
        if code and code in rooms:
            r = rooms[code]
        else:
            if not code:
                code = gen_code()
            while code in rooms:
                code = gen_code()
            r = {'host': conn.id, 'players': {}}
            rooms[code] = r
        conn.room = code
        player = {
            'id': conn.id, 'conn': conn, 'name': name,
            'x': 0, 'z': 0, 'yaw': 0, 'hp': 100, 'armor': 0, 'ammo': 0,
            'reloading': False, 'running': False, 'weapon': '', 'mode': 'coop',
            'last': time.time(),
        }
        r['players'][conn.id] = player
        conn.player = player
        send(conn, {
            't': 'joined', 'id': conn.id, 'room': code, 'host': r['host'],
            'players': [public_state(pp) for pp in r['players'].values()],
        })
        broadcast(code, {'t': 'peerJoin', 'id': conn.id, 'name': name, 'host': r['host']}, conn.id)
        print(f'[join] {name}(#{conn.id}) -> room {code} ({len(r["players"])} players)', flush=True)

    elif t == 'state':
        r = rooms.get(conn.room)
        if not r:
            return
        p = r['players'].get(conn.id)
        if not p:
            return
        s = m.get('s', {})
        p['x'] = float(s.get('x') or 0)
        p['z'] = float(s.get('z') or 0)
        p['yaw'] = float(s.get('yaw') or 0)
        p['hp'] = float(s.get('hp'))
        p['armor'] = float(s.get('armor'))
        p['ammo'] = float(s.get('ammo'))
        p['reloading'] = bool(s.get('reloading'))
        p['running'] = bool(s.get('running'))
        p['weapon'] = s.get('weapon') or ''
        p['mode'] = s.get('mode') or 'coop'
        p['last'] = time.time()
        broadcast(conn.room, {'t': 'state', 'id': conn.id, 's': public_state(p)}, conn.id)

    elif t == 'shoot':
        r = rooms.get(conn.room)
        if not r:
            return
        name = r['players'].get(conn.id, {}).get('name', '')
        broadcast(conn.room, {'t': 'shoot', 'id': conn.id, 'name': name,
                              'o': m.get('o'), 'd': m.get('d'),
                              'dmg': m.get('dmg'), 'w': m.get('w')}, conn.id)

    elif t == 'reload':
        r = rooms.get(conn.room)
        if not r:
            return
        broadcast(conn.room, {'t': 'reload', 'id': conn.id}, conn.id)

    elif t == 'chat':
        r = rooms.get(conn.room)
        if not r:
            return
        name = r['players'].get(conn.id, {}).get('name', '')
        broadcast(conn.room, {'t': 'chat', 'id': conn.id, 'name': name,
                              'msg': str(m.get('msg') or '')[:200]}, conn.id)

    elif t == 'rooms':
        # 房间列表查询(客户端「自动搜索房间」用):返回各房间码、人数、房主名与本机局域网 IP
        send(conn, {'t': 'rooms', 'rooms': [
            {'code': c, 'players': len(r['players']), 'host': r['players'].get(r['host'], {}).get('name', '')}
            for c, r in rooms.items()
        ], 'ips': local_ips()})

    elif t == 'leave':
        leave_room(conn)


# ----------------------------- 连接处理 -----------------------------
async def handle_connection(reader, writer):
    global next_id
    conn = type('Conn', (), {})()
    conn.reader = reader
    conn.writer = writer
    conn.buf = b''
    conn.id = None
    conn.room = None
    conn.player = None
    conn.is_alive = True

    try:
        # 读取 HTTP 头(WebSocket 握手 或 普通 HTTP 健康检查)
        header_data = b''
        while b'\r\n\r\n' not in header_data:
            chunk = await reader.read(1024)
            if not chunk:
                writer.close()
                return
            header_data += chunk
            if len(header_data) > 65536:
                break
        header_text = header_data.split(b'\r\n\r\n')[0].decode('utf-8', errors='replace')
        key = None
        upgrade = ''
        for line in header_text.split('\r\n'):
            if ':' in line:
                k, v = line.split(':', 1)
                k = k.strip().lower()
                v = v.strip()
                if k == 'upgrade':
                    upgrade = v
                elif k == 'sec-websocket-key':
                    key = v

        if not key or upgrade.lower() != 'websocket':
            # 普通 HTTP 请求:返回健康检查文本
            body = f'四方洲行动联机服务器运行中 · 房间数={len(rooms)} · 端口={PORT}\n'
            body_b = body.encode('utf-8')
            resp = ('HTTP/1.1 200 OK\r\nContent-Type: text/plain; charset=utf-8\r\n'
                    f'Content-Length: {len(body_b)}\r\n\r\n').encode() + body_b
            writer.write(resp)
            await writer.drain()
            writer.close()
            return

        # 完成 WebSocket 握手
        accept = base64.b64encode(
            hashlib.sha1((key + WS_GUID).encode('utf-8')).digest()
        ).decode('ascii')
        resp = (
            'HTTP/1.1 101 Switching Protocols\r\n'
            'Upgrade: websocket\r\n'
            'Connection: Upgrade\r\n'
            f'Sec-WebSocket-Accept: {accept}\r\n\r\n'
        )
        writer.write(resp.encode('utf-8'))
        await writer.drain()

        conn.id = next_id
        next_id += 1
        print(f'[connect] #{conn.id}', flush=True)

        while True:
            data = await reader.read(4096)
            if not data:
                break
            conn.buf += data
            messages, conn.buf = decode_frames(conn.buf)
            for kind, payload in messages:
                if kind == 'close':
                    return
                elif kind == 'ping':
                    try:
                        writer.write(bytes([0x8A, len(payload)]) + payload)
                        await writer.drain()
                    except Exception:
                        pass
                elif kind == 'text':
                    handle_message(conn, payload)
            try:
                await writer.drain()
            except Exception:
                pass

    except (ConnectionResetError, asyncio.IncompleteReadError, OSError):
        pass
    except Exception:
        pass
    finally:
        if conn.room:
            leave_room(conn)
        try:
            writer.close()
        except Exception:
            pass


# ----------------------------- 心跳(超时踢出) -----------------------------
async def heartbeat():
    while True:
        await asyncio.sleep(15)
        now = time.time()
        for code in list(rooms.keys()):
            r = rooms[code]
            dead = [pid for pid, p in r['players'].items() if now - p['last'] > 60]
            for pid in dead:
                p = r['players'][pid]
                send(p['conn'], {'t': 'kick', 'reason': 'timeout'})
                try:
                    p['conn'].writer.close()
                except Exception:
                    pass
                del r['players'][pid]
            if not r['players']:
                del rooms[code]


async def main():
    asyncio.create_task(heartbeat())
    server = await asyncio.start_server(handle_connection, HOST, PORT)
    print(f'[server] 四方洲行动联机服务器已启动: ws://{HOST}:{PORT}', flush=True)
    async with server:
        await server.serve_forever()


if __name__ == '__main__':
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print('\n[server] 已停止', flush=True)

v1.0

建议

/*------------Python联机------------*/
/*--------------tips---------------*/
/*--作为.txt类文件后要将后缀改为.py--*/
/*转换后并启用即可*/
# ============================================================================
# 四方洲行动 · 联机服务器(Python 零依赖版,仅用标准库 asyncio + 手写 WebSocket)
# 运行:python server.py   (可选环境变量 PORT 覆盖端口,默认 3210)
# 该服务器只负责「房间管理 + 状态转发」,不直接模拟游戏世界;
# 每个客户端各自模拟自己的玩家与敌人,服务器把其他玩家的状态广播出去。
# 与 server.js 协议完全一致,前端无需任何改动。
# ============================================================================
import asyncio
import base64
import hashlib
import json
import os
import random
import string
import time

PORT = int(os.environ.get('PORT', 3210))
HOST = os.environ.get('HOST', '0.0.0.0')
WS_GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'

# rooms: code -> {'host': id, 'players': {id: player}}
# player: {id, conn, name, x, z, yaw, hp, armor, ammo, reloading, running, weapon, mode, last}
rooms = {}
next_id = 1


def gen_code():
    chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'  # 去掉易混淆字符
    while True:
        c = ''.join(random.choice(chars) for _ in range(4))
        if c not in rooms:
            return c


def public_state(p):
    return {
        'id': p['id'], 'name': p['name'], 'x': p['x'], 'z': p['z'], 'yaw': p['yaw'],
        'hp': p['hp'], 'armor': p['armor'], 'ammo': p['ammo'],
        'reloading': p['reloading'], 'running': p['running'],
        'weapon': p['weapon'], 'mode': p['mode'],
    }


# ----------------------------- 帧编码(服务端 -> 客户端,不加掩码) -----------------------------
def encode_frame(text):
    payload = text.encode('utf-8')
    n = len(payload)
    if n < 126:
        header = bytes([0x81, n])
    elif n < 65536:
        header = bytes([0x81, 126]) + n.to_bytes(2, 'big')
    else:
        header = bytes([0x81, 127]) + n.to_bytes(8, 'big')
    return header + payload


# ----------------------------- 帧解码(客户端 -> 服务端,必带掩码) -----------------------------
def decode_frames(buf):
    messages = []
    offset = 0
    while offset + 2 <= len(buf):
        b0 = buf[offset]
        b1 = buf[offset + 1]
        opcode = b0 & 0x0F
        masked = (b1 & 0x80) == 0x80
        length = b1 & 0x7F
        p = offset + 2
        if length == 126:
            if p + 2 > len(buf):
                break
            length = int.from_bytes(buf[p:p + 2], 'big')
            p += 2
        elif length == 127:
            if p + 8 > len(buf):
                break
            length = int.from_bytes(buf[p:p + 8], 'big')
            p += 8
        mask_key = None
        if masked:
            if p + 4 > len(buf):
                break
            mask_key = buf[p:p + 4]
            p += 4
        if p + length > len(buf):
            break
        payload = buf[p:p + length]
        if masked and mask_key:
            payload = bytes(payload[i] ^ mask_key[i & 3] for i in range(length))
        offset = p + length
        if opcode == 0x8:
            messages.append(('close', b''))
        elif opcode == 0x9:
            messages.append(('ping', payload))
        elif opcode == 0x1:
            messages.append(('text', payload.decode('utf-8', errors='replace')))
        # 0xA pong / 0x0 续帧:本 MVP 不处理(浏览器短消息均为单帧)
    return messages, buf[offset:]


# ----------------------------- 发送 / 广播 / 离开 -----------------------------
def send(conn, obj):
    try:
        conn.writer.write(encode_frame(json.dumps(obj)))
    except Exception:
        pass


def broadcast(code, obj, except_id=None):
    r = rooms.get(code)
    if not r:
        return
    for pid, p in list(r['players'].items()):
        if pid != except_id:
            send(p['conn'], obj)


def leave_room(conn):
    code = conn.room
    if not code or code not in rooms:
        conn.room = None
        return
    r = rooms[code]
    if conn.id in r['players']:
        del r['players'][conn.id]
    if not r['players']:
        del rooms[code]
        print(f'[room closed] {code}', flush=True)
    else:
        if r['host'] == conn.id:
            r['host'] = next(iter(r['players'].keys()))
            broadcast(code, {'t': 'host', 'host': r['host']})
        broadcast(code, {'t': 'peerLeave', 'id': conn.id})
    print(f'[leave] #{conn.id} left room {code} ({len(r["players"])} left)', flush=True)
    conn.room = None


# ----------------------------- 消息处理 -----------------------------
def handle_message(conn, text):
    global next_id
    try:
        m = json.loads(text)
    except Exception:
        return
    t = m.get('t')
    conn.is_alive = True

    if t == 'join':
        code = (m.get('room') or '').upper().strip()
        name = str(m.get('name') or '玩家')[:12]
        if code and code in rooms:
            r = rooms[code]
        else:
            if not code:
                code = gen_code()
            while code in rooms:
                code = gen_code()
            r = {'host': conn.id, 'players': {}}
            rooms[code] = r
        conn.room = code
        player = {
            'id': conn.id, 'conn': conn, 'name': name,
            'x': 0, 'z': 0, 'yaw': 0, 'hp': 100, 'armor': 0, 'ammo': 0,
            'reloading': False, 'running': False, 'weapon': '', 'mode': 'coop',
            'last': time.time(),
        }
        r['players'][conn.id] = player
        conn.player = player
        send(conn, {
            't': 'joined', 'id': conn.id, 'room': code, 'host': r['host'],
            'players': [public_state(pp) for pp in r['players'].values()],
        })
        broadcast(code, {'t': 'peerJoin', 'id': conn.id, 'name': name, 'host': r['host']}, conn.id)
        print(f'[join] {name}(#{conn.id}) -> room {code} ({len(r["players"])} players)', flush=True)

    elif t == 'state':
        r = rooms.get(conn.room)
        if not r:
            return
        p = r['players'].get(conn.id)
        if not p:
            return
        s = m.get('s', {})
        p['x'] = float(s.get('x') or 0)
        p['z'] = float(s.get('z') or 0)
        p['yaw'] = float(s.get('yaw') or 0)
        p['hp'] = float(s.get('hp'))
        p['armor'] = float(s.get('armor'))
        p['ammo'] = float(s.get('ammo'))
        p['reloading'] = bool(s.get('reloading'))
        p['running'] = bool(s.get('running'))
        p['weapon'] = s.get('weapon') or ''
        p['mode'] = s.get('mode') or 'coop'
        p['last'] = time.time()
        broadcast(conn.room, {'t': 'state', 'id': conn.id, 's': public_state(p)}, conn.id)

    elif t == 'shoot':
        r = rooms.get(conn.room)
        if not r:
            return
        name = r['players'].get(conn.id, {}).get('name', '')
        broadcast(conn.room, {'t': 'shoot', 'id': conn.id, 'name': name,
                              'o': m.get('o'), 'd': m.get('d'),
                              'dmg': m.get('dmg'), 'w': m.get('w')}, conn.id)

    elif t == 'reload':
        r = rooms.get(conn.room)
        if not r:
            return
        broadcast(conn.room, {'t': 'reload', 'id': conn.id}, conn.id)

    elif t == 'chat':
        r = rooms.get(conn.room)
        if not r:
            return
        name = r['players'].get(conn.id, {}).get('name', '')
        broadcast(conn.room, {'t': 'chat', 'id': conn.id, 'name': name,
                              'msg': str(m.get('msg') or '')[:200]}, conn.id)

    elif t == 'leave':
        leave_room(conn)


# ----------------------------- 连接处理 -----------------------------
async def handle_connection(reader, writer):
    global next_id
    conn = type('Conn', (), {})()
    conn.reader = reader
    conn.writer = writer
    conn.buf = b''
    conn.id = None
    conn.room = None
    conn.player = None
    conn.is_alive = True

    try:
        # 读取 HTTP 头(WebSocket 握手 或 普通 HTTP 健康检查)
        header_data = b''
        while b'\r\n\r\n' not in header_data:
            chunk = await reader.read(1024)
            if not chunk:
                writer.close()
                return
            header_data += chunk
            if len(header_data) > 65536:
                break
        header_text = header_data.split(b'\r\n\r\n')[0].decode('utf-8', errors='replace')
        key = None
        upgrade = ''
        for line in header_text.split('\r\n'):
            if ':' in line:
                k, v = line.split(':', 1)
                k = k.strip().lower()
                v = v.strip()
                if k == 'upgrade':
                    upgrade = v
                elif k == 'sec-websocket-key':
                    key = v

        if not key or upgrade.lower() != 'websocket':
            # 普通 HTTP 请求:返回健康检查文本
            body = f'四方洲行动联机服务器运行中 · 房间数={len(rooms)} · 端口={PORT}\n'
            body_b = body.encode('utf-8')
            resp = ('HTTP/1.1 200 OK\r\nContent-Type: text/plain; charset=utf-8\r\n'
                    f'Content-Length: {len(body_b)}\r\n\r\n').encode() + body_b
            writer.write(resp)
            await writer.drain()
            writer.close()
            return

        # 完成 WebSocket 握手
        accept = base64.b64encode(
            hashlib.sha1((key + WS_GUID).encode('utf-8')).digest()
        ).decode('ascii')
        resp = (
            'HTTP/1.1 101 Switching Protocols\r\n'
            'Upgrade: websocket\r\n'
            'Connection: Upgrade\r\n'
            f'Sec-WebSocket-Accept: {accept}\r\n\r\n'
        )
        writer.write(resp.encode('utf-8'))
        await writer.drain()

        conn.id = next_id
        next_id += 1
        print(f'[connect] #{conn.id}', flush=True)

        while True:
            data = await reader.read(4096)
            if not data:
                break
            conn.buf += data
            messages, conn.buf = decode_frames(conn.buf)
            for kind, payload in messages:
                if kind == 'close':
                    return
                elif kind == 'ping':
                    try:
                        writer.write(bytes([0x8A, len(payload)]) + payload)
                        await writer.drain()
                    except Exception:
                        pass
                elif kind == 'text':
                    handle_message(conn, payload)
            try:
                await writer.drain()
            except Exception:
                pass

    except (ConnectionResetError, asyncio.IncompleteReadError, OSError):
        pass
    except Exception:
        pass
    finally:
        if conn.room:
            leave_room(conn)
        try:
            writer.close()
        except Exception:
            pass


# ----------------------------- 心跳(超时踢出) -----------------------------
async def heartbeat():
    while True:
        await asyncio.sleep(15)
        now = time.time()
        for code in list(rooms.keys()):
            r = rooms[code]
            dead = [pid for pid, p in r['players'].items() if now - p['last'] > 60]
            for pid in dead:
                p = r['players'][pid]
                send(p['conn'], {'t': 'kick', 'reason': 'timeout'})
                try:
                    p['conn'].writer.close()
                except Exception:
                    pass
                del r['players'][pid]
            if not r['players']:
                del rooms[code]


async def main():
    asyncio.create_task(heartbeat())
    server = await asyncio.start_server(handle_connection, HOST, PORT)
    print(f'[server] 四方洲行动联机服务器已启动: ws://{HOST}:{PORT}', flush=True)
    async with server:
        await server.serve_forever()


if __name__ == '__main__':
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print('\n[server] 已停止', flush=True)

共 2 条回复

LZC

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

MCJ_CHY

?