mzcopilot

van.mz.playerAdvanced (skill coloring, H1/L2 stars, radar, 2D, scout, XML) revived for current MZ + mzcopilot match-page player values & team total

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

You will need to install an extension such as Tampermonkey to install this script.

Tendrás que instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Tendrás que instalar una extensión como Tampermonkey antes de poder instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         mzcopilot
// @namespace    mzcopilot
// @version      4.28.2-mzc12
// @license      MIT
// @description  van.mz.playerAdvanced (skill coloring, H1/L2 stars, radar, 2D, scout, XML) revived for current MZ + mzcopilot match-page player values & team total
// @author       van + mzcopilot
// @match        https://www.managerzone.com/*
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_listValues
// @grant        GM_deleteValue
// @grant        GM_setClipboard
// @grant        GM_xmlhttpRequest
// @connect      www.x2x.fun
// @connect      sgj.x2x.fun
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/pako.min.js
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/dexie.min.js
// @require      https://cdn.jsdelivr.net/npm/[email protected]/js/md5.min.js
// @require      https://unpkg.com/vple/base64js.min.js
// @require      https://unpkg.com/vple/vple.min.js
// @require      https://unpkg.com/vple/echarts.min.js
// (No @updateURL/@downloadURL on purpose — this is our own fork; van's update URL
//  would clobber it back to the broken dead-CDN version. Add our own host URL here
//  later if we want auto-update.)
// ==/UserScript==

var vanGmMzModel = {

    language: {
        zh: {
            Name: "中文",
            GetPlayersHtml: "获取球员页面HTML",
            GetPlayersHtml2: "获取球员页面HTML(不用缓存)",
            Clear: "清空缓存",
            Save: "保存",
            Setting: "设置",
            Test: "测试",
            SettingTitle: "点击可对语言和XML导出进行设置",
            Language: "语言",
            XmlMode: "战术导出模式",
            XmlMode1: "顺序选择球员",
            XmlMode2: "根据位置选择球员(需提交数据到后台)",
            TacConf: "位置系数设置",
            AutoRun: "自动着色",
            AutoRun0: "仅打开页面时自动执行一次",
            AutoRun1: "随系统刷新自动着色(如果浏览器变卡请关闭此选项)",

            Pay: "如果你觉得好用,可通过打赏支持作者。",



            NotSureEx: "挂牌后属性可能有变动,不确定转会市场显示是否是真实属性,请自行甄别。<br/>属性变动时间",
            NotSure: "属性不确定",
            ManualColorTitle: "点击可手动着色 快捷键:ALT + A",
            ManualColor: "手动着色",
            Jijing: "比赛集锦",
            dongzuo: "球员动作",
            Copyxml1: "复制主队战术",
            Copyxml2: "复制客队战术",
            CopyXml: "数据已复制到剪切板",
            CopyXmlMsg: "战术已复制到剪切板",
            CopyXmlMsgError: "战术复制失败",
            BA_NORMAL: "BA_NORMAL",
            BA_WALL: "站人墙",
            BA_HOLD: "抱着球",
            BA_DOWN: "倒地",
            BA_HOLD_THROWIN: "界外球准备",
            BA_THROWIN: "界外球",
            BA_LEFT_FOOT_SHOT_FWD: "射门/长传(L)",
            BA_LEFT_FOOT_SHOT_BACK: "BA_LEFT_FOOT_SHOT_BACK",
            BA_LEFT_FOOT_SHOT_RIGHT: "BA_LEFT_FOOT_SHOT_RIGHT",
            BA_LEFT_FOOT_SHOT_LEFT: "BA_LEFT_FOOT_SHOT_LEFT",
            BA_RIGHT_FOOT_SHOT_FWD: "射门/长传(R)",
            BA_RIGHT_FOOT_SHOT_BACK: "BA_RIGHT_FOOT_SHOT_BACK",
            BA_RIGHT_FOOT_SHOT_RIGHT: "BA_RIGHT_FOOT_SHOT_RIGHT",
            BA_RIGHT_FOOT_SHOT_LEFT: "BA_RIGHT_FOOT_SHOT_LEFT",
            BA_LEFT_FOOT_PASS_FWD: "短传(L)",
            BA_LEFT_FOOT_PASS_BACK: "BA_LEFT_FOOT_PASS_BACK",
            BA_LEFT_FOOT_PASS_RIGHT: "BA_LEFT_FOOT_PASS_RIGHT",
            BA_LEFT_FOOT_PASS_LEFT: "BA_LEFT_FOOT_PASS_LEFT",
            BA_RIGHT_FOOT_PASS_FWD: "短传(R)",
            BA_RIGHT_FOOT_PASS_BACK: "BA_RIGHT_FOOT_PASS_BACK",
            BA_RIGHT_FOOT_PASS_RIGHT: "BA_RIGHT_FOOT_PASS_RIGHT",
            BA_RIGHT_FOOT_PASS_LEFT: "BA_RIGHT_FOOT_PASS_LEFT",
            BA_PICK_UP_BALL: "捡起球",
            BA_DROP_BALL: "放下球",
            BA_HEADER: "争顶",
            BA_TRIP: "丢失球权",
            BA_CELEBRATE: "庆祝进球",
            BA_GK_READY: "准备扑救",
            BA_GK_ACRO_LEFT: "ACRO(L)",
            BA_GK_ACRO_LEFT_HOLD: "ACRO_HOLD(L)",
            BA_GK_ACRO_RIGHT: "ACRO(R)",
            BA_GK_ACRO_RIGHT_HOLD: "ACRO_HOLD(R)",
            BA_GK_SIDESTEP_LEFT: "移动(L)",
            BA_GK_SIDESTEP_RIGHT: "移动(R)",
            BA_GK_KICK: "BA_GK_KICK",
            BA_GK_THROW_BALL: "BA_GK_THROW_BALL",
            BA_GK_STRETCH_LEFT: "BA_GK_STRETCH_LEFT",
            BA_GK_STRETCH_LEFT_HOLD: "BA_GK_STRETCH_LEFT_HOLD",
            BA_GK_STRETCH_RIGHT: "BA_GK_STRETCH_RIGHT",
            BA_GK_STRETCH_RIGHT_HOLD: "BA_GK_STRETCH_RIGHT_HOLD",
            BA_BALL_OWNER: "控球",
            BA_TACKLE: "上抢",
            BA_SLIDING_TACKLE: "BA_SLIDING_TACKLE",
            BA_SLIDING_TACKLE_STAND: "BA_SLIDING_TACKLE_STAND",
            BA_MAX: "BA_MAX",
            BA_MY_1001: "头球攻门(L)",
            BA_MY_1002: "头球攻门(R)",
            BA_MY_1003: "卸下球",
            BA_MY_1011: "上抢(成功)",
            BA_MY_1012: "上抢(失败)",
            Unknown: "未知"


            ,
            training_pos: "无教练",
            training_camp: "进营",
            training_coach: "有教练",
            training_ycc: "调整",
            training_itc: "强化",
            training_neg: "掉球",
            training_unit: "格",
            training_unknown: "未知训练类型",
            training_ball_day: "离下一次涨球训练天数",
            training_part: "分段训练效率",
            training_total: "进度",
            training_avg: "平均",
            training_now: "当前训练进度",
            SkillsAnalysisTitle: "点击可手动着色和分析训练效率 快捷键:ALT + S",
            SkillsAnalysis: "训练效率分析"


            ,

            sug_T0: "首选:",
            sug_T1: "次选:",
            sug_T2: "可尝试:",
            sug_T3: "默认:",

            Pos9: "后卫",
            Pos7: "门将",
            Pos10: "边锋",
            Pos5: "前锋",
            Pos4: "中场",
            Pos56: "中锋",
            Pos21: "后腰",
            Pos22: "边卫",
            Pos23: "前腰",
            PosScores: "位置评分",
            Scores: "评分",

            sug_Loser: "关键属性容易早死,尽早交换或开除。",

            sug_PRI: "训练顺序:",
            attrName1: "速度",
            attrName2: "耐力",
            attrName3: "意识",
            attrName4: "传球",
            attrName5: "射门",
            attrName6: "头球",
            attrName7: "守门",
            attrName8: "控球",
            attrName9: "抢断",
            attrName10: "传中",
            attrName11: "定位"

            ,
            scoutReport: "球探报告"
            ,
            now: "当前",
            future: "可达",
            max: "最大可能"
        }
        ,

        en: {
            Name: "English",
            GetPlayersHtml: "Get players page",
            GetPlayersHtml2: "Get players page(No cache)",
            Clear: "Clear Cache",
            Save: "Save",
            Setting: "Setting",
            Test: "Test",
            SettingTitle: "Click setting language",
            Language: "Language",
            XmlMode: "Tactical Export Model",
            XmlMode1: "Sequential selection",
            XmlMode2: "Choose by location(need submit data to server)",
            TacConf: "Tactical Coefficient Setting",
            AutoRun: "Auto Colorable",
            AutoRun0: "By page loaded(Once)",
            AutoRun1: "By MZ Refresh",
            Pay: "Support the author.",

            NotSureEx: "Skills may change after entering the transfer market.<br/>Change time ",
            NotSure: "Uncertain skill",
            ManualColorTitle: "Click the Colorable Skill. Shortcut key : ALT + A",
            ManualColor: "Colorable Skill",
            Jijing: "Events",
            dongzuo: "PlayerStatus",
            Copyxml1: "CopyXML(home)",
            Copyxml2: "CopyXML(away)",
            CopyXml: "The data has been copied to the clipboard!",
            CopyXmlMsg: "The tactic was copied to the Clipboard!",
            CopyXmlMsgError: "Copy error!",
            BA_NORMAL: "Normal",
            BA_WALL: "Wall",
            BA_HOLD: "Hold",
            BA_DOWN: "Down",
            BA_HOLD_THROWIN: "HoldThrowin",
            BA_THROWIN: "Throwin",
            BA_LEFT_FOOT_SHOT_FWD: "FootShot(L)",
            BA_LEFT_FOOT_SHOT_BACK: "FootShotBack(L)",
            BA_LEFT_FOOT_SHOT_RIGHT: "FootShotRight(L)",
            BA_LEFT_FOOT_SHOT_LEFT: "FootShotLeft(L)",
            BA_RIGHT_FOOT_SHOT_FWD: "FootShot(R)",
            BA_RIGHT_FOOT_SHOT_BACK: "FootShotBack(R)",
            BA_RIGHT_FOOT_SHOT_RIGHT: "FootShotRight(R)",
            BA_RIGHT_FOOT_SHOT_LEFT: "FootShotLeft(R)",
            BA_LEFT_FOOT_PASS_FWD: "FootPass(L)",
            BA_LEFT_FOOT_PASS_BACK: "FootPassBack(L)",
            BA_LEFT_FOOT_PASS_RIGHT: "FootPassRight(L)",
            BA_LEFT_FOOT_PASS_LEFT: "FootPassLeft(L)",
            BA_RIGHT_FOOT_PASS_FWD: "FootPass(R)",
            BA_RIGHT_FOOT_PASS_BACK: "FootPassBack(R)",
            BA_RIGHT_FOOT_PASS_RIGHT: "FootPassRight(R)",
            BA_RIGHT_FOOT_PASS_LEFT: "FootPassLeft(R)",
            BA_PICK_UP_BALL: "PickUpBall",
            BA_DROP_BALL: "DropBall",
            BA_HEADER: "Header",
            BA_TRIP: "Trip",
            BA_CELEBRATE: "Celebrate",
            BA_GK_READY: "GkReady",
            BA_GK_ACRO_LEFT: "GkAcroLeft",
            BA_GK_ACRO_LEFT_HOLD: "GkAcroLeftHold",
            BA_GK_ACRO_RIGHT: "GkAcroRight",
            BA_GK_ACRO_RIGHT_HOLD: "GkAcroRightHold",
            BA_GK_SIDESTEP_LEFT: "GkSidestepLeft",
            BA_GK_SIDESTEP_RIGHT: "GkSidestepRight",
            BA_GK_KICK: "GkKick",
            BA_GK_THROW_BALL: "GkThrowBall",
            BA_GK_STRETCH_LEFT: "GkStretchLeft",
            BA_GK_STRETCH_LEFT_HOLD: "GkStretchLeftHold",
            BA_GK_STRETCH_RIGHT: "GkStretchRight",
            BA_GK_STRETCH_RIGHT_HOLD: "GkStretchRightHold",
            BA_BALL_OWNER: "BallOwner",
            BA_TACKLE: "Tackle",
            BA_SLIDING_TACKLE: "SlidingTackle",
            BA_SLIDING_TACKLE_STAND: "SlidingTackleStand",
            BA_MAX: "Max",
            BA_MY_1001: "HeadGoal(L)",
            BA_MY_1002: "HeadGoal(R)",
            BA_MY_1003: "StopTheBall",
            BA_MY_1011: "Tackle(Success)",
            BA_MY_1012: "Tackle(Fail)",
            Unknown: "Unknown"



            ,
            training_pos: "No coach",
            training_camp: "CAMP",
            training_coach: "Coach",
            training_ycc: "Ycc",
            training_itc: "Itc",
            training_neg: "Neg",
            training_unit: "↑",
            training_unknown: "Unknown training",
            training_ball_day: "Next ball days",
            training_part: "Training efficiency",
            training_total: "Total",
            training_avg: "Avg",
            training_now: "Now",
            SkillsAnalysisTitle: "Colorable Skill and Analysis of Training Efficiency Shortcut key :ALT + S",
            SkillsAnalysis: "Colorable By Graphs"



            ,
            sug_T0: "First plan:",
            sug_T1: "Second plan:",
            sug_T2: "May try:",
            sug_T3: "Default:",

            Pos9: "CB",
            Pos7: "GK",
            Pos10: "WF",
            Pos5: "ST",
            Pos4: "MF",
            Pos56: "CF",
            Pos21: "DM",
            Pos22: "WB",
            Pos23: "AMF",
            PosScores: "Tactics score",
            Scores: "Scores",

            sug_Loser: "Key skills too low.Exchange or dismiss as soon as possible.",

            sug_PRI: "Training order:",
            attrName1: "Speed",
            attrName2: "Stamina",
            attrName3: "Play Intelligence",
            attrName4: "Passing",
            attrName5: "Shooting",
            attrName6: "Heading",
            attrName7: "Keeping",
            attrName8: "Ball Control",
            attrName9: "Tackling",
            attrName10: "Aerial Passing",
            attrName11: "Set Plays"
            ,
            scoutReport: "Scout Report",
            now: "now",
            future: "attainable",
            max: "max"
        }

        ,
        es: {
            Name: "Español",
            GetPlayersHtml: "Página de jugadores",
            GetPlayersHtml2: "Página de jugadores(sin caché)",
            Clear: "Vaciar el caché",
            Save: "Guardar",
            Setting: "Ajustes",
            Test: "Test",
            SettingTitle: "Haga clic en configuración Idioma",
            Language: "Idioma",

            XmlMode: "Tactical Export Model",
            XmlMode1: "Secuencia de selección",
            XmlMode2: "Elegir por locación (necesita suministrar datos al servidor)",
            TacConf: "Tactical Coefficient Setting",
            AutoRun: "Auto Coloreable",
            AutoRun0: "Por página cargada (sólo una vez)",
            AutoRun1: "Por recargar MZ",
            Pay: "Apoya al autor.",

            NotSureEx: "Las skills pueden cambiar después de ingresar al mercado. <br/> Cambiar hora ",
            NotSure: "Skill incierta",
            ManualColorTitle: "Haga clic en la skill para colorear. Acceso directo: ALT + A",
            ManualColor: "Color de la skill",
            Jijing: "Eventos",
            dongzuo: "PlayerStatus",
            Copyxml1: "CopiarXML(local)",
            Copyxml2: "CopiarXML(visitante)",
            CopyXml: "Los datos se han copiado al portapapeles",
            CopyXmlMsg: "La táctica fue copiada al portapapeles",
            CopyXmlMsgError: "¡Error al copiar!",
            BA_NORMAL: "Normal",
            BA_WALL: "Wall",
            BA_HOLD: "Hold",
            BA_DOWN: "Down",
            BA_HOLD_THROWIN: "HoldThrowin",
            BA_THROWIN: "Throwin",
            BA_LEFT_FOOT_SHOT_FWD: "FootShot(L)",
            BA_LEFT_FOOT_SHOT_BACK: "FootShotBack(L)",
            BA_LEFT_FOOT_SHOT_RIGHT: "FootShotRight(L)",
            BA_LEFT_FOOT_SHOT_LEFT: "FootShotLeft(L)",
            BA_RIGHT_FOOT_SHOT_FWD: "FootShot(R)",
            BA_RIGHT_FOOT_SHOT_BACK: "FootShotBack(R)",
            BA_RIGHT_FOOT_SHOT_RIGHT: "FootShotRight(R)",
            BA_RIGHT_FOOT_SHOT_LEFT: "FootShotLeft(R)",
            BA_LEFT_FOOT_PASS_FWD: "FootPass(L)",
            BA_LEFT_FOOT_PASS_BACK: "FootPassBack(L)",
            BA_LEFT_FOOT_PASS_RIGHT: "FootPassRight(L)",
            BA_LEFT_FOOT_PASS_LEFT: "FootPassLeft(L)",
            BA_RIGHT_FOOT_PASS_FWD: "FootPass(R)",
            BA_RIGHT_FOOT_PASS_BACK: "FootPassBack(R)",
            BA_RIGHT_FOOT_PASS_RIGHT: "FootPassRight(R)",
            BA_RIGHT_FOOT_PASS_LEFT: "FootPassLeft(R)",
            BA_PICK_UP_BALL: "Toma la pelota",
            BA_DROP_BALL: "Tira la pelota al césped",
            BA_HEADER: "Cabezazo",
            BA_TRIP: "Trip",
            BA_CELEBRATE: "Celebración",
            BA_GK_READY: "Arquero preparado",
            BA_GK_ACRO_LEFT: "GkAcroLeft",
            BA_GK_ACRO_LEFT_HOLD: "GkAcroLeftHold",
            BA_GK_ACRO_RIGHT: "GkAcroRight",
            BA_GK_ACRO_RIGHT_HOLD: "GkAcroRightHold",
            BA_GK_SIDESTEP_LEFT: "Arquero da un paso a la izquierda",
            BA_GK_SIDESTEP_RIGHT: "Arquero da un paso a la derecha",
            BA_GK_KICK: "Arquero da una patada",
            BA_GK_THROW_BALL: "GkThrowBall",
            BA_GK_STRETCH_LEFT: "GkStretchLeft",
            BA_GK_STRETCH_LEFT_HOLD: "GkStretchLeftHold",
            BA_GK_STRETCH_RIGHT: "GkStretchRight",
            BA_GK_STRETCH_RIGHT_HOLD: "GkStretchRightHold",
            BA_BALL_OWNER: "Con la pelota en los pies",
            BA_TACKLE: "Entrada",
            BA_SLIDING_TACKLE: "Barrida",
            BA_SLIDING_TACKLE_STAND: "SlidingTackleStand",
            BA_MAX: "Max",
            BA_MY_1001: "HeadGoal(L)",
            BA_MY_1002: "HeadGoal(R)",
            BA_MY_1003: "Frena la pelota",
            BA_MY_1011: "Entrada(acertada)",
            BA_MY_1012: "Entrada(fallida)",
            Unknown: "Desconocido"


            ,
            training_pos: "Sin entrenador",
            training_camp: "CAMP",
            training_coach: "Coach",
            training_ycc: "YCC",
            training_itc: "ITC",
            training_neg: "Neg",
            training_unit: "↑",
            training_unknown: "Entrenamiento desconocido",
            training_ball_day: "Días para ganar una pelotita",
            training_part: "Eficacia de entrenamiento",
            training_total: "Total",
            training_avg: "Avg",
            training_now: "Ahora",
            SkillsAnalysisTitle: "Skills y análisis de eficacia de entrenamiento coloreables al presionar: ALT + S",
            SkillsAnalysis: "Coloreable por gráficos"


            ,
            sug_T0: "Primera opción:",
            sug_T1: "Segunda opción:",
            sug_T2: "Podrías intentar:",
            sug_T3: "Predeterminado:",

            Pos9: "Centro defensor",
            Pos7: "Arquero",
            Pos10: "Delantero lateral",
            Pos5: "Segundo delantero",
            Pos4: "Centrocampista",
            Pos56: "Miediocampista/Anchor",
            Pos21: "DM",
            Pos22: "WB",
            Pos23: "AMF",
            PosScores: "Puntuación táctica",
            Scores: "Puntuación",

            sug_Loser: "Habilidades clave demasiado bajas. Intercambialo lo más antes posible.",

            sug_PRI: "Orden de entrenamiento:",
            attrName1: "Velocidad",
            attrName2: "Resistencia",
            attrName3: "Inteligencia",
            attrName4: "Pases",
            attrName5: "Remates",
            attrName6: "Cabezazos",
            attrName7: "Atajando",
            attrName8: "Control de balón",
            attrName9: "Entradas",
            attrName10: "Pases Largos",
            attrName11: "Balón Parado"
            ,
            scoutReport: "REPORTE DE SCOUTEO",
            now: "ahora",
            future: "realizable",
            max: "máximo"
        }
        ,

        br: {
            Name: "Português",
            GetPlayersHtml: "Página de jogadores",
            GetPlayersHtml2: "Página de jugadores(sem cache)",
            Clear: "Esvaziar o cache",
            Save: "Salvar",
            Setting: "Configurações",
            Test: "Teste",
            SettingTitle: "Clique para configurar linguagem",
            Language: "Linguagem",
            XmlMode: "Exportar Modelo Tático",
            XmlMode1: "Seleção Sequencial",
            XmlMode2: "Escolha localização (precisa submeter dados ao servidor)",
            TacConf: "Configuração de Coeficiente Tático",
            AutoRun: "Auto Colorir",
            AutoRun0: "Por página carregada(Uma vez)",
            AutoRun1: "Recarregada do MZ",
            Pay: "Apoie o autor.",

            NotSureEx: "Habilidades podem mudar depois de entrar no mercado de transferências.<br/>Hora da mudança ",
            NotSure: "Habilidade incerta",
            ManualColorTitle: "Clique na habilidade colorida. Tecla de atalho: ALT + A",
            ManualColor: "Habilidade colorida",
            Jijing: "Eventos",
            dongzuo: "Status do jogador",
            Copyxml1: "Copiar XML(mandante)",
            Copyxml2: "Copiar XML(visitante)",
            CopyXml: "Os dados foram copiados para a área de transferência!",
            CopyXmlMsg: "A tática foi copiada para a área de transferências!",
            CopyXmlMsgError: "Erro na cópia!",
            BA_NORMAL: "Normal",
            BA_WALL: "Wall",
            BA_HOLD: "Hold",
            BA_DOWN: "Down",
            BA_HOLD_THROWIN: "HoldThrowin",
            BA_THROWIN: "Throwin",
            BA_LEFT_FOOT_SHOT_FWD: "FootShot(L)",
            BA_LEFT_FOOT_SHOT_BACK: "FootShotBack(L)",
            BA_LEFT_FOOT_SHOT_RIGHT: "FootShotRight(L)",
            BA_LEFT_FOOT_SHOT_LEFT: "FootShotLeft(L)",
            BA_RIGHT_FOOT_SHOT_FWD: "FootShot(R)",
            BA_RIGHT_FOOT_SHOT_BACK: "FootShotBack(R)",
            BA_RIGHT_FOOT_SHOT_RIGHT: "FootShotRight(R)",
            BA_RIGHT_FOOT_SHOT_LEFT: "FootShotLeft(R)",
            BA_LEFT_FOOT_PASS_FWD: "FootPass(L)",
            BA_LEFT_FOOT_PASS_BACK: "FootPassBack(L)",
            BA_LEFT_FOOT_PASS_RIGHT: "FootPassRight(L)",
            BA_LEFT_FOOT_PASS_LEFT: "FootPassLeft(L)",
            BA_RIGHT_FOOT_PASS_FWD: "FootPass(R)",
            BA_RIGHT_FOOT_PASS_BACK: "FootPassBack(R)",
            BA_RIGHT_FOOT_PASS_RIGHT: "FootPassRight(R)",
            BA_RIGHT_FOOT_PASS_LEFT: "FootPassLeft(R)",
            BA_PICK_UP_BALL: "Pega a bola",
            BA_DROP_BALL: "Deixa a bola",
            BA_HEADER: "Cabeceio",
            BA_TRIP: "Trip",
            BA_CELEBRATE: "Celebração",
            BA_GK_READY: "Goleiro pronto",
            BA_GK_ACRO_LEFT: "GkAcroLeft",
            BA_GK_ACRO_LEFT_HOLD: "GkAcroLeftHold",
            BA_GK_ACRO_RIGHT: "GkAcroRight",
            BA_GK_ACRO_RIGHT_HOLD: "GkAcroRightHold",
            BA_GK_SIDESTEP_LEFT: "Goleiro dá passo à esquerda",
            BA_GK_SIDESTEP_RIGHT: "Goleiro dá passo à direita",
            BA_GK_KICK: "Goleiro chuta",
            BA_GK_THROW_BALL: "GkThrowBall",
            BA_GK_STRETCH_LEFT: "GkStretchLeft",
            BA_GK_STRETCH_LEFT_HOLD: "GkStretchLeftHold",
            BA_GK_STRETCH_RIGHT: "GkStretchRight",
            BA_GK_STRETCH_RIGHT_HOLD: "GkStretchRightHold",
            BA_BALL_OWNER: "Com a bola nos pés",
            BA_TACKLE: "Desarme",
            BA_SLIDING_TACKLE: "Carrinho",
            BA_SLIDING_TACKLE_STAND: "SlidingTackleStand",
            BA_MAX: "Max",
            BA_MY_1001: "HeadGoal(L)",
            BA_MY_1002: "HeadGoal(R)",
            BA_MY_1003: "Pára a bola",
            BA_MY_1011: "Desarme(Sucesso)",
            BA_MY_1012: "Desarme(Falha)",
            Unknown: "Desconhecido"



            ,
            training_pos: "Sem treinador",
            training_camp: "CAMP",
            training_coach: "Coach",
            training_ycc: "Ycc",
            training_itc: "Itc",
            training_neg: "Neg",
            training_unit: "↑",
            training_unknown: "Treinamento desconhecido",
            training_ball_day: "Dias para ganhar bola",
            training_part: "Eficiência de treinamento",
            training_total: "Total",
            training_avg: "Avg",
            training_now: "Agora",
            SkillsAnalysisTitle: "Tecla de atalho de Habilidades coloridas e Análise de Eficiência de treinamento: ALT + S",
            SkillsAnalysis: "Colorir por gráficos"



            ,
            sug_T0: "Primeira opção:",
            sug_T1: "Segunda opção:",
            sug_T2: "Pode tentar:",
            sug_T3: "Padrão:",

            Pos9: "Zagueiro central",
            Pos7: "Goleiro",
            Pos10: "Ponta",
            Pos5: "Segundo atacante",
            Pos4: "Meia Central",
            Pos56: "Meio-campo/Volante",
            Pos21: "DM",
            Pos22: "WB",
            Pos23: "AMF",
            PosScores: "Pontuação tática",
            Scores: "Pontuação",

            sug_Loser: "Habilidades principais muito baixas. Troque ou dispense o mais breve possível.",

            sug_PRI: "Ordem de treinamento:",
            attrName1: "Velocidade",
            attrName2: "Resistência",
            attrName3: "Inteligência",
            attrName4: "Passe Curto",
            attrName5: "Chute",
            attrName6: "Cabeceio",
            attrName7: "Defesa a Gol",
            attrName8: "Controle de Bola",
            attrName9: "Desarme",
            attrName10: "Passe Longo",
            attrName11: "Bola Parada"
            ,
            scoutReport: "Relatório de Observador",
            now: "agora",
            future: "realizável",
            max: "máximo"
        }
    }
    ,
    scoutLocList: { "9": { "Prop": { "1": 0, "2": 0, "9": 1, "10": 2, "8": 2, "3": 2, "4": 2, "6": 2 }, "Order": [1, 2, 9, 10, 8, 3, 4, 6], "CampKey": "9" }, "7": { "Prop": { "2": 0, "7": 1, "3": 1, "1": 1, "10": 2, "11": 2, "8": 2 }, "Order": [2, 7, 3, 1, 10, 11, 8], "CampKey": "7" }, "10": { "Prop": { "1": 0, "2": 0, "10": 1, "8": 1, "9": 2, "4": 2, "5": 2, "6": 2 }, "Order": [1, 2, 10, 8, 9, 4, 5, 6], "CampKey": "10" }, "5": { "Prop": { "1": 0, "2": 0, "5": 1, "8": 1, "6": 1, "3": 2, "4": 2, "10": 2, "9": 2 }, "Order": [1, 2, 5, 8, 6, 3, 4, 10, 9], "CampKey": "5" }, "4": { "Prop": { "1": 0, "2": 0, "4": 1, "8": 1, "3": 1, "10": 2, "9": 2, "5": 2, "6": 2 }, "Order": [1, 2, 4, 8, 3, 10, 9, 5, 6], "CampKey": "4" }, "5,6": { "Prop": { "2": 0, "1": 0, "5": 1, "6": 1, "8": 1, "3": 2, "4": 2, "10": 2, "9": 2 }, "Order": [2, 1, 5, 8, 6, 3, 4, 10, 9], "CampKey": "56" } }
    ,
    OKeys: ["9", "7", "10", "5", "4", "5,6"]
    ,
    CTable: function () {
        //key value
        this.data = {};
        //keys
        this.keys = new Array();
        this.addData = function (key, value) {
            if (this.data[key] == undefined) {
                this.keys.push(key);
                this.keys.sort(function (a, b) {
                    return a - b;
                });
            }
            this.data[key] = value;
        };
        this.getVal = function (i) {
            if (this.data[i] == undefined) {
                //
            } else {
                return this.data[i];
            }
        };
        this.GetX = function (i) {
            let rv = this.getVal(i);
            rv = Math.floor(rv * 214 / 1000) - 3;
            return rv;
        };
        this.GetY = function (i) {
            let rv = this.getVal(i);
            rv = Math.floor(rv * 328 / 1000) - 1;
            return rv;
        };
    }
    ,

    mzcamp: function () {
        this.data = {};
        this.name = null;
        this.keys = new Array();
        this.index = 0;
        this.add = function (begin, end) {
            if (end > begin + 2937600000) {
                end = begin + 2937600000;
            }
            if (this.data[begin] == undefined) {
                this.keys.push(begin);
                this.keys.sort(function (a, b) {
                    return a - b;
                });
            }
            this.data[begin] = {
                begin: begin,
                end: end
            };
        };
        this.getItem = function (begin) {
            return this.data[begin];
        };
        this.resetIndex = function () {
            this.index = 0;
        };
        this.inYTC = function (x) {
            while (this.index < this.keys.length) {
                let item = this.data[this.keys[this.index]];
                if (x < item.begin) {
                    return false;
                } else if (x <= item.end) {
                    if (/\d/.test(item.name)) {
                        return false;
                    }
                    return true;
                }
                if (x > item.end) {
                    this.index++;
                }
            }
            return false;
        };
    }
    ,
    playerTrainingBySkill: function () {
        //涨球时间
        this.ballDay = 0;
        //训练统计
        this.stat = new vanGmMzModel.trainingStat();
        //当前球数
        this.skill = 0;
        //最后一次训练
        this.lt = 0;
    }
    ,
    trainingStat: function () {
        //所有 不包含掉球
        this.all = new vanGmMzModel.trainingDay();
        ////普通训练 无教练
        //this.pos = new vanGmMzModel.trainingDay();
        ////强化营
        //this.itc = new vanGmMzModel.trainingDay();
        ////调整营
        //this.ycc = new vanGmMzModel.trainingDay();
        ////掉球
        //this.neg = new vanGmMzModel.trainingDay();
        ////理疗
        //this.physio = new vanGmMzModel.trainingDay();
        ////有教练
        //this.coach = new vanGmMzModel.trainingDay();
        ////训练营
        //this.camp = new vanGmMzModel.trainingDay();
        //对某类型加1
        this.add = function (type, tn) {
            if (!this[type]) {
                this[type] = new vanGmMzModel.trainingDay();
            }
            this[type][tn] += 1;

        };
        this.getSum = function (canOver100) {
            let ret = 0;
            if (this.neg) {
                ret = this.all.getSum() - this.neg.getSum();
            } else {
                ret = this.all.getSum();
            }
            if (!canOver100) {
                if (ret >= 100) {
                    ret = 99.99;
                }
            }
            return ret;
        };
        this.getAvg = function () {
            //let ret = this.getSum() / (this.t1 * 1 + this.t2 * 1 + this.t3 * 1 + this.t4 * 1 + this.t5 * 1 + this.t6 * 1 + this.t7 * 1 + this.t8 * 1 + this.t9 * 1 + this.t10 * 1);
            //ret = parseFloat(ret).toFixed(1);
            //return ret;
            if (this.neg) {
                return -this.neg.getAvg();
            } else {
                return this.all.getAvg();
            }
        };
        this.getTnText = function (now_language) {
            let str = "";
            if (this.pos) {
                str += " " + now_language.training_pos + this.pos.getTnText(now_language);
            }
            if (this.camp) {
                str += " " + now_language.training_camp + this.camp.getTnText(now_language);
            }
            if (this.coach) {
                str += " " + now_language.training_coach + this.coach.getTnText(now_language);
            }
            if (this.ycc) {
                str += " " + now_language.training_ycc + this.ycc.getTnText(now_language);
            }
            if (this.itc) {
                str += " " + now_language.training_itc + this.itc.getTnText(now_language);
            }
            if (this.neg) {
                str += " " + now_language.training_neg + this.neg.getTnText(now_language);
            }
            return str;
        };
        //this.getAvgAndText = function () {
        //    //let ret = this.getSum() / (this.t1 * 1 + this.t2 * 1 + this.t3 * 1 + this.t4 * 1 + this.t5 * 1 + this.t6 * 1 + this.t7 * 1 + this.t8 * 1 + this.t9 * 1 + this.t10 * 1);
        //    //ret = parseFloat(ret).toFixed(1);
        //    //return ret;

        //    let ret = this.getAvg();
        //    let str = "";
        //    if (ret <= 0.4) {
        //        str = "1格";
        //    }
        //    else if (ret > 0.4 && ret <= 1.1) {
        //        str = "2格";
        //    }
        //    else if (ret > 0.4 && ret <= 2.1) {
        //        str = "2格";
        //    }



        //          this.t1  * 0.4  * 1
        //        + this.t2  * 0.55 * 2
        //        + this.t3  * 0.7  * 3
        //        + this.t4  * 0.85 * 4
        //        + this.t5  * 1    * 5
        //        + this.t6  * 1.15 * 6
        //        + this.t7  * 1.3  * 7
        //        + this.t8  * 1.45 * 8
        //        + this.t9  * 1.6  * 9
        //        + this.t10 * 1.75 * 10;
        //};
        this.getDayByAvg = function (avg) {
            let ret = (100 - this.getSum()) / avg;
            ret = parseFloat(ret).toFixed(1);
            return ret;
        };
        this.getDay = function () {
            if (this.coach) {
                return this.getDayByAvg(this.coach);
            } else if (this.pos) {
                return this.getDayByAvg(this.pos);
            }
            return undefined;
        };
    }
    ,
    trainingDay: function () {
        this.t1 = 0;
        this.t2 = 0;
        this.t3 = 0;
        this.t4 = 0;
        this.t5 = 0;
        this.t6 = 0;
        this.t7 = 0;
        this.t8 = 0;
        this.t9 = 0;
        this.t10 = 0;
        this.getSum = function () {
            let ret = this.t1 * 0.645 * 1 + this.t2 * 0.55 * 2 + this.t3 * 0.7 * 3 + this.t4 * 0.85 * 4 + this.t5 * 0.96 * 5 + this.t6 * 1.111 * 6 + this.t7 * 1.3 * 7 + this.t8 * 1.6 * 8 + this.t9 * 2.02 * 9 + this.t10 * 2.4 * 10;
            ret = parseFloat(ret).toFixed(1);
            return ret;
        };
        this.getAvg = function () {
            let ret = this.getSum() / (this.t1 * 1 + this.t2 * 1 + this.t3 * 1 + this.t4 * 1 + this.t5 * 1 + this.t6 * 1 + this.t7 * 1 + this.t8 * 1 + this.t9 * 1 + this.t10 * 1);
            ret = parseFloat(ret).toFixed(1);
            return ret;
        };
        this.getTnText = function (now_language) {
            let str = "";
            if (this.t1 > 0) {
                str += " 1" + now_language.training_unit + "(" + this.t1 + ")";
            }
            if (this.t2 > 0) {
                str += " 2" + now_language.training_unit + "(" + this.t2 + ")";
            }
            if (this.t3 > 0) {
                str += " 3" + now_language.training_unit + "(" + this.t3 + ")";
            }
            if (this.t4 > 0) {
                str += " 4" + now_language.training_unit + "(" + this.t4 + ")";
            }
            if (this.t5 > 0) {
                str += " 5" + now_language.training_unit + "(" + this.t5 + ")";
            }
            if (this.t6 > 0) {
                str += " 6" + now_language.training_unit + "(" + this.t6 + ")";
            }
            if (this.t7 > 0) {
                str += " 7" + now_language.training_unit + "(" + this.t7 + ")";
            }
            if (this.t8 > 0) {
                str += " 8" + now_language.training_unit + "(" + this.t8 + ")";
            }
            if (this.t9 > 0) {
                str += " 9" + now_language.training_unit + "(" + this.t9 + ")";
            }
            if (this.t10 > 0) {
                str += " 10" + now_language.training_unit + "(" + this.t10 + ")";
            }
            return str;
        };
    }
    ,
    mzreg: {
        td_skill_val: /(\d+)/,
        img_val: /(\d+)\.gif/,
        playerMax: /trainingField.players\s*=\s*({.+})/,
        playerId: /player_id_(\d+)/,
        bar_itc: /bar_itc_(\d+)/,
        bar_ycc: /bar_ycc_(\d+)/,
        bar_pos: /bar_pos_(\d+)/,
        bar_neg: /bar_neg_(\d+)/,
        trainingType: /&t=([^)]+)/,
        data2d_url: /matchviewer\/media/,
        shortlist_url: /\/?p=shortlist/,
        ruok_url: /\/?p=team&tid=572357/,
        playerId_tac: /pid=(\d+)/,
        matchResult: /\/?p=match&sub=result&mid=(\d+)/,
        nocache: /nocache-\d+/
        //data2d_url: /matchviewer\/getMatchFiles.php\?type=data&mid=\d+/
    },
    mzImg: {
        g: "data:image/gif;base64,R0lGODlhDAAKAJEDAP///8zM/wAA/////yH5BAEAAAMALAAAAAAMAAoAAAIk3CIpYZ0BABJtxvjMgojTIVwKpl0dCQbQJX3T+jpLNDXGlDUFADs=",
        r: "data:image/gif;base64,R0lGODlhDAAKAJEDAP////8AAMyZmf///yH5BAEAAAMALAAAAAAMAAoAAAIk3BQZYp0CAAptxvjMgojTEVwKpl0dCQrQJX3T+jpLNDXGlDUFADs=",
        b: "data:image/gif;base64,R0lGODlhDAAKAJEDAP///5mZmQAAAP///yH5BAEAAAMALAAAAAAMAAoAAAIk3CIpYZ0BABJtxvjMgojTIVwKpl0dCQbQJX3T+jpLNDXGlDUFADs=",
        p: "data:image/gif;base64,R0lGODlhDAAKAJEDAP///5lm/5kzzP///yH5BAEAAAMALAAAAAAMAAoAAAIk3CIpYZ0BABJtxvjMgojTIVwKpl0dCQbQJX3T+jpLNDXGlDUFADs=",
        x: "data:image/gif;base64,R0lGODlhBgAKAJEDAJnMZpmZmQAAAP///yH5BAEAAAMALAAAAAAGAAoAAAIRXCRhApAMgoPtVXXS2Lz73xUAOw=="
    },
    hImg: {
        g: "data:image/gif;base64,R0lGODlhDAAKALMNAOnt/+Xr/9ri/6/A/6G1/73L/52x/8/Z/4Wf/32Z/1x9/0Rr/x9N/////wAAAAAAACH5BAEAAA0ALAAAAAAMAAoAAAQwsDXD2FJB6sot0UnHLYckdoJ5VmmzWoi0nAuxSIEyW0qxJBrFAAAYKCoaSYgD1EQAADs=",
        r: "data:image/gif;base64,R0lGODlhDAAKANUkAOXq//8pKunt//ZTVPz19dXZ+tzk/+NAV+bl+Ojs//4wMeWkreXp/f4tLvRMT+Dm/+Xr/7lra/4vMepKSv7///ZRUvz8/tmHhs/Z/+xKSfVeYNCJkfhFRPUxOuBUZvRsb9ri//39//hDQv8oKf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACQALAAAAAAMAAoAAAZCQBLpMhqJMgiLkEQoOkeDwnLzdIowwuoTlNUWDRSSF/oIkUQBZ6BRAWiEkIlopPgsEhzPMgIQCBgOEiNLQh1PB4RBADs=",
        b: "data:image/gif;base64,R0lGODlhDAAKAMQUALW1teLi4oCAgMDAwB0dHevr6+3t7aCgoDMzM9nZ2bOzs0pKSszMzC0tLX9/f19fXz8/P5qamhISEgAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAABQALAAAAAAMAAoAAAU1IEUpkgQ5hahObNsAatTOTyLOMxHcOKvzvcdB1Oi9FqKCA1I6MR4RlWBgMAwEiIlKJGtFVSEAOw==",
        p: "data:image/gif;base64,R0lGODlhDAAKALMNAOnt/+Xr/9ri/6/A/6G1/73L/52x/8/Z/4Wf/32Z/1x9/4tQ/30+/////wAAAAAAACH5BAEAAA0ALAAAAAAMAAoAAAQwsDXD2FJB6sot0UnHLYckdoJ5VmmzWoi0nAuxSIEyW0qxJBrFAAAYKCoaSYgD1EQAADs=",
        x: "data:image/gif;base64,R0lGODlhBgAKAJEDAJnMZpmZmQAAAP///yH5BAEAAAMALAAAAAAGAAoAAAIRXCRhApAMgoPtVXXS2Lz73xUAOw=="
    }
    ,
    //以下为2D比赛辅助
    MatchEvent: function () {
        this.data = new Array();
        this.setAllPlayerEvent = function (team, tc) {
            for (let i = 0; i < tc.length; i++) {
                this.data.push(tc[i]);
            }

            for (let i = 0; i < team.m_players.length; i++) {
                let len = team.m_players[i].m_events.getLength();
                for (let j = 0; j < len; j++) {
                    this.data.push(team.m_players[i].m_events.at(j));
                }
            }
        };
        this.Sort = function () {
            this.data.sort(function (a, b) {
                return a.m_frame - b.m_frame;
            });
        };
    }
    ,
    OutOfPlay: function () {
        this.data = new Array();
        this.add = function (begin, end) {
            this.data.push({
                begin: begin,
                end: end
            });
        };
        this.resetIndex = function () {
            this.index = 0;
        };
        this.notin = function (frame) {
            while (this.index < this.data.length) {
                let item = this.data[this.index];
                if (frame < item.begin) {
                    return true;
                } else if (frame <= item.end) {
                    return false;
                }
                if (frame > item.end) {
                    this.index++;
                }
            }
            return true;
        };
        this.Sort = function () {
            this.data.sort(function (a, b) {
                return a.begin - b.begin;
            });
        }
    }

};

var vanGmMz = {
    now_sport: "soccer",
    now_language: vanGmMzModel.language.en
    ,
    pmax: {},
    tacP: {},
    tacCof: {},
    trainingInfo: {},
    vv: "",

    getMax: function (callback) {
        vple.ajax(
            "/?p=training&sport=" + vanGmMz.now_sport,
            function (data) {
                let result = data.match(vanGmMzModel.mzreg.playerMax);
                if (result) {
                    vanGmMz.pmax = JSON.parse(result[1]);
                    callback(vanGmMz.pmax);
                } else {
                    return true;
                }
            });
        return false;
    }
    ,
    setSrc: function (transfer, img, skill, maxed, skillBallDay, pid, k) {
        img.skill = skill;
        img.maxed = maxed;
        let old = true;
        let p_tr = $(img).parents("tr:first");
        if (p_tr.length == 0 || p_tr.attr("class")) {
            p_tr = $(img).nextAll(".skill_exact:first");
            old = false;
        }
        if (skill > 0) {
            let flag_exit = false;
            if (transfer && skillBallDay) {
                if (new Date().getTime() - skillBallDay < 345600000) {

                    vanGmMz.getTrainingGraphsBySkill_id(pid, k, function (data) {
                        let result = data.match(new RegExp('{"x":' + skillBallDay + ',"y":(\\d+),[^}]*"marker"'));
                        if (result && result.length) {
                            $(img).parents("tr:first").find("td.skillval").html("(<span class=\"" + (maxed === "red" ? "maxed" : "") + "\">" + result[1] + "</span>)");
                            vanGmMz.setSrc(false, img, parseInt(result[1]), maxed, false, pid, k);
                            flag_exit = true;
                            return true;
                        } else {
                            return false;
                        }
                    });
                    //$(img).parent().find("span").remove();
                    //$(img).parent().append("<span class=\"help_button_placeholder\"><a class=\"help_button\" href=\"#\" onclick=\"showHelpLayer('" + now_language.NotSureEx + new Date(skillBallDay).toLocaleString() + "', '" + now_language.NotSure + "', true); return false\"><span class=\"help_button_wrapper\"><span class=\"help_button_text\">?</span></span></a></span>");
                }
            }
            if (flag_exit) {
                return;
            }
            if (pid && vanGmMz.trainingInfo[pid][k]) {
                let extmp = p_tr.find(".skill_exact2");
                if (extmp.length > 0) {
                    extmp.remove();
                }
                let sum = 0;
                if (vanGmMz.trainingInfo[pid][k].neg && vanGmMz.trainingInfo[pid][k].neg[skill + 1]) {
                    sum = vanGmMz.trainingInfo[pid][k].neg[skill + 1].stat.getSum();
                } else if (vanGmMz.trainingInfo[pid][k][skill]) {
                    sum = vanGmMz.trainingInfo[pid][k][skill].stat.getSum();
                }
                if (old) {
                    p_tr.append("<td class='skill_exact2'><div><span id=" + pid + "_" + k + "_" + skill + " class='skillval skill_exact_van'>" + sum + "%</span></div></td>");
                } else {
                    p_tr.append("<div class='skill_exact2 clearfix' style='display:inline-block;'><div><span id=" + pid + "_" + k + "_" + skill + " class='skillval skill_exact_van'>" + sum + "%</span></div></div>");
                }
            }

            if (img.isYtc) {
                p_tr.children().eq(0).addClass("gm_ytc");
            }
        }
        let strdiv;
        if (old) {
            strdiv = "<div class='skill' style='font-size:0;padding: 0 0 0 4px;'>";
        } else {
            strdiv = "<div class='skilladd ignore-fluid'>";
        }
        let tmpImg = vanGmMzModel.mzImg;
        if (vanGmMz.now_sport != "soccer") {
            tmpImg = vanGmMzModel.hImg;
        }
        for (let i = 0; i < skill; i++) {
            if (maxed === "red") {
                strdiv += "<img src='" + tmpImg.r + "'>";
            }
            else if (maxed === "green") {
                strdiv += "<img src='" + tmpImg.g + "'>";
            } else {
                strdiv += "<img src='" + tmpImg.b + "'>";
            }
        }
        if (/blevel_/.test(img.src)) {
            strdiv += "<img src='" + tmpImg.x + "'>";
        }
        strdiv += "</div>";
        $(img).hide();
        if (old) {
            $(img).parent().find("div").remove();
        } else {
            $(img).nextAll("div.skilladd:first").remove();
        }
        $(img).after(strdiv);
    }
    ,
    showMax: function (GraphsType) {
        let players = $(".playerContainer");
        for (let i = 0; i < players.length; i++) {
            let pdom = players.eq(i);
            let pid = pdom.html().match(vanGmMzModel.mzreg.playerId)[1];
            let player = vanGmMz.pmax[pid];
            let imgs = pdom.find("div.player-skills").find("img.ignore-fluid");
            if (imgs.length == 0) {
                imgs = pdom.find("img.skill");
            }
            if (GraphsType == 0 && player) {
                this.setPlayerImgs(imgs, player);
                if (pdom.find(".scout_report").length > 0) {
                    vanGmMz.getScoutReport(pid, pdom);
                }
            } else if (pdom.find(".training_graphs").length > 0 && imgs.length > 0) {
                if (pdom.find(".scout_report").length > 0) {
                    vanGmMz.getScoutReport(pid, pdom);
                }
                else if(pdom.find(".scout_report_stars")) {
                    vanGmMz.getScoutReport(pid, pdom);
                }
                vanGmMz.getTrainingGraphs(pid, pdom, GraphsType);
            } else if (pdom.find(".scout_report").length > 0) {
                if (player) {
                    this.setPlayerImgs(imgs, player);
                } else {
                    for (let j = 0; j < imgs.length; j++) {
                        vanGmMz.setSrc(false, imgs[j], parseInt(imgs[j].src.match(vanGmMzModel.mzreg.img_val)[1]), "");
                    }
                }
                vanGmMz.getScoutReport(pid, pdom, GraphsType == 2);
            }
        }
        return false;
    }
    ,

    setPlayerImgs: function (imgs, player) {
        if (isNaN(parseInt(player.skills.stamina))) {
            for (let j = 0; j < imgs.length; j++) {
                vanGmMz.setSrc(false, imgs[j], parseInt(imgs[j].src.match(vanGmMzModel.mzreg.img_val)[1]), "");
            }
        } else {
            if (vanGmMz.now_sport == "soccer") {
                vanGmMz.setSrc(false, imgs[0], player.skills.speed, player.maxed.speed);
                vanGmMz.setSrc(false, imgs[1], player.skills.stamina, player.maxed.stamina);
                vanGmMz.setSrc(false, imgs[2], player.skills.gameintelligence, player.maxed.gameintelligence);
                vanGmMz.setSrc(false, imgs[3], player.skills.passing, player.maxed.passing);
                vanGmMz.setSrc(false, imgs[4], player.skills.shooting, player.maxed.shooting);
                vanGmMz.setSrc(false, imgs[5], player.skills.heading, player.maxed.heading);
                vanGmMz.setSrc(false, imgs[6], player.skills.goalkeeping, player.maxed.goalkeeping);
                vanGmMz.setSrc(false, imgs[7], player.skills.technique, player.maxed.technique);
                vanGmMz.setSrc(false, imgs[8], player.skills.tackling, player.maxed.tackling);
                vanGmMz.setSrc(false, imgs[9], player.skills.highpassing, player.maxed.highpassing);
                vanGmMz.setSrc(false, imgs[10], player.skills.situations, player.maxed.situations);
            }
            else {
                vanGmMz.setSrc(false, imgs[1], player.skills.gameintelligence, player.maxed.gameintelligence);
                vanGmMz.setSrc(false, imgs[2], player.skills.power, player.maxed.power);
                vanGmMz.setSrc(false, imgs[3], player.skills.skating, player.maxed.skating);
                vanGmMz.setSrc(false, imgs[4], player.skills.passing, player.maxed.passing);
                vanGmMz.setSrc(false, imgs[5], player.skills.quickness, player.maxed.quickness);
                vanGmMz.setSrc(false, imgs[6], player.skills.shooting, player.maxed.shooting);
                vanGmMz.setSrc(false, imgs[7], player.skills.goalkeeping, player.maxed.goalkeeping);
                vanGmMz.setSrc(false, imgs[8], player.skills.puckcontrol, player.maxed.puckcontrol);
                vanGmMz.setSrc(false, imgs[9], player.skills.checking, player.maxed.checking);
                vanGmMz.setSrc(false, imgs[10], player.skills.stamina, player.maxed.stamina);
            }
        }
    },
    drawPlayerByTrainingGraphs: function (pid, data, pdom) {
        let imgs = pdom.find("div.player-skills").find("img.ignore-fluid");
        let old = false;
        if (imgs.length == 0) {
            imgs = pdom.find("img.skill");
            old = true;
        }

        var series = undefined;
        eval(data);
        if (series == undefined) {
            return false;
        }
        let maxeds, skillBallDays, allSkillTraining_tmp;
        if (vanGmMz.now_sport == "soccer") {
            maxeds = ["green", "green", "green", "green", "green", "green", "green", "green", "green", "green", "green"];
            skillBallDays = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
            allSkillTraining_tmp = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
        } else {
            imgs.splice(0, 1);
            maxeds = ["green", "green", "green", "green", "green", "green", "green", "green", "green", "green"];
            skillBallDays = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
            allSkillTraining_tmp = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
        }
        let camp = new vanGmMzModel.mzcamp();

        let NowSeasonInfo = vanGmMz.D_GetNowSeasonInfo(xPlotLines);

        for (let i = 0; i < series.length; i++) {
            if ((series[i].type == "line" && series[i].color == "rgba(255,0,0,0.7)")) {
                if (series[i].data.length > 0) {
                    let g = series[i].data[0];
                    let index = g.y - 1;
                    if (index >= 0 && g.y <= 11) {
                        maxeds[index] = "red";
                    }
                }
            } else if ((series[i].type == "line" && series[i].color == "rgba(255,88,0,0.6)")) {
                //训练营线
                if (series[i].data && series[i].data.length == 2) {
                    camp.add(series[i].data[0].x, series[i].data[1].x);
                }
            }
            else {
                for (let j = 0; j < series[i].data.length; j++) {
                    let g = series[i].data[j];

                    if (g.y == "-3") {
                        let itemcamp = camp.getItem(g.x);
                        if (itemcamp) {
                            itemcamp.name = g.name;
                        }
                    }

                    let index = g.y - 1;
                    if (index >= 0 && g.y <= 11) {
                        if (g.name == "Maxed") {
                            maxeds[index] = "red";
                        }
                        if (g.marker && g.marker.symbol) {
                            if (allSkillTraining_tmp[index] == 0) {
                                allSkillTraining_tmp[index] = new Array();
                                allSkillTraining_tmp[index].push(new vanGmMzModel.playerTrainingBySkill());
                            }
                            if (/training_camp/.test(g.marker.symbol)) {
                                //训练营 判断是否是ytc
                                if (camp.inYTC(g.x)) {
                                    imgs[index].isYtc = true;
                                }

                            }

                            let playerTS;
                            //掉球单独列
                            if (/bar_neg/.test(g.marker.symbol)) {
                                if (allSkillTraining_tmp[index].neg == undefined) {
                                    allSkillTraining_tmp[index].neg = new Array();
                                }
                                if (/_ball/.test(g.marker.symbol) || /_puck/.test(g.marker.symbol)) {
                                    if (skillBallDays[index] < g.x) {
                                        skillBallDays[index] = g.x;
                                        playerTS = new vanGmMzModel.playerTrainingBySkill();
                                        playerTS.ballDay = g.x;
                                        allSkillTraining_tmp[index].neg.push(playerTS);
                                    }
                                } else if (allSkillTraining_tmp[index].neg.length == 0) {
                                    playerTS = new vanGmMzModel.playerTrainingBySkill();
                                    allSkillTraining_tmp[index].neg.push(playerTS);
                                } else {
                                    playerTS = allSkillTraining_tmp[index].neg[allSkillTraining_tmp[index].neg.length - 1];
                                }
                            } else {
                                playerTS = allSkillTraining_tmp[index][allSkillTraining_tmp[index].length - 1];
                                if (/_ball/.test(g.marker.symbol) || /_puck/.test(g.marker.symbol)) {
                                    if (skillBallDays[index] < g.x) {
                                        skillBallDays[index] = g.x;
                                        playerTS.ballDay = g.x;
                                        let next_playerTS = new vanGmMzModel.playerTrainingBySkill();
                                        next_playerTS.last = playerTS;
                                        allSkillTraining_tmp[index].push(next_playerTS);
                                    }
                                }
                            }
                            let result = g.marker.symbol.match(vanGmMzModel.mzreg.trainingType);
                            let type = "";
                            if (result && result.length > 0) {
                                switch (result[1]) {
                                    case "physio":
                                        //理疗
                                        type = "physio";
                                        break;
                                    case "coach":
                                        //有教练
                                        type = "coach";
                                        break;
                                    case "training_camp":
                                        //训练营
                                        type = "camp";
                                        break;
                                    case "training_camp_ycc":
                                        //调整营
                                        type = "ycc";
                                        break;
                                    case "training_camp_itc":
                                        //强化营
                                        type = "itc";
                                        break;
                                    default:
                                        //未知
                                        console.log(vanGmMz.now_language.training_unknown + ":" + result[1]);
                                        break;
                                }
                            }
                            vanGmMz.D_FillTraining(type, playerTS, g, NowSeasonInfo);
                        }
                    }
                }
            }
        }
        let allSkillTraining = new Array();
        for (let t1 = 0; t1 < allSkillTraining_tmp.length; t1++) {
            if (imgs[t1].nowSkill == undefined) {
                imgs[t1].nowSkill = parseInt(imgs[t1].src.match(vanGmMzModel.mzreg.img_val)[1]);
            }
            let tmp = {};
            let negCount = 0;
            if (allSkillTraining_tmp[t1].neg) {
                negCount = allSkillTraining_tmp[t1].neg.length;
                tmp.neg = {};
                for (let t3 = 0; t3 < allSkillTraining_tmp[t1].neg.length; t3++) {
                    let tmp3 = allSkillTraining_tmp[t1].neg[t3];
                    if (tmp3.stat.getSum() != 0) {
                        tmp3.skill = imgs[t1].nowSkill + negCount - t3;
                        tmp.neg[tmp3.skill] = tmp3;
                    }
                }
            }
            for (let t2 = 0; t2 < allSkillTraining_tmp[t1].length; t2++) {
                let tmp2 = allSkillTraining_tmp[t1][t2];
                if (tmp2.stat.getSum() != 0) {
                    tmp2.skill = imgs[t1].nowSkill + negCount + 1 - allSkillTraining_tmp[t1].length + t2;
                    tmp[tmp2.skill] = tmp2;
                }

                //test
                vanGmMz.vanlog(pid, tmp2, t1, t2);
            }
            allSkillTraining[t1] = tmp;

        }
        vanGmMz.trainingInfo[pid] = allSkillTraining;
        for (let k = 0; k < maxeds.length; k++) {
            vanGmMz.setSrc(pdom.find(".player_share_skills").length == 0, imgs[k], imgs[k].nowSkill, maxeds[k], skillBallDays[k], pid, k);
        }
        vanGmMz.D_NowSeasonText(pid, NowSeasonInfo, pdom);

        series = undefined;
        plotBands = undefined;
        xPlotLines = undefined;
        return true;
    }
    ,
    vanlog: function (pid, pt, t1, t2) {
    },
    fillTrainingLevel: function (type, reg, playerTS, url, isneg) {
        let result = url.match(reg);
        if (result && result.length > 0) {
            let stat = playerTS.stat;
            playerTS.lt = parseInt(result[1]);
            if (isneg) {
                stat.add(type, "t" + result[1]);
            } else {
                stat.add("all", "t" + result[1]);
                stat.add(type, "t" + result[1]);
            }
        }
    }
    ,

    getScoutReport: function (pid, pdom, showMB, nochecka) {
        let url = "/ajax.php?p=players&sub=scout_report&pid=" + pid + "&sport=" + vanGmMz.now_sport;
        let cache_mode = 1;
        if (pdom.find("#discard_youth_button").length) {
            url = "/ajax.php?p=players&sub=scout_report&pid=null&sport=" + vanGmMz.now_sport;
            cache_mode = 0;
        }
        vple.ajax(
            url,
            function (data) {
                if (!nochecka) {
                    if (pdom.find("a[href$='" + pid + "']").length == 0 && pdom.find("#player_id_" + pid).length == 0) {
                        return;
                    }
                }
                let srdom = $($.parseHTML(data));
                let remark = srdom.find("span.blurred span").text();
                let srdivs = srdom.find("dd div.flex-grow-1");
                if (srdivs.length == 3) {
                    let HS = srdivs.eq(0).find(".lit").length;
                    let LS = srdivs.eq(1).find(".lit").length;
                    let SS = srdivs.eq(2).find(".lit").length;
                    //Trzxyvopaxis
                    let Hspan = srdivs.eq(0).find(".blurred span");
                    let HArr = new Array();
                    for (let i = 0; i < Hspan.length; i++) {
                        if (Hspan.eq(i).text() != "Trzxyvopaxis") {
                            HArr.push(Hspan.eq(i).text());
                        }
                    }
                    let Lspan = srdivs.eq(1).find(".blurred span");
                    let LArr = new Array();
                    for (let i = 0; i < Lspan.length; i++) {
                        if (Lspan.eq(i).text() != "Trzxyvopaxis") {
                            LArr.push(Lspan.eq(i).text());
                        }
                    }

                    let HPids = [], LPids = [];

                    let skillnames = pdom.find("div.player-skills").find("span.responsive-hide.responsive-container");

                    if (skillnames.length == 0) {
                        skillnames = pdom.find("td > span.clippable");
                    }

                    let onMarket = false;
                    if(skillnames.length == 0){
                        skillnames = pdom.find("td > span.skill_name")
                        onMarket = true;
                    }
                    for (let i = 0; i < skillnames.length; i++) {
                        let skillText = onMarket ? skillnames.find("span:first").eq(i).text() : skillnames.eq(i).text()
                        if (HArr.indexOf(skillText) >= 0) {
                            skillnames.eq(i).parent().addClass("gm_scout_h");
                            skillnames.eq(i).parent().addClass("gm_s" + HS);
                            HPids.push(i + 1);
                        } else if (LArr.indexOf(skillText) >= 0) {
                            skillnames.eq(i).parent().removeClass("gm_scout_h");
                            skillnames.eq(i).parent().addClass("gm_s" + LS);
                            LPids.push(i + 1);
                        }
                        //else {
                        //    skillnames.eq(i).parent().removeClass("gm_scout_h");
                        //    skillnames.eq(i).parent().removeClass("gm_s*");
                        //}
                    }

                    $("#GM_scout_" + pid).remove();
                    let nsavgstat = "<span id='GM_scout_" + pid + "'>[H" + HS + " " + HArr[0] + "," + HArr[1] + "] [L" + LS + " " + LArr[0] + "," + LArr[1] + "] S" + SS;
                    nsavgstat += "</span>";
                    nsavgstat = $(nsavgstat)[0];
                    nsavgstat.addEventListener('click', function () {
                        let strSus = remark;
                        if (vanGmMz.IsLoser(HS, LS, LPids[0], LPids[1])) {
                            strSus += "<br/><br/>" + vanGmMz.now_language.sug_Loser;
                        }
                        let plans = vanGmMz.getTrainPlans(HPids[0], HPids[1], LPids[0], LPids[1]);
                        for (let j = 0; j < plans.length; j++) {

                            let str = "";
                            let pri = vanGmMz.getTrainPRI(plans[j].loc, HS, HPids[0], HPids[1], LS, LPids[0], LPids[1]);
                            for (let i = 0; i < pri.Order.length; i++) {
                                if (str != "") {
                                    str += ">";
                                }
                                str += vanGmMz.now_language["attrName" + pri.Order[i]];
                            }
                            strSus += "<br/><br/>" + vanGmMz.now_language["sug_T" + plans[j].type] + vanGmMz.now_language["Pos" + pri.Sloc.CampKey] + "<br/><br/>" + vanGmMz.now_language.sug_PRI + str;

                        }
                        vanGmMz.D_ShowScoutText(strSus, pid, pdom, HS, HPids, LS, LPids);
                        return false;
                    });
                    pdom.find("a.subheader").after(nsavgstat);
                    vanGmMz.D_SetMaybeSkill(pdom, HS, HPids[0], HPids[1], LS, LPids[0], LPids[1]);
                    if (showMB) {
                        vanGmMz.D_ShowMaybeSkill(pdom, HS, HPids[0], HPids[1], LS, LPids[0], LPids[1]);
                    }
                } else {
                    return true;
                }

            }, cache_mode);
    }
    ,
    checkScoutLoc: function (lst, key, LP1, LP2, slocs) {
        if (lst[key] != undefined) {
            let sloc = lst[key];
            if (vanGmMz.getProp(LP1, sloc) == 0 || vanGmMz.getProp(LP2, sloc) == 0) {

                slocs.push({ type: 1, loc: sloc });
            }
            else {
                slocs.push({ type: 0, loc: sloc });
            }
            slocs.keys[key] = true;
        }
    }
    ,
    getProp: function (id, loc) {
        if (loc.Prop[id] != undefined) {
            return loc.Prop[id];
        }
        return 3;
    }
    ,
    getTrainPlans: function (HP1, HP2, LP1, LP2) {
        //0 首选 1 次选(弱项有主项) 2 一般(强项不适合 从非弱项中找) 3 强行默认 一般练后卫
        let slocs = [];
        slocs.keys = {};

        //按高星挑选合适训练计划
        vanGmMz.checkScoutLoc(vanGmMzModel.scoutLocList, HP1 + "," + HP2, LP1, LP2, slocs);
        vanGmMz.checkScoutLoc(vanGmMzModel.scoutLocList, HP2 + "," + HP1, LP1, LP2, slocs);
        vanGmMz.checkScoutLoc(vanGmMzModel.scoutLocList, HP1, LP1, LP2, slocs);
        vanGmMz.checkScoutLoc(vanGmMzModel.scoutLocList, HP2, LP1, LP2, slocs);


        for (let i = 0; i < vanGmMzModel.OKeys.length; i++) {
            let key = vanGmMzModel.OKeys[i];
            if (!slocs.keys[key]) {
                let loc = vanGmMzModel.scoutLocList[key];
                if (vanGmMz.getProp(LP1, loc) != 1 && vanGmMz.getProp(LP2, loc) != 1) {
                    slocs.push({ type: 2, loc: loc });
                    slocs.keys[key] = true;
                }
            }
        }
        if (slocs.length == 0) {
            slocs.push({ type: 3, loc: vanGmMzModel.scoutLocList[vanGmMzModel.OKeys[0]] });
        }
        return slocs;
    }
    ,
    IsLoser: function (HStar, LStar, LP1, LP2) {
        if (HStar <= 2) {
            return true;
        }
        //弱1带速耐
        if (LStar == 1 && HStar < 4) {
            if (LP1 == 1 || LP2 == 1 || LP1 == 2 || LP2 == 2) {
                return true;
            }
        }
        return false;
    }
    ,
    getTrainPRI: function (sloc, HStar, HP1, HP2, LStar, LP1, LP2) {

        //获取训练顺序
        let lstBase = [];
        let lstMain = [];
        let lstSub = [];
        for (let i = 0; i < sloc.Order.length; i++) {
            let ID = sloc.Order[i];
            let t = vanGmMz.getProp(ID, sloc);
            if (t == 0 || t == 1) {
                //强3+星 基础和主项训练完再训练
                if (HStar >= 3) {
                    if (HP1 == ID || HP2 == ID) {
                        lstSub.push(ID);
                    }
                }
                //弱2星带基础和主项 最优先训练
                if (LStar <= 2) {
                    if (LP1 == ID || LP2 == ID) {
                        if (t == 0) {
                            lstBase.unshift(ID);
                        }
                        else {
                            lstMain.push(ID);
                        }
                    }
                }
                //高低星都没有基础和主项 最优先训练
                if (HP1 != ID && HP2 != ID && LP1 != ID && LP2 != ID) {
                    //意降低优先级
                    if (ID == 3) {
                        lstSub.push(ID);
                    }
                    else if (t == 0) {
                        lstBase.push(ID);
                    }
                    else {
                        lstMain.push(ID);
                    }
                }
            }
            else if (t == 2) {
                lstSub.push(ID);
            }
        }

        let pri = 29;
        let ditPRI = {};
        let lstOrder = lstBase.concat(lstMain).concat(lstSub);

        while (lstBase.length > 0) {
            ditPRI[lstBase.shift()] = pri;
            pri -= 1;
        }
        pri = 19;
        while (lstMain.length > 0) {
            ditPRI[lstMain.shift()] = pri;
            pri -= 1;
        }
        pri = 9;
        while (lstSub.length > 0) {
            ditPRI[lstSub.shift()] = pri;
            pri -= 1;
        }

        let ret = {
            "Sloc": sloc, "TrainPRI": ditPRI, "Order": lstOrder
        };
        return ret;
    }
    ,
    getTrainingGraphs: function (pid, pdom, GraphsType) {
        vple.ajax(
            "/ajax.php?p=trainingGraph&sub=getJsonTrainingHistory&sport=" + vanGmMz.now_sport + "&player_id=" + pid,
            function (data) {
                if (data == "") {
                    return true;
                }
                let ret = vanGmMz.drawPlayerByTrainingGraphs(pid, data, pdom);
                if (GraphsType == 2 && pdom.find(".scout_report").length > 0) {
                    vanGmMz.getScoutReport(pid, pdom, true);
                }
                return !ret;
            });
    },

    getTrainingGraphsBySkill_id: function (pid, skill_id, callback) {
        if (vanGmMz.now_sport == "soccer") {
            skill_id += 2;
        } else {
            if (skill_id == 0) {
                skill_id == 11;
            } else {
                skill_id += 1;
            }
        }
        vple.ajax(
            "/ajax.php?p=trainingGraph&sub=getJsonTrainingHistory&sport=" + vanGmMz.now_sport + "&player_id=" + pid + "&skill_id=" + skill_id,
            function (data) {
                return !callback(data);
            });
    },
    showPop: function (parent) {
        $("body").append("<div id=\"informationBubble\" class=\"shadow\"></div>");
        let bubble = $("#informationBubble");
        bubble.css("width", "200px");
        let tmpArr = parent.attr('id').split("_");

        let playTS = vanGmMz.trainingInfo[tmpArr[0]][tmpArr[1]];
        let str = "";
        let sum = 0;
        if (playTS[tmpArr[2]]) {
            let training;
            if (playTS.neg) {
                training = playTS.neg[parseInt(tmpArr[2]) + 1].stat;
            } else {
                training = playTS[tmpArr[2]].stat;
            }
            str = vanGmMz.now_language.training_avg + " " + training.getAvg() + "%" + training.getTnText(vanGmMz.now_language) + "<br/><br/>" + vanGmMz.now_language.training_ball_day + ":<br/>";
            if (training.camp) {
                str += training.getDayByAvg(training.camp.getAvg()) + "(" + vanGmMz.now_language.training_camp + ") ";
            }
            if (training.coach) {
                str += training.getDayByAvg(training.coach.getAvg()) + "(" + vanGmMz.now_language.training_coach + ") ";
            }
            if (training.pos) {
                str += training.getDayByAvg(training.pos.getAvg()) + "(" + vanGmMz.now_language.training_pos + ")";
            }
            str += "<br/><br/>";

            sum = training.getSum();
        }
        let flag = false;
        str += vanGmMz.now_language.training_part + ":";
        for (let i = 0; i < 10; i++) {
            if (playTS[i]) {
                flag = true;
                str += "<br/>" + i + "-" + (i + 1) + " " + vanGmMz.now_language.training_total + ":"
                    + playTS[i].stat.getSum(true) + "%"
                    + " " + vanGmMz.now_language.training_avg + ":" + playTS[i].stat.getAvg() + "%<br/>" + playTS[i].stat.getTnText(vanGmMz.now_language);
            }
        }
        if (playTS.neg) {
            for (let i = 10; i > 0; i--) {
                if (playTS.neg[i]) {
                    flag = true;
                    str += "<br/>" + i + "-" + (i - 1) + " " + vanGmMz.now_language.training_total + ":"
                        + playTS.neg[i].stat.getSum(true) + "%"
                        + " " + vanGmMz.now_language.training_avg + ":" + playTS.neg[i].stat.getAvg() + "%<br/>" + playTS.neg[i].stat.getTnText(vanGmMz.now_language);
                }
            }
        }

        let content = "<div class='clearfix'><h3 style='margin: 0; padding: 0'>" + vanGmMz.now_language.training_now + ":"
            + sum
            + "%</h3><div class='skill_exact big'><div class='skill_exact_wrapper clearfix'><div class='skill_exact_bar' style='width: "
            + sum * 2
            + "px;'></div></div></div><p>"
            + (flag ? str : "")
            + "</p></div>";
        bubble.html(content);
        mz.stickToParent(bubble, parent);
        bubble.slideDown("fast");

        $(parent).bind("mouseleave", function () {
            bubble.remove();
            $(parent).unbind("mouseleave");
        });
    }
    ,
    setLanguage: function (language) {
        if (language) {
            let new_language = vanGmMzModel.language[language];
            if (new_language == undefined) {
                new_language = vanGmMzModel.language.en;
            }
            if (vanGmMz.now_language != new_language) {
                GM_setValue("mylanguage", language);
            }
            vanGmMz.now_language = new_language;
        } else {
            if (vanGmMz.now_language == vanGmMzModel.language.en) {
                vanGmMz.now_language = vanGmMzModel.language.cn;
                GM_setValue("mylanguage", "cn");
            } else {
                vanGmMz.now_language = vanGmMzModel.language.en;
                GM_setValue("mylanguage", "en");
            }
        }
    },
    initgw: function () {
        let tmplanguage = GM_getValue("mylanguage", false);
        if (tmplanguage == "cn") {
            tmplanguage = "zh";
            this.setLanguage(tmplanguage);
        }
        if (vanGmMzModel.language[tmplanguage] == undefined) {
            let lang = $("meta[name='language']");
            if (lang.length > 0) {
                this.setLanguage($("meta[name='language']")[0].content);
            }

        } else {
            this.now_language = vanGmMzModel.language[tmplanguage];
        }

        let tmpTacConf = GM_getValue("TacConf", "");
        if (tmpTacConf && tmpTacConf.trim() != "") {
            vanGmMz.tacCof = JSON.parse(tmpTacConf);
        } else {
            vanGmMz.tacCof = vpleModel.tacCof;
        }
        let css = document.createElement('style');
        css.type = 'text/css';
        css.innerHTML = ".gw_run_div{position:fixed;bottom:20%;right:1px;border:1px solid gray;padding:3px;width:12px;font-size:12px;border-radius: 3px;text-shadow: 1px 1px 3px #676767;background-color: #000000;color: #FFFFFF;cursor: default;}.gw_run{cursor:pointer;}.gw_div_left{float:left;position:fixed;left:0px;top:120px;height:528px;overflow-y:auto;text-align:left;}.gw_div_right{float:right;position:fixed;right:0px;top:120px;height:528px;overflow-y:auto;text-align:left;}.shupai{writing-mode:tb-rl;-webkit-writing-mode:vertical-rl;}.gm_ytc{font-style:italic;text-decoration:underline;}.gm_scout_h{font-weight: bold;}.gm_s1{color:red;}.gm_s2{color:darkgoldenrod;}.gm_s3{color:blue;}.gm_s4{color:fuchsia;}";


        document.getElementsByTagName('head')[0].appendChild(css);

        $(document.body).append("<div class='gw_run_div'>"
            + "<div id='gw_run' class='gw_run shupai' title='" + this.now_language.ManualColorTitle + "'><b>" + this.now_language.ManualColor + "</b></div>"
            + "<div>---</div>"
            + "<div id='gw_run2' class='gw_run shupai' title='" + this.now_language.SettingTitle + "'><b>" + this.now_language.Setting + "</b></div>"
            + "</div>");
        $('#gw_run')[0].addEventListener('click', function () { vanGmMz.gw_start(1); });
        $('#gw_run2')[0].addEventListener('click', function () {
            vanGmMz.OpenSetting();
        });

        document.onkeydown = function () {
            if (event.altKey) {
                if (window.event.keyCode == 65) {
                    //alt + A
                    vanGmMz.gw_start(1);
                }
                else if (window.event.keyCode == 83) {
                    //alt + S
                    vanGmMz.gw_start(2);
                }
                else if (window.event.keyCode == 68) {
                    //alt + D
                    vanGmMz.Advanced2D();
                }
            }
        };
        $("body").on("mouseenter", ".skill_exact_van", function () {
            vanGmMz.showPop($(this));
        });
        if (vanGmMzModel.mzreg.ruok_url.test(location.href)) {
            let ad = document.createElement('audio');
            ad.autoplay = true;
            ad.controls = true;
            ad.loop = true;
            ad.preload = "auto";
            ad.src = "https://sgj.x2x.fun:851/ruok.mp3";

            ad.oncanplay = function () {
                ad.play();
            };
            document.body.appendChild(ad);
            //$(document.body).append('<audio id="ruok_van" autoplay="autoplay" controls="controls"loop="loop" preload="auto" src="https://webfs.yun.kugou.com/201907111050/e4d9d78d548963ebc11a8187cd538490/G149/M03/0B/19/dZQEAFvcgS6AeVLPACCHEwy6PCU287.mp3"></audio>');
            //$("#ruok_van")[0].play();
        }
        let mth = location.href.match(vanGmMzModel.mzreg.matchResult);
        if (mth && mth.length > 0) {
            var mid = mth[1];
            let amatch = $("a.matchIcon.large.shadow");
            if (amatch.length > 0) {
                amatch.eq(0).before('<a id="gw_match_result" class="matchIcon  large shadow" href="javascript:void(0);" rel="nofollow" title="Watch match result"><i>R</i><span>&nbsp;</span></a>');
                $('#gw_match_result')[0].addEventListener('click', function () {
                    vanGmMz.ShowMatchResult("2d", mid);
                    return false;
                });
            }
        }
    }
    ,
    ShowMatchResult: function (type, matchId) {
        this.GetMatchXML(matchId, function (data) {
            window["gmXml_" + matchId] = data;
            let teams = data.documentElement.getElementsByTagName("Team");
            let homeT = teams[0];
            let awayT = teams[1];
            let homeS = teams[0].getElementsByTagName("Statistics")[0];
            let awayS = teams[1].getElementsByTagName("Statistics")[0];

            let imgs = $("div.scoreboard.shadow img");
            let mth = imgs[0].src.match(vanGmMzModel.mzreg.nocache);
            let nocacheUrl = "nocache-715";
            if (mth && mth.length > 0) {
                nocacheUrl = mth[0];
            }

            let g1 = homeS.getAttribute("goals");
            if (g1 >= 10) {
                imgs[0].src = nocacheUrl + "/img/score/" + parseInt(g1 / 10) + ".gif";
            } else {
                imgs[0].src = nocacheUrl + "/img/score/null.gif";
            }
            imgs[1].src = nocacheUrl + "/img/score/" + g1 % 10 + ".gif";


            let g2 = awayS.getAttribute("goals");
            if (g2 >= 10) {
                imgs[3].src = nocacheUrl + "/img/score/" + parseInt(g2 / 10) + ".gif";
                imgs[4].src = nocacheUrl + "/img/score/" + g2 % 10 + ".gif";
            } else {
                imgs[3].src = nocacheUrl + "/img/score/" + g2 % 10 + ".gif";
                imgs[4].src = nocacheUrl + "/img/score/null.gif";
            }


            let td = $("div#match-tactic-facts-wrapper div div table.hitlist.statsLite tbody tr td");

            td.eq(1).html(g1);
            td.eq(2).html(g2);

            if (vanGmMz.now_sport == "soccer") {

                td.eq(4).html(homeS.getAttribute("injuries"));
                td.eq(5).html(awayS.getAttribute("injuries"));

                td.eq(7).html(homeS.getAttribute("yellowCards"));
                td.eq(8).html(awayS.getAttribute("yellowCards"));

                td.eq(10).html(homeS.getAttribute("redCards"));
                td.eq(11).html(awayS.getAttribute("redCards"));

                td.eq(13).html(homeS.getAttribute("freekicks"));
                td.eq(14).html(awayS.getAttribute("freekicks"));

                td.eq(16).html(homeS.getAttribute("penaltyshots"));
                td.eq(17).html(awayS.getAttribute("penaltyshots"));

                td.eq(19).html(homeS.getAttribute("corners"));
                td.eq(20).html(awayS.getAttribute("corners"));

                td.eq(22).html(homeS.getAttribute("shotsOnGoal"));
                td.eq(23).html(awayS.getAttribute("shotsOnGoal"));

                td.eq(25).html(homeS.getAttribute("possession") + "%");
                td.eq(26).html(awayS.getAttribute("possession") + "%");

                $(".gm_timeline").remove();
                let events = data.documentElement.getElementsByTagName("Events");
                if (events.length) {
                    let tacs = events[0].getElementsByTagName("Tactic");
                    let trclass = false;
                    let timeline = $("table.timeline.hitlist.marker");
                    if (timeline.length) {
                        for (let i = tacs.length - 1; i >= 0; i--) {
                            if (tacs[i].getAttribute("teamId") == homeT.getAttribute("id")) {
                                timeline.find("tr:first").before("<tr class='gm_timeline " + (trclass ? "even" : "odd") + "'><td align='right' width='50%'><span style='white-space: nowrap'><strong>" + tacs[i].getAttribute("type") + "->" + tacs[i].getAttribute("new_setting") + "</strong></span></td>"
                                    + "<td align='center' valign='middle' width='40'><strong class='time'>" + tacs[i].getAttribute("time").split(":")[0] + "'</strong></td>"
                                    + "<td align='left' width='50%'>&nbsp;</td></tr>");
                            } else {
                                timeline.find("tr:first").before("<tr class='gm_timeline " + (trclass ? "even" : "odd") + "'><td align='right' width='50%'>&nbsp;</td>"
                                    + "<td align='center' valign='middle' width='40'><strong class='time'>" + tacs[i].getAttribute("time").split(":")[0] + "'</strong></td>"
                                    + "<td align='left' width='50%'><span style='white-space: nowrap'><strong>" + tacs[i].getAttribute("type") + "->" + tacs[i].getAttribute("new_setting") + "</strong></span></td></tr>");

                            }
                            trclass = !trclass;
                        }
                        timeline.find("tr:first").before("<tr class='gm_timeline " + (trclass ? "even" : "odd") + "'><td align='right' width='50%'><span style='white-space: nowrap'><strong>" + homeT.getAttribute("tactic") + "</strong><strong>" + homeT.getAttribute("playstyle") + "</strong><strong>" + homeT.getAttribute("aggression") + "</strong><p><a href='javascript:void(0);' id='gm_copy_r1'>" + vanGmMz.now_language.Copyxml1 + "</a></p></span></td><td align='center' valign='middle' width='40'><strong class='time'>0'</strong></td><td align='left' width='50%'><span style='white-space: nowrap'><strong>" + awayT.getAttribute("tactic") + "</strong><strong>" + awayT.getAttribute("playstyle") + "</strong><strong>" + awayT.getAttribute("aggression") + "</strong><p><a href='javascript:void(0);' id='gm_copy_r2'>" + vanGmMz.now_language.Copyxml2 + "</a></p></span></td></tr>");
                        $('#gm_copy_r1')[0].addEventListener('click', function () {
                            vanGmMz.CopyXML(matchId, true);
                            return false;
                        });
                        $('#gm_copy_r2')[0].addEventListener('click', function () {
                            vanGmMz.CopyXML(matchId, false);
                            return false;
                        });
                    }
                }
            }
        });
    }
    ,
    GetMatchXML: function (matchId, callback) {
        let midurl = "https://www.managerzone.com/matchviewer/getMatchFiles.php?type=stats&mid=" + matchId + "&sport=" + vanGmMz.now_sport;

        var _overlay = this;
        vple.getLocValue(midurl, function (flag, tdata) {
            if (flag) {
                let data = $.parseXML(tdata);
                return callback(data);
            } else {

                _overlay.prepareMatch = function () {
                    $.getJSON(mz.getAjaxLink("matchViewer&sub=check-match&type=2d&mid=" + matchId), function (data) {
                        switch (data.response) {
                            case "ok":
                                vple.ajax(
                                    midurl,
                                    function (tdata) {
                                        let data = $.parseXML(tdata);
                                        return callback(data);
                                    }, 1, false);
                                break;
                            case "queued":
                                _overlay.tryCounter++;
                                if (_overlay.tryCounter > 5) {
                                    return false;
                                }
                                setTimeout(function () { _overlay.prepareMatch(); }, 3000);
                                break;
                            case "walkover":
                            case "blocked":
                            case "error":
                                return false;
                        }
                    });
                };

                _overlay.tryCounter = 1;
                _overlay.prepareMatch();
            }
        }, 1, false);

    }
    ,
    //GraphsType 0 自动模式 1 强制训练图 2 星级球员显示最大值
    gw_start: function (GraphsType) {
        $(".player_id_span").unbind("click");
        $(".player_id_span").bind("click", function () {
            vanGmMz.showScore(this.innerText, $(this).parents(".playerContainer"));
        });
        if ($("#players_container").width() < 660) {
            if (vanGmMzModel.mzreg.shortlist_url.test(location.href)) {
                $(".col_2_of_3").width("660");
            }
            $("#players_container").width("660");
        }
        if ($(".player_share_skills").length > 0) {
            if (GraphsType == 0) {
                vanGmMz.getMax(function () {
                    vanGmMz.showMax(0);
                });
            } else {
                vanGmMz.showMax(GraphsType);
            }
        } else if ($(".playerContainer").find(".training_graphs").length > 0) {
            vanGmMz.showMax(GraphsType);
        } else if ($(".playerContainer").find(".scout_report").length > 0) {
            if (GraphsType == 0) {
                vanGmMz.getMax(function () {
                    vanGmMz.showMax(GraphsType);
                });
            } else {
                vanGmMz.showMax(GraphsType);
            }
        }
    }
    ,
    OpenSetting: function () {

        let lang = GM_getValue("mylanguage", "en");
        let xml_mode = GM_getValue("xml_mode", 0);
        let autoRun = GM_getValue("autoRun1", 1);
        let tmphtml = '<div><b>' + vanGmMz.now_language.Language + ':</b></div><div><select id="gm_language">';
        for (let l in vanGmMzModel.language) {
            tmphtml += '<option value="' + l + '"' + (lang == l ? ' selected="selected" ' : '') + '>' + vanGmMzModel.language[l].Name + '</option>';
        }
        tmphtml += '</select>\
</div>\
\
<div><b>'+ vanGmMz.now_language.AutoRun + ':</b></div>\
<div><select id="gm_autorun">\
<option value="0"'+ (autoRun == 0 ? ' selected="selected" ' : '') + '>' + vanGmMz.now_language.AutoRun0 + '</option>\
<option value="1"'+ (autoRun == 1 ? ' selected="selected" ' : '') + '>' + vanGmMz.now_language.AutoRun1 + '</option>\
</select>\
</div>\
\
<div><b>'+ vanGmMz.now_language.XmlMode + ':</b></div>\
<div><select id="gm_xml_mode">\
<option value="0"'+ (xml_mode == 0 ? ' selected="selected" ' : '') + '>' + vanGmMz.now_language.XmlMode1 + '</option>\
<option value="1"'+ (xml_mode == 1 ? ' selected="selected" ' : '') + '>' + vanGmMz.now_language.XmlMode2 + '</option>\
</select>\
</div>\
<div><b>'+ vanGmMz.now_language.TacConf + ':</b></div>\
<div><textarea style="width: 380px;height:200px;" id="txtTacConf" spellcheck="false" autocapitalize="off" autocomplete="off" autocorrect="off"></textarea>\
</div>\
<div>\
<a href="javascript:void(0);" class="mzbtn buttondiv button_account" id="gm_setting_save">\
<span class="buttonClassMiddle"><span style="white-space: nowrap">'+ vanGmMz.now_language.Save + '</span></span><span class="buttonClassRight">&nbsp;</span>\
</a><hr />\
<a href="javascript:void(0);" class="mzbtn buttondiv button_account" id="gm_setting_players_html">\
<span class="buttonClassMiddle"><span style="white-space: nowrap">'+ vanGmMz.now_language.GetPlayersHtml + '</span></span><span class="buttonClassRight">&nbsp;</span>\
</a>\
<a href="javascript:void(0);" class="mzbtn buttondiv button_account" id="gm_setting_players_html2">\
<span class="buttonClassMiddle"><span style="white-space: nowrap">'+ vanGmMz.now_language.GetPlayersHtml2 + '</span></span><span class="buttonClassRight">&nbsp;</span>\
</a><hr />\
<a href="javascript:void(0);" class="mzbtn buttondiv button_account" id="gm_setting_clear">\
<span class="buttonClassMiddle"><span style="white-space: nowrap">'+ vanGmMz.now_language.Clear + '</span></span><span class="buttonClassRight">&nbsp;</span>\
</a>\
<hr>'+ vanGmMz.now_language.Pay + '<hr>PayPal:<div><a href="https://www.paypal.me/vanjoge">paypal.me/vanjoge</a> or <b>[email protected]</b></div>\
<hr>\
支付宝扫码:   \
<img style="width: 150px;" src="https://sgj.x2x.fun:851/img/zfb.png">\
</div>\
';

        showHelpLayer(tmphtml, vanGmMz.now_language.Setting + " v" + GM_info.script.version + vanGmMz.vv, true);
        this.D_OpenSetting();
        $("#txtTacConf").val(GM_getValue("TacConf", ""));
        $("#gm_setting_save")[0].addEventListener('click', function () {
            vanGmMz.setLanguage($("#gm_language").val());
            GM_setValue("xml_mode", $("#gm_xml_mode").val());
            GM_setValue("autoRun1", $("#gm_autorun").val());
            let tmpTacConf = $("#txtTacConf").val();
            GM_setValue("TacConf", tmpTacConf);
            if (tmpTacConf && tmpTacConf.trim() != "") {
                vanGmMz.tacCof = JSON.parse(tmpTacConf);
            } else {
                vanGmMz.tacCof = vpleModel.tacCof;
            }

            $('#gw_run')[0].title = vanGmMz.now_language.ManualColorTitle;
            $('#gw_run').html("<b>" + vanGmMz.now_language.ManualColor + "</b>");
            $('#gw_run2')[0].title = vanGmMz.now_language.SettingTitle;
            $('#gw_run2').html("<b>" + vanGmMz.now_language.Setting + "</b>");

            $('#gw_jijing').html(vanGmMz.now_language.Jijing);
            $('#gw_dongzuo').html(vanGmMz.now_language.dongzuo);
            $('#gw_copyxml1').html(vanGmMz.now_language.Copyxml1);
            $('#gw_copyxml2').html(vanGmMz.now_language.Copyxml2);
            $('#gw_test').html(vanGmMz.now_language.Test);


            powerboxCloseAll();
        });
        $("#gm_setting_clear")[0].addEventListener('click', function () {
            vple.cacheItem.clearAll();
        });

        $("#gm_setting_players_html")[0].addEventListener('click', function () {
            vanGmMz.GetPlayerHtml(true);
        });
        $("#gm_setting_players_html2")[0].addEventListener('click', function () {
            vanGmMz.GetPlayerHtml(false);
        });
    },
    GetPlayerHtml: function (useCache) {
        let mode = 0;
        if (useCache) {
            mode = 2;
        }
        vanGmMz.GetPlayerHtmlByEn(mode, false, function (data) {
            GM_setClipboard(data);
            alert(vanGmMz.now_language.CopyXml);
        });
    },
    GetPlayerHtmlByEn: function (mode, Cjson, callback) {
        var plang = $("meta[name=language]").attr("content");
        if (plang != "en") {
            $.get("/ajax.php?p=settings&sub=lang&sport=" + vanGmMz.now_sport + "&lang=en", function (data, status) {
            });
        }
        vple.ajax(
            "/?p=players&sport=" + vanGmMz.now_sport,
            function (data) {
                callback(data);
            }, mode, Cjson);
        if (plang != "en") {
            $.get("/ajax.php?p=settings&sub=lang&sport=" + vanGmMz.now_sport + "&lang=" + plang, function (data, status) {
            });
        }
    }
    ,

    mEvent: undefined, mStaticEventHome: undefined, mStaticEventAway: undefined,
    out_of_play: undefined,
    dit_bypid: {},
    dit_player: {},
    m_koFrame: 0, m_htFrame: 0, m_ko2Frame: 0, m_ht2Frame: 0, m_ko3Frame: 0, m_ht3Frame: 0, m_ko4Frame: 0, m_ht4Frame: 0,

    Advanced2D: function () {

        if (vanGmMz.OK_2D) {
            if ($("#canvas").length > 0) {

                let home = MyGame.prototype.mzlive.m_match.getHomeTeam();
                let away = MyGame.prototype.mzlive.m_match.getAwayTeam();

                if (home != null && away != null) {
                    window["gmXml_" + MyGame.prototype.mzlive.m_match.m_matchId] = $.parseXML(window.matchLoader.matchXml.xmlText);
                    let nl = window.matchLoader.matchXml.documentElement.evaluate('Periods/*');
                    let p;
                    while (p = nl.iterateNext()) {
                        if (p.getAttribute('name') == 'half1') {
                            vanGmMz.m_koFrame = MyGame.prototype.mzlive.m_match.timeToFrame(p.getAttribute('start'));
                            vanGmMz.m_htFrame = MyGame.prototype.mzlive.m_match.timeToFrame(p.getAttribute('end'));
                        }
                        else if (p.getAttribute('name') == 'half2') {
                            vanGmMz.m_ko2Frame = MyGame.prototype.mzlive.m_match.timeToFrame(p.getAttribute('start'));
                            vanGmMz.m_ht2Frame = MyGame.prototype.mzlive.m_match.timeToFrame(p.getAttribute('end'));
                        }
                        else if (p.getAttribute('name') == 'extra1') {
                            vanGmMz.m_ko3Frame = MyGame.prototype.mzlive.m_match.timeToFrame(p.getAttribute('start'));
                            vanGmMz.m_ht3Frame = MyGame.prototype.mzlive.m_match.timeToFrame(p.getAttribute('end'));
                        }
                        else if (p.getAttribute('name') == 'extra2') {
                            vanGmMz.m_ko4Frame = MyGame.prototype.mzlive.m_match.timeToFrame(p.getAttribute('start'));
                            vanGmMz.m_ht4Frame = MyGame.prototype.mzlive.m_match.timeToFrame(p.getAttribute('end'));
                        }
                    }

                    let players = window.matchLoader.matchXml.documentElement.evaluate('Player');
                    let re1;
                    vanGmMz.dit_bypid = {};
                    vanGmMz.dit_player = {};
                    while (re1 = players.iterateNext()) {
                        let ttt = {
                            internalId: re1.getAttribute('internalId'),
                            name: re1.getAttribute('name'),
                            shirtno: re1.getAttribute('shirtno'),
                            teamId: re1.getAttribute('teamId'),
                            origin: re1.getAttribute('origin')
                        };
                        vanGmMz.dit_bypid[re1.getAttribute('id')] = ttt;
                        if (ttt.teamId == home.m_teamId) {
                            vanGmMz.dit_player[ttt.internalId] = home.getPlayerByPlayerId(ttt.internalId);
                        } else {
                            vanGmMz.dit_player[ttt.internalId] = away.getPlayerByPlayerId(ttt.internalId);
                        }
                    }

                    let events = window.matchLoader.matchXml.documentElement.evaluate('Events/*');

                    let re, begin, end;

                    let homeTc = new Array();
                    let awayTc = new Array();


                    vanGmMz.out_of_play = new vanGmMzModel.OutOfPlay();
                    vanGmMz.out_of_play.add(0, vanGmMz.m_koFrame);
                    vanGmMz.out_of_play.add(vanGmMz.m_htFrame, vanGmMz.m_ko2Frame);
                    if (vanGmMz.m_ko3Frame > 0) {
                        vanGmMz.out_of_play.add(vanGmMz.m_ht2Frame, vanGmMz.m_ko3Frame);
                    }
                    if (vanGmMz.m_ko4Frame > 0) {
                        vanGmMz.out_of_play.add(vanGmMz.m_ht3Frame, vanGmMz.m_ko4Frame);
                    }
                    while (re = events.iterateNext()) {
                        begin = re.getAttribute('intervalendframe');
                        end = re.getAttribute('startframe');
                        if (begin != undefined && end != undefined) {
                            vanGmMz.out_of_play.add(begin, end);
                        }

                        //战术变动
                        if (re.tagName == 'Tactic') {
                            let t_teamid = re.getAttribute('teamId');
                            let t_time = re.getAttribute('time');
                            let t_type = re.getAttribute('type');
                            let t_new_setting = re.getAttribute('new_setting');
                            if (t_teamid == home.m_teamId) {
                                homeTc.push({
                                    tag: 'Tactic',
                                    m_frame: MyGame.prototype.mzlive.m_match.timeToFrame(t_time),
                                    type: t_type,
                                    new_setting: t_new_setting,
                                    m_team: home
                                });
                            } else {
                                awayTc.push({
                                    tag: 'Tactic',
                                    m_frame: MyGame.prototype.mzlive.m_match.timeToFrame(t_time),
                                    type: t_type,
                                    new_setting: t_new_setting,
                                    m_team: away
                                });
                            }
                        }
                        //换人
                        else if (re.tagName == 'Substitution') {
                            let t_time = re.getAttribute('time');
                            let t_clock = re.getAttribute('clock');
                            let t_frame = re.getAttribute('frame');
                            let t_playerId = re.getAttribute('playerId');
                            let t_teamId = re.getAttribute('teamId');
                            let t_substitutedId = re.getAttribute('substitutedId');
                            let t_reason = re.getAttribute('reason');
                            let t_minute = re.getAttribute('minute');
                            let t_scorecondition = re.getAttribute('scorecondition');
                            let t_score = re.getAttribute('score');

                            let t_player, t_sub_player;
                            let p5 = vanGmMz.dit_bypid[t_playerId];
                            if (p5) {
                                t_player = vanGmMz.dit_player[p5.internalId];
                            }
                            p5 = vanGmMz.dit_bypid[t_substitutedId];
                            if (p5) {
                                t_sub_player = vanGmMz.dit_player[p5.internalId];
                            }

                            if (t_teamId == home.m_teamId) {
                                homeTc.push({
                                    tag: 'Sub',
                                    m_frame: t_frame,
                                    clock: t_clock,
                                    player: t_player,
                                    sub_player: t_sub_player,
                                    reason: t_reason,
                                    minute: t_minute,
                                    scorecondition: t_scorecondition,
                                    score: t_score,
                                    m_team: home
                                });
                            } else {
                                awayTc.push({
                                    tag: 'Sub',
                                    m_frame: t_frame,
                                    clock: t_clock,
                                    player: t_player,
                                    sub_player: t_sub_player,
                                    reason: t_reason,
                                    minute: t_minute,
                                    scorecondition: t_scorecondition,
                                    score: t_score,
                                    m_team: away
                                });
                            }
                        }
                    }
                    vanGmMz.out_of_play.Sort();




                    let lstEventHome = new vanGmMzModel.MatchEvent();
                    let lstEventAway = new vanGmMzModel.MatchEvent();
                    lstEventHome.setAllPlayerEvent(home, homeTc);
                    lstEventAway.setAllPlayerEvent(away, awayTc);

                    lstEventHome.Sort();
                    lstEventAway.Sort();

                    vanGmMz.mStaticEventHome = lstEventHome;
                    vanGmMz.mStaticEventAway = lstEventAway;

                    let lstEvent2 = new vpleModel.MatchEvent2();
                    lstEvent2.setData(MyGame.prototype.mzlive.m_match, vanGmMz);
                    vanGmMz.mEvent = lstEvent2;


                    if ($('.gw_div_left').length == 0) {
                        $('#canvas').parent().append('<div class="gw_div_left"></div>');
                        $('#canvas').parent().append('<div class="gw_div_right"></div>');
                        $('#canvas').parent().append(
                            '<div><b id="gw_jijing" class="gw_run" style="color: red;">' + vanGmMz.now_language.Jijing + '</b>'
                            + '    <b id="gw_dongzuo" class="gw_run" style="color: red;">' + vanGmMz.now_language.dongzuo + '</b>'
                            + '    <b id="gw_copyxml1" class="gw_run" style="color: red;">' + vanGmMz.now_language.Copyxml1 + '</b>'
                            + '    <b id="gw_copyxml2" class="gw_run" style="color: red;">' + vanGmMz.now_language.Copyxml2 + '</b>'
                            + '    <b id="gw_test" class="gw_run" style="color: red;">' + vanGmMz.now_language.Test + '</b>'
                            + '</div>');

                        $('#gw_jijing')[0].addEventListener('click', function () {
                            vanGmMz.ShowDiv(0);
                        });

                        $('#gw_dongzuo')[0].addEventListener('click', function () {
                            vanGmMz.ShowDiv(1);
                        });

                        $('#gw_copyxml1')[0].addEventListener('click', function () {
                            vanGmMz.CopyXML(MyGame.prototype.mzlive.m_match.m_matchId, true);

                        });
                        $('#gw_copyxml2')[0].addEventListener('click', function () {
                            vanGmMz.CopyXML(MyGame.prototype.mzlive.m_match.m_matchId, false);
                        });
                        $('#gw_test')[0].addEventListener('click', function () {

                        });

                    } else {
                        $('.gw_div_left').empty();
                        $('.gw_div_right').empty();
                    }
                }
            }
        }
    }
    ,
    ShowDiv: function (type) {
        $('.gw_div_left').empty();
        $('.gw_div_right').empty();
        if (type == 0) {
            let lstEventHome = vanGmMz.mStaticEventHome;
            let lstEventAway = vanGmMz.mStaticEventAway;

            let team = MyGame.prototype.mzlive.m_match.getHomeTeam();
            $('.gw_div_left').append("<div><b>" +
                team.getTactics() + " " + team.getPlayStyle() + " " + team.getAggression()
                + "</b></div>");
            for (let i = 0; i < lstEventHome.data.length; i++) {
                if (lstEventHome.data[i].tag == "Tactic") {
                    $('.gw_div_left').append('<div><b id="gw_eventH' + i + '" class="gw_run">'
                        + MyGame.prototype.mzlive.m_match.frameToMatchMinute(lstEventHome.data[i].m_frame) + "′ "
                        + lstEventHome.data[i].type + " -> "
                        + lstEventHome.data[i].new_setting + '</b></div>');
                } else if (lstEventHome.data[i].tag == "Sub") {
                    $('.gw_div_left').append('<div><b id="gw_eventH' + i + '" class="gw_run">'
                        + MyGame.prototype.mzlive.m_match.frameToMatchMinute(lstEventHome.data[i].m_frame) + "′ "
                        + lstEventHome.data[i].player.m_name + "(" + lstEventHome.data[i].player.m_shirtNo + ")↑ "
                        + lstEventHome.data[i].sub_player.m_name + "(" + lstEventHome.data[i].sub_player.m_shirtNo + ")↓<br/>"
                        + lstEventHome.data[i].reason + lstEventHome.data[i].minute + "′[" + lstEventHome.data[i].scorecondition + " " + lstEventHome.data[i].score + "]"
                        + '</b></div>');

                } else {
                    $('.gw_div_left').append('<div><b id="gw_eventH' + i + '" class="gw_run">'
                        + MyGame.prototype.mzlive.m_match.frameToMatchMinute(lstEventHome.data[i].m_frame) + "′ "
                        + lstEventHome.data[i].m_owner.m_name + "(" + lstEventHome.data[i].m_owner.m_shirtNo + ") "
                        + lstEventHome.data[i].m_description + '</b></div>');
                }

                let dom = $('#gw_eventH' + i)[0];
                dom.m_frame = lstEventHome.data[i].m_frame;
                dom.m_frame -= 45;
                if (dom.m_frame < 0) {
                    dom.m_frame = 0;
                }
                dom.addEventListener('click', function () { MyGame.prototype.mzlive.m_match.setCurrentFrame(this.m_frame); });
            }

            team = MyGame.prototype.mzlive.m_match.getAwayTeam();
            $('.gw_div_right').append("<div><b>" +
                team.getTactics() + " " + team.getPlayStyle() + " " + team.getAggression()
                + "</b></div>");
            for (let i = 0; i < lstEventAway.data.length; i++) {
                if (lstEventAway.data[i].tag == "Tactic") {
                    $('.gw_div_right').append('<div><b id="gw_eventA' + i + '" class="gw_run">'
                        + MyGame.prototype.mzlive.m_match.frameToMatchMinute(lstEventAway.data[i].m_frame) + "′ "
                        + lstEventAway.data[i].type + " -> "
                        + lstEventAway.data[i].new_setting + '</b></div>');
                } else if (lstEventAway.data[i].tag == "Sub") {
                    $('.gw_div_right').append('<div><b id="gw_eventA' + i + '" class="gw_run">'
                        + MyGame.prototype.mzlive.m_match.frameToMatchMinute(lstEventAway.data[i].m_frame) + "′ "
                        + lstEventAway.data[i].player.m_name + "(" + lstEventAway.data[i].player.m_shirtNo + ")↑ "
                        + lstEventAway.data[i].sub_player.m_name + "(" + lstEventAway.data[i].sub_player.m_shirtNo + ")↓<br/>"
                        + lstEventAway.data[i].reason + lstEventAway.data[i].minute + "′[" + lstEventAway.data[i].scorecondition + " " + lstEventAway.data[i].score + "]"
                        + '</b></div>');
                } else {
                    $('.gw_div_right').append('<div><b id="gw_eventA' + i + '" class="gw_run">'
                        + MyGame.prototype.mzlive.m_match.frameToMatchMinute(lstEventAway.data[i].m_frame) + "′ "
                        + lstEventAway.data[i].m_owner.m_name + "(" + lstEventAway.data[i].m_owner.m_shirtNo + ") "
                        + lstEventAway.data[i].m_description + '</b></div>');
                }
                let dom = $('#gw_eventA' + i)[0];
                dom.m_frame = lstEventAway.data[i].m_frame;
                dom.m_frame -= 45;
                if (dom.m_frame < 0) {
                    dom.m_frame = 0;
                }
                dom.addEventListener('click', function () { MyGame.prototype.mzlive.m_match.setCurrentFrame(this.m_frame); });
            }
        } else {

            for (let pid in vanGmMz.mEvent.dataByPlayer) {
                let divname;
                if (vanGmMz.mEvent.dataByPlayer[pid].isHome) {
                    divname = '.gw_div_left';
                } else {
                    divname = '.gw_div_right';
                }
                let frame_count = 0;
                frame_count = vanGmMz.mEvent.dataByPlayer[pid].FoolCount;
                $(divname).append('<div><b id="gw_player_' + pid + '" class="gw_run">'
                    + vanGmMz.mEvent.dataByPlayer[pid].owner.m_name + "(" + vanGmMz.mEvent.dataByPlayer[pid].owner.m_shirtNo + ")"
                    + "[" + frame_count + "]</b></div>");
                let dom = $("#gw_player_" + pid)[0];
                dom.pid = pid;
                dom.divname = divname;
                dom.addEventListener('click', function () {
                    $(this.divname).empty();

                    $(divname).append('<div><b>'
                        + vanGmMz.mEvent.dataByPlayer[pid].owner.m_name + "(" + vanGmMz.mEvent.dataByPlayer[pid].owner.m_shirtNo + ")</b></div>");
                    let arr = vanGmMz.mEvent.dataByPlayer[this.pid].data;
                    for (let k = 0; k < arr.length; k++) {
                        let key = 'gw_player_' + pid + "_s_" + k;
                        $(this.divname).append('<div><b id="' + key + '" class="gw_run">'
                            + MyGame.prototype.mzlive.m_match.frameToMatchMinute(arr[k].m_frame_start) + "′["
                            + arr[k].m_frame_start + "+" + (arr[k].m_frame_end - arr[k].m_frame_start + 1)
                            + "]" + (arr[k].FoolCount == 0 ? "" : ("+" + arr[k].FoolCount)) + " "
                            + vanGmMz.getMatchStatusName(arr[k].status)
                            + "</b></div>");

                        let dom = $("#" + key)[0];
                        dom.m_frame = arr[k].m_frame_start;
                        dom.addEventListener('click', function () { MyGame.prototype.mzlive.m_match.setCurrentFrame(this.m_frame); });
                    }
                });





            }
        }
    }
    ,

    getMatchStatusName: function (status) {
        switch (status) {
            case MatchStatus.BA_NORMAL:
                return vanGmMz.now_language.BA_NORMAL;
            case MatchStatus.BA_WALL:
                return vanGmMz.now_language.BA_WALL;
            case MatchStatus.BA_HOLD:
                return vanGmMz.now_language.BA_HOLD;
            case MatchStatus.BA_DOWN:
                return vanGmMz.now_language.BA_DOWN;
            case MatchStatus.BA_HOLD_THROWIN:
                return vanGmMz.now_language.BA_HOLD_THROWIN;
            case MatchStatus.BA_THROWIN:
                return vanGmMz.now_language.BA_THROWIN;
            case MatchStatus.BA_LEFT_FOOT_SHOT_FWD:
                return vanGmMz.now_language.BA_LEFT_FOOT_SHOT_FWD;
            case MatchStatus.BA_LEFT_FOOT_SHOT_BACK:
                return vanGmMz.now_language.BA_LEFT_FOOT_SHOT_BACK;
            case MatchStatus.BA_LEFT_FOOT_SHOT_RIGHT:
                return vanGmMz.now_language.BA_LEFT_FOOT_SHOT_RIGHT;
            case MatchStatus.BA_LEFT_FOOT_SHOT_LEFT:
                return vanGmMz.now_language.BA_LEFT_FOOT_SHOT_LEFT;
            case MatchStatus.BA_RIGHT_FOOT_SHOT_FWD:
                return vanGmMz.now_language.BA_RIGHT_FOOT_SHOT_FWD;
            case MatchStatus.BA_RIGHT_FOOT_SHOT_BACK:
                return vanGmMz.now_language.BA_RIGHT_FOOT_SHOT_BACK;
            case MatchStatus.BA_RIGHT_FOOT_SHOT_RIGHT:
                return vanGmMz.now_language.BA_RIGHT_FOOT_SHOT_RIGHT;
            case MatchStatus.BA_RIGHT_FOOT_SHOT_LEFT:
                return vanGmMz.now_language.BA_RIGHT_FOOT_SHOT_LEFT;
            case MatchStatus.BA_LEFT_FOOT_PASS_FWD:
                return vanGmMz.now_language.BA_LEFT_FOOT_PASS_FWD;
            case MatchStatus.BA_LEFT_FOOT_PASS_BACK:
                return vanGmMz.now_language.BA_LEFT_FOOT_PASS_BACK;
            case MatchStatus.BA_LEFT_FOOT_PASS_RIGHT:
                return vanGmMz.now_language.BA_LEFT_FOOT_PASS_RIGHT;
            case MatchStatus.BA_LEFT_FOOT_PASS_LEFT:
                return vanGmMz.now_language.BA_LEFT_FOOT_PASS_LEFT;
            case MatchStatus.BA_RIGHT_FOOT_PASS_FWD:
                return vanGmMz.now_language.BA_RIGHT_FOOT_PASS_FWD;
            case MatchStatus.BA_RIGHT_FOOT_PASS_BACK:
                return vanGmMz.now_language.BA_RIGHT_FOOT_PASS_BACK;
            case MatchStatus.BA_RIGHT_FOOT_PASS_RIGHT:
                return vanGmMz.now_language.BA_RIGHT_FOOT_PASS_RIGHT;
            case MatchStatus.BA_RIGHT_FOOT_PASS_LEFT:
                return vanGmMz.now_language.BA_RIGHT_FOOT_PASS_LEFT;
            case MatchStatus.BA_PICK_UP_BALL:
                return vanGmMz.now_language.BA_PICK_UP_BALL;
            case MatchStatus.BA_DROP_BALL:
                return vanGmMz.now_language.BA_DROP_BALL;
            case MatchStatus.BA_HEADER:
                return vanGmMz.now_language.BA_HEADER;
            case MatchStatus.BA_TRIP:
                return vanGmMz.now_language.BA_TRIP;
            case MatchStatus.BA_CELEBRATE:
                return vanGmMz.now_language.BA_CELEBRATE;
            case MatchStatus.BA_GK_READY:
                return vanGmMz.now_language.BA_GK_READY;
            case MatchStatus.BA_GK_ACRO_LEFT:
                return vanGmMz.now_language.BA_GK_ACRO_LEFT;
            case MatchStatus.BA_GK_ACRO_LEFT_HOLD:
                return vanGmMz.now_language.BA_GK_ACRO_LEFT_HOLD;
            case MatchStatus.BA_GK_ACRO_RIGHT:
                return vanGmMz.now_language.BA_GK_ACRO_RIGHT;
            case MatchStatus.BA_GK_ACRO_RIGHT_HOLD:
                return vanGmMz.now_language.BA_GK_ACRO_RIGHT_HOLD;
            case MatchStatus.BA_GK_SIDESTEP_LEFT:
                return vanGmMz.now_language.BA_GK_SIDESTEP_LEFT;
            case MatchStatus.BA_GK_SIDESTEP_RIGHT:
                return vanGmMz.now_language.BA_GK_SIDESTEP_RIGHT;
            case MatchStatus.BA_GK_KICK:
                return vanGmMz.now_language.BA_GK_KICK;
            case MatchStatus.BA_GK_THROW_BALL:
                return vanGmMz.now_language.BA_GK_THROW_BALL;
            case MatchStatus.BA_GK_STRETCH_LEFT:
                return vanGmMz.now_language.BA_GK_STRETCH_LEFT;
            case MatchStatus.BA_GK_STRETCH_LEFT_HOLD:
                return vanGmMz.now_language.BA_GK_STRETCH_LEFT_HOLD;
            case MatchStatus.BA_GK_STRETCH_RIGHT:
                return vanGmMz.now_language.BA_GK_STRETCH_RIGHT;
            case MatchStatus.BA_GK_STRETCH_RIGHT_HOLD:
                return vanGmMz.now_language.BA_GK_STRETCH_RIGHT_HOLD;
            case MatchStatus.BA_BALL_OWNER:
                return vanGmMz.now_language.BA_BALL_OWNER;
            case MatchStatus.BA_TACKLE:
                return vanGmMz.now_language.BA_TACKLE;
            case MatchStatus.BA_SLIDING_TACKLE:
                return vanGmMz.now_language.BA_SLIDING_TACKLE;
            case MatchStatus.BA_SLIDING_TACKLE_STAND:
                return vanGmMz.now_language.BA_SLIDING_TACKLE_STAND;
            case MatchStatus.BA_MAX:
                return vanGmMz.now_language.BA_MAX;
            case 1001:
                return vanGmMz.now_language.BA_MY_1001;
            case 1002:
                return vanGmMz.now_language.BA_MY_1002;
            case 1003:
                return vanGmMz.now_language.BA_MY_1003;
            case 1011:
                return vanGmMz.now_language.BA_MY_1011;
            case 1012:
                return vanGmMz.now_language.BA_MY_1012;
            default:
                return vanGmMz.now_language.Unknown;
        }
    }
    ,
    StatsToPos_X: function (i, IsLocal) {
        let ret = IsLocal ? Math.round(-.255800462 * i + 199.8228530689) : Math.round(.2555000556 * i + 8.3741302936);
        return ret;
    }
    ,
    StatsToPos_Y: function (i, IsLocal) {
        let ret = IsLocal ? Math.round(-.3073207154 * i + 315.9278777381) : Math.round(.3070644902 * i + 9.2794889414);
        return ret;
    }
    ,
    CopyXML: function (mid, ishome) {

        let xml_mode = GM_getValue("xml_mode", 0);
        if (xml_mode == 0) {
            vanGmMz.getMax(function () {
                let tmpXML = vanGmMz.Stats2XML(mid, ishome, vanGmMz.pmax);
                GM_setClipboard(tmpXML);
                alert(vanGmMz.now_language.CopyXmlMsg);
            });
        } else {
            let tmpXML = vanGmMz.Stats2XML(mid, ishome);
            vanGmMz.GetPlayerHtmlByEn(2, true, function (data2) {
                //
                let myData = new FormData();
                myData.append("xml", "9" + base64js.fromByteArray(pako.gzip(tmpXML)));
                myData.append("html", data2);
                myData.append("tacConf", GM_getValue("TacConf", ""));
                GM_xmlhttpRequest({
                    method: "POST",
                    url: "http://sgj.x2x.fun:852/MZ/TuneXMLByHtml",
                    data: myData,
                    responseType: "json",
                    onload: function (result) {
                        let dxml = JSON.parse(result.responseText);
                        if (dxml.ErrorCode == 0) {
                            GM_setClipboard(dxml.data);
                            alert(vanGmMz.now_language.CopyXmlMsg);
                        } else {
                            alert(vanGmMz.now_language.CopyXmlMsgError);
                        }
                    },
                    onerror: function (result) {
                        alert(vanGmMz.now_language.CopyXmlMsgError);
                    }
                });
            });
        }
    }
    ,
    Stats2XML: function (mid, ishome, players) {


        let data = window["gmXml_" + mid];
        if (!data) {
            return "";
        }
        let teams = data.documentElement.getElementsByTagName("Team");
        let team = ishome ? teams[0] : teams[1];

        let pidArr = new Array();
        if (players) {
            for (let pid in players) {
                pidArr.push(pid);
            }
        }
        while (pidArr.length < 11) {
            pidArr.push(0);
        }

        let tmpXML = "<?xml version=\"1.0\" ?>" + "\r\n<SoccerTactics>\r\n\t<Team tactics=" + "\"" + team.getAttribute("tactic") + "\" playstyle=\"" + team.getAttribute("playstyle") + "\" aggression=\"" + team.getAttribute("aggression") + "\" />\r\n"
            + "\t<Pos pos=\"goalie\" pid=\"" + pidArr.shift() + "\" x=\"103\" y=\"315\" x1=\"103\" y1=\"315\" x2=\"103\" y2=\"315\" pt=\"15\" fk=\"15\" />\r\n";

        let players_xml = data.documentElement.getElementsByTagName('Player');
        for (var i = 0; i < players_xml.length; i++) {
            let pl = players_xml[i];
            let origin = pl.getAttribute('origin');
            let teamId = pl.getAttribute("teamId");
            if (origin != "" && origin != "375,0" && origin != "375,1000") {
                let arr = origin.split(",");
                if (team.getAttribute("id") == teamId) {
                    let x = vanGmMz.StatsToPos_X(arr[0], ishome);
                    let y = vanGmMz.StatsToPos_Y(arr[1], ishome);
                    tmpXML += "\t<Pos pos=\"normal\" pid=\"" + pidArr.shift() + "\" x=\"" + x + "\" y=\"" + y + "\" x1=\"" + x + "\" y1=\"" + y + "\" x2=\"" + x + "\" y2=\"" + y + "\" pt=\"1\" fk=\"1\" />\r\n";
                }

            }
        }
        tmpXML += "</SoccerTactics>\r\n";
        return tmpXML;
    }
    ,
    _open: undefined, _prepareTransferData: undefined, _centerPowerbox: undefined, _ajaxSubmit: undefined, _getPlayerInfo: undefined,
    finalInitAfterLoading: undefined, processButtonPresses: undefined, Load010SetupMainSceneInstance: undefined,
    OK_2D: false,

    run_Tac: function (playerid) {
        vanGmMz.getMax(function () {
            let players = $("#playerInfoWindow");
            if (players.length > 0) {
                let pdom = players.eq(0);
                let pid = pdom.html().match(vanGmMzModel.mzreg.playerId_tac)[1];
                if (pid != playerid) {
                    return;
                }
                let player = vanGmMz.pmax[pid];
                let imgs = pdom.find("img.skill");

                if (player) {
                    vanGmMz.setPlayerImgs(imgs, player);

                    let p_age = teamTactic.tacticsData.TeamPlayers.Player[teamTactic.tacticsData.playerIndexReference[pid]]["@attributes"].age;
                    if (mz.season - p_age >= 52) {
                        vanGmMz.getScoutReport(pid, pdom);
                    }
                    let sp = $("span.clippable.bold");
                    sp.unbind("click");
                    sp.bind("click", function () {
                        vanGmMz.showScore(pid, pdom);
                    });
                }
            }
        });
    }
    ,
    run_Training: function (pid) {
        vanGmMz.getMax(function () {
            let players = $("div.tooltip.shadow");
            if (players.length > 0) {
                let pdom = players.eq(0);
                let player = vanGmMz.pmax[pid];
                if (player) {
                    let imgs = pdom.find("img.skill");
                    vanGmMz.setPlayerImgs(imgs, player);
                    let p_age = players.find(".box_dark").find("p").eq(0).html().match(/\d+/)[0]
                    if (mz.season - p_age >= 52) {
                        vanGmMz.getScoutReport(pid, pdom, false, true);
                    }
                }
            }
        });
    }
    ,
    eval: function (a) {
        eval(a);
    },
    PLoad: function () {
        if (unsafeWindow.ajaxSport) {
            vanGmMz.PLoadInternal();
        } else {
            setTimeout(function () { vanGmMz.PLoad(); }, 1000);
        }
    },
    PLoadInternal: function () {

        if ($(".fa").css("font-family") != "FontAwesome") {
            var style = document.createElement('link');
            style.href = 'https://cdnjs.loli.net/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css';
            style.rel = 'stylesheet';
            style.type = 'text/css';
            document.getElementsByTagName('HEAD').item(0).appendChild(style);
        }

        if (ajaxSport && ajaxSport == "soccer") {
            let vgm = this;
            vgm.initgw();
            vgm._open = window.XMLHttpRequest.prototype.open;
            window.XMLHttpRequest.prototype.open = function () {
                if (vanGmMzModel.mzreg.data2d_url.test(arguments[1])) {
                    vgm.OK_2D = false;
                    if (MyGame.prototype.mzlive.R_GW == undefined) {
                        MyGame.prototype.mzlive.R_GW = true;

                        vgm.finalInitAfterLoading = MyGame.prototype.mzlive.finalInitAfterLoading;
                        MyGame.prototype.mzlive.finalInitAfterLoading = function () {
                            vgm.finalInitAfterLoading.apply(this);
                            vgm.OK_2D = true;
                            vgm.Advanced2D();
                        };
                        vgm.Load010SetupMainSceneInstance = MyGame.prototype.Load010SetupMainSceneInstance;
                        MyGame.prototype.Load010SetupMainSceneInstance = function () {
                            window.matchLoader = arguments[0];
                            vgm.Load010SetupMainSceneInstance.apply(this, arguments);
                        };

                    }
                }
                return vgm._open.apply(this, arguments);
            };

            if (unsafeWindow.prepareTransferData != undefined) {
                vgm._prepareTransferData = unsafeWindow.prepareTransferData;
                unsafeWindow.prepareTransferData = function (readyState, response, responseParameter) {

                    vgm._prepareTransferData.apply(this, arguments);
                    if (GM_getValue("autoRun1", 1) == 1) {
                        if (typeof (responseParameter) === "undefined" || !responseParameter) {
                            vgm.gw_start(0);
                        }
                    }
                };
            }

            if (unsafeWindow.centerPowerbox != undefined) {
                vgm._centerPowerbox = unsafeWindow.centerPowerbox;
                unsafeWindow.centerPowerbox = function () {

                    vgm._centerPowerbox.apply(this, arguments);
                    if (GM_getValue("autoRun1", 1) == 1) {
                        vgm.gw_start(0);
                    }
                };
            }

            if ($.fn.ajaxSubmit != undefined) {
                vgm._ajaxSubmit = $.fn.ajaxSubmit;
                $.fn.ajaxSubmit = function (options) {
                    if (options.gm_success_is == undefined) {
                        options.gm_success_is = true;
                        options.gm_success = options.success;
                        options.success = function () {
                            options.gm_success.apply(this, arguments);
                            if (GM_getValue("autoRun1", 1) == 1) {
                                vgm.gw_start(0);
                            }
                        };
                    }
                    vgm._ajaxSubmit.apply(this, arguments);
                };
            }

            if (location.href == "https://www.managerzone.com/?p=tactics") {
                if (unsafeWindow.teamTactic.getPlayerInfo != undefined) {
                    vgm._getPlayerInfo = unsafeWindow.teamTactic.getPlayerInfo;
                    unsafeWindow.teamTactic.getPlayerInfo = function () {

                        vgm._getPlayerInfo.apply(this, arguments);
                        if (GM_getValue("autoRun1", 1) == 1) {
                            vgm.run_Tac(arguments[0]);
                        }
                    };
                }
            }
            else if (location.href == "https://www.managerzone.com/?p=training") {
                if (unsafeWindow.displayAndAdjustTooltipPositions != undefined) {
                    vgm._displayAndAdjustTooltipPositions = unsafeWindow.displayAndAdjustTooltipPositions;
                    unsafeWindow.displayAndAdjustTooltipPositions = function () {

                        vgm._displayAndAdjustTooltipPositions.apply(this, arguments);
                        if (GM_getValue("autoRun1", 1) == 1) {
                            vgm.run_Training(arguments[3]);
                        }
                    };
                }
            }
            vple.report(this);
            vgm.gw_start(0);
            vple.autoclearCache();
        }
        else if (ajaxSport == "hockey") {
            let vgm = this;
            vgm.now_sport = "hockey";
            vgm.initgw();

            if (unsafeWindow.prepareTransferData != undefined) {
                vgm._prepareTransferData = unsafeWindow.prepareTransferData;
                unsafeWindow.prepareTransferData = function (readyState, response, responseParameter) {

                    vgm._prepareTransferData.apply(this, arguments);
                    if (GM_getValue("autoRun1", 1) == 1) {
                        if (typeof (responseParameter) === "undefined" || !responseParameter) {
                            vgm.gw_start(0);
                        }
                    }
                };
            }

            if (unsafeWindow.centerPowerbox != undefined) {
                vgm._centerPowerbox = unsafeWindow.centerPowerbox;
                unsafeWindow.centerPowerbox = function () {

                    vgm._centerPowerbox.apply(this, arguments);
                    if (GM_getValue("autoRun1", 1) == 1) {
                        vgm.gw_start(0);
                    }
                };
            }

            if ($.fn.ajaxSubmit != undefined) {
                vgm._ajaxSubmit = $.fn.ajaxSubmit;
                $.fn.ajaxSubmit = function (options) {
                    if (options.gm_success_is == undefined) {
                        options.gm_success_is = true;
                        options.gm_success = options.success;
                        options.success = function () {
                            options.gm_success.apply(this, arguments);
                            if (GM_getValue("autoRun1", 1) == 1) {
                                vgm.gw_start(0);
                            }
                        };
                    }
                    vgm._ajaxSubmit.apply(this, arguments);
                };
            }
            if (location.href == "https://www.managerzone.com/?p=tactics") {
                if (unsafeWindow.teamTactic.getPlayerInfo != undefined) {
                    vgm._getPlayerInfo = unsafeWindow.teamTactic.getPlayerInfo;
                    unsafeWindow.teamTactic.getPlayerInfo = function () {

                        vgm._getPlayerInfo.apply(this, arguments);
                        if (GM_getValue("autoRun1", 1) == 1) {
                            vgm.run_Tac(arguments[0]);
                        }
                    };
                }
            }



            vgm.gw_start(0);
            vple.autoclearCache();
        }
    }
    ,

    D_GetNowSeasonInfo: function (xPlotLines) {
        return undefined;
    },
    D_FillTraining: function (type, playerTS, g, NowSeasonInfo) {
        if (type == "") {
            vanGmMz.fillTrainingLevel("itc", vanGmMzModel.mzreg.bar_itc, playerTS, g.marker.symbol);
            vanGmMz.fillTrainingLevel("ycc", vanGmMzModel.mzreg.bar_ycc, playerTS, g.marker.symbol);
            vanGmMz.fillTrainingLevel("pos", vanGmMzModel.mzreg.bar_pos, playerTS, g.marker.symbol);
            vanGmMz.fillTrainingLevel("neg", vanGmMzModel.mzreg.bar_neg, playerTS, g.marker.symbol, true);
        } else {
            vanGmMz.fillTrainingLevel(type, vanGmMzModel.mzreg.bar_itc, playerTS, g.marker.symbol);
            vanGmMz.fillTrainingLevel(type, vanGmMzModel.mzreg.bar_ycc, playerTS, g.marker.symbol);
            vanGmMz.fillTrainingLevel(type, vanGmMzModel.mzreg.bar_pos, playerTS, g.marker.symbol);
            vanGmMz.fillTrainingLevel(type, vanGmMzModel.mzreg.bar_neg, playerTS, g.marker.symbol, true);
        }
    },
    D_NowSeasonText: function (pid, NowSeasonInfo, pdom) {

    },
    D_ShowScoutText: function (strSus, pid, pdom, HS, HPids, LS, LPids) {
        showHelpLayer(strSus, vanGmMz.now_language.scoutReport, true);
        return strSus;
    },
    D_ShowMaybeSkill: function (pdom, HStar, HP1, HP2, LStar, LP1, LP2) {

    },
    D_OpenSetting: function () {

    },
    D_SetMaybeSkill: function (pdom, HStar, HP1, HP2, LStar, LP1, LP2) {
        let imgs = pdom.find("img.skill");
        let LMax = 10, Nmin = 4, NMax = 10, Hmin = 7;
        if (LStar == 1) {
            Nmin = 4;
            LMax = 6;
        }
        else if (LStar == 2) {
            Nmin = 5;
            LMax = 8;
        } else if (LStar == 3) {
            Nmin = 7;
            LMax = 10;
        }
        if (HStar < 4) {
            NMax = 9;
        }
        let tmpMSkills = {};
        for (let i = 0; i < 11; i++) {
            if (imgs[i].skill == undefined) {
                return;
            }
            let mskill = imgs[i].skill;
            if (imgs[i].maxed == "green") {
                mskill += 1;
            }
            tmpMSkills[i] = mskill;
            if (i == LP1 - 1 || i == LP2 - 1) {
                if (Nmin < mskill) {
                    Nmin = mskill;
                }
            } else if (i == HP1 - 1 || i == HP2 - 1) {
                //高星
                if (imgs[i].maxed == "red") {
                    if (mskill < NMax) {
                        NMax = mskill;
                    }
                }
            } else {
                if (Hmin < mskill) {
                    Hmin = mskill;
                }
                if (imgs[i].maxed == "red") {
                    if (mskill < LMax) {
                        LMax = mskill;
                    }
                }
            }
        }
        for (let i = 0; i < 11; i++) {
            let mbskill = 4;
            let mbmax = 10;
            if (i == HP1 - 1 || i == HP2 - 1) {
                //高星
                if (imgs[i].maxed != "red") {
                    mbmax = 10;
                }

                if (HStar == 3) {
                    mbskill = 8;
                } else if (HStar == 4) {
                    mbskill = 9;
                    //h4 9死 另一个一定10
                    let ahp;
                    if (i == HP1 - 1) {
                        ahp = HP2 - 1;
                    } else {
                        ahp = HP1 - 1;
                    }
                    if (imgs[ahp].maxed == "red" && imgs[ahp].skill == 9) {
                        mbskill = 10;
                    }
                }
                if (mbskill < Hmin) {
                    mbskill = Hmin;
                }
                if (mbskill < Nmin) {
                    mbskill = Nmin;
                }
            } else if (i == LP1 - 1 || i == LP2 - 1) {
                //低星
                if (imgs[i].maxed != "red") {
                    mbmax = LMax;
                }
            } else {
                if (imgs[i].maxed != "red") {
                    mbmax = NMax;
                }
                if (mbskill < Nmin) {
                    mbskill = Nmin;
                }
            }
            if (mbskill < tmpMSkills[i]) {
                mbskill = tmpMSkills[i];
            }
            if (imgs[i].maxed == "red") {
                mbmax = imgs[i].skill;
            }
            imgs[i].mbskill = mbskill;
            imgs[i].mbmax = mbmax;
        }

    },
    radarOption: function (tacPlayer, option, text) {
        let CFScore = this.GetScore(tacPlayer, vanGmMz.tacCof["CF"]);
        let WFScore = this.GetScore(tacPlayer, vanGmMz.tacCof["LWF"]);
        //let WMFScore = this.GetScore(tacPlayer, vanGmMz.tacCof["LMF"]);
        let CMFScore = this.GetScore(tacPlayer, vanGmMz.tacCof["CMF"]);
        let WMScore = this.GetScore(tacPlayer, vanGmMz.tacCof["LM"]);
        let CDMScore = this.GetScore(tacPlayer, vanGmMz.tacCof["CDM"]);
        let WBScore = this.GetScore(tacPlayer, vanGmMz.tacCof["LSB"]);
        let CBScore = this.GetScore(tacPlayer, vanGmMz.tacCof["CB"]);
        let GKScore = this.GetScore(tacPlayer, vanGmMz.tacCof["GK"]);
        option.legend.data.push(text);
        option.series[0].data.push({
            value: [CFScore, WFScore, CDMScore, WBScore, CBScore, GKScore, WMScore, CMFScore],
            name: text
        });
    },
    getRadarOption: function (tacPI, pdom) {
        let option = {
            title: {
                text: vanGmMz.now_language.PosScores
            },
            tooltip: {},
            legend: {
                data: []
            },
            radar: {
                name: {
                    textStyle: {
                        color: '#fff',
                        backgroundColor: '#999',
                        borderRadius: 3,
                        padding: [3, 5]
                    }
                },
                indicator: [
                    { name: vanGmMz.now_language.Pos56, max: 100 },
                    { name: vanGmMz.now_language.Pos10, max: 100 },
                    { name: vanGmMz.now_language.Pos21, max: 100 },
                    { name: vanGmMz.now_language.Pos22, max: 100 },
                    { name: vanGmMz.now_language.Pos9, max: 100 },
                    { name: vanGmMz.now_language.Pos7, max: 100 },
                    { name: vanGmMz.now_language.Pos4, max: 100 },
                    { name: vanGmMz.now_language.Pos23, max: 100 }
                ]
            },
            series: [{
                name: vanGmMz.now_language.Scores,
                type: 'radar',
                data: []
            }]
        };
        this.radarOption(tacPI.tacPlayer, option, vanGmMz.now_language.now);

        let imgs = pdom.find("img.skill");
        if (tacPI.tacPlayerMB.InitByImgs(imgs, "mbskill", 100, 100)) {
            this.radarOption(tacPI.tacPlayerMB, option, vanGmMz.now_language.future);
        }
        if (tacPI.tacPlayerMax.InitByImgs(imgs, "mbmax", 100, 100)) {
            this.radarOption(tacPI.tacPlayerMax, option, vanGmMz.now_language.max);
        }

        return option;
    },
    showScore: function (pid, pdom) {

        let tacPI = this.tacP[pid];
        if (tacPI == undefined) {
            tacPI = { tacPlayer: new vpleModel.TacPlayer(), tacPlayerMB: new vpleModel.TacPlayer(), tacPlayerMax: new vpleModel.TacPlayer() };

            this.tacP[pid] = tacPI;
        }
        if (tacPI.tacPlayer.InitByTds(pdom.find("td.skillval"))) {
            let content = "<div class='clearfix'><div id='ldchart' style='height: 400px; width: 400px'></div>";
            let pname = pdom.find(".player_name").html();
            if (pname == undefined) {
                pname = pdom.find(".player_link").html();
            }
            showHelpLayer(content, pname + "(" + pid + ")", true);
            let radar_chart = echarts.init(document.getElementById("ldchart"));
            radar_chart.setOption(this.getRadarOption(tacPI, pdom));
        }
    },
    GetScore: function (player, tacConfItem) {
        var Speed = this.GetScoreItem(player.Speed, tacConfItem.Speed);
        var Stamina = this.GetScoreItem(player.Stamina, tacConfItem.Stamina);
        var Gameintelligence = this.GetScoreItem(player.Gameintelligence, tacConfItem.Gameintelligence);
        var Passing = this.GetScoreItem(player.Passing, tacConfItem.Passing);
        var Shooting = this.GetScoreItem(player.Shooting, tacConfItem.Shooting);
        var Heading = this.GetScoreItem(player.Heading, tacConfItem.Heading);
        var Goalkeeping = this.GetScoreItem(player.Goalkeeping, tacConfItem.Goalkeeping);
        var Technique = this.GetScoreItem(player.Technique, tacConfItem.Technique);
        var Tackling = this.GetScoreItem(player.Tackling, tacConfItem.Tackling);
        var Highpassing = this.GetScoreItem(player.Highpassing, tacConfItem.Highpassing);
        var Situations = this.GetScoreItem(player.Situations, tacConfItem.Situations);
        var Experience = this.GetScoreItem(player.Experience, tacConfItem.Experience);
        var Form = this.GetScoreItem(player.Form, tacConfItem.Form);

        var score = player.Speed * Speed
            + player.Stamina * Stamina
            + player.Gameintelligence * Gameintelligence
            + player.Passing * Passing
            + player.Shooting * Shooting
            + player.Heading * Heading
            + player.Goalkeeping * Goalkeeping
            + player.Technique * Technique
            + player.Tackling * Tackling
            + player.Highpassing * Highpassing
            + player.Situations * Situations
            + player.Form * Form
            + player.Experience * Experience;
        var sum = Speed
            + Stamina
            + Gameintelligence
            + Passing
            + Shooting
            + Heading
            + Goalkeeping
            + Technique
            + Tackling
            + Highpassing
            + Situations
            + Form
            + Experience;
        return (score / sum).toFixed(2);
    },
    GetScoreItem: function (attrVal, prop) {
        var lastVal = 0;
        $.each(prop, function (key, values) {
            lastVal = values;
            if (attrVal < key) {
                return false;
            }
        });
        return lastVal;
    }
};

(function () {
    'use strict';
    try { vanGmMz.PLoad(); }
    catch (e) { console.error('[mzc-adv] van bootstrap threw (skill-coloring/other van features may be down — report this):', e); }
})();

// Surface any later async throw from van's features in a clearly tagged way so we
// can pinpoint what current-MZ change broke it (does NOT affect the module below).
try {
    window.addEventListener('error', function (ev) {
        var s = String((ev && ev.error && ev.error.stack) || (ev && ev.message) || '');
        if (/vanGmMz|playerAdvanced|vple|echarts|MyGame|ajaxSport/i.test(s)) {
            console.error('[mzc-adv] van runtime error:', ev.message, ev.filename + ':' + ev.lineno);
        }
    });
} catch (e) { /* ignore */ }

// ===== mzcopilot match-page player VALUES + team total (independent module) =====
// Self-contained — runs on ?p=match regardless of whether van's code breaks. Adds
// each player's value into the Estadísticas stats tables + a per-team total. Values
// come from MZ's OWN converted ?p=players&sub=alt page (already in the viewer's
// currency), NEVER the raw team_playerlist XML (team's LOCAL currency → inflates a
// foreign side). The team total sums ONLY the 11 starters (subs are shown, dimmed).
(function () {
    'use strict';
    var CACHE = {}, running = false;
    function urlParam(n) { try { return new URL(location.href).searchParams.get(n); } catch (e) { return null; } }
    function group(n) { return String(Math.round(n)).replace(/\B(?=(\d{3})+(?!\d))/g, " "); }
    function parseValor(html) {
        var out = {}, rowRe = /<tr\b[^>]*>([\s\S]*?)<\/tr>/gi, rm;
        while ((rm = rowRe.exec(html))) {
            var row = rm[1] || "", pidM = row.match(/[?&]pid=(\d+)/); if (!pidM) continue;
            var cellRe = /<td\b[^>]*>([\s\S]*?)<\/td>/gi, cells = [], nameIdx = -1, cm;
            while ((cm = cellRe.exec(row))) {
                if (nameIdx === -1 && /[?&]pid=\d+/.test(cm[1])) nameIdx = cells.length;
                cells.push((cm[1] || "").replace(/<[^>]*>/g, " ").replace(/&nbsp;/gi, " ").replace(/\s+/g, " ").trim());
            }
            if (nameIdx === -1) continue;
            var v = Number((cells[nameIdx + 1] || "").replace(/[^\d]/g, ""));
            if (v > 1000 && out[pidM[1]] == null) out[pidM[1]] = v;
        }
        return out;
    }
    function fetchTeam(tid) {
        if (CACHE[tid] && Date.now() - CACHE[tid].at < 1800000) return Promise.resolve(CACHE[tid].map);
        return fetch("/?p=players&sub=alt&tid=" + encodeURIComponent(tid) + "&sport=soccer", { credentials: "include" })
            .then(function (r) { return r.text(); })
            .then(function (h) { var m = parseValor(h); CACHE[tid] = { at: Date.now(), map: m }; return m; })
            .catch(function (e) { console.warn("[mzc-match] alt-page fetch failed for team", tid, e); return {}; });
    }
    function teamIds() {
        var ids = [], links = document.querySelectorAll('a[href*="p=team&tid="]');
        for (var i = 0; i < links.length; i++) {
            var m = (links[i].getAttribute("href") || "").match(/tid=(\d+)/);
            if (m && ids.indexOf(m[1]) < 0) ids.push(m[1]);
            if (ids.length >= 2) break;
        }
        return ids;
    }
    function run() {
        if (urlParam("p") !== "match" || running) return;
        var tables = [].slice.call(document.querySelectorAll("table.matchStats")).filter(function (t) { return !t.dataset.mzcVal; });
        if (!tables.length) return;
        running = true;
        var ids = teamIds();
        if (!ids.length) { running = false; console.warn("[mzc-match] no team ids on page"); return; }
        Promise.all(ids.map(fetchTeam)).then(function (maps) {
            var val = {}; maps.forEach(function (m) { for (var p in m) val[p] = m[p]; });
            console.log("[mzc-match] " + Object.keys(val).length + " player values; injecting into " + tables.length + " tables");
            tables.forEach(function (T) {
                if (T.dataset.mzcVal) return;
                var total = 0, starters = 0;
                [].slice.call(T.querySelectorAll("tr")).forEach(function (r) {
                    var link = r.querySelector('a[href*="pid="]'), txt = r.textContent || "";
                    if (link) {
                        starters++; var isStarter = starters <= 11;
                        var m = (link.getAttribute("href") || "").match(/pid=(\d+)/), v = m ? val[m[1]] : null;
                        var td = document.createElement("td");
                        td.style.cssText = "text-align:right;font-weight:bold;color:#1a7a3a;white-space:nowrap;padding:0 6px";
                        td.textContent = v != null ? group(v) : "—";
                        if (isStarter && v != null) total += v;
                        if (!isStarter) { td.style.opacity = "0.45"; td.title = "Suplente — no suma al total"; }
                        r.insertBefore(td, r.cells[1] || null);
                    } else if (/Equipo/i.test(txt)) {
                        var tdt = document.createElement("td");
                        tdt.style.cssText = "text-align:right;font-weight:bold;color:#b45309;white-space:nowrap;padding:0 6px";
                        tdt.textContent = group(total); tdt.title = "Suma del 11 titular";
                        r.insertBefore(tdt, r.cells[1] || null);
                    } else if (r.querySelectorAll("th").length >= 3) {
                        var th = document.createElement("th"); th.textContent = "Valor";
                        r.insertBefore(th, r.cells[1] || null);
                    }
                });
                T.dataset.mzcVal = "1";
            });
        }).catch(function (e) { console.warn("[mzc-match] inject error", e); }).then(function () { running = false; });
    }
    function schedule() { [800, 2000, 3500, 6000].forEach(function (ms) { setTimeout(run, ms); }); }
    if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", schedule); else schedule();
    var dbnc; try { new MutationObserver(function () { clearTimeout(dbnc); dbnc = setTimeout(run, 700); }).observe(document.documentElement, { childList: true, subtree: true }); } catch (e) { /* ignore */ }
})();

// ===== mzcopilot match INSIGHT (?p=match) — per-team starting-XI rating summary =====
// Self-contained: reads the per-player ratings already in MZ's lineup tables
// (table.statsLite.marker, rating = last cell) and shows, per team, the XI
// average rating + MVP (top-rated) + weakest starter. No account/API needed.
(function () {
  'use strict';
  function up(n) { try { return new URL(location.href).searchParams.get(n); } catch (e) { return null; } }
  function teamNames() {
    var m = (document.title || '').match(/\|\s*(.+?)\s+-\s+(.+?)\s*\(/);
    return m ? [m[1].trim(), m[2].trim()] : ['Local', 'Visitante'];
  }
  var building = false;
  function pVal(html) { var out = {}, R = /<tr\b[^>]*>([\s\S]*?)<\/tr>/gi, m; while ((m = R.exec(html))) { var r = m[1] || "", p = r.match(/[?&]pid=(\d+)/); if (!p) continue; var C = /<td\b[^>]*>([\s\S]*?)<\/td>/gi, c = [], n = -1, x; while ((x = C.exec(r))) { if (n < 0 && /[?&]pid=\d+/.test(x[1])) n = c.length; c.push((x[1] || "").replace(/<[^>]*>/g, " ").replace(/&nbsp;/gi, " ").replace(/\s+/g, " ").trim()); } if (n < 0) continue; var v = Number((c[n + 1] || "").replace(/[^\d]/g, "")); if (v > 1000) out[p[1]] = v; } return out; }
  async function run() {
    if (building || up('p') !== 'match' || document.getElementById('mzc-insight')) return;
    var tables = [].slice.call(document.querySelectorAll('table.statsLite.marker')).filter(function (t) { return t.querySelector('a[href*="pid="]'); });
    if (!tables.length) return;
    building = true;
    try {
      var names = teamNames(), insights = [];
      tables.forEach(function (t, idx) {
        var rows = [].slice.call(t.querySelectorAll('tr')).filter(function (r) { return r.querySelector('a[href*="pid="]'); });
        var players = rows.map(function (r) {
          var c = r.cells, a = r.querySelector('a[href*="pid="]');
          return { name: a.textContent.trim(), pid: (a.getAttribute('href').match(/pid=(\d+)/) || [])[1], rating: parseFloat((c[c.length - 1].textContent || '').replace(',', '.')) };
        }).filter(function (p) { return !isNaN(p.rating) && p.rating > 0; });
        var xi = players.slice(0, 11);
        if (!xi.length) return;
        var s = xi.slice().sort(function (a, b) { return b.rating - a.rating; });
        var avg = (xi.reduce(function (a, b) { return a + b.rating; }, 0) / xi.length).toFixed(2);
        insights.push({ team: names[idx] || ('Equipo ' + (idx + 1)), avg: avg, mvp: s[0], worst: s[s.length - 1], pids: xi.map(function (p) { return p.pid; }) });
      });
      if (!insights.length) { building = false; return; }
      // starting-11 $ value: fetch both teams' converted alt pages, merge, sum each XI
      var ids = []; document.querySelectorAll('a[href*="p=team&tid="]').forEach(function (a) { var m = (a.getAttribute('href') || '').match(/tid=(\d+)/); if (m && ids.indexOf(m[1]) < 0 && ids.length < 2) ids.push(m[1]); });
      var val = {};
      try { var maps = await Promise.all(ids.map(function (t) { return fetch('/?p=players&sub=alt&tid=' + t + '&sport=soccer', { credentials: 'include' }).then(function (r) { return r.text(); }).then(pVal).catch(function () { return {}; }); })); maps.forEach(function (mp) { for (var p in mp) val[p] = mp[p]; }); } catch (e) { /* values optional */ }
      insights.forEach(function (ti) { var sum = ti.pids.reduce(function (a, p) { return a + (val[p] || 0); }, 0); ti.xiVal = sum > 0 ? sum : null; });
      if (document.getElementById('mzc-insight')) { building = false; return; }
      var box = document.createElement('div');
      box.id = 'mzc-insight';
      box.style.cssText = 'margin:8px auto;max-width:980px;border-radius:11px;overflow:hidden;box-shadow:0 3px 14px rgba(0,0,0,.22);border:1px solid #cbd5e1;font:13px/1.5 Arial,Helvetica,sans-serif;background:#eef1f6';
      function teamCard(ti, accent) {
        return '<div style="background:#fff;border:1px solid #e5e9f0;border-radius:9px;box-shadow:0 1px 3px rgba(0,0,0,.06);overflow:hidden"><div style="padding:6px 11px;background:' + accent + '1a;border-bottom:1px solid ' + accent + '33;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.4px;color:' + accent + '">' + ti.team + '</div><div style="padding:9px 11px">'
          + (ti.xiVal ? '<span style="display:inline-block;background:#eff6ff;border:1px solid #bfdbfe;border-radius:8px;padding:4px 11px;margin:0 7px 6px 0"><span style="color:#64748b;font-size:10px;text-transform:uppercase;letter-spacing:.5px">Valor XI</span> <b style="color:#1d4ed8;font-size:15px;margin-left:3px">$' + (ti.xiVal / 1e6).toFixed(1) + 'M</b></span>' : '')
          + '<span style="display:inline-block;background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:4px 11px;margin-bottom:6px"><span style="color:#64748b;font-size:10px;text-transform:uppercase;letter-spacing:.5px">Nota media</span> <b style="color:#0f172a;font-size:14px;margin-left:3px">' + ti.avg + '</b></span>'
          + '<div style="margin-top:4px;font-size:12.5px">⭐ MVP: <b>' + ti.mvp.name + '</b> <span style="color:#16a34a;font-weight:700">' + ti.mvp.rating.toFixed(2) + '</span></div>'
          + '<div style="margin-top:2px;font-size:12.5px;color:#64748b">▽ Flojo: ' + ti.worst.name + ' <span style="color:#dc2626;font-weight:700">' + ti.worst.rating.toFixed(2) + '</span></div></div></div>';
      }
      box.innerHTML = '<div style="background:linear-gradient(135deg,#1e293b,#2563eb);color:#fff;padding:9px 15px;font-weight:700;letter-spacing:.3px"><span style="font-size:15px;margin-right:6px">⚡</span>mzcopilot <span style="opacity:.65;font-weight:400">· análisis del partido</span></div>'
        + '<div style="padding:12px 13px"><div style="display:grid;grid-template-columns:' + (insights.length > 1 ? '1fr 1fr' : '1fr') + ';gap:11px">'
        + insights.map(function (ti, i) { return teamCard(ti, i === 0 ? '#2563eb' : '#475569'); }).join('')
        + '</div></div>';
      var stripes = document.getElementById('stripes');
      if (stripes) stripes.insertBefore(box, stripes.firstChild);
      else { var anchor = tables[0].closest('table') || tables[0]; if (anchor && anchor.parentNode) anchor.parentNode.insertBefore(box, anchor); }
    } catch (e) { /* ignore */ }
    building = false;
  }
  function sched() { [800, 2000, 4000].forEach(function (ms) { setTimeout(run, ms); }); }
  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', sched); else sched();
  var d2; try { new MutationObserver(function () { clearTimeout(d2); d2 = setTimeout(run, 700); }).observe(document.documentElement, { childList: true, subtree: true }); } catch (e) { /* ignore */ }
})();

// ===== mzcopilot RIVAL BRIEF (?p=team&tid=X) — scout panel =====
// Self-contained: the team's converted player values (alt page) + recent
// SENIOR-official form (team_matchlist.php) → XI value, squad size, last-5 form,
// top threats. No account/API needed. Fires on any OTHER team's page
// (?p=team&tid=X); clubhouse is own-team-only so it can't be used for rivals.
(function () {
  'use strict';
  function up(n) { try { return new URL(location.href).searchParams.get(n); } catch (e) { return null; } }
  function parseValor(html) {
    var out = {}, R = /<tr\b[^>]*>([\s\S]*?)<\/tr>/gi, m;
    while ((m = R.exec(html))) {
      var r = m[1] || "", p = r.match(/[?&]pid=(\d+)/); if (!p) continue;
      var C = /<td\b[^>]*>([\s\S]*?)<\/td>/gi, c = [], n = -1, x;
      while ((x = C.exec(r))) { if (n < 0 && /[?&]pid=\d+/.test(x[1])) n = c.length; c.push((x[1] || "").replace(/<[^>]*>/g, " ").replace(/&nbsp;/gi, " ").replace(/\s+/g, " ").trim()); }
      if (n < 0) continue;
      var name = (c[n] || "").replace(/^\d+/, "").replace(/\s*\d.*$/, "").trim(); // strip shirt# + age/pos tail
      var v = Number((c[n + 1] || "").replace(/[^\d]/g, ""));
      if (v > 1000) out[p[1]] = { name: name, v: v };
    }
    return out;
  }
  function recentForm(ml, tid) {
    var out = [], blocks = ml.match(/<Match\b[^>]*>[\s\S]*?<\/Match>/g) || [];
    for (var i = 0; i < blocks.length && out.length < 5; i++) {
      var b = blocks[i], head = (b.match(/<Match\b[^>]*>/) || [""])[0];
      if (!/status="played"/.test(head)) continue;
      var type = (head.match(/type="([^"]*)"/) || [])[1] || "";
      if (!/^(league|world_league|cup)/.test(type)) continue; // senior official only
      var teams = b.match(/<Team\b[^>]*>/g) || [], mine = null, opp = null;
      for (var j = 0; j < teams.length; j++) {
        var id = (teams[j].match(/teamId="(\d+)"/) || [])[1], g = Number((teams[j].match(/goals="(\d+)"/) || [])[1]);
        if (id === tid) mine = g; else opp = g;
      }
      if (mine == null || opp == null) continue;
      out.push(mine > opp ? "W" : mine < opp ? "L" : "D");
    }
    return out;
  }
  async function run() {
    var tid = up('tid');
    if (up('p') !== 'team' || !tid || document.getElementById('mzc-rival')) return;
    var ml, alt;
    try {
      var res = await Promise.all([
        fetch('/xml/team_matchlist.php?sport_id=soccer&team_id=' + tid, { credentials: 'include' }).then(function (r) { return r.text(); }),
        fetch('/?p=players&sub=alt&tid=' + tid + '&sport=soccer', { credentials: 'include' }).then(function (r) { return r.text(); })
      ]);
      ml = res[0]; alt = res[1];
    } catch (e) { console.warn('[mzc-rival] fetch failed', e); return; }
    var pmap = parseValor(alt);
    var players = Object.keys(pmap).map(function (k) { return pmap[k]; }).sort(function (a, b) { return b.v - a.v; });
    if (!players.length) return;
    var xi = players.slice(0, 11), xiVal = xi.reduce(function (s, p) { return s + p.v; }, 0);
    var form = recentForm(ml, tid);
    var formHtml = form.map(function (r) {
      var c = r === 'W' ? '#16a34a' : r === 'D' ? '#d97706' : '#dc2626';
      return '<span style="display:inline-flex;width:18px;height:18px;align-items:center;justify-content:center;border-radius:4px;color:#fff;font-weight:700;font-size:11px;margin-right:3px;background:' + c + '">' + r + '</span>';
    }).join('');
    var threatHtml = players.slice(0, 4).map(function (p) {
      return '<span style="display:inline-block;background:#f1f5f9;border:1px solid #e2e8f0;border-radius:999px;padding:2px 9px;margin:0 5px 4px 0;font-size:12px;color:#334155"><b style="color:#0f172a">' + p.name + '</b> <span style="color:#16a34a;font-weight:600">$' + (p.v / 1e6).toFixed(2) + 'M</span></span>';
    }).join('');
    var rPill = function (label, val) { return '<span style="display:inline-block;background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:3px 11px;margin:0 8px 4px 0"><span style="color:#64748b;font-size:11px;text-transform:uppercase;letter-spacing:.4px">' + label + '</span> <b style="color:#0f172a;font-size:14px">' + val + '</b></span>'; };
    var box = document.createElement('div');
    box.id = 'mzc-rival';
    box.style.cssText = 'margin:8px auto;max-width:980px;border-radius:10px;overflow:hidden;box-shadow:0 2px 10px rgba(0,0,0,.18);border:1px solid #cbd5e1;font:13px/1.5 Arial,Helvetica,sans-serif;background:#fff';
    box.innerHTML = '<div style="background:linear-gradient(135deg,#1e293b,#2563eb);color:#fff;padding:8px 14px;font-weight:700;letter-spacing:.3px"><span style="font-size:15px;margin-right:6px">⚡</span>mzcopilot <span style="opacity:.65;font-weight:400">· informe rival</span></div>'
      + '<div style="padding:11px 14px">'
        + '<div style="margin-bottom:6px">' + rPill('Valor XI', '$' + (xiVal / 1e6).toFixed(1) + 'M') + rPill('Plantel', players.length)
          + (form.length ? '<span style="white-space:nowrap"><span style="color:#64748b;font-size:11px;text-transform:uppercase;letter-spacing:.4px;margin-right:5px">Forma</span>' + formHtml + '</span>' : '')
        + '</div>'
        + '<div><span style="color:#64748b;font-size:11px;text-transform:uppercase;letter-spacing:.4px">Amenazas</span><div style="margin-top:4px">' + threatHtml + '</div></div>'
      + '</div>';
    var anchor = document.getElementById('stripes') || document.getElementById('mainDiv') || document.body;
    anchor.insertBefore(box, anchor.firstChild);
  }
  function sched() { [1000, 2500, 4500].forEach(function (ms) { setTimeout(run, ms); }); }
  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', sched); else sched();
})();

// ===== mzcopilot LINEUP CHECK (?p=tactics) — XI value + legality =====
// Self-contained: reads the placed XI from the tactics pitch (#pitch drag tokens;
// subs carry .substitute), your converted squad values (own alt page), and shows the
// starting-XI value, formation, an 11/11 legality check, and your priciest sub.
// Purely additive + fully try/caught: on any failure it shows nothing and never
// touches van's tactics coloring. The badge is a SIBLING of #pitch and we observe
// only #pitch, so re-rendering the badge can't retrigger itself (no mutation loop).
(function () {
  'use strict';
  var VMAP = null, building = false, observing = false;
  function up(n) { try { return new URL(location.href).searchParams.get(n); } catch (e) { return null; } }
  function parseValor(html) {
    var out = {}, R = /<tr\b[^>]*>([\s\S]*?)<\/tr>/gi, m;
    while ((m = R.exec(html))) {
      var r = m[1] || "", p = r.match(/[?&]pid=(\d+)/); if (!p) continue;
      var C = /<td\b[^>]*>([\s\S]*?)<\/td>/gi, c = [], n = -1, x;
      while ((x = C.exec(r))) { if (n < 0 && /[?&]pid=\d+/.test(x[1])) n = c.length; c.push((x[1] || "").replace(/<[^>]*>/g, " ").replace(/&nbsp;/gi, " ").replace(/\s+/g, " ").trim()); }
      if (n < 0) continue;
      var name = (c[n] || "").replace(/^\d+/, "").replace(/\s*\d.*$/, "").trim();
      var v = Number((c[n + 1] || "").replace(/[^\d]/g, ""));
      if (v > 1000) out[p[1]] = { name: name, v: v };
    }
    return out;
  }
  function getVals() {
    if (VMAP) return Promise.resolve(VMAP);
    return fetch('/?p=team', { credentials: 'include' }).then(function (r) { return r.text(); }).then(function (t) {
      var tid = (t.match(/[?&]tid=(\d+)/) || [])[1];
      if (!tid) { VMAP = {}; return VMAP; }
      return fetch('/?p=players&sub=alt&tid=' + tid + '&sport=soccer', { credentials: 'include' }).then(function (r) { return r.text(); }).then(function (h) { VMAP = parseValor(h); return VMAP; });
    }).catch(function () { VMAP = {}; return VMAP; });
  }
  async function run() {
    if (building || up('p') !== 'tactics') return;
    var pitch = document.getElementById('pitch'); if (!pitch) return;
    if (!pitch.querySelector('[id^="drag_n_"]')) return;
    building = true;
    try {
      var vmap = await getVals();
      var placed = [].slice.call(pitch.querySelectorAll('[id^="drag_n_"]'));
      var starterEls = placed.filter(function (e) { return !e.classList.contains('substitute'); });
      var subEls = placed.filter(function (e) { return e.classList.contains('substitute'); });
      var starters = starterEls.map(function (e) { return e.id.replace('drag_n_', ''); });
      var illegal = starterEls.filter(function (e) { return !e.classList.contains('fieldpos-ok'); }).length;
      var formation = ((document.getElementById('formation_text') || {}).textContent || '').trim();
      var xiVal = starters.reduce(function (s, p) { return s + (vmap[p] ? vmap[p].v : 0); }, 0);
      var bench = subEls.map(function (e) { return vmap[e.id.replace('drag_n_', '')]; }).filter(Boolean).sort(function (a, b) { return b.v - a.v; });
      var topSub = bench[0];
      var ok = (starterEls.length === 11 && illegal === 0);
      var warn = (starterEls.length !== 11 ? (starterEls.length + '/11 en cancha') : '') + (illegal ? ((starterEls.length !== 11 ? ' · ' : '') + illegal + ' fuera de posición') : '');
      var old = document.getElementById('mzc-lineup'); if (old && old.parentNode) old.parentNode.removeChild(old);
      var lPill = function (label, val) { return '<span style="display:inline-block;background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:3px 11px;margin:0 8px 4px 0"><span style="color:#64748b;font-size:11px;text-transform:uppercase;letter-spacing:.4px">' + label + '</span> <b style="color:#0f172a;font-size:14px">' + val + '</b></span>'; };
      var status = ok
        ? '<span style="display:inline-block;background:#dcfce7;border:1px solid #86efac;border-radius:8px;padding:3px 11px;margin:0 8px 4px 0;color:#15803d;font-weight:700">11/11 ✓</span>'
        : '<span style="display:inline-block;background:#fef3c7;border:1px solid #fcd34d;border-radius:8px;padding:3px 11px;margin:0 8px 4px 0;color:#b45309;font-weight:700">⚠ ' + warn + '</span>';
      var box = document.createElement('div');
      box.id = 'mzc-lineup';
      box.style.cssText = 'margin:8px auto;max-width:780px;border-radius:10px;overflow:hidden;box-shadow:0 2px 10px rgba(0,0,0,.18);border:1px solid ' + (ok ? '#cbd5e1' : '#f59e0b') + ';font:13px/1.5 Arial,Helvetica,sans-serif;background:#fff';
      box.innerHTML = '<div style="background:linear-gradient(135deg,#1e293b,#2563eb);color:#fff;padding:8px 14px;font-weight:700;letter-spacing:.3px"><span style="font-size:15px;margin-right:6px">⚡</span>mzcopilot <span style="opacity:.65;font-weight:400">· alineación</span></div>'
        + '<div style="padding:11px 14px">'
          + '<div>' + lPill('Valor XI', xiVal ? ('$' + (xiVal / 1e6).toFixed(1) + 'M') : '—') + (formation ? lPill('Formación', formation) : '') + status + '</div>'
          + (topSub ? ('<div style="margin-top:2px;color:#64748b;font-size:12px">Suplente más caro: <b style="color:#0f172a">' + topSub.name + '</b> <span style="color:#16a34a;font-weight:600">$' + (topSub.v / 1e6).toFixed(2) + 'M</span></div>') : '')
        + '</div>';
      var tbox = document.getElementById('tactics_box');
      if (tbox && tbox.parentNode) tbox.parentNode.insertBefore(box, tbox.nextSibling);
      else pitch.parentNode.insertBefore(box, pitch);
      if (!observing) {
        observing = true;
        try { var d = null; new MutationObserver(function () { clearTimeout(d); d = setTimeout(run, 800); }).observe(pitch, { childList: true, subtree: true, attributes: true, attributeFilter: ['class'] }); } catch (e) { /* ignore */ }
      }
    } catch (e) { /* never break the tactics page */ }
    building = false;
  }
  function sched() { [1000, 2500, 4500].forEach(function (ms) { setTimeout(run, ms); }); }
  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', sched); else sched();
})();

// ===== mzcopilot CLUBHOUSE PANEL (?p=clubhouse) — personal dashboard (P1–P3) =====
// READ-ONLY command center on your own clubhouse: squad value, XI value, recent
// official form, top assets, and an AUTO-SCOUT of your next opponent (their XI
// value + form + threats). Own team id is read dynamically from /?p=team (never
// hardcoded) so it works for any user. All data from MZ read-safe endpoints — zero
// mutations. Injected at the top of #stripes. Fully try/caught.
(function () {
  'use strict';
  var built = false;
  function up(n) { try { return new URL(location.href).searchParams.get(n); } catch (e) { return null; } }
  function parseValor(html) {
    var out = {}, R = /<tr\b[^>]*>([\s\S]*?)<\/tr>/gi, m;
    while ((m = R.exec(html))) {
      var r = m[1] || "", p = r.match(/[?&]pid=(\d+)/); if (!p) continue;
      var C = /<td\b[^>]*>([\s\S]*?)<\/td>/gi, c = [], n = -1, x;
      while ((x = C.exec(r))) { if (n < 0 && /[?&]pid=\d+/.test(x[1])) n = c.length; c.push((x[1] || "").replace(/<[^>]*>/g, " ").replace(/&nbsp;/gi, " ").replace(/\s+/g, " ").trim()); }
      if (n < 0) continue;
      var name = (c[n] || "").replace(/^\d+/, "").replace(/\s*\d.*$/, "").trim();
      var v = Number((c[n + 1] || "").replace(/[^\d]/g, ""));
      if (v > 1000) out[p[1]] = { name: name, v: v };
    }
    return out;
  }
  function sortedPlayers(html) { var pm = parseValor(html); return Object.keys(pm).map(function (k) { return pm[k]; }).sort(function (a, b) { return b.v - a.v; }); }
  function recentForm(ml, tid) {
    var o = [], b = ml.match(/<Match\b[^>]*>[\s\S]*?<\/Match>/g) || [];
    for (var i = b.length - 1; i >= 0 && o.length < 5; i--) {
      var h = (b[i].match(/<Match\b[^>]*>/) || [''])[0]; if (!/status="played"/.test(h)) continue;
      var ty = (h.match(/type="([^"]*)"/) || [])[1] || ""; if (!/^(league|world_league|cup)/.test(ty)) continue;
      var ts = b[i].match(/<Team\b[^>]*>/g) || [], mine = null, opp = null;
      for (var j = 0; j < ts.length; j++) { var id = (ts[j].match(/teamId="(\d+)"/) || [])[1], g = Number((ts[j].match(/goals="(\d+)"/) || [])[1]); if (id === tid) mine = g; else opp = g; }
      if (mine == null || opp == null) continue; o.unshift(mine > opp ? 'W' : mine < opp ? 'L' : 'D');
    }
    return o;
  }
  function pill(l, v, em) { return '<span style="display:inline-block;background:' + (em ? '#eff6ff' : '#fff') + ';border:1px solid ' + (em ? '#bfdbfe' : '#e2e8f0') + ';border-radius:8px;padding:4px 11px;margin:0 7px 5px 0"><span style="color:#64748b;font-size:10px;text-transform:uppercase;letter-spacing:.5px">' + l + '</span> <b style="color:' + (em ? '#1d4ed8' : '#0f172a') + ';font-size:14px;margin-left:3px">' + v + '</b></span>'; }
  function card(icon, title, accent, bodyHtml) { return '<div style="background:#fff;border:1px solid #e5e9f0;border-radius:9px;box-shadow:0 1px 3px rgba(0,0,0,.06);overflow:hidden"><div style="display:flex;align-items:center;gap:6px;padding:6px 11px;background:' + accent + '1a;border-bottom:1px solid ' + accent + '33"><span style="font-size:13px">' + icon + '</span><span style="font-size:10.5px;font-weight:800;text-transform:uppercase;letter-spacing:.5px;color:' + accent + '">' + title + '</span></div><div style="padding:9px 11px">' + bodyHtml + '</div></div>'; }
  function M(n) { return '$' + (n / 1e6).toFixed(1) + 'M'; }
  function K(n) { return n >= 1e6 ? '$' + (n / 1e6).toFixed(1) + 'M' : '$' + Math.round(n / 1e3) + 'K'; }
  function fsq(f) { return f.map(function (r) { var c = r === 'W' ? '#16a34a' : r === 'D' ? '#d97706' : '#dc2626'; return '<span style="display:inline-flex;width:18px;height:18px;align-items:center;justify-content:center;border-radius:4px;color:#fff;font-weight:700;font-size:11px;margin-right:3px;background:' + c + '">' + r + '</span>'; }).join(''); }
  function chip(n, v) { return '<span style="display:inline-block;background:#f1f5f9;border:1px solid #e2e8f0;border-radius:999px;padding:2px 9px;margin:0 5px 5px 0;font-size:12px;color:#334155"><b style="color:#0f172a">' + n + '</b> <span style="color:#16a34a;font-weight:600">$' + (v / 1e6).toFixed(2) + 'M</span></span>'; }
  function panelHead(label) { return '<div style="background:#f8fafc;border:1px solid #eef2f7;border-radius:8px;padding:10px 12px"><div style="font-size:11px;text-transform:uppercase;letter-spacing:.4px;color:#475569;font-weight:700;margin-bottom:5px">' + label + '</div>'; }
  function gt(u) { return fetch(u, { credentials: 'include' }).then(function (r) { return r.text(); }).catch(function () { return ''; }); }

  async function run() {
    if (built || up('p') !== 'clubhouse' || document.getElementById('mzc-panel')) return;
    var stripes = document.getElementById('stripes'); if (!stripes) return;
    built = true;
    try {
      var teamHtml = await gt('/?p=team');
      var tid = (teamHtml.match(/[?&]tid=(\d+)/) || [])[1];
      if (!tid) { built = false; return; }
      var unameEl = document.querySelector('#header-username,.username,#loggedInUsername,.header-user');
      var uname = unameEl ? unameEl.textContent.trim() : '';
      var res = await Promise.all([
        gt('/?p=players&sub=alt&tid=' + tid + '&sport=soccer'),
        gt('/xml/team_matchlist.php?sport_id=soccer&team_id=' + tid),
        gt('/?p=match&sub=scheduled'),
        gt('/xml/team_playerlist.php?sport_id=soccer&team_id=' + tid),
        gt('/?p=economy'),
        uname ? gt('/xml/manager_data.php?sport_id=soccer&username=' + encodeURIComponent(uname)) : Promise.resolve('')
      ]);
      var players = sortedPlayers(res[0]);
      if (!players.length) { built = false; return; }
      var squadVal = players.reduce(function (s, p) { return s + p.v; }, 0);
      var xiVal = players.slice(0, 11).reduce(function (s, p) { return s + p.v; }, 0);
      var form = recentForm(res[1], tid);
      var sd = new DOMParser().parseFromString(res[2], 'text/html');
      var oppEl = [].slice.call(sd.querySelectorAll('a[href*="p=team&tid="]')).map(function (a) { return { tid: (a.getAttribute('href').match(/tid=(\d+)/) || [])[1], name: a.textContent.trim() }; }).filter(function (x) { return x.tid && x.tid !== tid && x.name; })[0];
      var scoutHtml = '<div style="color:#94a3b8">sin próximo partido</div>', oppName = '';
      if (oppEl) {
        oppName = oppEl.name.length > 22 ? oppEl.name.slice(0, 22) + '…' : oppEl.name;
        var orr = await Promise.all([gt('/?p=players&sub=alt&tid=' + oppEl.tid + '&sport=soccer'), gt('/xml/team_matchlist.php?sport_id=soccer&team_id=' + oppEl.tid)]);
        var op = sortedPlayers(orr[0]);
        if (op.length) {
          var oXi = op.slice(0, 11).reduce(function (s, p) { return s + p.v; }, 0), oForm = recentForm(orr[1], oppEl.tid);
          scoutHtml = '<div style="margin-top:3px">XI <b>$' + (oXi / 1e6).toFixed(1) + 'M</b>' + (oForm.length ? ' &nbsp; ' + fsq(oForm) : '') + '</div><div style="margin-top:5px">' + op.slice(0, 3).map(function (p) { return chip(p.name, p.v); }).join('') + '</div>';
        } else { scoutHtml = '<div style="color:#94a3b8">sin datos del rival</div>'; }
      }
      // P2 data: squad health (injuries), economy, league standing
      var plP = res[3].match(/<Player\b[^>]*>/g) || [];
      var squadSize = plP.length || players.length;
      var injured = plP.filter(function (p) { return /injury="[1-9]/.test(p); }).map(function (p) { return (p.match(/name="([^"]*)"/) || [])[1] || '?'; });
      var saludBody = injured.length
        ? '<span style="display:inline-block;background:#fef3c7;border:1px solid #fcd34d;border-radius:999px;padding:2px 10px;margin:0 6px 4px 0;color:#b45309;font-weight:700;font-size:12px">' + injured.length + ' lesionado' + (injured.length > 1 ? 's' : '') + '</span><span style="color:#64748b;font-size:12px">' + squadSize + ' jugadores</span><div style="margin-top:4px;font-size:12px;color:#334155">' + injured.slice(0, 4).join(' · ') + '</div>'
        : '<span style="display:inline-block;background:#dcfce7;border:1px solid #86efac;border-radius:999px;padding:2px 10px;margin-right:6px;color:#15803d;font-weight:700;font-size:12px">0 lesionados</span><span style="color:#64748b;font-size:12px">' + squadSize + ' jugadores · 0 suspendidos</span>';
      var ecoTxt = '';
      try { ecoTxt = new DOMParser().parseFromString(res[4], 'text/html').body.textContent.replace(/\s+/g, ' '); } catch (e) { }
      function ecoNum(re) { var m = ecoTxt.match(re); return m ? Number(m[1].replace(/[^\d]/g, '')) : null; }
      var balance = ecoNum(/([\d\s.]+)\s*USD\s*Tu Saldo Actual/i), income = ecoNum(/Ingresos\s*([\d\s.]+)\s*USD/i), expProj = ecoNum(/Tu Saldo Actual\s*([\d\s.]+)\s*USD\s*Proyecci/i);
      var ecoBody = balance != null
        ? pill('Balance', M(balance)) + (income != null ? '<span style="font-size:12px;color:#64748b;margin-right:8px">Ingresos <b style="color:#16a34a">+' + K(income) + '</b>/sem</span>' : '') + (expProj != null ? '<span style="font-size:12px;color:#64748b">Gastos <b style="color:#dc2626">-' + K(expProj) + '</b>/sem</span>' : '')
        : '<span style="color:#94a3b8">sin datos</span>';
      var standing = null, seriesId = (res[5].match(/seriesId="(\d+)"/) || [])[1];
      if (seriesId) {
        var lgx = await gt('/xml/team_league.php?sport_id=soccer&league_id=' + seriesId);
        var ownT = (lgx.match(new RegExp('<Team\\b[^>]*teamId="' + tid + '"[^>]*>')) || [])[0] || '';
        if (ownT) standing = { pos: (ownT.match(/pos="(\d+)"/) || [])[1], total: (lgx.match(/<Team\b/g) || []).length, pts: (ownT.match(/points="(\d+)"/) || [])[1] };
      }
      // Native MZ widget chrome: reuse MZ's own .box_dark + .widget-content + h3
      // classes so MZ's stylesheet styles us 1:1 with the clubhouse widgets, and
      // a real .mzbtn green button for the app link.
      var box = document.createElement('div'); box.id = 'mzc-panel'; box.className = 'flex-grow-1 box_dark';
      box.style.cssText = 'margin:8px auto;max-width:980px;float:none;font:13px/1.5 Arial,Helvetica,sans-serif';
      var kpiCard = '<div style="background:#fff;border:1px solid #e5e9f0;border-radius:9px;box-shadow:0 1px 3px rgba(0,0,0,.06);padding:9px 11px;margin-bottom:11px">' + pill('Valor plantel', M(squadVal)) + pill('Valor XI', M(xiVal)) + pill('Plantel', players.length) + (standing ? pill('Liga', standing.pos + 'º/' + standing.total + ' · ' + standing.pts + 'pts', true) : '') + (form.length ? '<span style="white-space:nowrap;margin-left:2px"><span style="color:#64748b;font-size:10px;text-transform:uppercase;letter-spacing:.5px;margin-right:5px">Forma</span>' + fsq(form) + '</span>' : '') + '</div>';
      box.innerHTML = '<div class="widget-content clearfix"><h3><span style="margin-right:6px">⚡</span>mzcopilot</h3><div class="widget-content-wrapper">'
        + kpiCard
        + '<div style="display:grid;grid-template-columns:1fr 1fr;gap:11px">'
        + card('🎯', 'Próximo rival' + (oppName ? ' · ' + oppName : ''), '#dc2626', scoutHtml)
        + card('💎', 'Mis cracks', '#2563eb', players.slice(0, 5).map(function (p) { return chip(p.name, p.v); }).join(''))
        + card('🏥', 'Salud del plantel', '#16a34a', saludBody)
        + card('💰', 'Economía', '#d97706', ecoBody)
        + '</div>'
        + '<div style="margin-top:11px"><a href="https://mzcopilot.vercel.app" target="_blank" rel="noopener" class="mzbtn buttondiv button_account"><span class="buttonClassMiddle"><span style="white-space:nowrap">Abrir mzcopilot app</span></span><span class="buttonClassRight">&nbsp;</span></a></div>'
        + '</div></div>';
      stripes.insertBefore(box, stripes.firstChild);
    } catch (e) { built = false; /* never break the clubhouse */ }
  }
  function sched() { [900, 2200, 4200].forEach(function (ms) { setTimeout(run, ms); }); }
  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', sched); else sched();
})();