XMOJ

XMOJ增强脚本

// ==UserScript==
// @name         XMOJ
// @version      1.4.0
// @description  XMOJ增强脚本
// @author       @XMOJ-Script-dev, @langningchen and the community
// @namespace    https://github/langningchen
// @match        *://*.xmoj.tech/*
// @match        *://116.62.212.172/*
// @require      https://s4.zstatic.net/ajax/libs/crypto-js/4.1.1/crypto-js.min.js
// @require      https://s4.zstatic.net/ajax/libs/codemirror/6.65.7/codemirror.min.js
// @require      https://s4.zstatic.net/ajax/libs/codemirror/6.65.7/mode/clike/clike.min.js
// @require      https://s4.zstatic.net/ajax/libs/codemirror/6.65.7/addon/merge/merge.js
// @require      https://s4.zstatic.net/ajax/libs/diff_match_patch/20121119/diff_match_patch_uncompressed.js
// @require      https://s4.zstatic.net/ajax/libs/dompurify/3.0.2/purify.min.js
// @require      https://s4.zstatic.net/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js
// @require      https://s4.zstatic.net/ajax/libs/marked/4.3.0/marked.min.js
// @grant        GM_registerMenuCommand
// @grant        GM_xmlhttpRequest
// @grant        GM_setClipboard
// @grant        unsafeWindow
// @grant        GM_setValue
// @grant        GM_getValue
// @homepage     https://www.xmoj-bbs.me/
// @supportURL   https://support.xmoj-bbs.me/form/8050213e-c806-4680-b414-0d1c48263677
// @connect      api.xmoj-bbs.tech
// @connect      api.xmoj-bbs.me
// @connect      challenges.cloudflare.com
// @connect      cppinsights.io
// @connect      s4.zstatic.net
// @connect      127.0.0.1
// @license      GPL
// @icon         data:image/png;base64,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Uk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAAJcEhZcwAACxMAAAsTAQCanBgAAAPSaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA3LjItYzAwMCA3OS4xYjY1YTc5LCAyMDIyLzA2LzEzLTE3OjQ2OjE0ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6ZTIyMGE0MzYtMWFhYi01MjRjLTg1ZjQtNDUyYjdkYTE4ZjdhIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjlEQTA5MUE5OTM0NEYxNEM5Q0RFMEVFREY2MzA4QThEIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjk1RkQ1QzI3QzBFN0I2NDdCMTBGMzU5NjU0RUI1NjQ2IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMy41IChXaW5kb3dzKSIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6ZTIyMGE0MzYtMWFhYi01MjRjLTg1ZjQtNDUyYjdkYTE4ZjdhIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOmUyMjBhNDM2LTFhYWItNTI0Yy04NWY0LTQ1MmI3ZGExOGY3YSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PiotHO0AAHUaSURBVHic1L1lmB1V1v7927uqjrVb3CACcQWSAAGCu8vgEtzdCRoIFggOwWVwGNwJIUKIESXu2t1p72NVtdf7oao7HWxmnv888u5cdXXOOXVOVe21Zcm97qU2bFrPf7UpBb5nqKmuJ5VOU1RUzOOPP84bb7xBt25daduuA337DWDEiN257dZb2LlnL/r368cjj4zjgvNH0b59J6ZNnU5RUT61tbVkMlm69+jB0qVLOfSQg1i5ai1PPf0iN1x7Ed98+y0LFy7mzjvv5N133ue77yYyYMAAjj/xWJ557jkuvvgC9th9OIuXLGHF8uWcfuqp5ObmOr7JDtfaFoWe4/m+6/ueD/jRSNQ88dQz3HP3PezYdQfatGlN506d2KlnTzp17MSpp59JWWkp3br3YOQ+eyOuz+jRd3DU0Udw2mmn8PXXXzNz5s9ccsnFHH30UXz15Xdcc+117L3PXvzjHx9y6KGH8f13E9lnn31ZsmQZw3ffFddNMWz3PRgz5n5OP/VUSstK+fDD97nt1lvQWrFTj53QWjf3r4hgxAcMgqCU+rdlZP+Xpft/qIkIlmURiURwHCfqOE5ufUPDDq7rHe777km+Lz188Td6rjfd871FwKpELL6ivr5+nW3baa21q7XOWpaVsW074ziO+d9+pv9U+/+tgJuEGo1GdSwWKyovLy9atGjRjsuXL9+rvKL80Ouvv77/urXr2FJeTm1tHZ5n2rmed7Tve0eDwrIsEokEOYk4DfX1q6ujkZXxWGxBPCcxN5vJLBSRrVrrRsuyGyORSJ0oHxH5337sf7v9/0rASikSiQSOE8mNRCJtKisr2s6fP3eA72X3G3PP2H22bFqb98fftADV4gAQqrduBQTwuwBdgJFN34gkChobchoXVZRvmrf4119/Ft8sikajWx0nUpmTk1PhRJz/Xwj8/xcCzsnJIRaLlWQymR0mTvy+28qVy/b0fX+fqdN+7Dl12sTwrAiQgxWJogDf+CilUGjEKAyC+p1AdCBubVBIcI5SWFrjZr2ctavW7LJ21bJdpv74wzkArVt1Wr9q1fIZ33zz9bRVK1f9mpubuz43N3ej1na5ZWn+L7b/kwI2YsjLyyM3Ny9h207fr776ZsDixYv3Wbd2w1733HNXm+CsKFrnIlqhlQYENBjfhIK1EBNspVosQILXykcApTRKSzALjR8oMZZGxOD7gtY22HlYysE3HiiPLeVbOmwpX9th4sTvjrasOAMH9lr78cefzs6k3TkRJ/aebdsL/7f67M/a/ykBG2PIzc2jVWmr3T/88MNhq9es6VtZsWWv51/4qXNwRi7YRSilEDEYAGXwlQ9oEAUIzRNVAWIQPDAGDYgKP1TB91U48ST4JqhQ6KLQxkKMD1rwLQE7BiqBMoLvu8ycOavTzJmzOj3xxISjDj/sgCNd1703Nzf3YyDzP9Vn/6z9nxCwMYZ4PE5BYdGgjz/+x0k11VXHTpkyecfg0yjKKUahghnqBbNtWwtnrwn/ig63WQn+KINvZ4PzRKNEI9jgWyhlo5VCfBMIVfmgTPjXx2gPpQRQYJzwZgMFT9sOSpegRPDcFB9/8tGgnJz8Cd999+1nIG/n5OR8+H9hj/5fFbCIEI1GadeuXdvXXnvtItfNHD1z5szeAFrnYNsRPCOoJt1IBKXV9sqNAOESjDQJWQIjXRQiHnjJ7U5v/r9x8MnFJgFojKUAPzzLD1cHEwwuiTR/TykruER4XctKYFtxGhuTBTN+nv63nNyiA7/4/NPj4vH4Szk5Od/8bwr6f0XAIoLjOLRv157nJ7w06ttvvxj1y9xfd0OyaJ2H1g4K8DwfsTQYg9IaE3ZUsESHhr/SiGigyXQVLG3jZ1MIjQB06NSJ9u06UNqqhIK8PLxsmi0b11NZsYU1K9fT4FUDNpoEIjaiNBibQPv2QWkUgphg4IjSaKWChcME64nnGSwrDipGKukXL1q05JSCguIRH3747pf9+g15LCcnZ15VVeP/eF//rwg4Fo2xZs2aAS+/9MrtixYu3SfrpvLRuSgrByMt9lACQQoEs1IErQPN14Svg6XYBB4gJShsvHQloDnqqOM55pij6dunLwVFucTjcSIRB5OtJb11PY31W1m3djVfT/2FN9/5mLUbqkBFsXQcwUFEo7WF8bMIabSyg5VeDCIK07zXK4J5rhBRoBSWU0BtbapjbW3tqPr65F5Lly169+xzTh8Tj8cbzP/gjP4fFbBSitzcXOrqam966cUXz6+pqe+EygE7HyBcetW2ZVQFSlP4YfNfw7ZZjDFobYF4KAOeW02P7jtx+513sf9+IyktLdn+JiQTKGN5BqJt2Wm3vuy57+6c+rfDGf/E60x45QN818d28tGWxvc8tDIoS1DK4HkGsJCmewtdiyIt7huFL4KOOIiJUFFR272iYsu14x56+ID9DjxkbGlJyTv/U8v2/5iAlVK4rrvz9dde9UR1dXI4WsfQeaBsEAMq0GC33yV/30w4i8X3ET8DZPB9hbJiiJ9i0OAhPPPscwweNAAF1NRU8967/2DFquWMGDGCgw7Yj5Urt3DXnTdTVVnFkUceyLEH70bfPt0ZN+4eunTpxh1jxmFMPVnX23Y/PoBCOzEgEChabxt4f+AmVmiMGKxoAiRmb9hUM/jvr732XH5+wfF/O+mkG7TWK/8zvfvn7X9MwCIy6q2/v3Z3Nmu11jqCUhZKGYRQuNvO/M031fafeRkMhoKiNvTsuTMlpYWk043MmT2baLSYBx9+iCGDBgDw1tuvc9edY1i5chW+MdQ01nPQgQewtaaRiZPnsnrVCr6e+BMTHm3LPbdfzj4HHsJ1115JfX0jz774MgMH7ULHjh2IJSI01MOSJUuYP38+mXQDWIlghWlSAM3v79k3BqXB+D4IOHYM1zcFlZU1x112yYUjzzrn/DHxeOxJpVT6P93fTe2/VcBKKSKRSPTccy4cv2b1qtNFR2IC+EbAzzYvb7/5VovvB4dtaVwvjSUuA3cdyNlnnsVBBx1CYWExidwYru+yfu0aMpk0O+20MyLC+PFPc+utt1BfnwUFljbErCgAWmmaPE8pN860X6s5YdSdPPZAI8cfvQ83XnQYZxy/Ox06dySeZ4OtEeOQrNrM/PnLePa5z/jg09k0uBYqmkbiSVRjPDTVdIsh6iCmaQT4uCaLUhZYuaq+3i158vFxY4cOH36U7/vXOo49Synl/adl8N/mX9Na49h2uwfH3v/RyhUrzjOiY8Y3gUaqQFsW/LN9SMCyLIybJhHV3HDTDUyaNJELLryALjt0Ip5wcLMZtED37jvRr+8AHMdma3UNz014nvr6emwnCtiBqdPih5t2TGVZWJEIlfXVvPb3N9m6dTMFJYV07zWYrJdgwS9r+HnyQpYsWo8VzWP3/fbkldfG88z40XRqF0MySbQXD6w1JYgyoS0toNwWh0+gNAIolB3FJ9eePOnHPQ879NApy5cvv9f3/Tb8h2Xy3zKDg5imGvTpJx++VN+Y7ascG0v5+G6gEImEC7FlgfnzyJzSCt9NE3Xgjrvv5erLLwGguqqaGTNm8NnnX7B61RqKSovZY4/h7L/vfnTq1JHS4iLGPXw/Z5xxOps3VYH+i8c0gu9uZfiwgdxz//W06tiFqhqfF197mzfffJ8Vy5ZQk0yRE0kwdHgfzjnjKI44Yk9OvuAAosUul15+P5s2Z1GOQlSLPbtpzVYmHMgKlBN+HJwTsSIYXcC6dZusE084+ZqxY8eeOGrU2bfEYtG3+E95wzZsWv9fPjZuXs+69WuZP38h03+eyeo167nu+psirVu3OzgWi6/VVlwsJyE5ecVyxVXXymFHHCtgibLyxXKKRdmFwl8cyi4QQK648hppar/8Mk8OO/xwAURrq6VmJgMGDpFvvvlOjDEiInLv2LFiWbag88W2InLlVdeKiMjMmbOkW7duwfd0kQDyzDMPi0iFbF7/s5x03CHhbyYEHCkpbSNdu/aVRCJfALnmimOlpvJTEflVHr7rRsl1Wgm6QHCKg8MuFuwiwSkQnFzBiQtOTvCeVSxYxWI5ZWI5JaJ0nkSjxQI5ArbcNvouqa9vuE5EHGMMnu/i+RlcP41nMv/2YV19zVX/5cGhFIgRUqkMkUiE2traIZ988vG5M37+aazn261FFOKnOPyII3hhwjP069eHl196ATfrYik7cB3/2W9rjXgpunbryksvvkBOToLFS5bxt7+dxOQff2TEXntzzTXXsfvuI2hszLBx4zo2b9rAlKlT2W/f/WjVqowuO3bizTffpr62Hq2F3YYO5cAD92fz5k289967VFVVoewcMFBb00BVRRVj7xvPx59/D1YJSjn0HzSQceMe5q67bqd37wEsWLSSjz/5hnjUZujQgQwZMIApEyeyYt1qIIpWUbSyCJwkOnB2iwIslIDWTRpZ4KHTWlBKUGJhRPHDD1+Scc0+w4cPy0SjkUUiJtU04/8riI7/5xm8dt0aVixfyfQZs4YefMhhawBROiGWE5e2bbvIVVdfI19/861k3YxUVFbIU089K+eMukCUyhNtF/3x7LUKREdLBJB77rlbREQymayceda5AkjHTl3kl3kLmmf1ihVr5OCDjxClLAHk1ttul2w2IyIie4/cR8AS247IVeEMnjVrtvTo3j3YNp1i0XZ7gWjzSqB0VHBKJK+wtXw36UdxvZRMmjJRkqmkfPPNDMnLK5PWrQrl24+eFJF18uz9l0pxfjz8vi2OXSa21U6U1VawWgt2qeCUioqUiB0rEdspFKVjAhG59LIb5OGHn5CS4o4CMdF2rgBy1dU3SG1d/Ssi0sX9f5jB/08buogQTyRIZzJtR48e/dDnn33SSVv5aDuB76bp0KE9t916G/vtOxKlfQqL8rnggnM5++yzEMkG5sOf2L3Gc4lEcthrxO4ALFm8lLfeehtQ+L5h2fLlVNfVkspk2HHHTlxz7TW0adMOgMW/LiGVCraweDz+Tx4CkAyOZfPQvXdw6YVnE41YIIaCwhJG7LEbs2ZO46wzz2DKlKn06duDbj36saW8hh+nLQevkaNP2JsHxlzDxWeeQP9eXXG9CoypQykf8FFaBTNXAgybZ1zEpOm0Q3tuufUarrzyInYbOhitDcbzQcV5+KH7uPPOe09Lp7Mv2trp+c/8A3/WtG1b/PuHTSIRp6SkhEwmHbv9jjvu/uKzT4ZrK4HSVhBtsQpYumQZZ59zFm+98wa2dqipqeTaa6/iumuvRdG0XLXwVkHwWlvgu5SVtaddu0Bos+fMIZWsx7ZzKS+v4vrrrmPUqFH84+N/ANC5c2datSoLf6IlcO2vlzWFwvjV5Ocp/va3Izn55GOJRDQINNZWMXv6DAb0340H7xvH7sOGsXzVXNavWwTATzOWsHldHaWdd+bsi0/n8Rfu4NUJY7l41GlYdhbjVaMcFyGJ4IPRiJ+hoCCHG26+maeeeJx4IoJvPG66+Xqefu4Z2nfqiNIKVJRx4x7g/gce3luECbaOdPuvCNneuLHi3/6SGMOq1aupqa1hzuzZZ73z9ptnaTsXVBTfBFEYrTW1dQ28/957bN5czl57HcC8eQt58MFxADhOIb6ETvuwGfHBSwNZwMdIlkg0B4CKykrA4HmBT2Dl8qWsXL6UnXfemZOOOyEM6zXtVS0FbML3txd0U1cF8WEHy4pQ21BFMlkDgBZNbW2Kq666ntvuvoP9DjyMydOmMua+0VSUb0LrHL765mtOPrOKXj1a02Pn1hx56In0HbY/D/boRvfupdw4ehwpz8NyHMR3UdrC97MkYnFOPOEkBvTrg2c8jBh2Hz6U4cOH8tTTz7Fh7UqcaD5upo77xtxDaVnx8IsuOO8+rewLjEjlv+PltCsrqv71s8PmeT6zZ8/jl3m/DPvy049GKytXoXIxxg+VWh8jBjsaQ0yE2bN/5cS/nUlVZTXaKUAr3Yyq0KIRJBCc1AMQiSWIRiPYEUUyFQi0qKgA23aIRhNBBMkY9hwxgpNOOBGAmupq0ukUAMbfdq9K/XVvKG0hWFRsrSHjetQ11pJOp7FUDqJzmDxtBmecfhqdO+3ImjVr2bRxM0oXYEwdZWXtSOS3YcqsDTwx4UNefu1nbjj3Io4/f28uv/hYapIpbr/jOZSOYSkfxEPbOVRV1nDeuecwfNge3HLLTZSWljD2gbF8+92PLF+2DKVjGAFt55FKN3DLLbdQ1qr1Uccfc+RsrRjjif+Xz9Sy2ZZl/euSDZvWmlgsUvbztB+f8STS2rYS+E37qShAB8pjOHPS2SyTvvsK0NiR3MAZYALnPYDn1gDCYUccy3HHH8+OO3TEsS201pSV5eOZLIcdcRDfdf8a246EAoZOnTrSoUOwhH/11XesWbPl334WcTOAx8knn0jnzjuRk1tEz547M2/uBiwrhorlsmnDJjZt2Ag4KDsP8WrZZZfdue++Meyx53AqKyt55PGHeGDMQ1xyy/Uk3VGcccmpXHjOWUyZtJavv/+SSCwXzxMs28Y3PjN+/pnZsxZyxplnUFRcwmuvvsGC+fPQTg5aRxBj0JaFUnlUb63guuuuszp16nT1bkMG/oRS3/1TJ1HYbP2H7sI/b9FohHQ6o5955tlHK8rr+sYSRRgTCNLzfJqi8yIaY4IgWhDKS4ShPhM4OpQC4+F5DRQVFnPrHXdw8kkn0LpV6R9et3VpW1rv2fYPP/vHPz7nySeeIp0OZnvTwPnLFq7YYuo5/bRzeeDBeygsilJYVMqTTz7JMUedQ3lVfbDKxAsxLkHo0G0kEolz0UUXM3Lknjz9zNMMHjKIO267nSmT5jB18jfccs+z9BnUm8HD9+Hi807iux8+w82m0VZBCAtS2JESvGyac0ZdTCInztJla9BOboAysXTQp2Go1IoUsXrFUm699Zbil154/u52bducJErW/ivysjds+NczG5RSTJ36E/Pmzh+1fu26E5RTiJvNoi0LERXMWiGAwYiAIgS6KZQKQmiWVogJcE/GT5HIiXHr7bdxyUXn4dg2dfV1/DR9OuvWriWbzQbKWPjASulmW9CyNMlkihkz5vLF519TUVGBbcfxvBQtlZE/tx3D961cTjz5BFq1KuWgQ/Zl77324NprbmG//fbh9b+/jmUl8A2Il8VYEUQM0Wg+nTq2I5vN8tZbb6O1sMvgXSkoLgGVYENFDY89+hIv7TqUgYN2YGC/nsz85VfQGiN+M1hBO1HmzJoDeCgdDZxdOvAtGDFIiGZRykLZeXz39ReMe+SxoXfdOfr4WDTyCGGM6y8FnM1m/y0Bb926tduPP343xraLLM8IPmB8L1BmxA+WXssOFIpgowWaYr3g+WHnGx/E5YgjjuPiC8/HsW2mTpvGtddey8IFC8hms4E2rgNMs+Bvp0QqpTDGkE43efQieF6AmPBlG27LGMPvNXW2+cF9l/rGBgD23HMvBvYfhGU5pNMNgIvnNqC1Ib+4lNrqAEfd2FjB5198xR4jdufdd94hkYgzb8Fi5s+fB9pBTIzpPy1iy6pllLVrw+DBfZn5y6/4LRS+oL8AKwI4odNHB33WtMeqEDxkfMDGNxEee/Rh1X9A3xtP/dtJXwPz/pnM/k1ftFKfffrxI7adX2Ik9MiEShV+lrYd2hKP5bJh/QY83/+jbm36HTAupaUlHH300UQiEVauXMmNN9zI1ClTiEZjnH766Shl8/rrb9HYmKa4uIhWrVsFipxs05ibzSAVrBgNdbV0bN8OS1vhHf8zHSPLI+Meom/vnbjmquvRWvPmG2/y5dcfAx7de/TgzrtuZ8DAAXz9xVfcf/+DrF+3kscfH09NbRWnnvo31qxezSMPP8mGtavAyQXjUFWfYtXKpQzt3pq2bZu2HcNv4opsF28UHfiugydjm/YfHJadRyZTwe23314ycED/c3r37HkT8Jc4IHvypIn/pAOCyziOzTffTDy/rq5xv4iTH0BmfBdsEK+eotISJjz3FD179ubII49i/txZYOVBiGP6fWjQpX279gwbOhyAzz/7mkmTfgDgphtu4fobryUScci6WT766B989dXn9OvbCy/EPQcdITSD15sFHrr+tIXn+zTU/zUOSjmF/DR1MkcdcQwHHnQ4VeUVvP/h26QzjeTk5vDo+AfZd5+RVNVu5YLzR5HIz+f8c84jnU7z/ITnefGFCUFH+hF0ROPjgyRAgee7YPkoK5xHltcCmfJHW4cOZdr0bE3PZUFobVh2ISuWLuHhcQ9dOu6hh97Nzyv48a+eT2ddj392uJ5HQ2OybMOGtTdaVjQqYtDKUFKSh6WygJCTk6CkrJiSkmJycwPvkTIuxUW5xKM2LeeyCkdmTm4xrVoFkJolvy5p/rxtm3bYtoUxhkgsQk5OnB27dgxjwwqtg5iuDmGvwaGDQ1to7eBlPd57/13mzv0FiP9laFI7OSxbsYLHH7uff3zyEYMGDmD4sF049NB92f+AkUyaMondhw9n1txZ7L7brnTq0g5wEfEZMGAgxx19HPkFeRgvG05GTTySQ5cO7Uk11LFh46ZQVi22TC2gTYsJKiF6s+W6F1gkTX9FwkidjvHi8y+rHyZNuhkobIKn/dFhL1uz7k8fXADbsokn4kz+/rs701naOxZ4fgNHHXUcN918NeMfe4TPPv2Mvn16UlZShMLQv99AVixbRt/efbjz7nv49IuveeiB+3F9wVIKY1x8fDLZGjw/RZQYXrO+oBk77lEyxkfwee+DT9m6eS2nnX4WewwbRiaTRiwLbUURLCzlYmmzDVljhEgkwqpVq3j11VdpbMyAjgWK3h9ZDCKgIjiOhZvJctbpRzPm3tFE8PHEINkMu/TrxcP3jmWXAf347OvvqKzcRBPi8rLzDuf0sw6j9+CfqVhQDcZBSTWD+g+kQ6fu1FXUkKcVhYV51NSk0Lo9OuLh6/JgH3ZLQGyUrgWTDu7H2Gg7HsKZgoCZWKB9FzebDISNx5h77j9wl8FD92vdpuw9+RMkn925U6c/FbBlWZSXl1OztWowmBPQliUi2Db07bszgwcN5LHHxnPC8ccyYu8R5CUKAXjqyfEcd8zR9Oy5E+3at6N8azWRSIRsYxqjwPfSdOnchUMOPgQVxmp79twZrW1E4qxYuoxLLz63+T6cSJxpUyYzbfKP+L5PbW3tn97zdk0l0E4i8O/+SRMdAuJDt/ykyVO5/75HsW1FfUMDJcVlHHXsiew58kCmzlzAw+Meor4mBRQDlfho3EwG8RyQOGQV+flRLr/8DCBFQnvcfce1DBy+G2MfeI75CzahXBsdEXzTNGMDk7G0tJBhw/ZgydKVLFm8GDuSF4AIEJTJ4nu19O87gNZtO/Dzz9P5adpk3n733XsuvPDcL7Wl6/9I4bFPOu6YP334vNw8Xn71Neebzz+5FSe3uAm9mM0Kzz73FL377sTxxx7PoYccAcCKFctwPZ9uXbux7377ADBz5hxG33oL9Q31WFYU321kjz324qH7x7LrsF2br5Wbm49lxXDdwAPmuwoxKfoMGMDxxx7LHnvsTn5eDqlkitmz5/DKq68xe9aMYJ9XOTQpL0qFu3Jooolv+CtrIkiCUGTdBiDGvPmLmDd/0XbnPPv8++zQfQfmzp9P1ZY1aLsU0wyuiZDJRBGTD9SACK7nkfHqwcpgYhrl2Jxy+un06t6Vs869lbkL56NcOxgQYoHyED/LhRddyB23j2b6jNmcd94lzPvlJ+xIAYLBuHUMHzaUZ5+dQO8+vTnj7PN47eXneeSRh3scdfTh3SKOM8eY30vY/kM4YNi0pamu2nqgZTn7GMBk0xgCZ8KmjRuZNWsWxx97PMlUiucmPMubb/yddDrL4UcexZWXX05RUQGTJk1i4YJ5oBzEZOnZpw8vvDiB7t26hgPgF5YsXcrzz7+A66axnFx8z0VMI4ccehQPPTiWnXfusd197bnnnhx66KHcfMvNvP3WW0Aq/CSBsiP4XgaoDx+iiL96RoyPeA0M2WU4hx6yH9VVW/nwo/dYu2YjkXghIhar16xg9ZoF4RcsjFcNBBLOpuuJWk1QHBeopWO7Nrh+IxSWsGj6Ip599hUuP/9kBg7blTF3XM4Z511DZVUt2kpgsIPvKch6LgC77TKIp58ez5lnnMXSJcF1dxk6lOcmTKBXr95k3cBXr9CsWrGcv7/x1okDBvSf80ePZ3/66We/e7NFSom9YN68Ub5v8pVW5OblcsThJ1NUVIhlG84/73wAPv/iS6679gaymUD4v/wyh9ZlrbjggnM5+uijeOiR8WxcvxY7anPtddfTvVtXslmXZ56ewGOPP86yZdtmjO/WANCtWy8eeeQRunfrDMBXX33FunUbaNu2HXvvPYJu3bry2KOP4WV9fpk3G8eOsWLFajw/SyTqsNeI/amtrefnGfN+B9mR8B+AeHWM2HtvnnvmWXr0CAbd/gfvz9lnnU1lTTLYBzXkRmMM6N8b3w/6x/czKOPTrUsrHMcHlQRq2WVQTx599HaG7TGYLRtWc9MtT/D5N9NprK5i/JO3cPDhe3P8Ufvz9AvvgSiUGER7KB3h8fGP0a5dRy696HyG7TaEx54Yx/nnjiI3N5fnnn2GXr1643kuY+67j3ffeRsfhbJsnnvu+VP+/vprt6fT6fTvxvKtt97+u+Puu+/l5FPOpH27LnvadnwLVp6ALf0HDpPftmzWlcuuuEoAcSJ5Eo0FMJtjjjlOamrqRESkT/9BAkivPgOkMZUS3xj5+KOPJBHPEUC69egpd937gFx48SWy54gRsscee8rb73wgIiLGGLnnnvulVatWApYUF5XIVVdfK42NKRER2bhxk0yeMlWmT58hV119tdiOlssuv0w2bymXJUuWyV4j9xVUVGw7Ktdcc/3vITs48uFHH4mIyHnnj5Lxjz0iIiLnnHeeoLRgxaSsdYk888h1UrFpvtRuWinVG5dJ+ZpZUrl2qoisk8/fe0TKyooFkPPOPlFEMrJ65XQ55tgDw2vkS34kR/7+8JUisl7eff0+KcovFCgRbbUSrDxRdr5AVHLy8uWxJ59p7t/vJ34tU6ZNEhER34jcfc+9Eok4Alp0NF90LE8AeezJpw+aM2ces2b/st1hn3POmb+bwfl5eXzwwSeln33y8dWe57XSkQRGGTZs2MiTTz5Hq7Iysl6Kww87lEQihx137AaAm62nCRTYq1dPYrEonuc1z+yu3bqSiMVobGjgHx9+SDLVSFlZR+64/W5O/tsxpN0sVRVViAjt2wd+52VLl3PvvXfR0FAPxKmq3soTTzzBiL1GcuThB9G2bRvatg1Shi1H8fQzT3HwwQfRulUZrVuVscsuQ/jhu+8B549WMEA1O0O0snCsIMksFokFGqzv06d3N8676ESmTFvC1B/mkp+fA5aLchRr123grTfep6KiCqUdvv7se8497VR+Xb2eKZN/ArsQLXnUZTczadoCTrqiiq47tadV62Kq68pBO2AM4ts4kXwa62u58Yab2Fq5hauuuIy999oPgOqaKh4Z9xj3P/AA2azGiuVjfAOWgHJ4/oUXLz72yKO/8Pztkbd2Nvt78J6RHJavWHFxY6r+EKWCB9ZWjMrKrVx99VUk4lF88Vm1+ipuvvFWjj/uWGbNmMXrr7+GMT5HHnU0Z511FtFohDfeeIONGwJTLBoLsgIy2SxbtgSRn6zr4cSCJTTmRIglwPhCefl6wOKR8U/Q0JjCipXgo8HEyaST3Hf/gyQb6olFA/+w5xvefe8dMqk0Tz3xLK3L2lG1dSuffPQpqBh/rmhleeqpx+nfry+PPPI40ajNzJ9/4fNPvkARR/DJzS1AdJTXXn2Xpye8iaUclPZAKzzXAHGcgh1xa9eyanM5E157B1DgFIJto2iElFBZa+Gn68gptInGbQLgZACzVeRgjCISK6GhbhOvvfYG559/Dnl5BYGAKyt44/U3SKcasZ12aKVRlovBAzvG0l8X7jF58o8dq2tq1rXUOewvv/p+u8cVI7Ru07r9nDkzDnCzWUfZCUSCqJBl26TTKdLpNEpv67B2bVsx/tGHOO20k/F9j0GDBtEqjAo5jtPsNqypCmLPubk5DBjYl48//ZTammpuv+0ufpoyi42b1rNg/pwwYGGhFCxfvgylI0EidphkZqwoP037maWLFmCFgQ4RQ1V1DagYH3/yBQsXzSOTNqzfUAGWDeJul53YFIRQdgFffTmRs88+izffeIytFQ2cM+oCVq7eiLZtxBMso8FXiATPIcTxJQ1uloGDduOKa26hZ+/ufPvFlzxwz+3U1DUikQSioyAWYjzAJ2LbaKcNmWQNgT7lgMlBqUaw6hHjkE3X03XH7kx49lnKSlpv6+P2nbj/obFccunlbFy3AYviMDMg8HKlUqncl1577fizTj/5Ydd1twm4bduy7QScm0jw4+SfBkyZMnNniDVn9jWna1pxLOVx9jlncclFl+L7PlU1VZSVlLH//s0cJmzYuIHS0jIOO+ww7r1vLNdecy3zf5nNsuUr6N6tK2edczY//TyHr7/6kkULZrJowcw/mWHhwPODHF9DFDuah+f5VFUFSpBWCiNZlGWHeGvFihUbAQ06DpIFtX1ecfMYVw7GizJt6jS2Vi5h+dLNLFmyGMvJQ6w0eBkaGhrA83HDrcZx4mTdBkpblzL2vrvYf//9qampYcCVF5GfA5defhWCF/qfNL7rE3cchgzpjLLbsGbVFLZWVhJkPsRBZ1F2A8ZL0b17D9544y2GDBmA57o89uTjeL7LlVdcw9FHHoUo4fxRo6isqMBySkPnmEaUY8+ZNfPkO2678eFkcls+tF1SXLRdRxYVFVJRsaVffX1FMVbBtg5pGvFhgnUskUNBQSHPTZjAHbffziGHHsro0aNp364dYx94gPGPPMKJJ57Mgw+OpaS4FUpZbCmvYNzDj/Hkk4+wQ5euvPLKy3z3ww8sXbIERLAdazu4TXC9wAerlUU6neb99z9i4fy5KDsXbActCuOlQdxghokBkwGiONEYnhH+GgAR+HrjiRiWrdFaEYlGcFMG4/tEnCgHHXwoKt6JXYfuxZvvf08q1YiIoWev3uy62668/fb7XHvdlXz15eccfezx3D1mHJvKq7C1T4B6rWPXgTtz4sl7AxuZMu17KiqrgUKCIIODcaFbt5145dXXGDJkACLw/Isvc8MNN2E7DkVFrTjzjNM56rAjcZ80XHrxlVRU1GA58TCXWqivrd7xnffe2y3ZmJze/Hg333zrtuOmW7l3zNiCvffa600gAGo3gdCdItFOkWAViLKLpKCwjQwesqsUFZcKIJ07d5FpP/0stXX1sseeIwKt2smVXXcdIR077CTRaLFYVp7k5hbK+Me3aYlGjGSz2eBwXcm62RaHu+3IupJOZ+SJZ54TQOxYQQAmR0nPPgNl3GNPyrQZs+WnmXPkjnvulU47dBOwxIoWCipvO+D79rDZEoFSKS4plKVL3pfP/vGk5OUVSCTWSpxoVG6+7TZJp9MikpF0Oi2PPPy0oAPNdefe/WXx0mWyYeMWeeftV6SxsVZmzZkvBQXtxLaLJBYNLIqeO3WVSd+8ICKLZPas16V37y4CiGUXi9JtBFUqYMtDDwcavOf58syzEyQej4tSEQFbSkvbyatvvBlo076Rc867TJTKFVSBWJGiQBO3Iu5+++4/buLESXz66ed8+unn2JMnTd1uPGutuy5fsaZfQEv0+7HelBFW35Bk1sw5zVEiI4LreqTTafxwxvhG8fPPswGFbUdRyqGxMcv1117NL3PmMOq8s2jTtjU5iVwEaY7dKhXgvpQSlHFRyqK4uIRoNEY8FiSQGeOivBQHHHwwTz/1FJ07dWxeZXYZ2I/jjz2G0087jZkzZoHO+aspDGH2vjF+GKcVstkUhUW5XHjRhaxds4aLLrqQ666/kWNOOJKXX3+NObMms2TRfB586GHuG3Mnxx53MuvWr+WWW0dTV1eHpTTaTnPiEXtzw21XMmDwQLaWb+aBsS+yaNEatE7giwLlBXlLvmLq1Gnsu+9IfvxxCldecSWe52JZOWjLprKygssuu5RkqpEhQ4aycOGvwbZpaXzPDxIFfGWvWLliv5ycHJ3NZg2AfXwIWoOAj+qrr77o9v0PX++smuAlTV0gLf9vgniQHQ1fW2zYWMmdd91LTk6C+QsWo6wcBIWyAoS/b4J4rWVHyLoeLzz/DK+8/DJt23ckJycR5PtKwMpoawtfBOO7QJrcnFzeeucdduq+U4ilBpNN0q3HTowefTtdOneitraWX+bOw/iGIUMG03OnHtx33xiOOuoYGhpMGK0Jm6IZiNAkYKXVNuVLASqgjGiorycnnkPXHr1p1boNmWyarJcCFNrKYcIzTzGgz46cdeqxnHLSCUyeOgd0gp12bMO4Mdcxcp/++LkRFv+6jNtuHs87H3yLY5ciOAhZBBfwUXaU9957n08//4p0YyNYEZQVxaBCcyif6sp6Lr7oUkQi+K6P5UTwRQKMGgKiqa2tbfPRPz4+0LKsz0UEO5VKNT+m1lql0+nugFLKCnJ3/7RpmrvMsjBG+OarL4NPrBhKO81aaxC2VTjawogXfM+O4XmGdWuWbverthPBcz2CFcQHXGyt8bKBYHXzHq0YOnR3hu22C5lMmptuvoUnn3gcgNvvuJvrr7+WESNGMGjQICb98GOgbf5hC/bgINToBP/HQilFY30jY8fcywMPPMTTT46nrq6Ohx59lIVzZwHRZvimm65DUg3UVlWBFUWZRk4/7Rj2P2ZvZMtqJn23gPMvHcOyleU4uhjIwTd+ANnVQexXxA4C+mkfZcVRSiOqaWIpMIIViWP8AK3iRCN4v00cUBY1NXVF69atP/iRRx7+vK6uDvvrr79pfs54IlGwatWqPs3URP+0bVOIlDJBng8BJgulELxtM198/HAZxDSQk5tD+/YdyC8swXEiNDY20K5dO3YZsgszZszghx8mkmpM0q5tWzp36kJuTk4o1qZrRmnXoQsAK1as4qtwcAG88/a7nH/+ebRpXUabtttMjT9/BotUuhHj+bgZD9fzUTqOj8OLL77M2tWVDN9jKAsWzeGD995t/qZvAq06onzi0SiO7YCforR1Cf17t4Oa1aiookeHLpxyyjG8+NqHrFlVia1iYYjXBTyQKMpEwQo4RtAGrVQoQAK0ihaMaBSB+ej53jYwRVOzNMbDWrly9ZBUKqkbGhqMXVAY8GNYlkVNTU2HjRvX94VoE4S8ib2oxdIFSgRp+sxIOJOtkIREMKJQdggoQgJDXgHigkkxePBgzjjnbI4+8gjat2sbdhbYoeyqa2oZPnx3KirKeeGFF9lzjz2J5yQAQkc7QJbNG9YjEmQ1HLDfQZRv2YztOJx88kkU5OcCEOC+m2A9fxB0EAEaKC4uJhItJq8gQyxmk6xuREU0ViSXb7//gm+//xiAffYdTo8ePUjVuGB8fLea3YfvSn1DmsbGNLm5ccY8cBcHHjICU7eBeYuW0q33Hoy+8172OXRXbrj8fqZNX4Kyi8J4L0EgRnS49QlKdICLVgoRvwVwJwQeEhDABKCQplVWoUVjUGzasqZ4zpwFHWrratcx9aefmfrTz8xfuIi77h6zL5DUdrEQKRZlF4utWonSZaKc1qKjrQTyBZzAx2pFxI4WiOUUirKKRdklouwwLTRSKMouEmUXinaKRNtB6uXBBx8mq1at3s6fbYwnnuc2v04mk9KzVx/Zc8SI7c7bvKlcjj7qBAmBYNK7Vx+ZPXueiIjU1dXJhBeekzf+/rpk3ayIiEyZMk2KS1oHWrQdl6uvubFZi+4eatEQkY4dO8qbb77RfJ177rlH4ok80Va+KF0odqRUICo7dussP0x8T0RqRVIrxU2uFDHLpK5hsdxx+/USj8WlR/dOsnnTYinfvFgeGnuDtC3Nk1FnnyqrlkwUkZWyZPbbMqzfjoEGr3cQnK5CtESIOoJTJFiBxYJVKMrKE9vJFytSIBAJ71eJRYlE7fZiOa2EaIEQzResYrFpJZCQ9u07bLx19D0HXXXtTba9ZvVqAHJyc9iyZXN7IK60CpYONIJBK/BNBnFrSCRK6NypC1kvxarVq/EytTiRIlCEG3443IwhcHMaLEvhphvo3ac/zz77FB06dMD3Xb788mumTZtOQ0MjrueSn19At67dmDJlGmtWr2fL5nKef/F5enTfiTmz5vLzzF/48MNPsKwcfD/DwkULmPjDRAYO7EteXh7nnDWqeWLOnTefK6+6hqqt1WDlQOh4CCataaE0elx91VWceOLfeOXll+nUuTM33nQT036awScff4Zl54ehQIs1q9Yx5p5H+fTDL8lk0rhGiMajrF2/ks8/+5mMK2zaVMW5oy4nGsvlvfffR0SY8MJrrF+7kifH3UCPgXty201XcNr5t1JZWw92QeCt1KrZSpEQxREky3v42Qbi8Xw6dd4RI8LqpZvIeCksKxZAfwjHvBIUFvX1ydxJk37o4rqusqdMmwZANBqzly1b1iNYVAXCpcEojcIDv5Y999ydc889n149+5Jxs0yZOonHxz/O2rVrsJzSwMnQtJ5AEGtV4PuC5ViMHj2aDh064Hk+940dy7iHx1FV9eepM8kkXHzRxZSVtWb9uiacdy7ajuH7KYqLS+nYoSMAa9etZcGCBaSSaVauWsNrr77JvHm/oK3cwF9LSyBbyxahV+8BADz7zDPsOmwYe++9N3379ueTjz8KHkaE4sI8cvOK+fLrSXz59aQ/+J18nEgujSmPjz8NlU2dSyQSI+v5fPHNVO6462kee7IL+x9xOEd8/A0vvvE54qtAgzfRZnqHpia+h/EbGDRwVy697FJ69d4Zg2LmlBncN/ZuNmzeDFY0VCANKBelNJmMl1i2bFmb+vp6zT77Hcg++x3IAQcfWtK7T9+3QIl2ikTZiSBD3SoRlC09e+4gC+f/8Ltw4bvvvC+tWrUVpaOiwux17ELBKRR0kWi7UFAR2W3oCEmm0uL7vrz9zrviRBwBJZFIWWCwg+TnF8vIkfvJCSf+TU455VQ54cQTxY7GgiGqE4KdHyz/TpCVv8uuu8n6jZtFROTBhx6W1q1bS15egQQhFkfisbZi2UE4zrYdufbaIFw4a7twIXLJJVeKiMjSpUulvKJcqmpqZZfdRggqIUoXSSSSK5dccIF8+eUX0qtXdwEtSrUSVAdRVhvBLhYVKRM72lqsaJmoSJnoSJlYkTai7Daio50E8iURj8nLT90lIlXy0fuPSVlpgaASoq0Ssa1t2f8BE0CegJJBg4bIggWLftfvb7/6opSVFAraEiL5glMglg62FK2j0rvfoGdHnXeBY1dWBtmFtmXl19fXdwogmttsRtEKfI/zzvob3ToW4mVWQ6Q9WdeQiDgce9zRzJo9l3vvvSOI2ljhN004MhUgWfbYczjxWJTaunomPPc8btYlGs0nm61FxOO0007lrLNH0b1bN/Ly8tFa4XkePfoM5O5bb0A5kVCtU0iYYdh/l11o17Y1nuczffrMMELloFUutm2RSieBBsDHAxqTTSiPMF8XUFYuL7/0IhHH4bjjj2H9hs088eTTzPh5OspKIL7gWMKQQd0Zud9Q2ndoy6JFy1COjcZCcJFsA0I23AQi6GgcY1RgAtkarbLoaB7J1AY+/ep7jj/5UIbu1p8dOrehonI5qDjGV6ADRKUSEJMlNy+Xc849j969ewa0jsqgVZpM/VaOP24/3n5nF97/+LvgWoDRgeprvCz5ufEOBx98UFu7vq4uXE50biqVbhd0kAZDEJ4Lk9O6dm6FSVbgexms4rZoW+N7KSw7hxEj9uCBB+N4bgYl8W1LoQgBaa+mW48gZrylvJw5c+YBEVw3hdIeV195JTfeeDPFxcW/W/iuuORCPvngfX6Z/TOCTRN4vPvOvbjw/PNRwNKly/j11wDaEosVkcnUkXXTKJVDrz4DyC1I4GczdOnSOfzVJkUBRMepb0jy6KPjefudv2OMsHHjJtDRIH9KBbaEn62lvn4LTZEapV3EuJhsBZGYoiC/EK0VybRHfW3tNpiuiqHjMXwVBWKsXLGaDatW0K1vX8qKiwEfxCBKoUTRzBkmHh077sQBBwTxYGNcLCcgP62vXk+iVQk9unbCtmyyxgq+Z/mhUq1pqK9ts3bt2kF2bU1NeMM6J5PJtkFpjO9hi8JYNhIGyjevW4Mj3chkNb5xsXSs+Wbatm3LDp13YNnyX9EkttGCCqFAFMVhUKO2toaqqmrAwpgUhxx2CLeNvp283Dzq6+t59rnn+Pjjjzn66GO4+OILKCnM5+WXX+Keu+5i0o8/YmnFHnvuzjXXXM2gvn0A+OCDf7Bk8WIsK490uoJEIp/zzruUgw8+kE47dCYaj4HvkZOINt3ZdoNQ2VF8L8369RsAC5ycgFE2hMYqFLYKEtubSMaVMvjZag49dB+uufJsOnXuCkSoqU1xxRU3cMwxJ+KLcP8DD1BRvhEdKQaExmQjDfVJ0DnE7AigMEoCOo9mszeAFJWWlrJjOCi1Mmhl4WazAWORn2TTxnX4viYAM/hBWDIcWFnXjW/dWtnKrq6qDB9ax7UdiaCc8CIWSuxmPNO6NSvxvT1AR9BKYxAsAsRiq7IyunfryrLlTdiqYIZorTASnFNTW4UgAS90QRFVVRtp3aYN5517IXm5eZSXb+WKK67kH/94j2QyzcwZs+jYYQeOOeYw+vXpydNPP8nmTQGWuF37NhQWFgLw4YfvM/7R8biuAI106dKNJ598kr32Gk4ikfjdivBb+Tb9R+kISkcxxgO3Lnw3MMzTGcgk/YB9MfSI+ekMOYlcrrjkPIbv2p2vv5mN+DbLlq3l5ONP4NyLLsII+K7P9TdchRIPcCkuLqGoqATSaTLpMG6r1XY3JSbwrvXo3iOgbRQvILxB8D0PWwcAyLUr1wRJfyqKkKEpy0OwyGTSkYqKigL7qaefJRqLMWf2LOex8eNRVhyUhaddtGRQWY2Hzbw1lWQUOCaFnU0jkXi4ZCpy8+K0aR8E+AONNUgY0yrwsxpg8cLFiBE6tGtH//478/33G+jRY0f22WdPAN54433eeuttjLGwrXwaGxs499yz2bDhTk47LQD6FRUVNsuotraeF154hbFj76O8IkgKKyjK55lnn+KA/fcFYO36dbz99nssXLyC4oJcjj36cIYPH95iEAYCFuWhHQPiUZAb48JzL6ZVcR6Ii5tJYlswYt89qK5KUl0bpMKIpIjF82jXsTU/Tp7ChZfcSU1tCs/3uf6W0Vi2Bb6P7weOGd+NAkKfHt3p2L07a1evZ8uWGiAWeCysLIJGYzBkSCQcevfeKfiuH+QtWb6Dm86gIi6VdY2U1/gBKlNnUGRQ0oTu1GQz2ejWyspCu6SkhFg8TkF+XoLQUyIojFZYnosyNhBh3eZGsq4hYnso10PswDEvGHJzc+neo0f44Fm0ToTRmSZXmmbalBk0NDRSUFDAGaefwg8/fE+XLp3JzyugqqqWiRO/xZgMtlWM0h6W0lRVb+Waa67h5VdeZcSeu9O2bVuUhjWr1/LDpMks/nUurhfFdnLw3CrOPf9s9to7GDCff/kFl112OWtWrcb3NZYteK7L8OHDt3nlYBvZuAaTStOqc1suuvB8ylrlgZsk8Aco6tIWTzzxAvPmLUBF8pFsstlt6vk2DY1Z6hsV6AiPPPYkycZa0g2NvPTCiyjlIKaKzu3KOPqofdGRYqZP/4hVmzYAMbSKhOzyhJQTLolEIV12aNIZwLJsMApxXSIxmyXL11DTmAomk86CZFEmErqIBd/3VTKZtOxkKolgyGSzZcG4bnryIEIRvLLZWllDfUOa3PwcfD9LyNNNkKdk061r10Dgoe0b3hZKGbSVw/Tp0/jii6854YRjOO6441m2bCn1oVZbXV1DZeXm8LqCbQfhxWTSxxiPWTOnMW/ujBAMIGHeTbAXOraLSIb2HTty9FHHEXUiLF+1nPMvuJB1q9ejnVyMNig/Rag4bxclA0ICcQ9tOaxYsZZ99z+awvwcbC3ocAXaUl7B+g2VaJ0HxPFI4jgRtFUEKhdtBQqSdqLU1SR54L77KczP5ezTjiXlGj58732uveREDjxmJI11S3n17feprE6iVAliCGhJpKnHNXl5BXTt2q35HgNEDfh+hng8wfp1m0im66FZ8QxGalPI1PONU1/fkGunUklEjJ1Op1tgd3TgtACM8kAibK6oYPPGCjoUFmK8JCg/yODXwWxo07otbdq0ZdOmjcGNGgVWEwlYwJJ+6623MGjQQLp124G77xlDZdWWcAnyg0w8IDc3zq233sTIkXsx/rFHeP2119ht6FBGjhxJIpHAdYNcZDFBlqEdiVFf30Dffj3p0ztQut56813KN21G6ViAmGzKy21GpbRoYjCZFH369mf47sNw0y4fffw+y1asbj5Ta0VRUR7RnDzSaRs320jHTj149JH72XnnAezUvTvnjPqF8Y9NIGMUiEYrh32HD2TcY3dSU7mZi886mL69dyKbtRn32Kt88eV0UAWIssHLoOxgOVECgker1m3o0b07ICGFsoV4GYxJgmWzef3WcA+3QYXhW1Ehj7XG+IZUOo3tewbPM1FjpF3T+FYqzM8Ov4gdIVPfyOYNW7H69cE3DWEgXje7/Nq1a0/XbjuyadNGlAalAuY2ELSlsCTO0qWLOfnkk3nmmafp06cXpcUB3FVbNLO/7rvvXpx//lnk5CQYPfo2vv/+Wx55dBxDd92Nf7XNmj2XTCaIPYsPASW/bl6dWs5f8WrZfY89eOmlF+nSpQuWZfHxJ0dyxpmjqKmuRYyw00478vJLD/La6x8wfvyTaMviuuuv4uijD+XD999mhx07MHbsw0z9eS6TJ80BywGjqKuupX7TKuKxDH0G9GJzbYwXH32Se++bgOtFwUmAJ2jboJSHbyy0FbDGt+/QgVgshudnQsyZgJ9C+Y3g57Fx/VayWSsEYAQexAAU6IMOMhGNMcq2HRvHsWOWbbUOloJgdqCtbdEgS4Gr2LS5FqM04jYiuFhWrDlm3KpVKzp17AxMDi8WTIBgPwhQEpadx4wZP3HIIQdz4UUXcuSRR9K/Xz9al5Wxww47MnXKZJYu+5WZM2fTu3dPJk6cRG1tLd9/+z0F+YX4JkygDuslNHFYSEh7EHOizFuwkJ+mTQdlYXwJNFTjtzR9g/trFrPNRZecT9euXbn8ykvp07c/5549ioMPO4A3Xn4JgLK2Zeyy61C+nTgZgEgkRrdugYv03rEPcvgRB9B/wHA6dtwBJbODqBqwavVGUskU0fwor//9Q5556ismz54O5GJHCvCMAe0iZFHioVQU43lEI1H69+sX3Gr4nFppjJ/BwsVNZlm5egNZT4GtQvsqCCX6xg8JXkVAPFspjWVZ8Ugk0gFAlGpW04PXTeu7w9KlAbG2+GnET6PsJqeGIScnQbv2HYGgTI2yIChC1bQ8gtIWViSfzZs3M/q22/jgg/f56puvKCsu45RTT+azTz9m/rxfOPucc+jfvx/ff/89NdXV3HTTjTw3YUIIxFBoy0aMj+/7IS+XYNsRbCfC6lXr8V2DZdnh0ibNEKI/brq5IlqysR7xAq03FtGAT9v2HRh1ztlALkOH7U7Xrt1YsWI5X37xOXvvNYJ/fPQBbVqXsWH9Bub/Mjco1KUNPh6xRIREfjGV9Y08/syLTJ+9lqhuj7EsfN9D4SLKRZTgt6A8jsUi9GsWsDS/b9wGIrYhm0yxfn15IBelmgMNEPCO+Qhaay/iOEl7QP9+KK0S8+bN7QHhuZZGwkiSqCbUgMWKpasw2SC31xcXm6Z6BQalbLr36IHSNmI8FA4iXjhrgunj+4JSFo5TguumWLZkMe+8/RYXXXAJBx94IPc/+ADjHx3P/HnzWbliKSiN48QwxrBu7Xp830NaQCQVNtF4FCOGbDrV/G4wOAOEv+8ntrELbGf7Nv1OkCPVv98gnns2mLGTJ0/j808+JRqNcdutt3PayX/jp+kz2XXwCB588CHOPOMMnnn6GSKRXA477DDmzl3KY4+OY8HChehoPr4fmIeDhwwkt6wL639dSE1NcD+e46L8DLa4CC4GwZcoqCiIB0oRT+TRabu03ibFKU08ZrF5Sy3VdUmC/TecwSoYrE3P5zi2n1+Q79q77jIEESl8+823Aj9hM3GY36zRBUqKZl1Fkqyridgu4tZDtDX4AXOMZdm0b9eOgoIiaqprQ9dZgMAQEbSoMKqlMKLQdg6NyWqeevIZ9t/3ILp378aos89hlyG7MHvWHFzXQ1tB7i4I8XiCZCrJ8xNeZPr0yey+x56ce865xHPjGDHMmDGb1155mcqKLRQWFjJ02B6IwLfffEc2q1F2FsvetiwjOYCNsnOY+MMPXHj+Jbz95ks0NDRyySUXsWnTRoqKSjj5pOP59dcFnHX2Gdw7Zgwj9t6bnXr35edpP3L/2Pt45pnnyWQM6VQdOHnBoM7W0q5VEeedezpYDnNnL2DVms1YkSjodLBiiIfGhNCmMOAfEtO0aduBrt12pCUrLSjwXHQiwuoNFdQlU9tWH2MhRiPKawZq2LaVKSgoqLIB5Xle17yCoHCn+EEqo2iFKAfLBKXhDLChLsWm6iw9WilMugLJ7RJUBFNZwNC6VWvatelGTfUcRLvgugEuGDA4aCsnmOGig8wFq5AF8xdw3nnn88AD9zNkyGD69+vXvP/8UfN9j+nTJ3HSycdxxpmnNL9/3DFHcdABe1O1dSsFhUXsussuCHDddbfwwvMfYKQO19QGM8GzyGYCJngdc/AbEvw4eSKV635l3drV/LpwHsouwHVh4eJ59O/bl+uuuZiB/ftSWVVD+dbA+6cjmtqakJ6BVuA2Im4j7VsXcc/tlzFsxGCqN67h2edeJusaYrlFQWqsElzjgWTAzwANKKsAtEJ8j1ZlpRTk5YWQIAmqv6BQ2SzkRVi1rpb6ZCoYAMYJ4D4ofCtgvwchEo2kS0tKq2yQqG1b/UrLAk+UiB8UZlRNbs2m/1hsrdrK2vWb2altJ4yXxQJEdGh+uHTu3InOnTuz6NfpSDaN0g79Bg6hqLCQRb8upXzzOpQqDiBAITzWsguYOPE7TjvtdE457RT2HbkPnTp3IZ3K0Lp1a2JxGzdr2LB+E1VV1XzxeYAh+3HidAYPGEr7Dm1o3bqMaCTK/vsd8LsB0b//AOAlfN+QiBYAkIhbRKJpIA1eFDAUlxThxBTx3BjxRBw3FSWZUtxw/RiefPxBzjrrItavL+e+O+5j9bI1aDuBySbpseOO5CcSrFq9htz8GEMHD+Xs047igCMPBKN5+IkX+W7KbLSVgx+W5PGyDSApevToRcfOHVm3Zi1Ll/4KOh/L0nTrGlT1M8YPyOMUiOdjxAMrxsb1FSQbU6CiwSrbVM5PmXCZ9ok4kUxJSUmV7YubsJTTt337DihlB3tcM3LRbPOQWhbG99iwcRNi7YBvBI0J5a+ALGVlRbRv3xrwyc9PcPc997Lf/geTiMfZsGEDt952N9998wmWUxJcRxTKimA5hSxe/Cu33XY7L734PEXFrXCzGU4//Swuvvh8QHH3PWOZOmUiy5dvwHEK+fjjr5k1azp777Mn48Y9TDQS5cGHxvHdtz+Qm5fHiSccj+8bnn7qSSDNiL1Gct65FwOGbt1bce3Vp3D9jfdQXV0PCL5yyGvVjkZPo5TG0jEMmkk/TOG444+jY/tOVNX4zJ23BIscjKmhfZtiHnrgZnrsuAMbF88hv6SArt27UtClB25dLXePfYJHxk9A2QVgRzG+i+81grhcde2NnHHaKRQVFVFdXc3TTz3OU089jxNzGDCgf7DQKgeFjxIDvh/MI89j0+YtZLN+YOnQJFjY5mESnIiTKSoursb1U+1FZMO06dMlngjygLVdHGCC7EJRVqFglYiKBBkMd1x7vvgbvpb6tV+K59eLlxFxsxkRyUhFRZUcdujxAshll50tntewXZB61ao1MmLvAwQQxykU2y4RbZeJtoslGi8TpXPDYH1A7L3r0BFS39AgvjHyyKOPNwfoLauoGZd1xZVXieu5UldfL8OG7RmeY0lZWQcpLe0kgAzcrY8sW7ZSwrQByaZXSapupoy57SKJ6uB8KxqR2++6Wc4590yJRHIECkRZrURbAZYs0CC0KFpLxCoTQEadcpikNk8VkYUiskJEVoqpXyCfvf+0HHHISIlFHUHFRcU6ipXoKGALILfdfpc0NDaGveKLiJHaqg2y+/A9xbJsueLKIAPD833x/aSIaZBUY6Wk1/8k2c2T5KjD9hZwBKs0kI1VIMoqEOxC0VahgJLdhu3+/dvvvtsHz0/3FBEzb/4Cad+pc9CBTcA5q6BZwNilAlpOO+5A8dZ9I9UrPpZsarOYrIgbgtx+/HG6dOiwozgRW95/5xmR9DoxXoUYv1ZcN0jYXrx0uey661ABxLaLxHZaiR0pE8suFh0iGpRdJOgccSIJ+frbL0VEpKGhTsbcN0bKWrcSQBKJPLniiquloqJcREQmTvxROnToJKDFtooFAkREx46d5Jd5U4K+NCIm64mXXil+40ypXTdFTj58/xAxkiOJnFxxIlEBR7p06hYOREfuu+96mTH9G9ltyCBpAkHtsVs/mfXDyyL+fJn1/eNy2SWnyvF/O1wGDekVIC3QYtkJwS4WHe8gSgcD5fobbpFkMugL10uLn60Wt36dSMMauX30aAFk5L4HihERT4z4fqOIXyP1lSsku36q1K74Qobt2kcgIkTbCFbZNgE7BYIKEC1HHn3cl7N/+aWjTVDaXBUVFtGje3c2rF3TvCxv59KzLfAclixfTibroxB8vw7H3ubhTCZTNDQ0kohHyUnYmIYKVKIAFclDKY3nZ9mpe1een/Acp59+GnN++YVYblvcTBatLAwKmmgIdQQ3W83tt99O3z79ad2qNVdfdSVHH3M4mzZuoqiojB7depBIJKiqqeKJJx5n48b1RJxCBA1+iqKiEl588UX69x1OfV0DM6fPYfjwwWzdWkflltX06z+QW2+4jF+XrWPO4sUk03HwM5w36lxuuPoSvv70bRauWMgF5x2JcaPs0LGYLZtK+dvxh3HqqYfTa8BO1FTXMHrMK3zx/Sw8ccBYIBZYBWjLBt/Dz1SDSXHZpVcy+rabicdjZD0PxzIoS1G/ZRP5iQgFeUF40xch6xkitg63PwNeEitmUbGlIYgnowNcdEu/XJNjCkVZWZnp1Lmzq4FOYCguLqLnzkF4KvAvSwsJawg5JsvLa2lMpdG2wvcbQW/ju3BsJwCxNyTB9dB+klT15iDChMGIj2d8+vTtw6uvvEL/fn1JN24BOyztajUZ7oDyUXYeUyfP4Oyzz2XFylVEnBg7d+/DPnvtz4B+A0gkEhh87rj9dj744D2MEbJuEs+rolPnzrzy6ivsu+9IPM/j7bf/zqtvvkgkEWfV6hrGP/o2C+YtYedhfXl2/J3sNqh/wFMFuI01tM61OefkIxhz66XodCOmoZLRN5zPj1+/xuhbL6bX4L5sKq/noovH8Pm38/BMDIiBToCVh5IYxliIyYI0csEF5zP2/nuJx2Mksx5aB/4uP1mLNNagtEt1bUjOrhQRWzfxBoG44CbRtmL95nLq6kMmhd/BvBWIIRqL0aN7j2xeItFgA6WCkEjE6dBph2AEeW7g4pPffN/S1DcmWbdhMzv3bo8XCripDGerNq1p36ETFRXr+OTjTxm264442NRXlBMvjaOtSCBkz9C7b1+enfASfzv1VFYu/RUdaRUmn7W8qEarYj7/7Fv2mXcAxx9/LAcfsj+JRIK8vEJ699oZrS3Ov+ACchKF/PjjFEBzwAH7cfqZp9C5YwdE4MfvJ3PFlZdz6unHoZQiGi3gs6+ms7WmnOeevpUhe+3Eh+88yrNvfsQnH09k+rSfGX/3vVx+6ak4uRa+DfHCPHLLyhARtm7dylfv/YOHx7/KgoWVKN2emKpC/CweYS1jZWHcFEqnOP2Ms3ho3EPEYlGSSRdfCWIrXC9N1Ya15OfaVJSv55OPPgKgtKgQBfg+OAH9LL7JgpXD2nUbqK2tYxvN6G+lbCguKlgzYED/RyKRSArPT9/tm2AP/cdHn0ssViDghDWNioIaQE6Z4JSIjuRI1LHk/RcfEVMxRZIbvhTJ1Eg6Uy+uaZCM1MtFl50nSmmBiNx13QWS3DhNGtZ9K8lN00UyteKnRdysJ0k/UMAmTf5Rdtyhi4AS22otlt1alF0qyikQIvmi7RLRdomgcsL9L1BUWrVuL6/+/V1JplK/Qxw2tVQqJR988JGUlrQXy9Jy9bWXi4jInNm/SI/uPQSQw488SBbO+kSy9fNF6hdIpnKmVCz6QmoXfibZtT+KWz5TNqz5We4Yfb0cst+ecuDIPaVtm1bh2hgVpUtEWe3FdvLEiRaIbRWLrVuJpYpFa0dOOukEaaivFiNZafAaJJsx4mVEvMYqqVg+Seo3/iDr10ySQ/YZIlAsOYk8efm158SIJ2m/UXw/K6ZxkzSu+ErE/VXuvOty0RpRVkKsSFmgaIV1mpRTKBDx27RpN+7Nt95l/fr14PnpR1wv6KRf5syX7t12DhStpgJPTqkQKRXsQrEjCdFayy3XXCFSPVdSqz+UdPli8bINknbrRIzI0uULZa+RB0lT9sO4e2+Q7JZJklr3maQ2zRBJ14nxfWk0GclKoEl+/+130qnjjgKORKOtxbKLxYoUiYqEioNTINgFQqRYrFhpCJuNSSxeJJdcfo3MmjVbNm/ZIrW1dVJXVy+bN2+RmbPmyFVXXS1OJBZoyZYtl10eCHjmrJnSrdsOoZBs2aFDG7n71ktl7pT3ZfPKb2Xruh+lYtUkWTb/G3njlcdk7913lW0O32igwFlFgi7ZBnWN5Iuy88WKFItWBQJROe64E6W2tkZEPEn7dZKWrIjxxdRtlcplEyWz+RvZummiHHbwnuHvFssZp50vGbdektkaSWXqJJOqk7qN8ySz4TNprJ4pJ5x6bKD8RXKCjAurNFCA7WLBzpNIJF7VsWPXY0uK21JQ0Ao8Pz2+ScCVFVvlmGNODASsCwSrMPxymahIqdjRYonYMSkrzJfP33pEpHGSVK2aKOmKVSKuL146qDj2y/y5MmjooOZAzzPjbhS36gepXvOupKqmivjVYnyRrOtJJqxv9NnnX0r7jjsIaNFOodiRElFWSbiKtDh0oehIqdiRMlFWgI+OxfJk+O4j5PQzzpKzR50vw4aPkHhYpQwigl0olhWVq666TkREZs+ZIzvvtFNwf05x86qQl4jJroN2lkMP2F323XtX6dCurNk0U5EisaMl4kSLmlNLAuGWCHaZaKtQnGiJWE6Q9H3gwYdLeeXWQFv2s+JljYgn4mfKpXrNV9K4+ROprZgop56wX3gNRw4+6lCpb2gUMSJeWsSks1K98VepWPWt+Nmf5dFHr5OcvFxRypJItEi0LhWsslBGRYKVK3l5eSuPOfrEtocecjSHHnJ0MIM9PyUinoiIjL3vQQEllsoRyyoIRobVSpTTSrBKJBIpFohI5/ZFMuXrZ0SSs6V2xbfilq8WaTASjhWZPPNH6TVgcCAAG3ntudvFa/hKtq77u6SqZolk0+JlRJJZI9mwFN27H30grdq2DkyoaGtx7NaCLg6OcKZoKxC8E2sj0UQbsaMl0rKo1bYjJtrOC7LfdZHYVkxuuOE2ERH5ddFi6dmzVyA4u0yUXSZEiwXiv/mNaOAPiJSJijTlDBWIihQLTolgbzu0VSqRSDAg9ho5UtZsWCciIo3ZjGQ8EZMVMclGqV79vdRtfkcaqr+Uy887pvla+x50lGypWR/Yv2kRSRqp37RcKlZ+I+LOk1dfuVuKi6ICltiRYtF2iSirVSDgpmQD4qastPSrcQ8/yl13juGuO8dg3Tb6lj2AEYFbzKGhMcXnX3xBY7IWW4ckLDoomxpo4BonkqCquo4pU+czdEgPduhRSLJ8PcqKYSfy8bRPl3Zd6NV3ZyZOmsLWyiq+nTiTnXt0p/+AnamvrsARhRUrAmUFvm4t9NmpF63bt+eHiT+QrK/H0oEbUSnTHJTSCowYlAQZiwHVv4Oy4jhOUCZeVBwVQCQwBJ4p8X0KCwsZPGgA03+ewQcfvE8644GOIegwbdMCOwEqirISKB1FW9Eg9bEJNREy0AcsvyZgIVBCxHLIZsvZZdjuvPzKC+zQsQspSeIoO6j7YDLUb16A5dQRLyrh7tEv8ODjbwEwYp+DefXV52hT2paU5xJVkKpejZ9eRlGHHN5+/2suu+wBtlZ5aKcQIwGVchgND+4BQYmfyclNPBmP50zfuHETW7aUg+enr3K9lKSz9SIisn79Btln5MhwHy4SbReJsoNlKBgtgffE0p0ECmVgn04y76fHRRq/kJrln0u6aq14ni8ZPy0iRt779GMpa72zgCXtW7WVrz9+VkzddKlc/g/JVq8Q8T3x/EZJmXrxwlXk2edfkvy8wCNjOQViOwUSFG+MhXt7IuCk0LmirELRVuAksSOloq0W+2L4fx0pa9YJevfqJ8XFwUzTdqFY8bairVLRqihwGNj5ouwgY9KygsO2S0VHSgIlRucG1ycmWDmiYwWio8F20Lt3b5kzd37gmPHqJWsaxZhGET8ltRvnSd3aT0XcufLg3VdI1Am2haG7HiG/Ll0pImlJ+a54ni915aukYvlnItnv5YvP75aO7fMDz5rdNXymUBa6RGynTCyrSLRVINFoomLffQ/qNGTIMHbZdTi77Doc67bRt7RRSk5UAYSf/Lx8li5dyuQfpyDioOyQHkC1QFMoUMpGqTibtqxl9tzFDN9jNzru2JHq8nJsHceORMnqevp270/Hzl347psplG9dz4wZixg8eBA9enahpnwz0WgEK+qgxcJDoZXFkIEDKC0p5vvvvyWTbsCYDAHRZxOkPkARIlnAQtsRUE31GWhhagXUT+I24jgRjj/+KAYOHsjgIYOxrQirV60ATGB+42/LZNCEKAqFwuD59YjfGPI5Z0PwnwFJI14G8TP06tWD5ye8yJAhg0i6WSylcZRBS5qG8tUYr5r8jm158ol3uHX0YyQzWfoPGMmECY/Rp3dXsqaOiGfjNlZQX7Ocsta5TJ76CxdcdB+r1tSi7XZhfN2lCWShdYAXEwwiRhxHTzvssIMfb9u2DR3at6ND+3Yoz0/dDebmpkRux07w5VffcMqpp7O1ogKiucHDGAlVpjBGbPvYlsZPa8TUsMfwfjz37G3stENbtm6qpbC0F+S0Q5TBsWyef+UFLj7/CjLpegb368eEp0czYGBnGjZuJd56J6ycDni+hev7OLZga5unnhjPZ19+Q5s27ejcuQvFJaVghIqtFaxbs5JZs2bxyy9zw/vJD1Iw5Te2tG+IxyzuuvtOLrnofKLRgFxm9eo13HLr7bz+2hso5YClEaW3ISS0Ddks+PU4Ti4j9tiN3n360aFjZ4qLi3C9LFu2bGTN6lXU19dx+WUXsMee+5NxXYzWaDFELUOycgWmYQ25HVvx/Cufc81VY6mpbaBnn4FMmPAcw3cbjCceyrMxNStoqF1JYZtc5vyyglPPuZlfl1ZiRfIxVirAl0mYSYgf+qICtJkIXmFh0age3Xd82bSsyez56eWenxTPaxQv1JCqamrloEOCGr3KyRMdDWv5WoWBuWIXiormiI7niI50EKXbBz7UvQbIyoUfiV8zRWqWfi9uTbl4XlJ8Uycinjz82MOCFQQJhg4eIotmfCJS+6NUr/he3OQmMb5IJmUknfHEl6QYqZPNmzdLKpX5nY2bTKZk0cJF8syEF6X/oCHBZmQlAgXILhDlFIpyCkTrqBx7wilijEgqlZRXX31JvvjiMxERWb5ytfQbMERAB0pUpEhUtEiIFQkqIYAcceQx8uFHX8iaNevEc83v7qOhoUEqt1aKiCdZaRDP8ySbEvFdkcbKpVK16jORhqny+ktjpaSkUADp1K2LfPnd94FC5TWIeGnxa7dK1cJvxJRPkwUz3pV+vQIzTuvOou12oqJxUZF4s9nYFAiyrCKx7QJxnMTm8869JP/UU86h5YHnp5/2/LQ0Hb4JOvPhh8eLbTuCjkvEKRFtl25LbbQLglROq1CwW4my2ojSwc0fecCesmXhd+JvnCy1a74Vt36N+Jm0+L6RrFsvo8fc2Kzl7r/77rJx3j/Er5omFau+FDe5UcQXcbNGsn69uFItQbQlK+KnRbykiJ9t1vib2tJly+TkU08ONY6EaKckCFhEiiTiROWFF14SEZE33nhdEom4DBzYXxYuCsrTnnbaGeHgyBc7WixWtERQcbGdhIy59z7ZvHlLiyu5YkxajJ8UMent7qNRjKT8jJiML5L0JVuxQapXfSpe/bfywdsPSauytoGDpl0refvjd0VEJG1EfNeXTPVqqV32hbibZsvaX6fKboP6hiZcUWACWaViq2LRVq7gJIKJpstEW63FsVqJUjmSm5s3/sEHxnH/2Ae3O6zbRt+yATh/25wWtLIpLi7h22+/paJ8I5adwIQIxkCdDRzaTft2sG8FZdwXL1/JhvWb2H/kHiRyDA0NDUTiRUFKSiTGLoN3I+O6TJs6iZXr1rF+1Vb23m8EhQUxGmo2EE1YaNtBkcDzg2KOYsJSeM1bq+DjBzgT5VJa3Ip99t6HTRVbmTfnZxAL5TgBLZJk2HPPvRg2bDfq6mv5buK39OrVi5NOOol4PMG7773H/PnzsOygkIjxPTA+4x59kCsuu5T8/Bw8P4VvXExYSNKY4NlFBBET9o2FZSwsy+BnllJXO4/cwhJ+mLqeUeffwpbyLRSXlvLIo49wwjHH4aEDp2a2htotv5LIMVQko5xxzhVMnj4bZSeCmkphSECLCuj9Q3AdElgHjm3h+3XeyH33PT2ZSlZVVFRSUbntsG4bfUsS6AnsHPRe4NssKS5h+YpV/PTTtABvGxaU3CbgJjxdCHITQWuNpWHBkmVs2VLJyJF7ErENDfXVAeWeHyeWiLHrroOpqS1n1sxfWLxyHZs3VrP33sNJRJOkkxuIJhIoCkEcfC2I0oiyAvRCU6EsFRBMZN0sWTdJQV4xe+45gp9nzGT1qlWIClCKxvVIJhs45dRT6dypI8cddwJHHXkUxcWl/DxjFuMffYzq6hqsaDwoAeDVcc2113Pt1ZejbY3rpkEMllIExogFyka0Fd5T0DdWFmyl8LObqKn9kVih8Mv8Ws488z7WbVxFfkkOD4y/j9NOOB3LWGgDJltJ9eZFxHMVKU9x6llX8+2k6VhOAuXEw7IBARheKxMGpdU2ASP4xkVr/6PBgwc9nc1mcT13u8O6bfQtWaAGOLV5DouPZTmUlpTx3XffUFVVAUS2RXpC8aqmi6nQLhRBKRtfYP6ixdRtTTNy5B4oq5p0aiuxeD5K5RCPJ9h1t93YtGUjc3+Zy8LFS6mpbGSfkcOIOBlSqQYi0VKMiQWplSFiMMjsa9LiA63e94LcIaUgNyeX1q3b89VXn5NsTGI5EYzApg3rWbV6DcOHDaNt2zbE4wl++mkmV1x5JQvmz0U7+SCCcevp3ac/TzzxKMVFRfi+BxLUfbCsJgGHypjWAcRYCUoMtij8zFYqt8wgpwBWrkly2qm3s2zVMvILW3Hn/Xdw3qnnobEDGHN2M7WbZ5HI8fCdAk474wa+/PZndDQXpWL4voTqfOAH0CKBgHVTmR0Jsjf9BkbsNWIUqLWu6/Hbw7pt9C0A9caYviLSTZoodzG0a9eeZctWMGPGTJqKJgb8HU3n6JaTHlRA74PSGBNl1rwlGDfNXvv0xvhVeG6KSKQATIzc/Dx22W0XFq9aytJFS5kzfwUmbbPH8KGATyaTIpaIoi27OXKplQ6yJSQouYMIlhXUShJAa4uuO+7IpCnTWLZkSbBsKhtjhHnzfuHv77zLDz9M4qWXXuWB+x9kxfLVKJ2gCTkqJs2tt45mn71HhBXWDJbWAVMBwTIcHMGgtjVoP4ttKSRTS9WWn4nmeVRuTfC3E+9h/q9LyM3P5Za7buOK8y7GWDbKN0hmCw2Vs8jJSeLHEpw76k7+8ekMxIoFv290i06VADmpwn5XQYqoZQVppVqZr7r36P6I1nobh3CLZt1y602ISCOQBI4l5DHzjYdtRWnbrgPffPMlVVVbUVaEbRkBAYFYsEkEdlkT+DqYbTG0yWPS9B+IWsJe++wK2RR+JosTzQViFBQWMHy3YSz6dQ3Lly9kyoxfyIkXsvvuwzGZSnyvnmi8GIum0GUwi0K0Dqpl0hVBjT/bcqisrOKHH77FdRWWtoNBpzV1NdUsWTyfFatWkvYEraMYo7C0wvcaKCpqxe2jb6Vt29YY3w3zE0JTRBRGhTNY68AY8LLYlkGyjcFSm5cmJRFOOXE00+esIZGTx9U3XMAt19yIry1sH7zMVuoq5hGPZzERmwsueYC33v0eQ/uQ9a5l+kWojyrC/g2Er5RgWQrfrTEjRux1RTQSXdRU8PO3h3XrbTc3CbsS2AHojQKtBSMe7dt2YMuWaqZOnRJyQYQpLcoK/t/kAGHbfYEdUBLYWTQWP/w4gwK7kN2HDcPNNpD1G4gkoohnUVxSxtBhuzJ34QLWrF7Bd5OmUZAoZvjgnkiqBt+1cBLxYHmWbcBu1SzkJuqD4H1LR3CzLh98+CnpdLYZ9SkiKMtCWxEsywk70g4cNoAxDQwcOJBzzz2HRMIJM/klsDLD6wrBvgugjItj+0i2kbrNK1FWLVlyGHXOXXw1cRqxWJzLr7iMu++4MyA5zWaRbB11W5cQjfmQKObKK8bx0mtfY6yisCt9FIamzWDbQahcBVXdbFvj+Rny8vJ/7NJlh/ujkUhaa41lWb87WpIzVwAPApuax1DIvHbxxRewc88+YLJsX4KtifLQBOg/QoZY0Sh8/GgtOuZgq/bcfM8EnnvqA+K5OfjZLdRWLUT5ScgYunfbkacmPMKwvfcAhOtuv4fvv55GjhPDa6gitXUTXroRrfwWZHUtk41U830A7NxzJ/Lz8zGeH/JlblvyQoAiEFQRb8qiBOjWtRvRaCScuUHHBpp707oV/I5WYCFIupFk+Xr8VA2FZTncfuvjfPT5ZCwnh/MvPJl7x9wSMNX5GuU3Ul8+l5xYBhWNcdP1D/P8yz8A7dCWA1YtGoM2oEXQYtBiUJgwfQhQGm2FSqbX4B980MEP7NitW03rtm1p067dHx6/rfU2Qyl1Jag6rWwsZeObDO3atebqqy8lGlVB2kWowQY8i4DYiDTtTyrMt/FQrsbN+vha4ZLHVXc9yrPPf0pRQSciqXoaaxbh2RVkpJZeO/Rh/PjH2X2vvencsQ2uVY9LPZbZSrZ6JY0bF5CpWov2kygl+NrGteIYbQc4AK3CKmpCbkE+VqSp+miQwY+WZtpFIaQCRILUnDBxOL+wEMu2A609TKoQS/AtRcaOYSyFjWC7WdzqLTSsW4bKVBK3UqiGBgpzNJ06tuWMiy7grocfIo3gm1q02UR2y0LyIgaxC7n11qcY//Rb+OggTUgMyrMwSjBagr8q4CgTbJDg0AjauLiZKnr06DWppKRoaiIWJScn8afH78rLKqXeAjqKyF1ATCGIeJx15um8/977fPLJR9h2HIwOFJHmWdSCwFSFtX7d4Od9lQHLIutHuf62h4jHEpx92kE01NXQuLWcRGEXXAuG9OnPqy+9zJaVs9ipcw6ZdAMx5RGLRkhn6khVZUHSRMs6IxJFCCI1qJZ7V5Aj20QAIxL6z2FbjlKLRUCQkEcEVBNZJkGxy5aJ4lobbPGw/Azpqs00Vq4h7rhE7CxGpfFrLa6+4Hz2PXoUu+1zADbg4aGNT3LDRqKWhZ+Tx713P80jT7wGxFB2BCNJ8AMSUlGy/c01r5TBayWCqCy5ObGaE0887oFOnTpVZTLpFs/++/Zn9YMfBQqAG0DZRly0shgz5h7mzJnFls1VYLWgSwL43c0JqKYSL4EyZkWiNKaTXHHd7UQdxSmnnEDd5kqy3hYSxSAe7NClAzt0SJBa9Su4HlhJjMniaI3np0nVueiYjZPXFsuzER3B6OY0DMRqybYnf/Xs21oLB0rwUpppfAXBEsHyk2jl4iUrSNevwrbqsbVGwjI2WRSJWA777LMLGBfXyxCXNKmKCmyJoHJKefChRxk77llAY0WCyuIoQYlPkAz3W3HItt0nHG6uW59s3677XdqyvspkUrjuXxcB/zMBu6DuBEkDtyilYr6foW/f3tx802guuvj8IJlMN9Uiau7R39xcWDdQgnxj34C286hP13LpdXcRj0U45sT9aNy6gWRDJbZjIykfyWbQ0UxQOt7korQLyiMSFVzjk0nV4BS0QTsRgsqdYXQnVIpiTlOytwl5RP6iCTTlONu2EyomNspqYQZK00zKks3Wgp0mFrPQRqN1DDEWxvEx1JLeNANtRxA8UpLBdjSRgiIeefQZ7rr/CVzjEInl4YlqoaA21Vf8I3E0WSkK49XRu1f/CUOHDn08J5HrK2Vj239dAPuvKoC7wD3AOhHu0Up1MMZj1Lln8vPPM3jp5WdB5wU0P8FQDBwAsE3bbV5dtoUaxdhop5Dq+hquuOEOCvOFkcccgrj1uCYLIjiRCFZeDrgW4iVQVgZIo8ni6BiezgFioKLNsfemfOamy1ohgZvSTfnOf9a2fRaJRIhGouFvtOgaRXAtfKx4PolIwH6HaPBjaB1FR2vx/Sza12AyiLjYto2Lw5MvvcrosQ+TyWosJw/PWMHer4LE+GZy5pZEaEGPAmHyWaaB1q3Kvj/uuGPH9O7dO1tdXYMxBuuvJAiorJvc7g293T7VvHYNB24EfZilo6xbt4HDDz+SuXNnYUXzgvKtyg7cmSHTWjDymridnVAATe+DMoL4tXTt1J79DxkB2sP1syCgjcbBQowi4yvQLpogmVxZFr6xETsHRRxlggCVhLPAjkTIuoYPP/iY2pqGQFH5SwEHufFi0gwcPJhdBvVD8ENHR6A1i9h4ykJJEkwttgqsCRGFESdgildplCg0UcTNopSPFY1QVZvhyy9/oqamAaxEYOs2OS6azMsmTV6cbf2DwdIqUCiNh639X4cP2/P4ww49fGF+fi7+X2e1/7sCNoBqawwn2ZZzm1J24Y+Tp3L0scewtbwcK5aH8QJqtMArFE7d5lLlvzVpgmYpB9/1CKqHmhbXyvKfaQpIgB2BP1moldZItpGgCtl/ojUVM2mK21pAMXYkgufXtRBsU9/obSte800F5zi2RiuD66bKi0tKzxnYb9AnI/fZm9LSEjxv+xJ2f9b+yQTfrm0SkXFGzCTxvev33GP48Q+Pe4SzTz8Nk23EjuYFbHOm6QY1SFPHBjZycxZcEzOAMthxC9+LB7PMCEiK0qIyWpXlB2aKnUAZG9WUEmIELA9UBtF+kPwsVvNgCkwfhaUdopE46zdWUFle/nsNGoLl0fPp2LkbRUW5ZLLJZudCc+Hm0IsWuGhBfEKeLQ3aEFT+83GMi23FWLxsE8mUG2RpaINtAq+X5zU0+89ppjfW4aSwg2dTmd/cniGTTTZg3NGZTPazdDr4XCvdTJf0nxRweFGZ5fv+BZalvjz5pBPuWL9mdfubb7oRL5NEW7EAGRHe3PYjs2UdiOCv8TVKaxzJBGE4LRg/zb77j2T01WcQjVqogn7YOhb8ltHB8maFCpzywmtsu46RQMBKBabOddffzJtvvE5TaZ1mrk+lwA/q8F595WUce+xh+H5Afi7KNLspm5jCFCYgIjM6jKJJ6JXVNCarMOmFRJ0ijjrhKhYsWIOyHMBFORpx6wOFrUUkbpujqMniCCvLiQmURvHxMnVu5y5dHjrtjDNfSKVSJhaNgSVU1VW1IDT/6/ZvCzhsVUbMi+Lz2aGHHdq6trr63vsfuP8gpSNoRzAotNgYz28mXd3mCWrRVByTcXDERyuXbMiLmVuQzw7d2xCzBfK68a/ZOn/cCvMTNPF1QKAZy3YDzaNjhzZ06NDuv3wNTCFeehN2vE1YPCQCJoIocH0vsDiUDvWEwEUatKb+CFyUlqVDhVlwsym/TevWj59+5llji4uLs67rIhLUlnJ9F/Uv9sl/VcAAxjdmUzab3XTU0Ued2ZhKjX3yicfP8ADtRJGm8jlNTf12xElAIaSzZH0XUBgVAWJUVimmzqwmV6XxciZjWZFgCaPZVG3xe7L9dQjoGI3vY9sWm8sraZnHYwKVClp09pKly5g3bwHJZDpwbYZxV2lyy9Ic5iBwOGz7NWWB56ZRpgHjrqW6yoCOBFmBuskVan5zj2ybzaG+IqFJhxLcTNIrKSl47vi/nXqjViqTzWZpibP6V4UL/56She8HjGu+B7ajcV3D3HnzaGyox/Ml8cbf37zz9VdeusyTiIO2W+xjf9IsA9oLTEBjg44HYDfPIyL1aDJsi4E5bL/MN+1nTdcIIy/N1ws0e18p8OyAG0RZgd2MhFQVBmOyKCXogIW7xW/9Vilseq/FstpiP7XRKGIYlUOWgG8SKxOsvn5AGyy/G+S/6Q4l+F7WKynJnXDSyaddAsYvLiokNy9vOwH/O+3/ZQY3NxGhoaE+edJJJ12TiCc2vDDhmTsyGTdPOQGofJsC+xthiwmLd2jQYNGILV6Y4B/cnrNdlmNL52EY2SIY0dt/EghCAEcpRAueB4amfNvA/BDjEbEFywroApscG7+bbdvfdLOsg7MCH3zAtRWwvsaUwjWCjwUmikgsVLAybD9gCGO9CsHH97PZsrLC508/a9RF9fUN2Na/PlP/rP1HBNzUqqqrOeW0U8Yl4rENz094dkxNbWNXOxrHhKFig9q2xKKwPButLDytEC/FAfuPYL8Ru4GXQvseom1MYXt8UQH3pSi2mbSh50prtNZBJbGQvzKeiIMIqXSSqG2zevkaHnvy6YDkW4U+Xy9FIuFw+qlnslPv3qRdj5x4HM9zcbNN20vT8imh0hi81mF4UiEoSwIHR0MF2sriWWDFErz6+gfMn7sMdC5IFMFr4RcgBMcIlq0xxsP33GS7NqWPn3bm2den0v8pk+0/LGClFBXlFVxy0YVv19fWLn/j768/0JBMjdROBIUVOhxU89IdOAZ0SIyZYeTu/bjy5nMgUw3pJNh5kPPnlEp/1so3b8b1XNqHFVmmTf6R8Y+PC0i/lUJpjSFNIh7h5FNOYs8RAQXx2rVrKC0tIZHI/Tev6EHyVzCNELEgUsLP02Yx/5fFaCyMMqHXqmnam8AYsHRQIkFTjcV9111//f1r12/8t5/3r9ofGIf/b00pRTKVor6+bvZOvfoc1XOnHk+aTGPSy6Z/d65RgqtNyJAK9Y3VsHE5rF9JesMGqtZvIJtei/ErELcS8WoxXl141GC8rRivHONXYrytgMfGdcs5+KCDGDxoCDOmTgOB2uogc15CqE/Avg6+myHZUAvACxMmMGDAIEadfRaNDXWIX494VYhXiXjlGFOJ8asxfh3Gq8VkqzFuJcZspX7rUurXrqZx4zrq1q4mtWUDJhkQoysDWCnQ6RZmY1CwxMs0EovodaVlpdcore9vWdj5P9X+ozO4ZVNK0djQUL/P/vtf3KZdu4U//zT98sbGxh7ayWsuuWeQgEwz9MpYEWfbcmjZKK1Ibt0YlHNTgUvQ90IOj1DJMXgBTZSxiecWUblhOco0EtFZqresxq3vRiYbkLFpDX4TOpSwNGu2Efwk5WuWYJk0VRtXk9y6GuMYjHiokBDc6FDBkqCEnzI+onyUpfDSjUSNgAc6aqNUgqgdBXQQrNeZ4HomGrpzXSRbR+vWred12aHbNZs2b/5a5L+mRP2z9t8mYAiEXFNdzTmjznlyzeo1s+tqqq6p3Fp5rOMUopTC9VSgZOFigESiANW2GypVQcxPExMFnqKZMVt5QTiwuQmiDEb5KDyUv5l+/Vvzygt343kefXt2Q+XU4oaWgiaC70eDUkE4ZNJZRFJg1XL5xUezx547sVOPrpTlZxHfowke0OKJQFxQTTUdJQA+OjEoCFYho+Pogg74DoCLsrMoiWApwXIM2UwaJEXPnXf6at/9D7xq0a9LFv6rbsf/SvtvFTAEQq6rq8P3/Z+6ddv5zG7d/RmzZv5yUdb1OllWHsZoLO1gyDBl2lyGTl5EYa4im9oaapi/Layxvd2rLUE18VqHkZmcoiJitsOilWuoSa7g7bffD6JehLq1CKIcGlP1fPHVd7RpX0BO3KF91x2pbEyzcXMlLc0kQRBv+xmmdEtzSeGbVADGs/NZv2kZc+b9GvBQGhUQk+OTSW9GKy3Hn3DCU4cdetjty1asqEinf791/Sfbf7uAm1rgWpOGffbZd+y8efOnlbUqvmDjxg1/U7oUZcexHc2nn//IvAWLycuN42bToYn7+3hnSy9dU75Yy88UAQgfpUgmU6xetRnLjuHhNUcVA10nwgsvv8N3E6fgODbGN0Husba2u4ggv4lIKX7rClZiMBLUPy4vr6G8vB7LyUeI4GdTGKro3mPnZPdu3UafdOLfHmvVqiwzZ+7cf9mn/F9t/2MChkDIjY2NWJaetOuuu8xXeuhXH7z/2dXZdKqPFSnG9S1WrGqpRf6RA+Nfvlr410KRg4UG7SHiBv5epdA6h2TKY9HiNS3OD4AC21+vycHR8rd/+3nTYQAb20rge1lEtgJ5nDPqgl+POPzQWz7+6JP3y8vLKSjI/28XLvwPC7ip+b5PTk5u9Y5de7y0eOmyqa1bFR038bsfrgJKVLQMrR2MCYpv4Luh0aj+XM5/4SBSBDa077vBacoLXZE2Rmy0jmF0rEWcVv3x7/0upLfNg6a0QnlB4ESMB8rH8wJG2v0P2F8uveTyh/bae6/nV61ctbi2tvZ/RLBN7X9FwBAwqSaTjRQUFS4tKSu9f+iwoe9HY/HTf/j+++t8tKXjRf9fe1cTGtUVhb/782ZG4+QlTiKdX1cpohsxkzFVaCImFktaTZGqBETQje3OhT9dKOi2dFNw78qFYiFVF4JRaLEkCKW0AauUZlEngiajmRjnvXfvPS7uezGJEFskyQj9dg/uuzzux733vHO+cw44cUArEKxqhEVerTfc2ostGAOxWHhHz3E/hj2GbENmwlvKwts44cKZw0qwMAQjOYzvA2SLlHV1d+Hrr47dKhY7zjuOM9KYXPOyOlVdVnKBFSQ4gtEGnuepprVr72ttzvX3f3G18uz5vju3hw4BlAZWg3MZFsELM/oWWLa0yKLZXQvYjPw5kRxisJXSCSCFxY4BBpsI8PrZOiyINBg4gsADMAPpJNDTsxtHjh6d+Ghr6ZvJytOr2Wzm6cOHfyGXw7KTC9QBwRGM1ggCVWvKNN+bqDz7/eyZM98+ePBn5/Ubtw9MTT353IAneWRRh1ezJW9W+z9ntvn+XjAPIJuhQCTDETZUSNzmHEXynHnvzcGs+BwAOIdRtrcvINC6Loe9/btwYP+XKLZ3XEwmk+e1VmOPyv/oIAhWhNgIdUNwBGMMtNae6zZ6DasbrgG4eeLkqeTduz/vGh6+twekdmqtGxl3BBeOUMqqETlns+a0rbzDbNjQ2F0WFTe3agiAjIF5HQAMx1r/tpDSnhTGWLE8t6oUMrbjqJQCzc0pdHbuQF/fHnyyuyfIpdO/OY48BbCfAPhL+W/7X1B3BEcwJtImw4/FYhNg7FJLS8ul0yePJy5f+WHb6OgfO6vVqa6GROJDz/fiZHjMkHC4YIJR2GaVcxtgNCxsNaNAwuZW2eCBAYMECz1i9lImaD8KCmhwTog5McTjAtnsehTb29Hb24uPu7fr9AeZquPEfwXUBUAMAuS/izhhKVC3BC+CGoChmZmZoVJHCZ9+tjc++OO19sfl8c3j4483+N7zDa7rrgdDaxDoZq0IWpPVCxAsB2ChowJgCCAEh5SAlAJSSkgpscZtRSGfp3yhQKXiFlPq2KLa2tqCpibXCb/hsjbed4b0fV5fnM7D+0jwLIgISimPiH4hohGEKqmDAwMxzuXhv8fGzpbL5URlsoKaV7MKztBYgyEwIWqJVateplIplkmnkS/kWT6Xm05n0qpQKLzYuGmTn3LdmhB8WggxyRh7BCCrlD8quPweC1VydQj2b8Vb/+P9xCsI6J0P9LoMiQAAAABJRU5ErkJggg==
// ==/UserScript==

/**
 * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 * You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
 */

const CaptchaSiteKey = "0x4AAAAAAALBT58IhyDViNmv";
const AdminUserList = ["zhuchenrui2", "shanwenxiao", "admin"];

let escapeHTML = (str) => {
    return str.replace(/[&<>"']/g, function (match) {
        const escape = {
            '&': '&amp;',
            '<': '&lt;',
            '>': '&gt;',
            '"': '&quot;',
            "'": '&#39;'
        };
        return escape[match];
    });
};

let PurifyHTML = (Input) => {
    try {
        return DOMPurify.sanitize(Input, {
            "ALLOWED_TAGS": ["a", "b", "big", "blockquote", "br", "code", "dd", "del", "div", "dl", "dt", "em", "h1", "h2", "h3", "h4", "h5", "h6", "h7", "h8", "hr", "i", "img", "ins", "kbd", "li", "ol", "p", "pre", "q", "rp", "rt", "ruby", "s", "samp", "strike", "strong", "sub", "sup", "table", "tbody", "td", "tfoot", "th", "thead", "tr", "tt", "ul", "var"],
            "ALLOWED_ATTR": ["abbr", "accept", "accept-charset", "accesskey", "action", "align", "alt", "axis", "border", "cellpadding", "cellspacing", "char", "charoff", "charset", "checked", "cite", "clear", "color", "cols", "colspan", "compact", "coords", "datetime", "dir", "disabled", "enctype", "for", "frame", "headers", "height", "href", "hreflang", "hspace", "ismap", "itemprop", "label", "lang", "longdesc", "maxlength", "media", "method", "multiple", "name", "nohref", "noshade", "nowrap", "prompt", "readonly", "rel", "rev", "rows", "rowspan", "rules", "scope", "selected", "shape", "size", "span", "src", "start", "summary", "tabindex", "target", "title", "type", "usemap", "valign", "value", "vspace", "width"]
        });
    } catch (e) {
        console.error(e);
        if (UtilityEnabled("DebugMode")) {
            SmartAlert("XMOJ-Script internal error!\n\n" + e + "\n\n" + "If you see this message, please report it to the developer.\nDon't forget to include console logs and a way to reproduce the error!\n\nDon't want to see this message? Disable DebugMode.");
        }
    }
}
let SmartAlert = (Message) => {
    if (localStorage.getItem("UserScript-Alert") !== Message) {
        alert(Message);
    }
    localStorage.setItem("UserScript-Alert", Message);
}
/**
 * Calculates the relative time based on the input date.
 * @param {string|Date} Input - The input date.
 * @returns {string} The relative time in a formatted string.
 */
let GetRelativeTime = (Input) => {
    try {
        Input = new Date(Input);
        let Now = new Date().getTime();
        let Delta = Now - Input.getTime();
        let RelativeName = "";
        if (Delta < 0) {
            RelativeName = "未来";
        } else if (Delta <= 1000 * 60) {
            RelativeName = "刚刚";
        } else if (Delta <= 1000 * 60 * 60) {
            RelativeName = Math.floor((Now - Input) / 1000 / 60) + "分钟前";
        } else if (Delta <= 1000 * 60 * 60 * 24) {
            RelativeName = Math.floor((Now - Input) / 1000 / 60 / 60) + "小时前";
        } else if (Delta <= 1000 * 60 * 60 * 24 * 31) {
            RelativeName = Math.floor((Now - Input) / 1000 / 60 / 60 / 24) + "天前";
        } else if (Delta <= 1000 * 60 * 60 * 24 * 365) {
            RelativeName = Math.floor((Now - Input) / 1000 / 60 / 60 / 24 / 31) + "个月前";
        } else {
            RelativeName = Math.floor((Now - Input) / 1000 / 60 / 60 / 24 / 365) + "年前";
        }
        return "<span title=\"" + Input.toLocaleString() + "\">" + RelativeName + "</span>";
    } catch (e) {
        console.error(e);
        if (UtilityEnabled("DebugMode")) {
            SmartAlert("XMOJ-Script internal error!\n\n" + e + "\n\n" + "If you see this message, please report it to the developer.\nDon't forget to include console logs and a way to reproduce the error!\n\nDon't want to see this message? Disable DebugMode.");
        }
    }
};
let RenderMathJax = async () => {
    try {
        if (document.getElementById("MathJax-script") === null) {
            var ScriptElement = document.createElement("script");
            ScriptElement.id = "MathJax-script";
            ScriptElement.type = "text/javascript";
            ScriptElement.src = "https://s4.zstatic.net/ajax/libs/mathjax/3.0.5/es5/tex-chtml.js";
            if (UtilityEnabled("cdnjs")) {
                ScriptElement.src = "https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.0.5/es5/tex-chtml.js";
            }
            document.body.appendChild(ScriptElement);
            await new Promise((Resolve) => {
                ScriptElement.onload = () => {
                    Resolve();
                };
            });
        }
        if (MathJax !== undefined) { //If there is a Math expression
            MathJax.startup.input[0].findTeX.options.inlineMath.push(["$", "$"]);
            MathJax.startup.input[0].findTeX.getPatterns();
            MathJax.typeset();
        }
    } catch (e) {
        console.error(e);
    }
};
let GetUserInfo = async (Username) => {
    try {
        if (localStorage.getItem("UserScript-User-" + Username + "-UserRating") != null && new Date().getTime() - parseInt(localStorage.getItem("UserScript-User-" + Username + "-LastUpdateTime")) < 1000 * 60 * 60 * 24) {
            return {
                "Rating": localStorage.getItem("UserScript-User-" + Username + "-UserRating"),
                "EmailHash": localStorage.getItem("UserScript-User-" + Username + "-EmailHash")
            }
        }
        return await fetch("https://www.xmoj.tech/userinfo.php?user=" + Username).then((Response) => {
            return Response.text();
        }).then((Response) => {
            if (Response.indexOf("No such User!") !== -1) {
                return null;
            }
            const ParsedDocument = new DOMParser().parseFromString(Response, "text/html");
            let Rating = (parseInt(ParsedDocument.querySelector("#statics > tbody > tr:nth-child(4) > td:nth-child(2)").innerText.trim()) / parseInt(ParsedDocument.querySelector("#statics > tbody > tr:nth-child(3) > td:nth-child(2)").innerText.trim())).toFixed(3) * 1000;
            let Temp = ParsedDocument.querySelector("#statics > tbody").children;
            let Email = Temp[Temp.length - 1].children[1].innerText.trim();
            let EmailHash = CryptoJS.MD5(Email).toString();
            localStorage.setItem("UserScript-User-" + Username + "-UserRating", Rating);
            if (Email == "") {
                EmailHash = undefined;
            } else {
                localStorage.setItem("UserScript-User-" + Username + "-EmailHash", EmailHash);
            }
            localStorage.setItem("UserScript-User-" + Username + "-LastUpdateTime", new Date().getTime());
            return {
                "Rating": Rating, "EmailHash": EmailHash
            }
        });
    } catch (e) {
        console.error(e);
        if (UtilityEnabled("DebugMode")) {
            SmartAlert("XMOJ-Script internal error!\n\n" + e + "\n\n" + "If you see this message, please report it to the developer.\nDon't forget to include console logs and a way to reproduce the error!\n\nDon't want to see this message? Disable DebugMode.");
        }
    }
};
/**
 * Retrieves the badge information for a given user.
 *
 * @param {string} Username - The username of the user.
 * @returns {Promise<Object>} - A promise that resolves to an object containing the badge information.
 * @property {string} BackgroundColor - The background color of the badge.
 * @property {string} Color - The color of the badge.
 * @property {string} Content - The content of the badge.
 */
let GetUserBadge = async (Username) => {
    try {
        if (localStorage.getItem("UserScript-User-" + Username + "-Badge-LastUpdateTime") != null && new Date().getTime() - parseInt(localStorage.getItem("UserScript-User-" + Username + "-Badge-LastUpdateTime")) < 1000 * 60 * 60 * 24) {
            return {
                "BackgroundColor": localStorage.getItem("UserScript-User-" + Username + "-Badge-BackgroundColor"),
                "Color": localStorage.getItem("UserScript-User-" + Username + "-Badge-Color"),
                "Content": localStorage.getItem("UserScript-User-" + Username + "-Badge-Content")
            }
        } else {
            let BackgroundColor = "";
            let Color = "";
            let Content = "";
            await new Promise((Resolve) => {
                RequestAPI("GetBadge", {
                    "UserID": String(Username)
                }, (Response) => {
                    if (Response.Success) {
                        BackgroundColor = Response.Data.BackgroundColor;
                        Color = Response.Data.Color;
                        Content = Response.Data.Content;
                    }
                    Resolve();
                });
            });
            localStorage.setItem("UserScript-User-" + Username + "-Badge-BackgroundColor", BackgroundColor);
            localStorage.setItem("UserScript-User-" + Username + "-Badge-Color", Color);
            localStorage.setItem("UserScript-User-" + Username + "-Badge-Content", Content);
            localStorage.setItem("UserScript-User-" + Username + "-Badge-LastUpdateTime", String(new Date().getTime()));
            return {
                "BackgroundColor": BackgroundColor, "Color": Color, "Content": Content
            }
        }
    } catch (e) {
        console.error(e);
        if (UtilityEnabled("DebugMode")) {
            SmartAlert("XMOJ-Script internal error!\n\n" + e + "\n\n" + "If you see this message, please report it to the developer.\nDon't forget to include console logs and a way to reproduce the error!\n\nDon't want to see this message? Disable DebugMode.");
        }
    }
};
/**
 * Sets the HTML content of an element to display a username with optional additional information.
 * @param {HTMLElement} Element - The element to set the HTML content.
 * @param {string} Username - The username to display.
 * @param {boolean} [Simple=false] - Indicates whether to display additional information or not.
 * @param {string} [Href="https://www.xmoj.tech/userinfo.php?user="] - The URL to link the username to.
 * @returns {Promise<void>} - A promise that resolves when the HTML content is set.
 */
let GetUsernameHTML = async (Element, Username, Simple = false, Href = "https://www.xmoj.tech/userinfo.php?user=") => {
    try {
        //Username = Username.replaceAll(/[^a-zA-Z0-9]/g, "");
        let ID = "Username-" + Username + "-" + Math.random();
        Element.id = ID;
        Element.innerHTML = `<div class="spinner-border spinner-border-sm me-2" role="status"></div>`;
        Element.appendChild(document.createTextNode(Username));
        let UserInfo = await GetUserInfo(Username);
        if (UserInfo === null) {
            document.getElementById(ID).innerHTML = "";
            document.getElementById(ID).appendChild(document.createTextNode(Username));
            return;
        }
        let HTMLData = "";
        if (!Simple) {
            HTMLData += `<img src="`;
            if (UserInfo.EmailHash == undefined) {
                HTMLData += `https://cravatar.cn/avatar/00000000000000000000000000000000?d=mp&f=y`;
            } else {
                HTMLData += `https://cravatar.cn/avatar/${UserInfo.EmailHash}?d=retro`;
            }
            HTMLData += `" class="rounded me-2" style="width: 20px; height: 20px; ">`;
        }
        HTMLData += `<a href="${Href}${Username}" class="link-offset-2 link-underline-opacity-50 `
        if (UtilityEnabled("Rating")) {
            let Rating = UserInfo.Rating;
            // if(AdminUserList.includes(Username)){
            //     HTMLData += "link-fuchsia"
            // }
            // else
            if (Rating > 500) {
                HTMLData += "link-danger";
            } else if (Rating >= 400) {
                HTMLData += "link-warning";
            } else if (Rating >= 300) {
                HTMLData += "link-success";
            } else {
                HTMLData += "link-info";
            }
        } else {
            HTMLData += "link-info";
        }
        HTMLData += `\";"></a>`;
        if (!Simple) {
            if (AdminUserList.includes(Username)) {
                HTMLData += `<span class="badge text-bg-danger ms-2">脚本管理员</span>`;
            }
            if (Username == "chenlangning") {
                HTMLData += `<span class="badge ms-2" style="background-color: #6633cc; color: #ffffff">吉祥物</span>`;
            }
            let BadgeInfo = await GetUserBadge(Username);
            if (BadgeInfo.Content != "") {
                HTMLData += `<span class="badge ms-2" style="background-color: ${BadgeInfo.BackgroundColor}; color: ${BadgeInfo.Color}">${BadgeInfo.Content}</span>`;
            }
        }
        if (document.getElementById(ID) !== null) {
            document.getElementById(ID).innerHTML = HTMLData;
            document.getElementById(ID).getElementsByTagName("a")[0].appendChild(document.createTextNode(Username));
        }
    } catch (e) {
        console.error(e);
        if (UtilityEnabled("DebugMode")) {
            SmartAlert("XMOJ-Script internal error!\n\n" + e + "\n\n" + "If you see this message, please report it to the developer.\nDon't forget to include console logs and a way to reproduce the error!\n\nDon't want to see this message? Disable DebugMode.");
        }
    }
};
/**
 * Converts the given number of seconds to a formatted string representation of hours, minutes, and seconds.
 * @param {number} InputSeconds - The number of seconds to convert.
 * @returns {string} The formatted string representation of the input seconds.
 */
let SecondsToString = (InputSeconds) => {
    try {
        let Hours = Math.floor(InputSeconds / 3600);
        let Minutes = Math.floor((InputSeconds % 3600) / 60);
        let Seconds = InputSeconds % 60;
        return (Hours < 10 ? "0" : "") + Hours + ":" + (Minutes < 10 ? "0" : "") + Minutes + ":" + (Seconds < 10 ? "0" : "") + Seconds;
    } catch (e) {
        console.error(e);
        if (UtilityEnabled("DebugMode")) {
            SmartAlert("XMOJ-Script internal error!\n\n" + e + "\n\n" + "If you see this message, please report it to the developer.\nDon't forget to include console logs and a way to reproduce the error!\n\nDon't want to see this message? Disable DebugMode.");
        }
    }
}
/**
 * Converts a string in the format "hh:mm:ss" to the equivalent number of seconds.
 * @param {string} InputString - The input string to convert.
 * @returns {number} The number of seconds equivalent to the input string.
 */
let StringToSeconds = (InputString) => {
    try {
        let SplittedString = InputString.split(":");
        return parseInt(SplittedString[0]) * 60 * 60 + parseInt(SplittedString[1]) * 60 + parseInt(SplittedString[2]);
    } catch (e) {
        console.error(e);
        if (UtilityEnabled("DebugMode")) {
            SmartAlert("XMOJ-Script internal error!\n\n" + e + "\n\n" + "If you see this message, please report it to the developer.\nDon't forget to include console logs and a way to reproduce the error!\n\nDon't want to see this message? Disable DebugMode.");
        }
    }
}
/**
 * Converts a memory size in bytes to a human-readable string representation.
 * @param {number} Memory - The memory size in bytes.
 * @returns {string} The human-readable string representation of the memory size.
 */
let SizeToStringSize = (Memory) => {
    try {
        if (UtilityEnabled("AddUnits")) {
            if (Memory < 1024) {
                return Memory + "KB";
            } else if (Memory < 1024 * 1024) {
                return (Memory / 1024).toFixed(2) + "MB";
            } else if (Memory < 1024 * 1024 * 1024) {
                return (Memory / 1024 / 1024).toFixed(2) + "GB";
            } else {
                return (Memory / 1024 / 1024 / 1024).toFixed(2) + "TB";
            }
        } else {
            return Memory;
        }
    } catch (e) {
        console.error(e);
        if (UtilityEnabled("DebugMode")) {
            SmartAlert("XMOJ-Script internal error!\n\n" + e + "\n\n" + "If you see this message, please report it to the developer.\nDon't forget to include console logs and a way to reproduce the error!\n\nDon't want to see this message? Disable DebugMode.");
        }
    }
};
let CodeSizeToStringSize = (Memory) => {
    try {
        if (UtilityEnabled("AddUnits")) {
            if (Memory < 1024) {
                return Memory + "B";
            } else if (Memory < 1024 * 1024) {
                return (Memory / 1024).toFixed(2) + "KB";
            } else if (Memory < 1024 * 1024 * 1024) {
                return (Memory / 1024 / 1024).toFixed(2) + "MB";
            } else {
                return (Memory / 1024 / 1024 / 1024).toFixed(2) + "GB";
            }
        } else {
            return Memory;
        }
    } catch (e) {
        console.error(e);
        if (UtilityEnabled("DebugMode")) {
            SmartAlert("XMOJ-Script internal error!\n\n" + e + "\n\n" + "If you see this message, please report it to the developer.\nDon't forget to include console logs and a way to reproduce the error!\n\nDon't want to see this message? Disable DebugMode.");
        }
    }
};
/**
 * Converts a time value to a string representation.
 * @param {number} Time - The time value to convert.
 * @returns {string|number} - The converted time value as a string, or the original value if UtilityEnabled("AddUnits") is false.
 */
let TimeToStringTime = (Time) => {
    try {
        if (UtilityEnabled("AddUnits")) {
            if (Time < 1000) {
                return Time + "ms";
            } else if (Time < 1000 * 60) {
                return (Time / 1000).toFixed(2) + "s";
            }
        } else {
            return Time;
        }
    } catch (e) {
        console.error(e);
        if (UtilityEnabled("DebugMode")) {
            SmartAlert("XMOJ-Script internal error!\n\n" + e + "\n\n" + "If you see this message, please report it to the developer.\nDon't forget to include console logs and a way to reproduce the error!\n\nDon't want to see this message? Disable DebugMode.");
        }
    }
};
/**
 * Tidies up the given table by applying Bootstrap styling and removing unnecessary attributes.
 *
 * @param {HTMLElement} Table - The table element to be tidied up.
 */
let TidyTable = (Table) => {
    try {
        if (UtilityEnabled("NewBootstrap") && Table != null) {
            Table.className = "table table-hover";
        }
    } catch (e) {
        console.error(e);
        if (UtilityEnabled("DebugMode")) {
            SmartAlert("XMOJ-Script internal error!\n\n" + e + "\n\n" + "If you see this message, please report it to the developer.\nDon't forget to include console logs and a way to reproduce the error!\n\nDon't want to see this message? Disable DebugMode.");
        }
    }
};
let UtilityEnabled = (Name) => {
    try {
        if (localStorage.getItem("UserScript-Setting-" + Name) == null) {
            const defaultOffItems = ["DebugMode", "cdnjs", "SuperDebug", "ReplaceXM"];
            localStorage.setItem("UserScript-Setting-" + Name, defaultOffItems.includes(Name) ? "false" : "true");
        }
        return localStorage.getItem("UserScript-Setting-" + Name) == "true";
    } catch (e) {
        console.error(e);
        if (UtilityEnabled("DebugMode")) {
            SmartAlert("XMOJ-Script internal error!\n\n" + e + "\n\n" + "If you see this message, please report it to the developer.\nDon't forget to include console logs and a way to reproduce the error!\n\nDon't want to see this message? Disable DebugMode.");
        }
    }
};
let RequestAPI = (Action, Data, CallBack) => {
    try {
        let Session = "";
        let Temp = document.cookie.split(";");
        for (let i = 0; i < Temp.length; i++) {
            if (Temp[i].includes("PHPSESSID")) {
                Session = Temp[i].split("=")[1];
            }
        }
        let PostData = {
            "Authentication": {
                "SessionID": Session, "Username": CurrentUsername,
            }, "Data": Data, "Version": GM_info.script.version, "DebugMode": UtilityEnabled("DebugMode")
        };
        let DataString = JSON.stringify(PostData);
        if (UtilityEnabled("DebugMode")) {
            console.log("Sent for", Action + ":", DataString);
        }
        GM_xmlhttpRequest({
            method: "POST",
            url: (UtilityEnabled("SuperDebug") ? "http://127.0.0.1:8787/" : "https://api.xmoj-bbs.me/") + Action,
            headers: {
                "Content-Type": "application/json",
                "Cache-Control": "no-cache",
                "XMOJ-UserID": CurrentUsername,
                "XMOJ-Script-Version": GM_info.script.version,
                "DebugMode": UtilityEnabled("DebugMode")
            },
            data: DataString,
            onload: (Response) => {
                if (UtilityEnabled("DebugMode")) {
                    console.log("Received for", Action + ":", Response.responseText);
                }
                try {
                    CallBack(JSON.parse(Response.responseText));
                } catch (Error) {
                    console.error(Response.responseText);
                }
            }
        });
    } catch (e) {
        console.error(e);
        if (UtilityEnabled("DebugMode")) {
            SmartAlert("XMOJ-Script internal error!\n\n" + e + "\n\n" + "If you see this message, please report it to the developer.\nDon't forget to include console logs and a way to reproduce the error!\n\nDon't want to see this message? Disable DebugMode.");
        }
    }
};

GM_registerMenuCommand("清除缓存", () => {
    let Temp = [];
    for (let i = 0; i < localStorage.length; i++) {
        if (localStorage.key(i).startsWith("UserScript-User-")) {
            Temp.push(localStorage.key(i));
        }
    }
    for (let i = 0; i < Temp.length; i++) {
        localStorage.removeItem(Temp[i]);
    }
    location.reload();
});
GM_registerMenuCommand("重置数据", () => {
    if (confirm("确定要重置数据吗?")) {
        localStorage.clear();
        location.reload();
    }
});

//otherwise CurrentUsername might be undefined
if (UtilityEnabled("AutoLogin") && document.querySelector("body > a:nth-child(1)") != null && document.querySelector("body > a:nth-child(1)").innerText == "请登录后继续操作") {
    localStorage.setItem("UserScript-LastPage", location.pathname + location.search);
    location.href = "https://www.xmoj.tech/loginpage.php";
}

let SearchParams = new URLSearchParams(location.search);
let ServerURL = (UtilityEnabled("DebugMode") ? "https://ghpages.xmoj-bbs.me/" : "https://www.xmoj-bbs.me")
let CurrentUsername = document.querySelector("#profile").innerText;
CurrentUsername = CurrentUsername.replaceAll(/[^a-zA-Z0-9]/g, "");
let IsAdmin = AdminUserList.indexOf(CurrentUsername) !== -1;


class NavbarStyler {
    constructor() {
        try {
            this.navbar = document.querySelector('.navbar.navbar-expand-lg.bg-body-tertiary');
            if (this.navbar && UtilityEnabled("NewTopBar")) {
                this.init();
            }
        } catch (e) {
            console.error(e);
            if (UtilityEnabled("DebugMode")) {
                SmartAlert("XMOJ-Script internal error!\n\n" + e + "\n\n" + "If you see this message, please report it to the developer.\nDon't forget to include console logs and a way to reproduce the error!\n\nDon't want to see this message? Disable DebugMode.");
            }
        }
    }

    init() {
        try {
            this.applyStyles();
            this.createOverlay();
            this.createSpacer();
            window.addEventListener('resize', () => this.updateBlurOverlay());
            this.updateBlurOverlay();
        } catch (e) {
            console.error(e);
            if (UtilityEnabled("DebugMode")) {
                SmartAlert("XMOJ-Script internal error!\n\n" + e + "\n\n" + "If you see this message, please report it to the developer.\nDon't forget to include console logs and a way to reproduce the error!\n\nDon't want to see this message? Disable DebugMode.");
            }
        }
    }

    applyStyles() {
        try {
            let n = this.navbar;
            n.classList.add('fixed-top', 'container', 'ml-auto');
            Object.assign(n.style, {
                position: 'fixed',
                borderRadius: '28px',
                boxShadow: '0 4px 8px rgba(0, 0, 0, 0.5)',
                margin: '16px auto',
                backgroundColor: 'rgba(255, 255, 255, 0)',
                opacity: '0.75',
                zIndex: '1000'
            });
        } catch (e) {
            console.error(e);
            if (UtilityEnabled("DebugMode")) {
                SmartAlert("XMOJ-Script internal error!\n\n" + e + "\n\n" + "If you see this message, please report it to the developer.\nDon't forget to include console logs and a way to reproduce the error!\n\nDon't want to see this message? Disable DebugMode.");
            }
        }
    }

    createOverlay() {
        try {
            if (!document.getElementById('blur-overlay')) {
                let overlay = document.createElement('div');
                overlay.id = 'blur-overlay';
                document.body.appendChild(overlay);

                let style = document.createElement('style');
                style.textContent = `
                #blur-overlay {
                    position: fixed;
                    backdrop-filter: blur(4px);
                    z-index: 999;
                    pointer-events: none;
                    border-radius: 28px;
                }
            `;
                document.head.appendChild(style);
            }
        } catch (e) {
            console.error(e);
            if (UtilityEnabled("DebugMode")) {
                SmartAlert("XMOJ-Script internal error!\n\n" + e + "\n\n" + "If you see this message, please report it to the developer.\nDon't forget to include console logs and a way to reproduce the error!\n\nDon't want to see this message? Disable DebugMode.");
            }
        }
    }

    updateBlurOverlay() {
        try {
            let overlay = document.getElementById('blur-overlay');
            let n = this.navbar;
            Object.assign(overlay.style, {
                top: `${n.offsetTop}px`,
                left: `${n.offsetLeft}px`,
                width: `${n.offsetWidth}px`,
                height: `${n.offsetHeight}px`
            });
        } catch (e) {
            console.error(e);
            if (UtilityEnabled("DebugMode")) {
                SmartAlert("XMOJ-Script internal error!\n\n" + e + "\n\n" + "If you see this message, please report it to the developer.\nDon't forget to include console logs and a way to reproduce the error!\n\nDon't want to see this message? Disable DebugMode.");
            }
        }
    }

    createSpacer() {
        try {
            let spacer = document.getElementById('navbar-spacer');
            let newHeight = this.navbar.offsetHeight + 24;
            if (!spacer) {
                spacer = document.createElement('div');
                spacer.id = 'navbar-spacer';
                spacer.style.height = `${newHeight}px`;
                spacer.style.width = '100%';
                document.body.insertBefore(spacer, document.body.firstChild);
            } else {
                let currentHeight = parseInt(spacer.style.height, 10);
                if (currentHeight !== newHeight) {
                    document.body.removeChild(spacer);
                    spacer = document.createElement('div');
                    spacer.id = 'navbar-spacer';
                    spacer.style.height = `${newHeight}px`;
                    spacer.style.width = '100%';
                    document.body.insertBefore(spacer, document.body.firstChild);
                }
            }
        } catch (e) {
            console.error(e);
            if (UtilityEnabled("DebugMode")) {
                SmartAlert("XMOJ-Script internal error!\n\n" + e + "\n\n" + "If you see this message, please report it to the developer.\nDon't forget to include console logs and a way to reproduce the error!\n\nDon't want to see this message? Disable DebugMode.");
            }
        }
    }
}

function replaceMarkdownImages(text, string) {
    return text.replace(/!\[.*?\]\(.*?\)/g, string);
}

async function main() {
    try {
        if (location.href.startsWith('http://')) {
            //use https
            location.href = location.href.replace('http://', 'https://');
        }
        if (location.host != "www.xmoj.tech") {
            location.host = "www.xmoj.tech";
        } else {
            if (location.href === 'https://www.xmoj.tech/open_contest_sign_up.php') {
                return;
            }
            document.body.classList.add("placeholder-glow");
            if (document.querySelector("#navbar") != null) {
                if (document.querySelector("body > div > div.jumbotron") != null) {
                    document.querySelector("body > div > div.jumbotron").className = "mt-3";
                }

                if (UtilityEnabled("AutoLogin") && document.querySelector("#profile") != null && document.querySelector("#profile").innerHTML == "登录" && location.pathname != "/login.php" && location.pathname != "/loginpage.php" && location.pathname != "/lostpassword.php") {
                    localStorage.setItem("UserScript-LastPage", location.pathname + location.search);
                    location.href = "https://www.xmoj.tech/loginpage.php";
                }

                let Discussion = null;
                if (UtilityEnabled("Discussion")) {
                    Discussion = document.createElement("li");
                    document.querySelector("#navbar > ul:nth-child(1)").appendChild(Discussion);
                    Discussion.innerHTML = "<a href=\"https://www.xmoj.tech/discuss3/discuss.php\">讨论</a>";
                }

                if (document.querySelector("#navbar > ul:nth-child(1)").childElementCount > 8 && UtilityEnabled("ACMRank")) {
                    let ACMRank = document.createElement("li");
                    document.querySelector("#navbar > ul:nth-child(1)").insertBefore(ACMRank, document.querySelector("#navbar > ul:nth-child(1) > li:nth-child(9)"));
                    ACMRank.innerHTML = "<a href=\"https://www.xmoj.tech/contestrank-oi.php?cid=" + Number(SearchParams.get("cid")) + "&ByUserScript=1\">ACM 排名</a>";
                    ACMRank.classList.add("active");
                }
                if (UtilityEnabled("Translate")) {
                    document.querySelector("#navbar > ul:nth-child(1) > li:nth-child(2) > a").innerText = "题库";
                }
                //send analytics
                RequestAPI("SendData", {});
                if (UtilityEnabled("ReplaceLinks")) {
                    document.body.innerHTML = String(document.body.innerHTML).replaceAll(/\[<a href="([^"]*)">([^<]*)<\/a>\]/g, "<button onclick=\"location.href='$1'\" class=\"btn btn-outline-secondary\">$2</button>");
                }
                if (UtilityEnabled("ReplaceXM")) {
                    document.body.innerHTML = String(document.body.innerHTML).replaceAll("我", "高老师");
                    document.body.innerHTML = String(document.body.innerHTML).replaceAll("小明", "高老师");
                    document.body.innerHTML = String(document.body.innerHTML).replaceAll("下海", "上海");
                    document.body.innerHTML = String(document.body.innerHTML).replaceAll("海上", "上海");
                    document.body.innerHTML = String(document.body.innerHTML).replaceAll("小红", "徐师娘");
                    document.body.innerHTML = String(document.body.innerHTML).replaceAll("小粉", "彩虹");
                    document.body.innerHTML = String(document.body.innerHTML).replaceAll("提交上节课的代码", "自动提交当年代码");
                    document.body.innerHTML = String(document.body.innerHTML).replaceAll("高老师们", "我们");
                    document.body.innerHTML = String(document.body.innerHTML).replaceAll("自高老师", "自我");
                    document.title = String(document.title).replaceAll("小明", "高老师");
                }

                if (UtilityEnabled("NewBootstrap")) {
                    let Temp = document.querySelectorAll("link");
                    for (var i = 0; i < Temp.length; i++) {
                        if (Temp[i].href.indexOf("bootstrap.min.css") != -1) {
                            Temp[i].remove();
                        } else if (Temp[i].href.indexOf("white.css") != -1) {
                            Temp[i].remove();
                        } else if (Temp[i].href.indexOf("semantic.min.css") != -1) {
                            Temp[i].remove();
                        } else if (Temp[i].href.indexOf("bootstrap-theme.min.css") != -1) {
                            Temp[i].remove();
                        } else if (Temp[i].href.indexOf("problem.css") != -1) {
                            Temp[i].remove();
                        }
                    }
                    if (UtilityEnabled("DarkMode")) {
                        document.querySelector("html").setAttribute("data-bs-theme", "dark");
                    } else {
                        document.querySelector("html").setAttribute("data-bs-theme", "light");
                    }
                    var resources = [{
                        type: 'link',
                        href: 'https://s4.zstatic.net/ajax/libs/codemirror/6.65.7/codemirror.min.css',
                        rel: 'stylesheet'
                    }, {
                        type: 'link',
                        href: 'https://s4.zstatic.net/ajax/libs/codemirror/6.65.7/theme/darcula.min.css',
                        rel: 'stylesheet'
                    }, {
                        type: 'link',
                        href: 'https://s4.zstatic.net/ajax/libs/codemirror/6.65.7/addon/merge/merge.min.css',
                        rel: 'stylesheet'
                    }, {
                        type: 'link',
                        href: 'https://s4.zstatic.net/ajax/libs/twitter-bootstrap/5.3.3/css/bootstrap.min.css',
                        rel: 'stylesheet'
                    }, {
                        type: 'script',
                        src: 'https://s4.zstatic.net/ajax/libs/twitter-bootstrap/5.3.3/js/bootstrap.bundle.js',
                        isModule: true
                    }];
                    if (UtilityEnabled("cdnjs")) {
                        resources[0].href = 'https://cdnjs.cloudflare.com/ajax/libs/codemirror/6.65.7/codemirror.min.css';
                        resources[1].href = 'https://cdnjs.cloudflare.com/ajax/libs/codemirror/6.65.7/theme/darcula.min.css';
                        resources[2].href = 'https://cdnjs.cloudflare.com/ajax/libs/codemirror/6.65.7/addon/merge/merge.min.css';
                        resources[3].href = 'https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/css/bootstrap.min.css';
                        resources[4].src = 'https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/js/bootstrap.bundle.js';
                    }
                    let loadResources = async () => {
                        let promises = resources.map(resource => {
                            return new Promise((resolve, reject) => {
                                let element;
                                if (resource.type === 'script') {
                                    element = document.createElement('script');
                                    element.src = resource.src;
                                    if (resource.isModule) {
                                        element.type = 'module';
                                    }
                                    element.onload = resolve;
                                    element.onerror = reject;
                                } else if (resource.type === 'link') {
                                    element = document.createElement('link');
                                    element.href = resource.href;
                                    element.rel = resource.rel;
                                    resolve(); // Stylesheets don't have an onload event
                                }
                                document.head.appendChild(element);
                            });
                        });

                        await Promise.all(promises);
                    };
                    if (location.pathname == "/submitpage.php") {
                        await loadResources();
                    } else {
                        loadResources();
                    }
                    document.querySelector("nav").className = "navbar navbar-expand-lg bg-body-tertiary";
                    document.querySelector("#navbar > ul:nth-child(1)").classList = "navbar-nav me-auto mb-2 mb-lg-0";
                    document.querySelector("body > div > nav > div > div.navbar-header").outerHTML = `<a class="navbar-brand" href="https://www.xmoj.tech/">${UtilityEnabled("ReplaceXM") ? "高老师" : "小明"}的OJ</a><button type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbar"><span class="navbar-toggler-icon"></span></button>`;
                    document.querySelector("#navbar > ul.nav.navbar-nav.navbar-right > li").classList = "nav-item dropdown";
                    document.querySelector("#navbar > ul.nav.navbar-nav.navbar-right > li > a").className = "nav-link dropdown-toggle";
                    document.querySelector("#navbar > ul.nav.navbar-nav.navbar-right > li > a > span.caret").remove();
                    Temp = document.querySelector("#navbar > ul:nth-child(1)").children;
                    for (var i = 0; i < Temp.length; i++) {
                        if (Temp[i].classList.contains("active")) {
                            Temp[i].classList.remove("active");
                            Temp[i].children[0].classList.add("active");
                        }
                        Temp[i].classList.add("nav-item");
                        Temp[i].children[0].classList.add("nav-link");
                    }
                    document.querySelector("#navbar > ul.nav.navbar-nav.navbar-right > li > a").setAttribute("data-bs-toggle", "dropdown");
                    document.querySelector("#navbar > ul.nav.navbar-nav.navbar-right > li > a").removeAttribute("data-toggle");
                }
                if (UtilityEnabled("RemoveUseless") && document.getElementsByTagName("marquee")[0] != undefined) {
                    document.getElementsByTagName("marquee")[0].remove();
                }
                let Style = document.createElement("style");
                document.body.appendChild(Style);
                Style.innerHTML = `
                nav {
                    border-bottom-left-radius: 5px;
                    border-bottom-right-radius: 5px;
                }
                blockquote {
                    border-left: 5px solid var(--bs-secondary-bg);
                    padding: 0.5em 1em;
                }
                .status_y:hover {
                    box-shadow: #52c41a 1px 1px 10px 0px !important;
                }
                .status_n:hover {
                    box-shadow: #fe4c61 1px 1px 10px 0px !important;
                }
                .status_w:hover {
                    box-shadow: #ffa900 1px 1px 10px 0px !important;
                }
                .test-case {
                    border-radius: 5px !important;
                }
                .test-case:hover {
                    box-shadow: rgba(0, 0, 0, 0.3) 0px 10px 20px 3px !important;
                }
                .data[result-item] {
                    border-bottom-left-radius: 5px;
                    border-bottom-right-radius: 5px;
                }
                .software_list {
                    width: unset !important;
                }
                .software_item {
                    margin: 5px 10px !important;
                    background-color: var(--bs-secondary-bg) !important;
                }
                .item-txt {
                    color: var(--bs-emphasis-color) !important;
                }
                .cnt-row {
                    justify-content: inherit;
                    align-items: stretch;
                    width: 100% !important;
                    padding: 1rem 0;
                }
                .cnt-row-head {
                    padding: 0.8em 1em;
                    background-color: var(--bs-secondary-bg);
                    border-radius: 0.3rem 0.3rem 0 0;
                    width: 100%;
                }
                .cnt-row-body {
                    padding: 1em;
                    border: 1px solid var(--bs-secondary-bg);
                    border-top: none;
                    border-radius: 0 0 0.3rem 0.3rem;
                }`;
                if (UtilityEnabled("AddAnimation")) {
                    Style.innerHTML += `.status, .test-case {
                    transition: 0.5s !important;
                }`;
                }
                if (UtilityEnabled("AddColorText")) {
                    Style.innerHTML += `.red {
                    color: red !important;
                }
                .green {
                    color: green !important;
                }
                .blue {
                    color: blue !important;
                }`;
                }

                if (UtilityEnabled("RemoveUseless")) {
                    if (document.getElementsByClassName("footer")[0] != null) {
                        document.getElementsByClassName("footer")[0].remove();
                    }
                }

                if (UtilityEnabled("ReplaceYN")) {
                    Temp = document.getElementsByClassName("status_y");//AC
                    for (let i = 0; i < Temp.length; i++) {
                        Temp[i].innerText = "✓";
                    }
                    Temp = document.getElementsByClassName("status_n");//WA
                    for (let i = 0; i < Temp.length; i++) {
                        Temp[i].innerText = "✗";
                    }
                    Temp = document.getElementsByClassName("status_w");//Waiting
                    for (let i = 0; i < Temp.length; i++) {
                        Temp[i].innerText = "⏳";
                    }
                }

                Temp = document.getElementsByClassName("page-item");
                for (let i = 0; i < Temp.length; i++) {
                    Temp[i].children[0].className = "page-link";
                }
                if (document.getElementsByClassName("pagination")[0] != null) {
                    document.getElementsByClassName("pagination")[0].classList.add("justify-content-center");
                }

                Temp = document.getElementsByTagName("table");
                for (let i = 0; i < Temp.length; i++) {
                    if (Temp[i].querySelector("thead") != null) {
                        TidyTable(Temp[i]);
                    }
                }

                setInterval(() => {
                    try {
                        let CurrentDate = new Date(new Date().getTime() + diff);
                        let Year = CurrentDate.getFullYear();
                        if (Year > 3000) {
                            Year -= 1900;
                        }
                        let Month = CurrentDate.getMonth() + 1;
                        let _Date = CurrentDate.getDate();
                        let Hours = CurrentDate.getHours();
                        let Minutes = CurrentDate.getMinutes();
                        let Seconds = CurrentDate.getSeconds();
                        document.getElementById("nowdate").innerHTML = Year + "-" + (Month < 10 ? "0" : "") + Month + "-" + (_Date < 10 ? "0" : "") + _Date + " " + (Hours < 10 ? "0" : "") + Hours + ":" + (Minutes < 10 ? "0" : "") + Minutes + ":" + (Seconds < 10 ? "0" : "") + Seconds;
                    } catch (Error) {
                    }
                    if (UtilityEnabled("NewTopBar")) {
                        new NavbarStyler();
                    }
                    if (UtilityEnabled("ResetType")) {
                        if (document.querySelector("#profile") != undefined && document.querySelector("#profile").innerHTML == "登录") {
                            let PopupUL = document.querySelector("#navbar > ul.nav.navbar-nav.navbar-right > li > ul");
                            PopupUL.innerHTML = `<li class="dropdown-item">登录</li>`;
                            PopupUL.children[0].addEventListener("click", () => {
                                location.href = "https://www.xmoj.tech/loginpage.php";
                            });
                            let parentLi = document.querySelector("#navbar > ul.nav.navbar-nav.navbar-right > li");
                            document.addEventListener("click", (event) => {
                                if (!parentLi.contains(event.target) && PopupUL.style.display === 'block') {
                                    hideDropdownItems();
                                }
                            });
                        } else if (document.querySelector("#navbar > ul.nav.navbar-nav.navbar-right > li > ul > li:nth-child(3) > a > span") != undefined && document.querySelector("#navbar > ul.nav.navbar-nav.navbar-right > li > ul > li:nth-child(3) > a > span").innerText != "个人中心") {
                            let PopupUL = document.querySelector("#navbar > ul.nav.navbar-nav.navbar-right > li > ul");
                            PopupUL.style.cursor = 'pointer';
                            PopupUL.innerHTML = `<li class="dropdown-item">修改帐号</li>
                                             <li class="dropdown-item">个人中心</li>
                                             <li class="dropdown-item">短消息</li>
                                             <li class="dropdown-item">插件设置</li>
                                             <li class="dropdown-item">插件更新日志</li>
                                             <li class="dropdown-item">注销</li>`;
                            PopupUL.children[0].addEventListener("click", () => {
                                location.href = "https://www.xmoj.tech/modifypage.php";
                            });
                            PopupUL.children[1].addEventListener("click", () => {
                                location.href = "https://www.xmoj.tech/userinfo.php?user=" + CurrentUsername;
                            });
                            PopupUL.children[2].addEventListener("click", () => {
                                location.href = "https://www.xmoj.tech/mail.php";
                            });
                            PopupUL.children[3].addEventListener("click", () => {
                                location.href = "https://www.xmoj.tech/index.php?ByUserScript=1";
                            });
                            PopupUL.children[4].addEventListener("click", () => {
                                location.href = "https://www.xmoj.tech/modifypage.php?ByUserScript=1";
                            });
                            PopupUL.children[5].addEventListener("click", () => {
                                localStorage.removeItem("UserScript-Username");
                                localStorage.removeItem("UserScript-Password");
                                location.href = "https://www.xmoj.tech/logout.php";
                            });
                            Array.from(PopupUL.children).forEach(item => {
                                item.style.opacity = 0;
                                item.style.transform = 'translateY(-16px)';
                                item.style.transition = 'transform 0.3s ease, opacity 0.5s ease';
                            });
                            let showDropdownItems = () => {
                                PopupUL.style.display = 'block';
                                Array.from(PopupUL.children).forEach((item, index) => {
                                    clearTimeout(item._timeout);
                                    item.style.opacity = 0;
                                    item.style.transform = 'translateY(-4px)';
                                    item._timeout = setTimeout(() => {
                                        item.style.opacity = 1;
                                        item.style.transform = 'translateY(2px)';
                                    }, index * 36);
                                });
                            };
                            let hideDropdownItems = () => {
                                Array.from(PopupUL.children).forEach((item) => {
                                    clearTimeout(item._timeout);
                                    item.style.opacity = 0;
                                    item.style.transform = 'translateY(-16px)';
                                });
                                setTimeout(() => {
                                    PopupUL.style.display = 'none';
                                }, 100);
                            };
                            let toggleDropdownItems = () => {
                                if (PopupUL.style.display === 'block') {
                                    hideDropdownItems();
                                } else {
                                    showDropdownItems();
                                }
                            };
                            let parentLi = document.querySelector("#navbar > ul.nav.navbar-nav.navbar-right > li");
                            parentLi.addEventListener("click", toggleDropdownItems);
                            document.addEventListener("click", (event) => {
                                if (!parentLi.contains(event.target) && PopupUL.style.display === 'block') {
                                    hideDropdownItems();
                                }
                            });
                        }
                    }
                    if (UtilityEnabled("AutoCountdown")) {
                        let Temp = document.getElementsByClassName("UpdateByJS");
                        for (let i = 0; i < Temp.length; i++) {
                            let EndTime = Temp[i].getAttribute("EndTime");
                            if (EndTime === null) {
                                Temp[i].classList.remove("UpdateByJS");
                                continue;
                            }
                            let TimeStamp = parseInt(EndTime) - new Date().getTime();
                            if (TimeStamp < 3000) {
                                Temp[i].classList.remove("UpdateByJS");
                                location.reload();
                            }
                            let CurrentDate = new Date(TimeStamp);
                            let Day = parseInt((TimeStamp / 1000 / 60 / 60 / 24).toFixed(0));
                            let Hour = CurrentDate.getUTCHours();
                            let Minute = CurrentDate.getUTCMinutes();
                            let Second = CurrentDate.getUTCSeconds();
                            Temp[i].innerHTML = (Day !== 0 ? Day + "天" : "") + (Hour !== 0 ? (Hour < 10 ? "0" : "") + Hour + "小时" : "") + (Minute !== 0 ? (Minute < 10 ? "0" : "") + Minute + "分" : "") + (Second !== 0 ? (Second < 10 ? "0" : "") + Second + "秒" : "");
                        }
                    }
                }, 100);

                fetch(ServerURL + "/Update.json", {cache: "no-cache"})
                    .then((Response) => {
                        return Response.json();
                    })
                    .then((Response) => {
                        let CurrentVersion = GM_info.script.version;
                        let LatestVersion;
                        for (let i = Object.keys(Response.UpdateHistory).length - 1; i >= 0; i--) {
                            let VersionInfo = Object.keys(Response.UpdateHistory)[i];
                            if (UtilityEnabled("DebugMode") || Response.UpdateHistory[VersionInfo].Prerelease == false) {
                                LatestVersion = VersionInfo;
                                break;
                            }
                        }
                        if (CurrentVersion < LatestVersion) {
                            let UpdateDiv = document.createElement("div");
                            UpdateDiv.innerHTML = `
                            <div class="alert alert-warning alert-dismissible fade show mt-2" role="alert">
                                <div>
                                    XMOJ用户脚本发现新版本${LatestVersion},当前版本${CurrentVersion},点击
                                    <a href="${ServerURL}/XMOJ.user.js" target="_blank" class="alert-link">此处</a>
                                    更新
                                </div>
                                <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
                            </div>`;
                            if (UtilityEnabled("NewTopBar")) {
                                UpdateDiv.style.position = 'fixed';
                                UpdateDiv.style.top = '72px';
                                UpdateDiv.style.left = '50%';
                                UpdateDiv.style.transform = 'translateX(-50%)';
                                UpdateDiv.style.zIndex = '1001';
                                let spacer = document.createElement("div");
                                spacer.style.height = '48px';
                                document.body.insertBefore(spacer, document.body.firstChild);
                                UpdateDiv.querySelector(".btn-close").addEventListener("click", function () {
                                    document.body.removeChild(spacer);
                                });
                            }
                            document.body.appendChild(UpdateDiv);
                            document.querySelector("body > div").insertBefore(UpdateDiv, document.querySelector("body > div > div.mt-3"));
                        }
                        if (localStorage.getItem("UserScript-Update-LastVersion") != GM_info.script.version) {
                            localStorage.setItem("UserScript-Update-LastVersion", GM_info.script.version);
                            let UpdateDiv = document.createElement("div");
                            document.querySelector("body").appendChild(UpdateDiv);
                            UpdateDiv.className = "modal fade";
                            UpdateDiv.id = "UpdateModal";
                            UpdateDiv.tabIndex = -1;
                            let UpdateDialog = document.createElement("div");
                            UpdateDiv.appendChild(UpdateDialog);
                            UpdateDialog.className = "modal-dialog";
                            let UpdateContent = document.createElement("div");
                            UpdateDialog.appendChild(UpdateContent);
                            UpdateContent.className = "modal-content";
                            let UpdateHeader = document.createElement("div");
                            UpdateContent.appendChild(UpdateHeader);
                            UpdateHeader.className = "modal-header";
                            let UpdateTitle = document.createElement("h5");
                            UpdateHeader.appendChild(UpdateTitle);
                            UpdateTitle.className = "modal-title";
                            UpdateTitle.innerText = "更新日志";
                            let UpdateCloseButton = document.createElement("button");
                            UpdateHeader.appendChild(UpdateCloseButton);
                            UpdateCloseButton.type = "button";
                            UpdateCloseButton.className = "btn-close";
                            UpdateCloseButton.setAttribute("data-bs-dismiss", "modal");
                            let UpdateBody = document.createElement("div");
                            UpdateContent.appendChild(UpdateBody);
                            UpdateBody.className = "modal-body";
                            let UpdateFooter = document.createElement("div");
                            UpdateContent.appendChild(UpdateFooter);
                            UpdateFooter.className = "modal-footer";
                            let UpdateButton = document.createElement("button");
                            UpdateFooter.appendChild(UpdateButton);
                            UpdateButton.type = "button";
                            UpdateButton.className = "btn btn-secondary";
                            UpdateButton.setAttribute("data-bs-dismiss", "modal");
                            UpdateButton.innerText = "关闭";
                            let Version = Object.keys(Response.UpdateHistory)[Object.keys(Response.UpdateHistory).length - 1]
                            let Data = Response.UpdateHistory[Version];
                            let UpdateDataCard = document.createElement("div");
                            UpdateBody.appendChild(UpdateDataCard);
                            UpdateDataCard.className = "card mb-3";
                            let UpdateDataCardBody = document.createElement("div");
                            UpdateDataCard.appendChild(UpdateDataCardBody);
                            UpdateDataCardBody.className = "card-body";
                            let UpdateDataCardTitle = document.createElement("h5");
                            UpdateDataCardBody.appendChild(UpdateDataCardTitle);
                            UpdateDataCardTitle.className = "card-title";
                            UpdateDataCardTitle.innerText = Version;
                            let UpdateDataCardSubtitle = document.createElement("h6");
                            UpdateDataCardBody.appendChild(UpdateDataCardSubtitle);
                            UpdateDataCardSubtitle.className = "card-subtitle mb-2 text-muted";
                            UpdateDataCardSubtitle.innerHTML = GetRelativeTime(Data.UpdateDate);
                            let UpdateDataCardText = document.createElement("p");
                            UpdateDataCardBody.appendChild(UpdateDataCardText);
                            UpdateDataCardText.className = "card-text";
                            //release notes
                            if (Data.Notes != undefined) {
                                UpdateDataCardText.innerHTML = Data.Notes;
                            }
                            let UpdateDataCardList = document.createElement("ul");
                            UpdateDataCardText.appendChild(UpdateDataCardList);
                            UpdateDataCardList.className = "list-group list-group-flush";
                            for (let j = 0; j < Data.UpdateContents.length; j++) {
                                let UpdateDataCardListItem = document.createElement("li");
                                UpdateDataCardList.appendChild(UpdateDataCardListItem);
                                UpdateDataCardListItem.className = "list-group-item";
                                UpdateDataCardListItem.innerHTML = "(<a href=\"https://github.com/XMOJ-Script-dev/XMOJ-Script/pull/" + Data.UpdateContents[j].PR + "\" target=\"_blank\">" + "#" + Data.UpdateContents[j].PR + "</a>) " + Data.UpdateContents[j].Description;
                            }
                            let UpdateDataCardLink = document.createElement("a");
                            UpdateDataCardBody.appendChild(UpdateDataCardLink);
                            UpdateDataCardLink.className = "card-link";
                            UpdateDataCardLink.href = "https://github.com/XMOJ-Script-dev/XMOJ-Script/releases/tag/" + Version;
                            UpdateDataCardLink.target = "_blank";
                            UpdateDataCardLink.innerText = "查看该版本";
                            new bootstrap.Modal(document.getElementById("UpdateModal")).show();
                        }
                    });
                RequestAPI("GetAddOnScript", {}, (Response) => {
                    if (Response.Success) {
                        eval(Response.Data["Script"]);
                    } else {
                        console.warn("Fetch AddOnScript failed: " + Response.Message);
                    }
                });
                let ToastContainer = document.createElement("div");
                ToastContainer.classList.add("toast-container", "position-fixed", "bottom-0", "end-0", "p-3");
                document.body.appendChild(ToastContainer);
                addEventListener("focus", () => {
                    if (UtilityEnabled("BBSPopup")) {
                        RequestAPI("GetBBSMentionList", {}, (Response) => {
                            if (Response.Success) {
                                ToastContainer.innerHTML = "";
                                let MentionList = Response.Data.MentionList;
                                for (let i = 0; i < MentionList.length; i++) {
                                    let Toast = document.createElement("div");
                                    Toast.classList.add("toast");
                                    Toast.setAttribute("role", "alert");
                                    let ToastHeader = document.createElement("div");
                                    ToastHeader.classList.add("toast-header");
                                    let ToastTitle = document.createElement("strong");
                                    ToastTitle.classList.add("me-auto");
                                    ToastTitle.innerHTML = "提醒:有人@你";
                                    ToastHeader.appendChild(ToastTitle);
                                    let ToastTime = document.createElement("small");
                                    ToastTime.classList.add("text-body-secondary");
                                    ToastTime.innerHTML = GetRelativeTime(MentionList[i].MentionTime);
                                    ToastHeader.appendChild(ToastTime);
                                    let ToastCloseButton = document.createElement("button");
                                    ToastCloseButton.type = "button";
                                    ToastCloseButton.classList.add("btn-close");
                                    ToastCloseButton.setAttribute("data-bs-dismiss", "toast");
                                    ToastHeader.appendChild(ToastCloseButton);
                                    Toast.appendChild(ToastHeader);
                                    let ToastBody = document.createElement("div");
                                    ToastBody.classList.add("toast-body");
                                    ToastBody.innerHTML = "讨论" + MentionList[i].PostTitle + "有新回复";
                                    let ToastFooter = document.createElement("div");
                                    ToastFooter.classList.add("mt-2", "pt-2", "border-top");
                                    let ToastDismissButton = document.createElement("button");
                                    ToastDismissButton.type = "button";
                                    ToastDismissButton.classList.add("btn", "btn-secondary", "btn-sm", "me-2");
                                    ToastDismissButton.innerText = "忽略";
                                    ToastDismissButton.addEventListener("click", () => {
                                        RequestAPI("ReadBBSMention", {
                                            "MentionID": Number(MentionList[i].MentionID)
                                        }, () => {
                                        });
                                        Toast.remove();
                                    });
                                    ToastFooter.appendChild(ToastDismissButton);
                                    let ToastViewButton = document.createElement("button");
                                    ToastViewButton.type = "button";
                                    ToastViewButton.classList.add("btn", "btn-primary", "btn-sm");
                                    ToastViewButton.innerText = "查看";
                                    ToastViewButton.addEventListener("click", () => {
                                        open("https://www.xmoj.tech/discuss3/thread.php?tid=" + MentionList[i].PostID + '&page=' + MentionList[i].PageNumber, "_blank");
                                        RequestAPI("ReadBBSMention", {
                                            "MentionID": Number(MentionList[i].MentionID)
                                        }, () => {
                                        });
                                    });
                                    ToastFooter.appendChild(ToastViewButton);
                                    ToastBody.appendChild(ToastFooter);
                                    Toast.appendChild(ToastBody);
                                    ToastContainer.appendChild(Toast);
                                    new bootstrap.Toast(Toast).show();
                                }
                            }
                        });
                    }
                    if (UtilityEnabled("MessagePopup")) {
                        RequestAPI("GetMailMentionList", {}, async (Response) => {
                            if (Response.Success) {
                                if (!UtilityEnabled("BBSPopup")) {
                                    ToastContainer.innerHTML = "";
                                }
                                let MentionList = Response.Data.MentionList;
                                for (let i = 0; i < MentionList.length; i++) {
                                    let Toast = document.createElement("div");
                                    Toast.classList.add("toast");
                                    Toast.setAttribute("role", "alert");
                                    let ToastHeader = document.createElement("div");
                                    ToastHeader.classList.add("toast-header");
                                    let ToastTitle = document.createElement("strong");
                                    ToastTitle.classList.add("me-auto");
                                    ToastTitle.innerHTML = "提醒:有新消息";
                                    ToastHeader.appendChild(ToastTitle);
                                    let ToastTime = document.createElement("small");
                                    ToastTime.classList.add("text-body-secondary");
                                    ToastTime.innerHTML = GetRelativeTime(MentionList[i].MentionTime);
                                    ToastHeader.appendChild(ToastTime);
                                    let ToastCloseButton = document.createElement("button");
                                    ToastCloseButton.type = "button";
                                    ToastCloseButton.classList.add("btn-close");
                                    ToastCloseButton.setAttribute("data-bs-dismiss", "toast");
                                    ToastHeader.appendChild(ToastCloseButton);
                                    Toast.appendChild(ToastHeader);
                                    let ToastBody = document.createElement("div");
                                    ToastBody.classList.add("toast-body");
                                    let ToastUser = document.createElement("span");
                                    GetUsernameHTML(ToastUser, MentionList[i].FromUserID);
                                    ToastBody.appendChild(ToastUser);
                                    ToastBody.innerHTML += "  给你发了一封短消息";
                                    let ToastFooter = document.createElement("div");
                                    ToastFooter.classList.add("mt-2", "pt-2", "border-top");
                                    let ToastDismissButton = document.createElement("button");
                                    ToastDismissButton.type = "button";
                                    ToastDismissButton.classList.add("btn", "btn-secondary", "btn-sm", "me-2");
                                    ToastDismissButton.setAttribute("data-bs-dismiss", "toast");
                                    ToastDismissButton.innerText = "忽略";
                                    ToastDismissButton.addEventListener("click", () => {
                                        RequestAPI("ReadMailMention", {
                                            "MentionID": Number(MentionList[i].MentionID)
                                        }, () => {
                                        });
                                    });
                                    ToastFooter.appendChild(ToastDismissButton);
                                    let ToastViewButton = document.createElement("button");
                                    ToastViewButton.type = "button";
                                    ToastViewButton.classList.add("btn", "btn-primary", "btn-sm");
                                    ToastViewButton.innerText = "查看";
                                    ToastViewButton.addEventListener("click", () => {
                                        open("https://www.xmoj.tech/mail.php?to_user=" + MentionList[i].FromUserID, "_blank");
                                        RequestAPI("ReadMailMention", {
                                            "MentionID": Number(MentionList[i].MentionID)
                                        }, () => {
                                        });
                                    });
                                    ToastFooter.appendChild(ToastViewButton);
                                    ToastBody.appendChild(ToastFooter);
                                    Toast.appendChild(ToastBody);
                                    ToastContainer.appendChild(Toast);
                                    new bootstrap.Toast(Toast).show();
                                }
                            }
                        });
                    }
                });
                dispatchEvent(new Event("focus"));


                if (location.pathname == "/index.php" || location.pathname == "/") {
                    if (new URL(location.href).searchParams.get("ByUserScript") != null) {
                        document.title = "脚本设置";
                        localStorage.setItem("UserScript-Opened", "true");
                        let Container = document.getElementsByClassName("mt-3")[0];
                        Container.innerHTML = "";
                        let Alert = document.createElement("div");
                        Alert.classList.add("alert");
                        Alert.classList.add("alert-primary");
                        Alert.role = "alert";
                        Alert.innerHTML = `欢迎您使用XMOJ增强脚本!点击
                <a class="alert-link" href="https://www.xmoj.tech/modifypage.php?ByUserScript=1" target="_blank">此处</a>
                查看更新日志。`;
                        Container.appendChild(Alert);
                        let UtilitiesCard = document.createElement("div");
                        UtilitiesCard.classList.add("card");
                        UtilitiesCard.classList.add("mb-3");
                        let UtilitiesCardHeader = document.createElement("div");
                        UtilitiesCardHeader.classList.add("card-header");
                        UtilitiesCardHeader.innerText = "XMOJ增强脚本功能列表";
                        UtilitiesCard.appendChild(UtilitiesCardHeader);
                        let UtilitiesCardBody = document.createElement("div");
                        UtilitiesCardBody.classList.add("card-body");
                        let CreateList = (Data) => {
                            let List = document.createElement("ul");
                            List.classList.add("list-group");
                            for (let i = 0; i < Data.length; i++) {
                                let Row = document.createElement("li");
                                Row.classList.add("list-group-item");
                                if (Data[i].Type == "A") {
                                    Row.classList.add("list-group-item-success");
                                } else if (Data[i].Type == "F") {
                                    Row.classList.add("list-group-item-warning");
                                } else if (Data[i].Type == "D") {
                                    Row.classList.add("list-group-item-danger");
                                }
                                if (Data[i].Children == undefined) {
                                    let CheckBox = document.createElement("input");
                                    CheckBox.classList.add("form-check-input");
                                    CheckBox.classList.add("me-1");
                                    CheckBox.type = "checkbox";
                                    CheckBox.id = Data[i].ID;
                                    if (localStorage.getItem("UserScript-Setting-" + Data[i].ID) == null) {
                                        localStorage.setItem("UserScript-Setting-" + Data[i].ID, "true");
                                    }
                                    if (localStorage.getItem("UserScript-Setting-" + Data[i].ID) == "false") {
                                        CheckBox.checked = false;
                                    } else {
                                        CheckBox.checked = true;
                                    }
                                    CheckBox.addEventListener("change", () => {
                                        return localStorage.setItem("UserScript-Setting-" + Data[i].ID, CheckBox.checked);
                                    });

                                    Row.appendChild(CheckBox);
                                    let Label = document.createElement("label");
                                    Label.classList.add("form-check-label");
                                    Label.htmlFor = Data[i].ID;
                                    Label.innerText = Data[i].Name;
                                    Row.appendChild(Label);
                                } else {
                                    let Label = document.createElement("label");
                                    Label.innerText = Data[i].Name;
                                    Row.appendChild(Label);
                                }
                                if (Data[i].Children != undefined) {
                                    Row.appendChild(CreateList(Data[i].Children));
                                }
                                List.appendChild(Row);
                            }
                            return List;
                        };
                        UtilitiesCardBody.appendChild(CreateList([{
                            "ID": "ACMRank", "Type": "A", "Name": "比赛ACM排名,并且能下载ACM排名"
                        }, {"ID": "Discussion", "Type": "F", "Name": "恢复讨论与短消息功能"}, {
                            "ID": "MoreSTD", "Type": "F", "Name": "查看到更多标程"
                        }, {"ID": "ApplyData", "Type": "A", "Name": "获取数据功能"}, {
                            "ID": "AutoCheat", "Type": "A", "Name": "自动提交当年代码"
                        }, {"ID": "Rating", "Type": "A", "Name": "添加用户评分和用户名颜色"}, {
                            "ID": "AutoRefresh", "Type": "A", "Name": "比赛列表、比赛排名界面自动刷新"
                        }, {
                            "ID": "AutoCountdown", "Type": "A", "Name": "比赛列表等界面的时间自动倒计时"
                        }, {"ID": "DownloadPlayback", "Type": "A", "Name": "回放视频增加下载功能"}, {
                            "ID": "ImproveACRate", "Type": "A", "Name": "自动提交已AC题目以提高AC率"
                        }, {"ID": "AutoO2", "Type": "F", "Name": "代码提交界面自动选择O2优化"}, {
                            "ID": "Beautify", "Type": "F", "Name": "美化界面", "Children": [{
                                "ID": "NewTopBar", "Type": "F", "Name": "使用新的顶部导航栏"
                            }, {
                                "ID": "NewBootstrap", "Type": "F", "Name": "使用新版的Bootstrap样式库*"
                            }, {"ID": "ResetType", "Type": "F", "Name": "重新排版*"}, {
                                "ID": "AddColorText", "Type": "A", "Name": "增加彩色文字"
                            }, {"ID": "AddUnits", "Type": "A", "Name": "状态界面内存与耗时添加单位"}, {
                                "ID": "DarkMode", "Type": "A", "Name": "使用暗色模式"
                            }, {
                                "ID": "DarkPicture", "Type": "A", "Name": "使用反色的题目图片(需要启用暗色模式)"
                            }, {"ID": "AddAnimation", "Type": "A", "Name": "增加动画"}, {
                                "ID": "ReplaceYN", "Type": "F", "Name": "题目前状态提示替换为好看的图标"
                            }, {"ID": "RemoveAlerts", "Type": "D", "Name": "去除多余反复的提示"}, {
                                "ID": "Translate", "Type": "F", "Name": "统一使用中文,翻译了部分英文*"
                            }, {
                                "ID": "ReplaceLinks", "Type": "F", "Name": "将网站中所有以方括号包装的链接替换为按钮"
                            }, {"ID": "RemoveUseless", "Type": "D", "Name": "删去无法使用的功能*"}, {
                                "ID": "ReplaceXM",
                                "Type": "F",
                                "Name": "将网站中所有“小明”和“我”关键字替换为“高老师”,所有“小红”替换为“徐师娘”,所有“小粉”替换为“彩虹”,所有“下海”、“海上”替换为“上海” (此功能默认关闭)"
                            }]
                        }, {
                            "ID": "AutoLogin", "Type": "A", "Name": "在需要登录的界面自动跳转到登陆界面"
                        }, {
                            "ID": "SavePassword", "Type": "A", "Name": "自动保存用户名与密码,免去每次手动输入密码的繁琐"
                        }, {
                            "ID": "CopySamples", "Type": "F", "Name": "题目界面测试样例有时复制无效"
                        }, {
                            "ID": "RefreshSolution", "Type": "F", "Name": "状态页面结果自动刷新每次只能刷新一个"
                        }, {"ID": "CopyMD", "Type": "A", "Name": "复制题目或题解内容"}, {
                            "ID": "OpenAllProblem", "Type": "A", "Name": "比赛题目界面一键打开所有题目"
                        }, {
                            "ID": "CheckCode", "Type": "A", "Name": "提交代码前对代码进行检查", "Children": [{
                                "ID": "IOFile", "Type": "A", "Name": "是否使用了文件输入输出(如果需要使用)"
                            }, {"ID": "CompileError", "Type": "A", "Name": "是否有编译错误"}]
                        }, {
                            "ID": "ExportACCode", "Type": "F", "Name": "导出AC代码每一道题目一个文件"
                        }, {"ID": "LoginFailed", "Type": "F", "Name": "修复登录后跳转失败*"}, {
                            "ID": "NewDownload", "Type": "A", "Name": "下载页面增加下载内容"
                        }, {"ID": "CompareSource", "Type": "A", "Name": "比较代码"}, {
                            "ID": "BBSPopup", "Type": "A", "Name": "讨论提醒"
                        }, {"ID": "MessagePopup", "Type": "A", "Name": "短消息提醒"}, {
                            "ID": "DebugMode", "Type": "A", "Name": "调试模式(仅供开发者使用)"
                        }, {
                            "ID": "SuperDebug", "Type": "A", "Name": "本地调试模式(仅供开发者使用) (未经授权的擅自开启将导致大部分功能不可用!)"
                        }, {"ID": "cdnjs", "Type": "A", "Name": "使用 cdnjs (如果延迟不大, 建议使用)"},]));
                        let UtilitiesCardFooter = document.createElement("div");
                        UtilitiesCardFooter.className = "card-footer text-muted";
                        UtilitiesCardFooter.innerText = "* 不建议关闭,可能会导致系统不稳定、界面错乱、功能缺失等问题\n绿色:增加功能 黄色:修改功能 红色:删除功能";
                        UtilitiesCardBody.appendChild(UtilitiesCardFooter);
                        UtilitiesCard.appendChild(UtilitiesCardBody);
                        Container.appendChild(UtilitiesCard);
                        let FeedbackCard = document.createElement("div");
                        FeedbackCard.className = "card mb-3";
                        let FeedbackCardHeader = document.createElement("div");
                        FeedbackCardHeader.className = "card-header";
                        FeedbackCardHeader.innerText = "反馈、源代码、联系作者";
                        FeedbackCard.appendChild(FeedbackCardHeader);
                        let FeedbackCardBody = document.createElement("div");
                        FeedbackCardBody.className = "card-body";
                        let FeedbackCardText = document.createElement("p");
                        FeedbackCardText.className = "card-text";
                        FeedbackCardText.innerText = "如果您有任何建议或者发现了bug,请前往本项目的GitHub页面并提交issue。提交issue前请先搜索是否有相同的issue,如果有请在该issue下留言。请在issue中尽可能详细地描述您的问题,并且附上您的浏览器版本、操作系统版本、脚本版本、复现步骤等信息。谢谢您支持本项目。";
                        FeedbackCardBody.appendChild(FeedbackCardText);
                        let FeedbackCardLink = document.createElement("a");
                        FeedbackCardLink.className = "card-link";
                        FeedbackCardLink.innerText = "GitHub";
                        FeedbackCardLink.href = "https://github.com/XMOJ-Script-dev/XMOJ-Script";
                        FeedbackCardBody.appendChild(FeedbackCardLink);
                        FeedbackCard.appendChild(FeedbackCardBody);
                        Container.appendChild(FeedbackCard);
                    } else {
                        let Temp = document.querySelector("body > div > div.mt-3 > div > div.col-md-8").children;
                        let NewsData = [];
                        for (let i = 0; i < Temp.length; i += 2) {
                            let Title = Temp[i].children[0].innerText;
                            let Time = 0;
                            if (Temp[i].children[1] != null) {
                                Time = Temp[i].children[1].innerText;
                            }
                            let Body = Temp[i + 1].innerHTML;
                            NewsData.push({"Title": Title, "Time": new Date(Time), "Body": Body});
                        }
                        document.querySelector("body > div > div.mt-3 > div > div.col-md-8").innerHTML = "";
                        for (let i = 0; i < NewsData.length; i++) {
                            let NewsRow = document.createElement("div");
                            NewsRow.className = "cnt-row";
                            let NewsRowHead = document.createElement("div");
                            NewsRowHead.className = "cnt-row-head title";
                            NewsRowHead.innerText = NewsData[i].Title;
                            if (NewsData[i].Time != 0) {
                                NewsRowHead.innerHTML += "<small class=\"ms-3\">" + NewsData[i].Time.toLocaleDateString() + "</small>";
                            }
                            NewsRow.appendChild(NewsRowHead);
                            let NewsRowBody = document.createElement("div");
                            NewsRowBody.className = "cnt-row-body";
                            NewsRowBody.innerHTML = NewsData[i].Body;
                            NewsRow.appendChild(NewsRowBody);
                            document.querySelector("body > div > div.mt-3 > div > div.col-md-8").appendChild(NewsRow);
                        }
                        let CountDownData = document.querySelector("#countdown_list").innerHTML;
                        document.querySelector("body > div > div.mt-3 > div > div.col-md-4").innerHTML = `<div class="cnt-row">
                        <div class="cnt-row-head title">倒计时</div>
                        <div class="cnt-row-body">${CountDownData}</div>
                    </div>`;
                        let Tables = document.getElementsByTagName("table");
                        for (let i = 0; i < Tables.length; i++) {
                            TidyTable(Tables[i]);
                        }
                        document.querySelector("body > div > div.mt-3 > div > div.col-md-4").innerHTML += `<div class="cnt-row">
                        <div class="cnt-row-head title">公告</div>
                        <div class="cnt-row-body">加载中...</div>
                    </div>`;
                        RequestAPI("GetNotice", {}, (Response) => {
                            if (Response.Success) {
                                document.querySelector("body > div.container > div > div > div.col-md-4 > div:nth-child(2) > div.cnt-row-body").innerHTML = marked.parse(Response.Data["Notice"]).replaceAll(/@([a-zA-Z0-9]+)/g, `<b>@</b><span class="ms-1 Usernames">$1</span>`);
                                RenderMathJax();
                                let UsernameElements = document.getElementsByClassName("Usernames");
                                for (let i = 0; i < UsernameElements.length; i++) {
                                    GetUsernameHTML(UsernameElements[i], UsernameElements[i].innerText, true);
                                }
                            } else {
                                document.querySelector("body > div.container > div > div > div.col-md-4 > div:nth-child(2) > div.cnt-row-body").innerHTML = "加载失败: " + Response.Message;
                            }
                        });
                    }
                } else if (location.pathname == "/problemset.php") {
                    if (UtilityEnabled("Translate")) {
                        document.querySelector("body > div > div.mt-3 > center > table:nth-child(2) > tbody > tr > td:nth-child(2) > form > input").placeholder = "题目编号";
                        document.querySelector("body > div > div.mt-3 > center > table:nth-child(2) > tbody > tr > td:nth-child(2) > form > button").innerText = "确认";
                        document.querySelector("body > div > div.mt-3 > center > table:nth-child(2) > tbody > tr > td:nth-child(3) > form > input").placeholder = "标题或内容";
                        document.querySelector("#problemset > thead > tr > th:nth-child(1)").innerText = "状态";
                    }
                    if (UtilityEnabled("ResetType")) {
                        document.querySelector("#problemset > thead > tr > th:nth-child(1)").style.width = "5%";
                        document.querySelector("#problemset > thead > tr > th:nth-child(2)").style.width = "10%";
                        document.querySelector("#problemset > thead > tr > th:nth-child(3)").style.width = "75%";
                        document.querySelector("#problemset > thead > tr > th:nth-child(4)").style.width = "5%";
                        document.querySelector("#problemset > thead > tr > th:nth-child(5)").style.width = "5%";
                    }
                    document.querySelector("body > div > div.mt-3 > center > table:nth-child(2)").outerHTML = `
            <div class="row">
                <div class="center col-md-3"></div>
                <div class="col-md-2">
                    <form action="problem.php" class="input-group">
                        <input class="form-control" type="number" name="id" placeholder="题目编号" min="0">
                        <button class="btn btn-outline-secondary" type="submit">跳转</button>
                    </form>
                </div>
                <div class="col-md-4">
                    <form action="problemset.php" class="input-group">
                        <input class="form-control" type="text" name="search" placeholder="标题或内容">
                        <button class="btn btn-outline-secondary" type="submit">查找</button>
                    </form>
                </div>
            </div>`;
                    if (SearchParams.get("search") != null) {
                        document.querySelector("body > div > div.mt-3 > center > div > div:nth-child(3) > form > input").value = SearchParams.get("search");
                    }

                    let Temp = document.querySelector("#problemset").rows;
                    for (let i = 1; i < Temp.length; i++) {
                        localStorage.setItem("UserScript-Problem-" + Temp[i].children[1].innerText + "-Name", Temp[i].children[2].innerText);
                    }
                } else if (location.pathname == "/problem.php") {
                    await RenderMathJax();
                    if (SearchParams.get("cid") != null) {
                        document.getElementsByTagName("h2")[0].innerHTML += " (" + localStorage.getItem("UserScript-Contest-" + SearchParams.get("cid") + "-Problem-" + SearchParams.get("pid") + "-PID") + ")";
                    }
                    if (document.querySelector("body > div > div.mt-3 > h2") != null) {
                        document.querySelector("body > div > div.mt-3").innerHTML = "没有此题目或题目对你不可见";
                        setTimeout(() => {
                            location.href = "https://www.xmoj.tech/problemset.php";
                        }, 1000);
                    } else {
                        let PID = localStorage.getItem("UserScript-Contest-" + SearchParams.get("cid") + "-Problem-" + SearchParams.get("pid") + "-PID");

                        document.querySelector("body > div > div.mt-3 > center").lastChild.style.marginLeft = "10px";
                        //修复提交按钮
                        let SubmitLink = document.querySelector('.mt-3 > center:nth-child(1) > a:nth-child(12)');
                        if (SubmitLink == null) { //a special type of problem
                            SubmitLink = document.querySelector('.mt-3 > center:nth-child(1) > a:nth-child(10)');
                        }
                        if (SubmitLink == null) {
                            SubmitLink = document.querySelector('.mt-3 > center:nth-child(1) > a:nth-child(11)');
                        }
                        if (SubmitLink == null) {
                            SubmitLink = document.querySelector('.mt-3 > center:nth-child(1) > a:nth-child(13)');
                        }
                        if (SubmitLink == null) {
                            SubmitLink = document.querySelector('.mt-3 > center:nth-child(1) > a:nth-child(9)');
                        }
                        let SubmitButton = document.createElement('button');
                        SubmitButton.id = 'SubmitButton';
                        SubmitButton.className = 'btn btn-outline-secondary';
                        SubmitButton.textContent = '提交';
                        SubmitButton.href = SubmitLink.href;
                        SubmitButton.onclick = function () {
                            window.location.href = SubmitLink.href;
                            console.log(SubmitLink.href);
                        };

                        // Replace the <a> element with the button
                        SubmitLink.parentNode.replaceChild(SubmitButton, SubmitLink);
                        // Remove the button's outer []
                        let str = document.querySelector('.mt-3 > center:nth-child(1)').innerHTML;
                        let target = SubmitButton.outerHTML;
                        let result = str.replace(new RegExp(`(.?)${target}(.?)`, 'g'), target);
                        document.querySelector('.mt-3 > center:nth-child(1)').innerHTML = result;
                        document.querySelector('html body.placeholder-glow div.container div.mt-3 center button#SubmitButton.btn.btn-outline-secondary').onclick = function () {
                            window.location.href = SubmitLink.href;
                            console.log(SubmitLink.href);
                        };
                        var Temp = document.querySelectorAll(".sampledata");
                        for (var i = 0; i < Temp.length; i++) {
                            Temp[i].parentElement.className = "card";
                        }
                        if (UtilityEnabled("RemoveUseless")) {
                            document.querySelector("h2.lang_en").remove();
                            document.getElementsByTagName("center")[1].remove();
                        }
                        if (UtilityEnabled("CopySamples")) {
                            $(".copy-btn").click((Event) => {
                                let CurrentButton = $(Event.currentTarget);
                                let span = CurrentButton.parent().last().find(".sampledata");
                                if (!span.length) {
                                    CurrentButton.text("未找到代码块").addClass("done");
                                    setTimeout(() => {
                                        $(".copy-btn").text("复制").removeClass("done");
                                    }, 1000);
                                    return;
                                }
                                GM_setClipboard(span.text());
                                CurrentButton.text("复制成功").addClass("done");
                                setTimeout(() => {
                                    $(".copy-btn").text("复制").removeClass("done");
                                }, 1000);
                                //document.body.removeChild(textarea[0]);
                            });
                        }
                        let IOFileElement = document.querySelector("body > div > div.mt-3 > center > h3");
                        if (IOFileElement != null) {
                            while (IOFileElement.childNodes.length >= 1) {
                                IOFileElement.parentNode.insertBefore(IOFileElement.childNodes[0], IOFileElement);
                            }
                            IOFileElement.parentNode.insertBefore(document.createElement("br"), IOFileElement);
                            IOFileElement.remove();
                            let Temp = document.querySelector("body > div > div.mt-3 > center").childNodes[2].data.trim();
                            let IOFilename = Temp.substring(0, Temp.length - 3);
                            localStorage.setItem("UserScript-Problem-" + PID + "-IOFilename", IOFilename);
                        }

                        if (UtilityEnabled("CopyMD")) {
                            await fetch(location.href).then((Response) => {
                                return Response.text();
                            }).then((Response) => {
                                let ParsedDocument = new DOMParser().parseFromString(Response, "text/html");
                                let Temp = ParsedDocument.querySelectorAll(".cnt-row-body");
                                if (UtilityEnabled("DebugMode")) console.log(Temp);
                                for (let i = 0; i < Temp.length; i++) {
                                    if (Temp[i].children[0].className === "content lang_cn") {
                                        let CopyMDButton = document.createElement("button");
                                        CopyMDButton.className = "btn btn-sm btn-outline-secondary copy-btn";
                                        CopyMDButton.innerText = "复制";
                                        CopyMDButton.style.marginLeft = "10px";
                                        CopyMDButton.type = "button";
                                        document.querySelectorAll(".cnt-row-head.title")[i].appendChild(CopyMDButton);
                                        CopyMDButton.addEventListener("click", () => {
                                            GM_setClipboard(Temp[i].children[0].innerText.trim().replaceAll("\n\t", "\n").replaceAll("\n\n", "\n"));
                                            CopyMDButton.innerText = "复制成功";
                                            setTimeout(() => {
                                                CopyMDButton.innerText = "复制";
                                            }, 1000);
                                        });
                                    }
                                }
                            });
                        }

                        if (UtilityEnabled("Discussion")) {
                            let DiscussButton = document.createElement("button");
                            DiscussButton.className = "btn btn-outline-secondary position-relative";
                            DiscussButton.innerHTML = `讨论`;
                            DiscussButton.style.marginLeft = "10px";
                            DiscussButton.type = "button";
                            DiscussButton.addEventListener("click", () => {
                                if (SearchParams.get("cid") != null) {
                                    open("https://www.xmoj.tech/discuss3/discuss.php?pid=" + PID, "_blank");
                                } else {
                                    open("https://www.xmoj.tech/discuss3/discuss.php?pid=" + SearchParams.get("id"), "_blank");
                                }
                            });
                            document.querySelector("body > div > div.mt-3 > center").appendChild(DiscussButton);
                            let UnreadBadge = document.createElement("span");
                            UnreadBadge.className = "position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger";
                            UnreadBadge.style.display = "none";
                            DiscussButton.appendChild(UnreadBadge);

                            let RefreshCount = () => {
                                RequestAPI("GetPostCount", {
                                    "ProblemID": Number(PID)
                                }, (Response) => {
                                    if (Response.Success) {
                                        if (Response.Data.DiscussCount != 0) {
                                            UnreadBadge.innerText = Response.Data.DiscussCount;
                                            UnreadBadge.style.display = "";
                                        }
                                    }
                                });
                            };
                            RefreshCount();
                            addEventListener("focus", RefreshCount);
                        }

                        let Tables = document.getElementsByTagName("table");
                        for (let i = 0; i < Tables.length; i++) {
                            TidyTable(Tables[i]);
                        }
                    }
                    Style.innerHTML += "code, kbd, pre, samp {";
                    Style.innerHTML += "    font-family: monospace, Consolas, 'Courier New';";
                    Style.innerHTML += "    font-size: 1rem;";
                    Style.innerHTML += "}";
                    Style.innerHTML += "pre {";
                    Style.innerHTML += "    padding: 0.3em 0.5em;";
                    Style.innerHTML += "    margin: 0.5em 0;";
                    Style.innerHTML += "}";
                    Style.innerHTML += ".in-out {";
                    Style.innerHTML += "    overflow: hidden;";
                    Style.innerHTML += "    display: flex;";
                    Style.innerHTML += "    padding: 0.5em 0;";
                    Style.innerHTML += "}";
                    Style.innerHTML += ".in-out .in-out-item {";
                    Style.innerHTML += "    flex: 1;";
                    Style.innerHTML += "    overflow: hidden;";
                    Style.innerHTML += "}";
                    Style.innerHTML += ".cnt-row .title {";
                    Style.innerHTML += "    font-weight: bolder;";
                    Style.innerHTML += "    font-size: 1.1rem;";
                    Style.innerHTML += "}";
                    Style.innerHTML += ".cnt-row .content {";
                    Style.innerHTML += "    overflow: hidden;";
                    Style.innerHTML += "}";
                    Style.innerHTML += "a.copy-btn {";
                    Style.innerHTML += "    float: right;";
                    Style.innerHTML += "    padding: 0 0.4em;";
                    Style.innerHTML += "    border: 1px solid var(--bs-primary);";
                    Style.innerHTML += "    border-radius: 3px;";
                    Style.innerHTML += "    color: var(--bs-primary);";
                    Style.innerHTML += "    cursor: pointer;";
                    Style.innerHTML += "}";
                    Style.innerHTML += "a.copy-btn:hover {";
                    Style.innerHTML += "    background-color: var(--bs-secondary-bg);";
                    Style.innerHTML += "}";
                    Style.innerHTML += "a.done, a.done:hover {";
                    Style.innerHTML += "    background-color: var(--bs-primary);";
                    Style.innerHTML += "    color: white;";
                    Style.innerHTML += "}";
                } else if (location.pathname == "/status.php") {
                    if (SearchParams.get("ByUserScript") == null) {
                        document.title = "提交状态";
                        document.querySelector("body > script:nth-child(5)").remove();
                        if (UtilityEnabled("NewBootstrap")) {
                            document.querySelector("#simform").outerHTML = `<form id="simform" class="justify-content-center form-inline row g-2" action="status.php" method="get" style="padding-bottom: 7px;">
                    <input class="form-control" type="text" size="4" name="user_id" value="${CurrentUsername} "style="display: none;">
                <div class="col-md-1">
                    <label for="problem_id" class="form-label">题目编号</label>
                    <input type="text" class="form-control" id="problem_id" name="problem_id" size="4">
                </div>
                <div class="col-md-1">
                    <label for="language" class="form-label">语言</label>
                    <select id="language" name="language" class="form-select">
                        <option value="-1" selected="">全部</option>
                        <option value="0">C</option>
                        <option value="1">C++</option>
                        <option value="2">Pascal</option>
                    </select>
                </div><div class="col-md-1">
                    <label for="jresult" class="form-label">结果</label>
                    <select id="jresult" name="jresult" class="form-select">
                        <option value="-1" selected="">全部</option>
                        <option value="4">正确</option>
                        <option value="5">格式错误</option>
                        <option value="6">答案错误</option>
                        <option value="7">时间超限</option>
                        <option value="8">内存超限</option>
                        <option value="9">输出超限</option>
                        <option value="10">运行错误</option>
                        <option value="11">编译错误</option>
                        <option value="0">等待</option>
                        <option value="1">等待重判</option>
                        <option value="2">编译中</option>
                        <option value="3">运行并评判</option>
                    </select>
                </div>
                <div class="col-md-1">
                    <button type="submit" class="btn btn-primary">查找</button>
                </div><div id="csrf"></div></form>`;
                        }

                        if (UtilityEnabled("ImproveACRate")) {
                            let ImproveACRateButton = document.createElement("button");
                            document.querySelector("body > div.container > div > div.input-append").appendChild(ImproveACRateButton);
                            ImproveACRateButton.className = "btn btn-outline-secondary";
                            ImproveACRateButton.innerText = "提高正确率";
                            ImproveACRateButton.disabled = true;
                            let ACProblems = [];
                            await fetch("https://www.xmoj.tech/userinfo.php?user=" + CurrentUsername)
                                .then((Response) => {
                                    return Response.text();
                                }).then((Response) => {
                                    let ParsedDocument = new DOMParser().parseFromString(Response, "text/html");
                                    ImproveACRateButton.innerText += "(" + (parseInt(ParsedDocument.querySelector("#statics > tbody > tr:nth-child(4) > td:nth-child(2)").innerText) / parseInt(ParsedDocument.querySelector("#statics > tbody > tr:nth-child(3) > td:nth-child(2)").innerText) * 100).toFixed(2) + "%)";
                                    let Temp = ParsedDocument.querySelector("#statics > tbody > tr:nth-child(2) > td:nth-child(3) > script").innerText.split("\n")[5].split(";");
                                    for (let i = 0; i < Temp.length; i++) {
                                        ACProblems.push(Number(Temp[i].substring(2, Temp[i].indexOf(","))));
                                    }
                                    ImproveACRateButton.disabled = false;
                                });
                            ImproveACRateButton.addEventListener("click", async () => {
                                ImproveACRateButton.disabled = true;
                                let SubmitTimes = 3;
                                let Count = 0;
                                let SubmitInterval = setInterval(async () => {
                                    if (Count >= SubmitTimes) {
                                        clearInterval(SubmitInterval);
                                        location.reload();
                                        return;
                                    }
                                    ImproveACRateButton.innerText = "正在提交 (" + (Count + 1) + "/" + SubmitTimes + ")";
                                    let PID = ACProblems[Math.floor(Math.random() * ACProblems.length)];
                                    let SID = 0;
                                    await fetch("https://www.xmoj.tech/status.php?problem_id=" + PID + "&jresult=4")
                                        .then((Result) => {
                                            return Result.text();
                                        }).then((Result) => {
                                            let ParsedDocument = new DOMParser().parseFromString(Result, "text/html");
                                            SID = ParsedDocument.querySelector("#result-tab > tbody > tr:nth-child(1) > td:nth-child(2)").innerText;
                                        });
                                    let Code = "";
                                    await fetch("https://www.xmoj.tech/getsource.php?id=" + SID)
                                        .then((Response) => {
                                            return Response.text();
                                        }).then((Response) => {
                                            Code = Response.substring(0, Response.indexOf("/**************************************************************")).trim();
                                        });
                                    await fetch("https://www.xmoj.tech/submit.php", {
                                        "headers": {
                                            "content-type": "application/x-www-form-urlencoded"
                                        },
                                        "referrer": "https://www.xmoj.tech/submitpage.php?id=" + PID,
                                        "method": "POST",
                                        "body": "id=" + PID + "&" + "language=1&" + "source=" + encodeURIComponent(Code) + "&" + "enable_O2=on"
                                    });
                                    Count++;
                                }, 1000);
                            });
                            ImproveACRateButton.style.marginBottom = ImproveACRateButton.style.marginRight = "7px";
                            ImproveACRateButton.style.marginRight = "7px";
                        }
                        if (UtilityEnabled("CompareSource")) {
                            let CompareButton = document.createElement("button");
                            document.querySelector("body > div.container > div > div.input-append").appendChild(CompareButton);
                            CompareButton.className = "btn btn-outline-secondary";
                            CompareButton.innerText = "比较提交记录";
                            CompareButton.addEventListener("click", () => {
                                location.href = "https://www.xmoj.tech/comparesource.php";
                            });
                            CompareButton.style.marginBottom = "7px";
                        }
                        if (UtilityEnabled("ResetType")) {
                            document.querySelector("#result-tab > thead > tr > th:nth-child(1)").remove();
                            document.querySelector("#result-tab > thead > tr > th:nth-child(2)").remove();
                            document.querySelector("#result-tab > thead > tr > th:nth-child(10)").innerHTML = "开启O2";
                        }
                        let Temp = document.querySelector("#result-tab > tbody").childNodes;
                        let SolutionIDs = [];
                        for (let i = 1; i < Temp.length; i += 2) {
                            let SID = Number(Temp[i].childNodes[1].innerText);
                            SolutionIDs.push(SID);
                            if (UtilityEnabled("ResetType")) {
                                Temp[i].childNodes[0].remove();
                                Temp[i].childNodes[0].innerHTML = "<a href=\"https://www.xmoj.tech/showsource.php?id=" + SID + "\">" + SID + "</a> " + "<a href=\"" + Temp[i].childNodes[6].children[1].href + "\">重交</a>";
                                Temp[i].childNodes[1].remove();
                                Temp[i].childNodes[1].children[0].removeAttribute("class");
                                Temp[i].childNodes[3].childNodes[0].innerText = SizeToStringSize(Temp[i].childNodes[3].childNodes[0].innerText);
                                Temp[i].childNodes[4].childNodes[0].innerText = TimeToStringTime(Temp[i].childNodes[4].childNodes[0].innerText);
                                Temp[i].childNodes[5].innerText = Temp[i].childNodes[5].childNodes[0].innerText;
                                Temp[i].childNodes[6].innerText = CodeSizeToStringSize(Temp[i].childNodes[6].innerText.substring(0, Temp[i].childNodes[6].innerText.length - 1));
                                Temp[i].childNodes[9].innerText = (Temp[i].childNodes[9].innerText == "" ? "否" : "是");
                            }
                            if (SearchParams.get("cid") === null) {
                                localStorage.setItem("UserScript-Solution-" + SID + "-Problem", Temp[i].childNodes[1].innerText);
                            } else {
                                localStorage.setItem("UserScript-Solution-" + SID + "-Contest", SearchParams.get("cid"));
                                localStorage.setItem("UserScript-Solution-" + SID + "-PID-Contest", Temp[i].childNodes[1].innerText.charAt(0));
                            }
                        }

                        if (UtilityEnabled("RefreshSolution")) {
                            let StdList;
                            await new Promise((Resolve) => {
                                RequestAPI("GetStdList", {}, async (Result) => {
                                    if (Result.Success) {
                                        StdList = Result.Data.StdList;
                                        Resolve();
                                    }
                                })
                            });

                            let Rows = document.getElementById("result-tab").rows;
                            let Points = Array();
                            for (let i = 1; i <= SolutionIDs.length; i++) {
                                Rows[i].cells[2].className = "td_result";
                                let SolutionID = SolutionIDs[i - 1];
                                if (Rows[i].cells[2].children.length == 2) {
                                    Points[SolutionID] = Rows[i].cells[2].children[1].innerText;
                                    Rows[i].cells[2].children[1].remove();
                                }
                                Rows[i].cells[2].innerHTML += "<img style=\"margin-left: 10px\" height=\"18\" width=\"18\" src=\"image/loader.gif\">";
                                setTimeout(() => {
                                    RefreshResult(SolutionID);
                                }, 0);
                            }

                            let RefreshResult = async (SolutionID) => {
                                let CurrentRow = null;
                                let Rows = document.getElementById("result-tab").rows;
                                for (let i = 0; i < SolutionIDs.length; i++) {
                                    if (SolutionIDs[i] == SolutionID) {
                                        CurrentRow = Rows[i + 1];
                                        break;
                                    }
                                }
                                await fetch("status-ajax.php?solution_id=" + SolutionID)
                                    .then((Response) => {
                                        return Response.text();
                                    })
                                    .then((Response) => {
                                        let PID = 0;
                                        if (SearchParams.get("cid") === null) {
                                            PID = localStorage.getItem("UserScript-Solution-" + SolutionID + "-Problem");
                                        } else {
                                            PID = localStorage.getItem("UserScript-Contest-" + SearchParams.get("cid") + "-Problem-" + (CurrentRow.cells[1].innerText.charCodeAt(0) - 65) + "-PID");
                                        }
                                        let ResponseData = Response.split(",");
                                        CurrentRow.cells[3].innerHTML = "<div id=\"center\" class=\"red\">" + SizeToStringSize(ResponseData[1]) + "</div>";
                                        CurrentRow.cells[4].innerHTML = "<div id=\"center\" class=\"red\">" + TimeToStringTime(ResponseData[2]) + "</div>";
                                        let TempHTML = "<a href=\"" + (ResponseData[0] == 11 ? "ce" : "re") + "info.php?sid=" + SolutionID + "\" class=\"" + judge_color[ResponseData[0]] + "\">";
                                        TempHTML += judge_result[ResponseData[0]];
                                        TempHTML += "</a>";
                                        if (Points[SolutionID] != undefined) {
                                            TempHTML += "<span style=\"margin-left: 5px\" class=\"badge text-bg-info\">" + Points[SolutionID] + "</span>";
                                            if (Points[SolutionID].substring(0, Points[SolutionID].length - 1) >= 50) {
                                                TempHTML += `<a href="https://www.xmoj.tech/showsource.php?pid=${PID}&ByUserScript=1" class="ms-1 link-secondary">查看标程</a>`;
                                            }
                                        }
                                        if (ResponseData[0] < 4) {
                                            setTimeout(() => {
                                                RefreshResult(SolutionID)
                                            }, 500);
                                            TempHTML += "<img style=\"margin-left: 5px\" height=\"18\" width=\"18\" src=\"image/loader.gif\">";
                                        } else if (ResponseData[0] == 4 && UtilityEnabled("UploadStd")) {
                                            if (SearchParams.get("cid") == null) CurrentRow.cells[1].innerText;
                                            let Std = StdList.find((Element) => {
                                                return Element == Number(PID);
                                            });
                                            if (Std != undefined) {
                                                TempHTML += "✅";
                                            } else {
                                                RequestAPI("UploadStd", {
                                                    "ProblemID": Number(PID),
                                                }, (Result) => {
                                                    if (Result.Success) {
                                                        CurrentRow.cells[2].innerHTML += "🆗";
                                                    } else {
                                                        CurrentRow.cells[2].innerHTML += "⚠️";
                                                    }
                                                });
                                            }
                                        }
                                        CurrentRow.cells[2].innerHTML = TempHTML;
                                    });
                            };
                        }
                    }
                } else if (location.pathname == "/contest.php") {
                    if (UtilityEnabled("AutoCountdown")) {
                        clock = () => {
                        }
                    }
                    if (location.href.indexOf("?cid=") == -1) {
                        if (UtilityEnabled("ResetType")) {
                            document.querySelector("body > div > div.mt-3 > center").innerHTML = String(document.querySelector("body > div > div.mt-3 > center").innerHTML).replaceAll("ServerTime:", "服务器时间:");
                            document.querySelector("body > div > div.mt-3 > center > table").style.marginTop = "10px";

                            document.querySelector("body > div > div.mt-3 > center > form").outerHTML = `<div class="row">
                        <div class="col-md-4"></div>
                        <form method="post" action="contest.php" class="col-md-4">
                            <div class="input-group">
                                <input name="keyword" type="text" class="form-control" spellcheck="false" data-ms-editor="true">
                                <input type="submit" value="搜索" class="btn btn-outline-secondary">
                            </div>
                        </form>
                    </div>`;
                        }
                        if (UtilityEnabled("Translate")) {
                            document.querySelector("body > div > div.mt-3 > center > table > thead > tr").childNodes[0].innerText = "编号";
                            document.querySelector("body > div > div.mt-3 > center > table > thead > tr").childNodes[1].innerText = "标题";
                            document.querySelector("body > div > div.mt-3 > center > table > thead > tr").childNodes[2].innerText = "状态";
                            document.querySelector("body > div > div.mt-3 > center > table > thead > tr").childNodes[3].remove();
                            document.querySelector("body > div > div.mt-3 > center > table > thead > tr").childNodes[3].innerText = "创建者";
                        }
                        let Temp = document.querySelector("body > div > div.mt-3 > center > table > tbody").childNodes;
                        for (let i = 1; i < Temp.length; i++) {
                            let CurrentElement = Temp[i].childNodes[2].childNodes;
                            if (CurrentElement[1].childNodes[0].data.indexOf("运行中") != -1) {
                                let Time = String(CurrentElement[1].childNodes[1].innerText).substring(4);
                                let Day = parseInt(Time.substring(0, Time.indexOf("天"))) || 0;
                                let Hour = parseInt(Time.substring((Time.indexOf("天") == -1 ? 0 : Time.indexOf("天") + 1), Time.indexOf("小时"))) || 0;
                                let Minute = parseInt(Time.substring((Time.indexOf("小时") == -1 ? 0 : Time.indexOf("小时") + 2), Time.indexOf("分"))) || 0;
                                let Second = parseInt(Time.substring((Time.indexOf("分") == -1 ? 0 : Time.indexOf("分") + 1), Time.indexOf("秒"))) || 0;
                                let TimeStamp = new Date().getTime() + diff + ((((isNaN(Day) ? 0 : Day) * 24 + Hour) * 60 + Minute) * 60 + Second) * 1000;
                                CurrentElement[1].childNodes[1].setAttribute("EndTime", TimeStamp);
                                CurrentElement[1].childNodes[1].classList.add("UpdateByJS");
                            } else if (CurrentElement[1].childNodes[0].data.indexOf("开始于") != -1) {
                                let TimeStamp = Date.parse(String(CurrentElement[1].childNodes[0].data).substring(4)) + diff;
                                CurrentElement[1].setAttribute("EndTime", TimeStamp);
                                CurrentElement[1].classList.add("UpdateByJS");
                            } else if (CurrentElement[1].childNodes[0].data.indexOf("已结束") != -1) {
                                let TimeStamp = String(CurrentElement[1].childNodes[0].data).substring(4);
                                CurrentElement[1].childNodes[0].data = " 已结束 ";
                                CurrentElement[1].className = "red";
                                let Temp = document.createElement("span");
                                CurrentElement[1].appendChild(Temp);
                                Temp.className = "green";
                                Temp.innerHTML = TimeStamp;
                            }
                            Temp[i].childNodes[3].style.display = "none";
                            Temp[i].childNodes[4].innerHTML = "<a href=\"https://www.xmoj.tech/userinfo.php?user=" + Temp[i].childNodes[4].innerHTML + "\">" + Temp[i].childNodes[4].innerHTML + "</a>";
                            localStorage.setItem("UserScript-Contest-" + Temp[i].childNodes[0].innerText + "-Name", Temp[i].childNodes[1].innerText);
                        }
                    } else {
                        document.getElementsByTagName("h3")[0].innerHTML = "比赛" + document.getElementsByTagName("h3")[0].innerHTML.substring(7);
                        if (document.querySelector("#time_left") != null) {
                            let EndTime = document.querySelector("body > div > div.mt-3 > center").childNodes[3].data;
                            EndTime = EndTime.substring(EndTime.indexOf("结束时间是:") + 6, EndTime.lastIndexOf("。"));
                            EndTime = new Date(EndTime).getTime();
                            if (new Date().getTime() < EndTime) {
                                document.querySelector("#time_left").classList.add("UpdateByJS");
                                document.querySelector("#time_left").setAttribute("EndTime", EndTime);
                            }
                        }
                        let HTMLData = document.querySelector("body > div > div.mt-3 > center > div").innerHTML;
                        HTMLData = HTMLData.replaceAll("&nbsp;&nbsp;\n&nbsp;&nbsp;", "&nbsp;")
                        HTMLData = HTMLData.replaceAll("<br>开始于: ", "开始时间:")
                        HTMLData = HTMLData.replaceAll("\n结束于: ", "<br>结束时间:")
                        HTMLData = HTMLData.replaceAll("\n订正截止日期: ", "<br>订正截止日期:")
                        HTMLData = HTMLData.replaceAll("\n现在时间: ", "当前时间:")
                        HTMLData = HTMLData.replaceAll("\n状态:", "<br>状态:")
                        document.querySelector("body > div > div.mt-3 > center > div").innerHTML = HTMLData;
                        if (UtilityEnabled("RemoveAlerts") && document.querySelector("body > div > div.mt-3 > center").innerHTML.indexOf("尚未开始比赛") != -1) {
                            document.querySelector("body > div > div.mt-3 > center > a").setAttribute("href", "start_contest.php?cid=" + SearchParams.get("cid"));
                        } else if (UtilityEnabled("AutoRefresh")) {
                            addEventListener("focus", async () => {
                                await fetch(location.href)
                                    .then((Response) => {
                                        return Response.text();
                                    })
                                    .then((Response) => {
                                        let ParsedDocument = new DOMParser().parseFromString(Response, "text/html");
                                        let Temp = ParsedDocument.querySelector("#problemset > tbody").children;
                                        if (UtilityEnabled("ReplaceYN")) {
                                            for (let i = 0; i < Temp.length; i++) {
                                                let Status = Temp[i].children[0].innerText;
                                                if (Status.indexOf("Y") != -1) {
                                                    document.querySelector("#problemset > tbody").children[i].children[0].children[0].className = "status status_y";
                                                    document.querySelector("#problemset > tbody").children[i].children[0].children[0].innerText = "✓";
                                                } else if (Status.indexOf("N") != -1) {
                                                    document.querySelector("#problemset > tbody").children[i].children[0].children[0].className = "status status_n";
                                                    document.querySelector("#problemset > tbody").children[i].children[0].children[0].innerText = "✗";
                                                }
                                            }
                                        }
                                    });
                            });
                            document.querySelector("body > div > div.mt-3 > center > br:nth-child(2)").remove();
                            document.querySelector("body > div > div.mt-3 > center > br:nth-child(2)").remove();
                            document.querySelector("body > div > div.mt-3 > center > div > .red").innerHTML = String(document.querySelector("body > div > div.mt-3 > center > div > .red").innerHTML).replaceAll("<br>", "<br><br>");
                            let StaticButton = document.createElement("button");
                            document.querySelectorAll("body > div > div.mt-3 > center > div > .red")[1].appendChild(StaticButton);
                            StaticButton.className = "btn btn-outline-secondary";
                            StaticButton.innerText = "统计";
                            StaticButton.addEventListener("click", () => {
                                location.href = "https://www.xmoj.tech/conteststatistics.php?cid=" + SearchParams.get("cid");
                            });

                            document.querySelector("#problemset > tbody").innerHTML = String(document.querySelector("#problemset > tbody").innerHTML).replaceAll(/\t&nbsp;([0-9]*) &nbsp;&nbsp;&nbsp;&nbsp; 问题 &nbsp;([^<]*)/g, "$2. $1");

                            document.querySelector("#problemset > tbody").innerHTML = String(document.querySelector("#problemset > tbody").innerHTML).replaceAll(/\t\*([0-9]*) &nbsp;&nbsp;&nbsp;&nbsp; 问题 &nbsp;([^<]*)/g, "拓展$2. $1");

                            if (UtilityEnabled("MoreSTD") && document.querySelector("#problemset > thead > tr").innerHTML.indexOf("标程") != -1) {
                                let Temp = document.querySelector("#problemset > thead > tr").children;
                                for (let i = 0; i < Temp.length; i++) {
                                    if (Temp[i].innerText == "标程") {
                                        Temp[i].remove();
                                        let Temp2 = document.querySelector("#problemset > tbody").children;
                                        for (let j = 0; j < Temp2.length; j++) {
                                            if (Temp2[j].children[i] != undefined) {
                                                Temp2[j].children[i].remove();
                                            }
                                        }
                                    }
                                }
                                document.querySelector("#problemset > thead > tr").innerHTML += "<td width=\"5%\">标程</td>";
                                Temp = document.querySelector("#problemset > tbody").children;
                                for (let i = 0; i < Temp.length; i++) {
                                    Temp[i].innerHTML += "<td><a href=\"https://www.xmoj.tech/problem_std.php?cid=" + Number(SearchParams.get("cid")) + "&pid=" + i + "\" target=\"_blank\">打开</a></td>";
                                }
                            }

                            Temp = document.querySelector("#problemset > tbody").rows;
                            for (let i = 0; i < Temp.length; i++) {
                                if (Temp[i].childNodes[0].children.length == 0) {
                                    Temp[i].childNodes[0].innerHTML = "<div class=\"status\"></div>";
                                }
                                let PID = Temp[i].childNodes[1].innerHTML;
                                if (PID.substring(0, 2) == "拓展") {
                                    PID = PID.substring(2);
                                }
                                Temp[i].children[2].children[0].target = "_blank";
                                localStorage.setItem("UserScript-Contest-" + SearchParams.get("cid") + "-Problem-" + i + "-PID", PID.substring(3));
                                localStorage.setItem("UserScript-Problem-" + PID.substring(3) + "-Name", Temp[i].childNodes[2].innerText);
                            }
                            let CheatDiv = document.createElement("div");
                            CheatDiv.style.marginTop = "20px";
                            CheatDiv.style.textAlign = "left";
                            document.querySelector("body > div > div.mt-3 > center").insertBefore(CheatDiv, document.querySelector("#problemset"));
                            if (UtilityEnabled("AutoCheat")) {
                                let AutoCheatButton = document.createElement("button");
                                CheatDiv.appendChild(AutoCheatButton);
                                AutoCheatButton.className = "btn btn-outline-secondary";
                                AutoCheatButton.innerText = "自动提交当年代码";
                                AutoCheatButton.style.marginRight = "5px";
                                AutoCheatButton.disabled = true;
                                let ACProblems = [], ContestProblems = [];
                                const UrlParams = new URLSearchParams(window.location.search);
                                const CID = UrlParams.get("cid");
                                await fetch("https://www.xmoj.tech/userinfo.php?user=" + CurrentUsername)
                                    .then((Response) => {
                                        return Response.text();
                                    }).then((Response) => {
                                        let ParsedDocument = new DOMParser().parseFromString(Response, "text/html");
                                        let Temp = ParsedDocument.querySelector("#statics > tbody > tr:nth-child(2) > td:nth-child(3) > script").innerText.split("\n")[5].split(";");
                                        for (let i = 0; i < Temp.length; i++) {
                                            ACProblems.push(Number(Temp[i].substring(2, Temp[i].indexOf(","))));
                                        }
                                        AutoCheatButton.disabled = false;
                                    });
                                let Rows = document.querySelector("#problemset > tbody").rows;
                                for (let i = 0; i < Rows.length; i++) {
                                    ContestProblems.push(Rows[i].children[1].innerText.substring(Rows[i].children[1].innerText.indexOf('.') + 2)).toFixed;
                                }
                                AutoCheatButton.addEventListener("click", async () => {
                                    AutoCheatButton.disabled = true;
                                    let Submitted = false;
                                    for (let i = 0; i < ContestProblems.length; i++) {
                                        let PID = ContestProblems[i];
                                        if (ACProblems.indexOf(Number(PID)) == -1) {
                                            console.log("Ignoring problem " + PID + " as it has not been solved yet.");
                                            continue;
                                        }
                                        if (Rows[i].children[0].children[0].classList.contains("status_y")) {
                                            console.log("Ignoring problem " + PID + " as it has already been solved in this contest.");
                                            continue;
                                        }
                                        console.log("Submitting problem " + PID);
                                        Submitted = true;
                                        AutoCheatButton.innerHTML = "正在提交 " + PID;
                                        let SID = 0;
                                        await fetch("https://www.xmoj.tech/status.php?problem_id=" + PID + "&jresult=4")
                                            .then((Result) => {
                                                return Result.text();
                                            }).then((Result) => {
                                                let ParsedDocument = new DOMParser().parseFromString(Result, "text/html");
                                                SID = ParsedDocument.querySelector("#result-tab > tbody > tr:nth-child(1) > td:nth-child(2)").innerText;
                                            });
                                        await new Promise(r => setTimeout(r, 500));
                                        let Code = "";
                                        await fetch("https://www.xmoj.tech/getsource.php?id=" + SID)
                                            .then((Response) => {
                                                return Response.text();
                                            }).then((Response) => {
                                                Code = Response.substring(0, Response.indexOf("/**************************************************************")).trim();
                                            });
                                        await new Promise(r => setTimeout(r, 500));
                                        await fetch("https://www.xmoj.tech/submit.php", {
                                            "headers": {
                                                "content-type": "application/x-www-form-urlencoded"
                                            },
                                            "referrer": "https://www.xmoj.tech/submitpage.php?id=" + PID,
                                            "method": "POST",
                                            "body": "cid=" + CID + "&pid=" + i + "&" + "language=1&" + "source=" + encodeURIComponent(Code) + "&" + "enable_O2=on"
                                        });
                                        await new Promise(r => setTimeout(r, 500));
                                    }
                                    if (!Submitted) {
                                        AutoCheatButton.innerHTML = "没有可以提交的题目!";
                                        await new Promise(r => setTimeout(r, 1000));
                                    }
                                    AutoCheatButton.disabled = false;
                                    if (Submitted) location.reload(); else AutoCheatButton.innerHTML = "自动提交当年代码";
                                });
                                document.addEventListener("keydown", (Event) => {
                                    if (Event.code === 'Enter' && Event.ctrlKey) {
                                        AutoCheatButton.click();
                                    }
                                });
                            }
                            if (UtilityEnabled("OpenAllProblem")) {
                                let OpenAllButton = document.createElement("button");
                                OpenAllButton.className = "btn btn-outline-secondary";
                                OpenAllButton.innerText = "打开全部题目";
                                OpenAllButton.style.marginRight = "5px";
                                CheatDiv.appendChild(OpenAllButton);
                                OpenAllButton.addEventListener("click", () => {
                                    let Rows = document.querySelector("#problemset > tbody").rows;
                                    for (let i = 0; i < Rows.length; i++) {
                                        open(Rows[i].children[2].children[0].href, "_blank");
                                    }
                                });
                                let OpenUnsolvedButton = document.createElement("button");
                                OpenUnsolvedButton.className = "btn btn-outline-secondary";
                                OpenUnsolvedButton.innerText = "打开未解决题目";
                                CheatDiv.appendChild(OpenUnsolvedButton);
                                OpenUnsolvedButton.addEventListener("click", () => {
                                    let Rows = document.querySelector("#problemset > tbody").rows;
                                    for (let i = 0; i < Rows.length; i++) {
                                        if (!Rows[i].children[0].children[0].classList.contains("status_y")) {
                                            open(Rows[i].children[2].children[0].href, "_blank");
                                        }
                                    }
                                });
                            }
                            localStorage.setItem("UserScript-Contest-" + SearchParams.get("cid") + "-ProblemCount", document.querySelector("#problemset > tbody").rows.length);
                        }
                    }
                } else if (location.pathname == "/contestrank-oi.php") {
                    if (document.querySelector("#rank") == null) {
                        document.querySelector("body > div > div.mt-3").innerHTML = "<center><h3>比赛排名</h3><a></a><table id=\"rank\"></table>";
                    }
                    if (SearchParams.get("ByUserScript") == null) {
                        if (document.querySelector("body > div > div.mt-3 > center > h3").innerText == "比赛排名") {
                            document.querySelector("#rank").innerText = "比赛暂时还没有排名";
                        } else {
                            document.querySelector("body > div > div.mt-3 > center > h3").innerText = document.querySelector("body > div > div.mt-3 > center > h3").innerText.substring(document.querySelector("body > div > div.mt-3 > center > h3").innerText.indexOf(" -- ") + 4) + "(OI排名)";
                            document.querySelector("#rank > thead > tr > :nth-child(1)").innerText = "排名";
                            document.querySelector("#rank > thead > tr > :nth-child(2)").innerText = "用户";
                            document.querySelector("#rank > thead > tr > :nth-child(3)").innerText = "昵称";
                            document.querySelector("#rank > thead > tr > :nth-child(4)").innerText = "AC数";
                            document.querySelector("#rank > thead > tr > :nth-child(5)").innerText = "得分";
                            let RefreshOIRank = async () => {
                                await fetch(location.href)
                                    .then((Response) => {
                                        return Response.text()
                                    })
                                    .then(async (Response) => {
                                        let ParsedDocument = new DOMParser().parseFromString(Response, "text/html");
                                        TidyTable(ParsedDocument.getElementById("rank"));
                                        let Temp = ParsedDocument.getElementById("rank").rows;
                                        for (var i = 1; i < Temp.length; i++) {
                                            let MetalCell = Temp[i].cells[0];
                                            let Metal = document.createElement("span");
                                            Metal.innerText = MetalCell.innerText;
                                            Metal.className = "badge text-bg-primary";
                                            MetalCell.innerText = "";
                                            MetalCell.appendChild(Metal);
                                            GetUsernameHTML(Temp[i].cells[1], Temp[i].cells[1].innerText);
                                            Temp[i].cells[2].innerHTML = Temp[i].cells[2].innerText;
                                            Temp[i].cells[3].innerHTML = Temp[i].cells[3].innerText;
                                            for (let j = 5; j < Temp[i].cells.length; j++) {
                                                let InnerText = Temp[i].cells[j].innerText;
                                                let BackgroundColor = Temp[i].cells[j].style.backgroundColor;
                                                let Red = BackgroundColor.substring(4, BackgroundColor.indexOf(","));
                                                let Green = BackgroundColor.substring(BackgroundColor.indexOf(",") + 2, BackgroundColor.lastIndexOf(","));
                                                let Blue = BackgroundColor.substring(BackgroundColor.lastIndexOf(",") + 2, BackgroundColor.lastIndexOf(")"));
                                                let NoData = (Red == 238 && Green == 238 && Blue == 238);
                                                let FirstBlood = (Red == 170 && Green == 170 && Blue == 255);
                                                let Solved = (Green == 255);
                                                let ErrorCount = "";
                                                if (Solved) {
                                                    ErrorCount = (Blue == 170 ? 5 : (Blue - 51) / 32);
                                                } else {
                                                    ErrorCount = (Blue == 22 ? 15 : (170 - Blue) / 10);
                                                }
                                                if (NoData) {
                                                    BackgroundColor = "";
                                                } else if (FirstBlood) {
                                                    BackgroundColor = "rgb(127, 127, 255)";
                                                } else if (Solved) {
                                                    BackgroundColor = "rgb(0, 255, 0, " + Math.max(1 / 10 * (10 - ErrorCount), 0.2) + ")";
                                                    if (ErrorCount != 0) {
                                                        InnerText += " (" + (ErrorCount == 5 ? "4+" : ErrorCount) + ")";
                                                    }
                                                } else {
                                                    BackgroundColor = "rgba(255, 0, 0, " + Math.min(ErrorCount / 10 + 0.2, 1) + ")";
                                                    if (ErrorCount != 0) {
                                                        InnerText += " (" + (ErrorCount == 15 ? "14+" : ErrorCount) + ")";
                                                    }
                                                }
                                                Temp[i].cells[j].innerHTML = InnerText;
                                                Temp[i].cells[j].style.backgroundColor = BackgroundColor;
                                                Temp[i].cells[j].style.color = (UtilityEnabled("DarkMode") ? "white" : "black");
                                            }
                                        }
                                        document.querySelector("#rank > tbody").innerHTML = ParsedDocument.querySelector("#rank > tbody").innerHTML;
                                    });
                            };
                            RefreshOIRank();
                            document.title = document.querySelector("body > div.container > div > center > h3").innerText;
                            if (UtilityEnabled("AutoRefresh")) {
                                addEventListener("focus", RefreshOIRank);
                            }
                        }
                    } else if (UtilityEnabled("ACMRank")) {
                        if (document.querySelector("body > div > div.mt-3 > center > h3").innerText != "比赛排名") {
                            document.querySelector("body > div > div.mt-3 > center > h3").innerText = document.querySelector("body > div > div.mt-3 > center > h3").innerText.substring(document.querySelector("body > div > div.mt-3 > center > h3").innerText.indexOf(" -- ") + 4) + "(ACM排名)";
                        }
                        let RankData = [];
                        let RefreshACMRank = async (ProblemCount) => {
                            let LastPositionX = scrollX;
                            let LastPositionY = scrollY;
                            let NewURL = new URL(location.href);
                            NewURL.pathname = "/contestrank2.php";
                            await fetch(NewURL.toString())
                                .then((Response) => {
                                    return Response.text()
                                })
                                .then(async (Response) => {
                                    RankData = [];
                                    let Table = document.querySelector("#rank");
                                    Table.classList.add("table");
                                    Table.innerHTML = "";
                                    let StartPosition = Response.indexOf("var solutions=") + 14;
                                    let EndPosition = Response.indexOf("}];", StartPosition) + 2;
                                    if (EndPosition == 1) {
                                        Table.innerHTML = "暂时还没有人提交呢";
                                    } else {
                                        let SubmitRecord = JSON.parse(Response.substring(StartPosition, EndPosition));

                                        for (let i = 0; i < SubmitRecord.length; i++) {
                                            let CurrentSubmission = SubmitRecord[i];
                                            let CurrentRow = RankData.find((CurrentRow) => {
                                                if (CurrentRow.Username == CurrentSubmission.user_id) {
                                                    return true;
                                                }
                                            });
                                            if (CurrentRow == null) {
                                                CurrentRow = {
                                                    Username: CurrentSubmission.user_id,
                                                    Nickname: CurrentSubmission.nick,
                                                    Solved: 0,
                                                    Penalty: 0,
                                                    Problem: [],
                                                    QuickSubmitCount: 0
                                                };
                                                RankData.push(CurrentRow);
                                            }
                                            let CurrentProblem = CurrentRow.Problem.find((CurrentRow) => {
                                                if (CurrentRow.Index == CurrentSubmission.num) {
                                                    return true;
                                                }
                                            });
                                            if (CurrentProblem == null) {
                                                CurrentProblem = {
                                                    Index: CurrentSubmission.num, Attempts: [], SolveTime: 0
                                                };
                                                CurrentRow.Problem.push(CurrentProblem);
                                            }
                                            if (CurrentSubmission.result == 4 && CurrentProblem.SolveTime == 0) {
                                                CurrentProblem.SolveTime = parseInt(CurrentSubmission.in_date);
                                                CurrentRow.Solved++;
                                                CurrentRow.Penalty += parseInt(CurrentSubmission.in_date) + CurrentProblem.Attempts.length * 20 * 60;
                                            }
                                            CurrentProblem.Attempts.push({
                                                Time: CurrentSubmission.in_date, Result: CurrentSubmission.result
                                            });
                                        }

                                        for (let i = 0; i < RankData.length; i++) {
                                            for (let j = 0; j < RankData[i].Problem.length; j++) {
                                                for (let k = 0; k < RankData[i].Problem.length; k++) {
                                                    if (j != k && RankData[i].Problem[j].SolveTime != 0 && RankData[i].Problem[k].SolveTime != 0 && Math.abs(RankData[i].Problem[j].SolveTime - RankData[i].Problem[k].SolveTime) < 60) {
                                                        RankData[i].QuickSubmitCount++;
                                                    }
                                                }
                                            }
                                        }

                                        RankData.sort((a, b) => {
                                            if (a.Solved != b.Solved) {
                                                return a.Solved < b.Solved ? 1 : -1;
                                            } else if (a.Penalty != b.Penalty) {
                                                return a.Penalty > b.Penalty ? 1 : -1;
                                            }
                                            return 0;
                                        });

                                        let Header = document.createElement("thead");
                                        Table.appendChild(Header);
                                        let RowHeader = document.createElement("tr");
                                        Header.appendChild(RowHeader);
                                        let MetalHeader = document.createElement("th");
                                        RowHeader.appendChild(MetalHeader);
                                        MetalHeader.innerText = "排名";
                                        MetalHeader.style.width = "5%";
                                        let UsernameHeader = document.createElement("th");
                                        RowHeader.appendChild(UsernameHeader);
                                        UsernameHeader.innerText = "用户";
                                        UsernameHeader.style.width = "10%";
                                        let NicknameHeader = document.createElement("th");
                                        RowHeader.appendChild(NicknameHeader);
                                        NicknameHeader.innerText = "昵称";
                                        NicknameHeader.style.width = "10%";
                                        let NameHeader = document.createElement("th");
                                        RowHeader.appendChild(NameHeader);
                                        NameHeader.innerText = "姓名";
                                        NameHeader.style.width = "5%";
                                        let SolvedHeader = document.createElement("th");
                                        RowHeader.appendChild(SolvedHeader);
                                        SolvedHeader.innerText = "AC数";
                                        SolvedHeader.style.width = "5%";
                                        let PenaltyHeader = document.createElement("th");
                                        RowHeader.appendChild(PenaltyHeader);
                                        PenaltyHeader.innerText = "罚时";
                                        PenaltyHeader.style.width = "10%";

                                        for (let i = 0; i < ProblemCount; i++) {
                                            let ProblemHeader = document.createElement("th");
                                            RowHeader.appendChild(ProblemHeader);
                                            let ProblemLink = document.createElement("a");
                                            ProblemHeader.appendChild(ProblemLink);
                                            ProblemLink.href = "problem.php?cid=" + SearchParams.get("cid") + "&pid=" + i;
                                            ProblemLink.innerText = String.fromCharCode(65 + i);
                                            ProblemHeader.classList.add("header");
                                            ProblemHeader.style.width = (50 / ProblemCount) + "%";
                                        }

                                        let Body = document.createElement("tbody");
                                        Table.appendChild(Body);
                                        Body.className = "table-group-divider";
                                        for (let i = 0; i < RankData.length; i++) {
                                            let RowData = RankData[i];
                                            let Row = document.createElement("tr");
                                            Body.appendChild(Row);
                                            let MetalCell = document.createElement("td");
                                            Row.appendChild(MetalCell);
                                            let UsernameCell = document.createElement("td");
                                            Row.appendChild(UsernameCell);
                                            let NicknameCell = document.createElement("td");
                                            Row.appendChild(NicknameCell);
                                            let NameCell = document.createElement("td");
                                            Row.appendChild(NameCell);
                                            let SolvedCell = document.createElement("td");
                                            Row.appendChild(SolvedCell);
                                            let PenaltyCell = document.createElement("td");
                                            Row.appendChild(PenaltyCell);

                                            let Medal = document.createElement("span");
                                            MetalCell.appendChild(Medal);
                                            Medal.innerText = i + 1;
                                            Medal.classList.add("badge");
                                            if (i <= RankData.length * 0.05) {
                                                Medal.classList.add("text-bg-danger");
                                            } else if (i <= RankData.length * 0.15) {
                                                Medal.classList.add("text-bg-warning");
                                            } else if (i <= RankData.length * 0.4) {
                                                Medal.classList.add("text-bg-primary");
                                            } else {
                                                Medal.classList.add("text-bg-secondary");
                                            }

                                            let UsernameSpan = document.createElement("span");
                                            UsernameCell.appendChild(UsernameSpan);
                                            GetUsernameHTML(UsernameSpan, RowData.Username);
                                            if (RowData.Username == CurrentUsername) {
                                                Row.classList.add("table-primary");
                                            }
                                            if (RowData.QuickSubmitCount >= 2) {
                                                let QuickSubmitBadge = document.createElement("span");
                                                UsernameCell.appendChild(QuickSubmitBadge);
                                                QuickSubmitBadge.innerText = "疑似提交当年代码";
                                                QuickSubmitBadge.className = "badge text-bg-warning ms-2";
                                            }

                                            NicknameCell.innerText = (RowData.Nickname.length < 16 ? RowData.Nickname : RowData.Nickname.substring(0, 15) + "...");

                                            let Names = {
                                                "chenlangning": "陈朗宁",
                                                "chensiru": "陈斯如",
                                                "chensiqi": "陈思齐",
                                                "chentianle": "陈天乐",
                                                "chenxi": "陈曦",
                                                "chenxuanhe": "陈宣合",
                                                "chenyiming5": "陈一铭",
                                                "chenzecong": "陈泽聪",
                                                "chenzerui": "陈泽睿",
                                                "danwenxiao": "单文骁",
                                                "dengwanting": "邓万廷",
                                                "dongminghui": "董明辉",
                                                "dujianping": "杜建平",
                                                "fanxiaoran": "范小冉",
                                                "gaochenming": "高晨茗",
                                                "guhongran": "顾泓然",
                                                "guoluxi": "郭麓羲",
                                                "guoqingtong": "郭庆桐",
                                                "guoruiqun": "郭睿群",
                                                "guyuchen": "顾毓辰",
                                                "guzheran": "顾哲然",
                                                "hanshujian": "韩书简",
                                                "heshuhan": "贺书瀚",
                                                "hexinyi": "何昕弈",
                                                "huheng": "胡恒",
                                                "huangkai": "黄开",
                                                "huangmingxuan": "黄铭宣",
                                                "huangruina": "黄睿纳",
                                                "huangwei": "黄唯",
                                                "huyiyang": "胡以杨",
                                                "hongshaolin": "洪绍霖",
                                                "jiangxingyu": "姜星宇",
                                                "jingtaiyu": "荆泰宇",
                                                "jinweizhe": "金炜喆",
                                                "leijiahan": "雷家涵",
                                                "leizihao": "雷子昊",
                                                "leiwenda": "雷文达",
                                                "lidonglin": "李东霖",
                                                "lihanzhang": "李含章",
                                                "lijiayi": "李佳毅",
                                                "limingrui": "李明睿",
                                                "lishinong": "李诗浓",
                                                "lizhishan": "李执善",
                                                "lianzhongzhe": "连中哲",
                                                "liaoyanxu": "廖彦旭",
                                                "lingzixiang": "凌梓翔",
                                                "linziyi": "林子懿",
                                                "liujianhao": "刘健豪",
                                                "liujiankun": "刘健坤",
                                                "liuxianyong": "刘先勇",
                                                "liuxixian": "刘希贤",
                                                "liuyuxi": "刘雨夕",
                                                "liyihan": "李亦涵",
                                                "lejingyuan": "乐静远",
                                                "luhanlin": "陆涵琳",
                                                "lutianfeng": "陆天枫",
                                                "luojinyang": "罗金阳",
                                                "lvhouxi": "吕厚希",
                                                "meitianyi": "梅天一",
                                                "niruolin": "倪若琳",
                                                "panyinliang": "潘胤良",
                                                "pengyixuan": "彭议萱",
                                                "putong": "蒲通",
                                                "qianqingyuan": "钱清源",
                                                "qidekai": "戚得凯",
                                                "renzhizhou": "任知周",
                                                "shanwenxiao": "单文骁",
                                                "shenhaoze": "沈昊泽",
                                                "shenxichen": "沈熙晨",
                                                "shenzichen": "沈孜晨",
                                                "shihongxi": "施泓熙",
                                                "shimufan": "施慕梵",
                                                "shiyichen": "施奕辰",
                                                "shiyunhao": "施云浩",
                                                "shuxinmo": "舒馨墨",
                                                "suiruochen": "隋若宸",
                                                "sunyihan": "孙艺涵",
                                                "sunyimiao": "孙义淼",
                                                "sunyichen2": "孙袆辰",
                                                "tangchao": "唐潮",
                                                "tangyuhan": "唐钰涵",
                                                "tanhaoxuan": "谭皓轩",
                                                "tanghaoran": "汤皓然",
                                                "taoxianyu": "陶羡榆",
                                                "wangkangming": "王康明",
                                                "wangmaohua": "王茂骅",
                                                "wangminghao": "王明浩",
                                                "wangmingshuo": "王茗铄",
                                                "wangpengyu": "王芃雨",
                                                "wangsiyuan3": "王思源",
                                                "wangtianqi": "王天琦",
                                                "wangzetong": "王泽通",
                                                "wangjiarui5": "王加睿",
                                                "wangjunzhe": "王俊喆",
                                                "wanxinlian": "万馨联",
                                                "weilai3": "魏铼",
                                                "weilai4": "魏来",
                                                "wensiyi": "闻思奕",
                                                "wujinhong": "吴锦鸿",
                                                "wuruitong": "吴瑞桐",
                                                "wumingxuan2": "吴明轩",
                                                "wurunze": "吴润泽",
                                                "wuyukai": "巫昱恺",
                                                "xiangjicheng": "项际诚",
                                                "xiaoguanxun": "肖贯勋",
                                                "xiaojiasheng": "肖嘉盛",
                                                "xiaruicheng": "夏瑞成",
                                                "xiaweimin": "夏蔚民",
                                                "xiaxuran": "夏诩然",
                                                "xiebingxiu": "谢秉修",
                                                "xieliren": "谢立仁",
                                                "xieruiqi": "谢睿棋",
                                                "xiongluofei": "熊洛菲",
                                                "xinyihan": "辛轶涵",
                                                "xuconghan": "徐从瀚",
                                                "xukan": "徐衎",
                                                "xuweiyi": "徐维易",
                                                "yanghaochen": "杨皓宸",
                                                "yangsining": "杨思凝",
                                                "yangqinyu": "杨钦宇",
                                                "yezijiong": "叶梓炅",
                                                "youzhouhang": "尤周杭",
                                                "yuanruiqing": "袁瑞擎",
                                                "yuanyueyang": "袁悦洋",
                                                "yutingjun": "于庭郡",
                                                "yuqiuning": "余秋凝",
                                                "zhangchenming": "张宸铭",
                                                "zhangqiuze": "张秋泽",
                                                "zhangshuxuan": "张澍萱",
                                                "zhangwenda": "张闻达",
                                                "zhangyifu": "张亦夫",
                                                "zhangyouheng": "张佑恒",
                                                "zhaochenshen": "赵晨神",
                                                "zhaochenwei": "赵晨伟",
                                                "zhengyinan": "郑逸楠",
                                                "zhonghongyi": "钟弘毅",
                                                "zhouyiqing": "周意清",
                                                "zhoujunyu": "周峻瑜",
                                                "zhouziyi": "周子逸",
                                                "zhuziruo": "朱子若",
                                                "zhouziyou": "周子游",
                                                "zhuchenrui2": "朱晨瑞",
                                                "zhuruichen": "朱睿宸",
                                                "zhuxule": "朱徐乐",
                                                "zhuyikun": "朱奕坤",
                                                "wangyuancheng": "王源成",
                                                "zhuyiyang": "朱奕阳",
                                                "hanjialin": "韩佳霖",
                                                "zhaozichen": "赵紫辰",
                                                "zhuochengjie": "卓成杰",
                                                "zhouhaiyang": "周海洋",
                                                "zhuaiwei": "朱艾薇",
                                                "linlitong": "林立桐",
                                                "xuyan": "徐衍",
                                                "fenghaochen": "冯皓宸",
                                                "lutianlang": "陆天朗",
                                                "jiangbowen": "姜博闻",
                                                "shangguanbocheng": "上官伯呈",
                                                "wangchengqi": "王呈齐",
                                                "yanpeitong": "颜培桐",
                                                "gongcheng": "龚橙",
                                                "weijiefu": "韦杰夫",
                                                "": ""
                                            };
                                            NameCell.innerText = (Names[RowData.Username] == undefined ? "" : Names[RowData.Username]);

                                            SolvedCell.innerText = RowData.Solved;

                                            PenaltyCell.innerText = SecondsToString(RowData.Penalty);

                                            for (let j = 0; j < ProblemCount; j++) {
                                                let Problem = document.createElement("td");
                                                Row.appendChild(Problem);
                                                let ProblemData = RowData.Problem.find((CurrentRow) => {
                                                    if (CurrentRow.Index == j) {
                                                        return true;
                                                    }
                                                });
                                                if (ProblemData == undefined) {
                                                    Problem.style.backgroundColor = "rgba(0, 0, 0, 0)";
                                                } else if (ProblemData.SolveTime != 0) {
                                                    Problem.innerText = SecondsToString(ProblemData.SolveTime) + "(" + ProblemData.Attempts.length + ")";
                                                    let Color = Math.max(1 / 10 * (10 - ProblemData.Attempts.length), 0.2);
                                                    Problem.style.backgroundColor = "rgba(0, 255, 0, " + Color + ")";
                                                } else {
                                                    Problem.innerText = "(" + ProblemData.Attempts.length + ")";
                                                    let Color = Math.min(ProblemData.Attempts.length / 10 + 0.2, 1);
                                                    Problem.style.backgroundColor = "rgba(255, 0, 0, " + Color + ")";
                                                }
                                                Problem.style.color = (UtilityEnabled("DarkMode") ? "white" : "black");
                                            }
                                        }

                                        TidyTable(Table);

                                        scrollTo({
                                            left: LastPositionX, top: LastPositionY, behavior: "instant"
                                        });
                                    }
                                });
                        }
                        document.getElementById("rank").style.width = "100%";
                        let DownloadButton = document.createElement("button");
                        document.querySelector("body > div.container > div > center").insertBefore(DownloadButton, document.querySelector("body > div.container > div > center > a"));
                        DownloadButton.className = "btn btn-outline-secondary";
                        DownloadButton.innerText = "下载ACM排名";
                        DownloadButton.style.marginBottom = "20px";
                        DownloadButton.addEventListener("click", () => {
                            location.href = "https://www.xmoj.tech/contestrank.xls.php?cid=" + SearchParams.get("cid");
                        });
                        let ProblemCount = localStorage.getItem("UserScript-Contest-" + SearchParams.get("cid") + "-ProblemCount");
                        RefreshACMRank(ProblemCount);
                        if (UtilityEnabled("AutoRefresh")) {
                            addEventListener("focus", () => {
                                RefreshACMRank(ProblemCount);
                            });
                        }
                    }
                    Style.innerHTML += "td {";
                    Style.innerHTML += "   white-space: nowrap;";
                    Style.innerHTML += "}";
                    document.querySelector("body > div.container > div > center").style.paddingBottom = "10px";
                    document.querySelector("body > div.container > div > center > a").style.display = "none";
                    document.title = document.querySelector("body > div.container > div > center > h3").innerText;
                } else if (location.pathname == "/contestrank-correct.php") {
                    if (document.querySelector("#rank") == null) {
                        document.querySelector("body > div > div.mt-3").innerHTML = "<center><h3>比赛排名</h3><a></a><table id=\"rank\"></table>";
                    }
                    if (document.querySelector("body > div > div.mt-3 > center > h3").innerText == "比赛排名") {
                        document.querySelector("#rank").innerText = "比赛暂时还没有排名";
                    } else {
                        if (UtilityEnabled("ResetType")) {
                            document.querySelector("body > div > div.mt-3 > center > h3").innerText = document.querySelector("body > div > div.mt-3 > center > h3").innerText.substring(document.querySelector("body > div > div.mt-3 > center > h3").innerText.indexOf(" -- ") + 4) + "(订正排名)";
                            document.querySelector("body > div > div.mt-3 > center > a").remove();
                        }
                        document.querySelector("#rank > thead > tr > :nth-child(1)").innerText = "排名";
                        document.querySelector("#rank > thead > tr > :nth-child(2)").innerText = "用户";
                        document.querySelector("#rank > thead > tr > :nth-child(3)").innerText = "昵称";
                        document.querySelector("#rank > thead > tr > :nth-child(4)").innerText = "AC数";
                        document.querySelector("#rank > thead > tr > :nth-child(5)").innerText = "得分";
                        let RefreshCorrectRank = async () => {
                            await fetch(location.href)
                                .then((Response) => {
                                    return Response.text()
                                })
                                .then(async (Response) => {
                                    let ParsedDocument = new DOMParser().parseFromString(Response, "text/html");
                                    TidyTable(ParsedDocument.getElementById("rank"));
                                    let Temp = ParsedDocument.getElementById("rank").rows;
                                    for (var i = 1; i < Temp.length; i++) {
                                        let MetalCell = Temp[i].cells[0];
                                        let Metal = document.createElement("span");
                                        Metal.innerText = MetalCell.innerText;
                                        Metal.className = "badge text-bg-primary";
                                        MetalCell.innerText = "";
                                        MetalCell.appendChild(Metal);
                                        GetUsernameHTML(Temp[i].cells[1], Temp[i].cells[1].innerText);
                                        Temp[i].cells[2].innerHTML = Temp[i].cells[2].innerText;
                                        Temp[i].cells[3].innerHTML = Temp[i].cells[3].innerText;
                                        for (let j = 5; j < Temp[i].cells.length; j++) {
                                            let InnerText = Temp[i].cells[j].innerText;
                                            let BackgroundColor = Temp[i].cells[j].style.backgroundColor;
                                            let Red = BackgroundColor.substring(4, BackgroundColor.indexOf(","));
                                            let Green = BackgroundColor.substring(BackgroundColor.indexOf(",") + 2, BackgroundColor.lastIndexOf(","));
                                            let Blue = BackgroundColor.substring(BackgroundColor.lastIndexOf(",") + 2, BackgroundColor.lastIndexOf(")"));
                                            let NoData = (Red == 238 && Green == 238 && Blue == 238);
                                            let FirstBlood = (Red == 170 && Green == 170 && Blue == 255);
                                            let Solved = (Green == 255);
                                            let ErrorCount = "";
                                            if (Solved) {
                                                ErrorCount = (Blue == 170 ? "4+" : (Blue - 51) / 32);
                                            } else {
                                                ErrorCount = (Blue == 22 ? "14+" : (170 - Blue) / 10);
                                            }
                                            if (NoData) {
                                                BackgroundColor = "";
                                            } else if (FirstBlood) {
                                                BackgroundColor = "rgba(127, 127, 255, 0.5)";
                                            } else if (Solved) {
                                                BackgroundColor = "rgba(0, 255, 0, 0.5)";
                                                if (ErrorCount != 0) {
                                                    InnerText += " (" + ErrorCount + ")";
                                                }
                                            } else {
                                                BackgroundColor = "rgba(255, 0, 0, 0.5)";
                                                if (ErrorCount != 0) {
                                                    InnerText += " (" + ErrorCount + ")";
                                                }
                                            }
                                            Temp[i].cells[j].innerHTML = InnerText;
                                            Temp[i].cells[j].style.backgroundColor = BackgroundColor;
                                        }
                                    }
                                    document.querySelector("#rank > tbody").innerHTML = ParsedDocument.querySelector("#rank > tbody").innerHTML;
                                });
                        };
                        RefreshCorrectRank();
                        document.title = document.querySelector("body > div.container > div > center > h3").innerText;
                        if (UtilityEnabled("AutoRefresh")) {
                            addEventListener("focus", RefreshCorrectRank);
                        }
                    }
                } else if (location.pathname == "/submitpage.php") {
                    document.title = "提交代码: " + (SearchParams.get("id") != null ? "题目" + Number(SearchParams.get("id")) : "比赛" + Number(SearchParams.get("cid")));
                    document.querySelector("body > div > div.mt-3").innerHTML = `<center class="mb-3">` + `<h3>提交代码</h3>` + (SearchParams.get("id") != null ? `题目<span class="blue">${Number(SearchParams.get("id"))}</span>` : `比赛<span class="blue">${Number(SearchParams.get("cid")) + `</span>&emsp;题目<span class="blue">` + String.fromCharCode(65 + parseInt(SearchParams.get("pid")))}</span>`) + `</center>
    <textarea id="CodeInput"></textarea>
    <center class="mt-3">
        <input id="enable_O2" name="enable_O2" type="checkbox"><label for="enable_O2">打开O2开关</label>
        <br>
        <input id="Submit" class="btn btn-info mt-2" type="button" value="提交">
        <div id="ErrorElement" class="mt-2" style="display: none; text-align: left; padding: 10px;">
            <div id="ErrorMessage" style="white-space: pre; background-color: rgba(0, 0, 0, 0.1); padding: 10px; border-radius: 5px;"></div>
            <button id="PassCheck" class="btn btn-outline-secondary mt-2" style="display: none">强制提交</button>
        </div>
    </center>`;
                    if (UtilityEnabled("AutoO2")) {
                        document.querySelector("#enable_O2").checked = true;
                    }
                    let CodeMirrorElement;
                    (() => {
                        CodeMirrorElement = CodeMirror.fromTextArea(document.querySelector("#CodeInput"), {
                            lineNumbers: true,
                            matchBrackets: true,
                            mode: "text/x-c++src",
                            indentUnit: 4,
                            indentWithTabs: true,
                            enterMode: "keep",
                            tabMode: "shift",
                            theme: (UtilityEnabled("DarkMode") ? "darcula" : "default"),
                            extraKeys: {
                                "Ctrl-Space": "autocomplete", "Ctrl-Enter": function (instance) {
                                    Submit.click();
                                }
                            }
                        })
                    })();
                    CodeMirrorElement.setSize("100%", "auto");
                    CodeMirrorElement.getWrapperElement().style.border = "1px solid #ddd";

                    if (SearchParams.get("sid") !== null) {
                        await fetch("https://www.xmoj.tech/getsource.php?id=" + SearchParams.get("sid"))
                            .then((Response) => {
                                return Response.text()
                            })
                            .then((Response) => {
                                CodeMirrorElement.setValue(Response.substring(0, Response.indexOf("/**************************************************************")).trim());
                            });
                    }

                    PassCheck.addEventListener("click", async () => {
                        ErrorElement.style.display = "none";
                        document.querySelector("#Submit").disabled = true;
                        document.querySelector("#Submit").value = "正在提交...";
                        let o2Switch = "&enable_O2=on";
                        if (!document.querySelector("#enable_O2").checked) o2Switch = "";
                        await fetch("https://www.xmoj.tech/submit.php", {
                            "headers": {
                                "content-type": "application/x-www-form-urlencoded"
                            },
                            "referrer": location.href,
                            "method": "POST",
                            "body": (SearchParams.get("id") != null ? "id=" + SearchParams.get("id") : "cid=" + SearchParams.get("cid") + "&pid=" + SearchParams.get("pid")) + "&language=1&" + "source=" + encodeURIComponent(CodeMirrorElement.getValue()) + o2Switch
                        }).then(async (Response) => {
                            if (Response.redirected) {
                                location.href = Response.url;
                            } else {
                                const text = await Response.text();
                                if (text.indexOf("没有这个比赛!") !== -1 && new URL(location.href).searchParams.get("pid") !== null) {
                                    // Credit: https://github.com/boomzero/quicksubmit/blob/main/index.ts
                                    // Also licensed under GPL-3.0
                                    const contestReq = await fetch("https://www.xmoj.tech/contest.php?cid=" + new URL(location.href).searchParams.get("cid"));
                                    const res = await contestReq.text();
                                    if (
                                        contestReq.status !== 200 ||
                                        res.indexOf("比赛尚未开始或私有,不能查看题目。") !== -1
                                    ) {
                                        console.error(`Failed to get contest page!`);
                                        return;
                                    }
                                    const parser = new DOMParser();
                                    const dom = parser.parseFromString(res, "text/html");
                                    const contestProblems = [];
                                    const rows = (dom.querySelector(
                                        "#problemset > tbody",
                                    )).rows;
                                    for (let i = 0; i < rows.length; i++) {
                                        contestProblems.push(
                                            rows[i].children[1].textContent.substring(2, 6).replaceAll(
                                                "\t",
                                                "",
                                            ),
                                        );
                                    }
                                    rPID = contestProblems[new URL(location.href).searchParams.get("pid")];
                                    if (UtilityEnabled("DebugMode")) {
                                        console.log("Contest Problems:", contestProblems);
                                        console.log("Real PID:", rPID);
                                    }
                                    ErrorElement.style.display = "block";
                                    ErrorMessage.style.color = "red";
                                    ErrorMessage.innerText = "比赛已结束, 正在尝试像题目 " + rPID + " 提交";
                                    console.log("比赛已结束, 正在尝试像题目 " + rPID + " 提交");
                                    let o2Switch = "&enable_O2=on";
                                    if (!document.querySelector("#enable_O2").checked) o2Switch = "";
                                    await fetch("https://www.xmoj.tech/submit.php", {
                                        "headers": {
                                            "content-type": "application/x-www-form-urlencoded"
                                        },
                                        "referrer": location.href,
                                        "method": "POST",
                                        "body": "id=" + rPID + "&language=1&" + "source=" + encodeURIComponent(CodeMirrorElement.getValue()) + o2Switch
                                    }).then(async (Response) => {
                                        if (Response.redirected) {
                                            location.href = Response.url;
                                        }
                                        console.log(await Response.text());
                                    });

                                }
                                if (UtilityEnabled("DebugMode")) {
                                    console.log("Submission failed! Response:", text);
                                }
                                ErrorElement.style.display = "block";
                                ErrorMessage.style.color = "red";
                                ErrorMessage.innerText = "提交失败!请关闭脚本后重试!";
                                Submit.disabled = false;
                                Submit.value = "提交";
                            }
                        })
                    });

                    Submit.addEventListener("click", async () => {
                        PassCheck.style.display = "none";
                        ErrorElement.style.display = "none";
                        document.querySelector("#Submit").disabled = true;
                        document.querySelector("#Submit").value = "正在检查...";
                        let Source = CodeMirrorElement.getValue();
                        let PID = 0;
                        let IOFilename = "";
                        if (SearchParams.get("cid") != null && SearchParams.get("pid") != null) {
                            PID = localStorage.getItem("UserScript-Contest-" + SearchParams.get("cid") + "-Problem-" + SearchParams.get("pid") + "-PID")
                        } else {
                            PID = SearchParams.get("id");
                        }
                        IOFilename = localStorage.getItem("UserScript-Problem-" + PID + "-IOFilename");
                        if (UtilityEnabled("IOFile") && IOFilename != null) {
                            if (Source.indexOf(IOFilename) == -1) {
                                PassCheck.style.display = "";
                                ErrorElement.style.display = "block";
                                if (UtilityEnabled("DarkMode")) ErrorMessage.style.color = "yellow"; else ErrorMessage.style.color = "red";
                                ErrorMessage.innerText = "此题输入输出文件名为" + IOFilename + ",请检查是否填错";

                                let freopenText = document.createElement('small');
                                if (UtilityEnabled("DarkMode")) freopenText.style.color = "white"; else freopenText.style.color = "black";
                                freopenText.textContent = '\n您也可以复制freopen语句。\n';
                                document.getElementById('ErrorMessage').appendChild(freopenText);
                                let copyFreopenButton = document.createElement("button");
                                copyFreopenButton.className = "btn btn-sm btn-outline-secondary copy-btn";
                                copyFreopenButton.innerText = "复制代码";
                                copyFreopenButton.style.marginLeft = "10px";
                                copyFreopenButton.style.marginTop = "10px";
                                copyFreopenButton.style.marginBottom = "10px";
                                copyFreopenButton.type = "button";
                                copyFreopenButton.addEventListener("click", () => {
                                    navigator.clipboard.writeText('\n	freopen("' + IOFilename + '.in", "r", stdin);\n	freopen("' + IOFilename + '.out", "w", stdout);');
                                    copyFreopenButton.innerText = "复制成功";
                                    setTimeout(() => {
                                        copyFreopenButton.innerText = "复制代码";
                                    }, 1500);
                                });
                                document.getElementById('ErrorMessage').appendChild(copyFreopenButton);
                                let freopenCodeField = CodeMirror(document.getElementById('ErrorMessage'), {
                                    value: 'freopen("' + IOFilename + '.in", "r", stdin);\nfreopen("' + IOFilename + '.out", "w", stdout);',
                                    mode: 'text/x-c++src',
                                    theme: (UtilityEnabled("DarkMode") ? "darcula" : "default"),
                                    readOnly: true,
                                    lineNumbers: true
                                });
                                freopenCodeField.setSize("100%", "auto");
                                document.querySelector("#Submit").disabled = false;
                                document.querySelector("#Submit").value = "提交";
                                return false;
                            } else if (RegExp("//.*freopen").test(Source)) {
                                PassCheck.style.display = "";
                                ErrorElement.style.display = "block";
                                if (UtilityEnabled("DarkMode")) ErrorMessage.style.color = "yellow"; else ErrorMessage.style.color = "red";
                                ErrorMessage.innerText = "请不要注释freopen语句";
                                document.querySelector("#Submit").disabled = false;
                                document.querySelector("#Submit").value = "提交";
                                return false;
                            }
                        }
                        if (Source == "") {
                            PassCheck.style.display = "";
                            ErrorElement.style.display = "block";
                            if (UtilityEnabled("DarkMode")) ErrorMessage.style.color = "yellow"; else ErrorMessage.style.color = "red";
                            ErrorMessage.innerText = "源代码为空";
                            document.querySelector("#Submit").disabled = false;
                            document.querySelector("#Submit").value = "提交";
                            return false;
                        }
                        if (UtilityEnabled("CompileError")) {
                            let ResponseData = await new Promise((Resolve) => {
                                GM_xmlhttpRequest({
                                    method: "POST", url: "https://cppinsights.io/api/v1/transform", headers: {
                                        "content-type": "application/json;charset=UTF-8"
                                    }, referrer: "https://cppinsights.io/", data: JSON.stringify({
                                        "insightsOptions": ["cpp14"], "code": Source
                                    }), onload: (Response) => {
                                        Resolve(Response);
                                    }
                                });
                            });
                            let Response = JSON.parse(ResponseData.responseText);
                            if (Response.returncode) {
                                PassCheck.style.display = "";
                                ErrorElement.style.display = "block";
                                if (UtilityEnabled("DarkMode")) ErrorMessage.style.color = "yellow"; else ErrorMessage.style.color = "red";
                                ErrorMessage.innerText = "编译错误:\n" + Response.stderr.trim();
                                document.querySelector("#Submit").disabled = false;
                                document.querySelector("#Submit").value = "提交";
                                return false;
                            } else {
                                PassCheck.click();
                            }
                        } else {
                            PassCheck.click();
                        }
                    });
                } else if (location.pathname == "/modifypage.php") {
                    if (SearchParams.get("ByUserScript") != null) {
                        document.title = "XMOJ-Script 更新日志";
                        document.querySelector("body > div > div.mt-3").innerHTML = "";
                        await fetch(ServerURL + "/Update.json", {cache: "no-cache"})
                            .then((Response) => {
                                return Response.json();
                            })
                            .then((Response) => {
                                for (let i = Object.keys(Response.UpdateHistory).length - 1; i >= 0; i--) {
                                    let Version = Object.keys(Response.UpdateHistory)[i];
                                    let Data = Response.UpdateHistory[Version];
                                    let UpdateDataCard = document.createElement("div");
                                    document.querySelector("body > div > div.mt-3").appendChild(UpdateDataCard);
                                    UpdateDataCard.className = "card mb-3";
                                    if (Data.Prerelease) UpdateDataCard.classList.add("text-secondary");
                                    let UpdateDataCardBody = document.createElement("div");
                                    UpdateDataCard.appendChild(UpdateDataCardBody);
                                    UpdateDataCardBody.className = "card-body";
                                    let UpdateDataCardTitle = document.createElement("h5");
                                    UpdateDataCardBody.appendChild(UpdateDataCardTitle);
                                    UpdateDataCardTitle.className = "card-title";
                                    UpdateDataCardTitle.innerText = Version;
                                    if (Data.Prerelease) {
                                        UpdateDataCardTitle.innerHTML += "(预览版)";
                                    }
                                    let UpdateDataCardSubtitle = document.createElement("h6");
                                    UpdateDataCardBody.appendChild(UpdateDataCardSubtitle);
                                    UpdateDataCardSubtitle.className = "card-subtitle mb-2 text-muted";
                                    UpdateDataCardSubtitle.innerHTML = GetRelativeTime(Data.UpdateDate);
                                    let UpdateDataCardText = document.createElement("p");
                                    UpdateDataCardBody.appendChild(UpdateDataCardText);
                                    UpdateDataCardText.className = "card-text";
                                    //release notes
                                    if (Data.Notes != undefined) {
                                        UpdateDataCardText.innerHTML = Data.Notes;
                                    }
                                    let UpdateDataCardList = document.createElement("ul");
                                    UpdateDataCardText.appendChild(UpdateDataCardList);
                                    UpdateDataCardList.className = "list-group list-group-flush";
                                    for (let j = 0; j < Data.UpdateContents.length; j++) {
                                        let UpdateDataCardListItem = document.createElement("li");
                                        UpdateDataCardList.appendChild(UpdateDataCardListItem);
                                        UpdateDataCardListItem.className = "list-group-item";
                                        UpdateDataCardListItem.innerHTML = "(<a href=\"https://github.com/XMOJ-Script-dev/XMOJ-Script/pull/" + Data.UpdateContents[j].PR + "\" target=\"_blank\">" + "#" + Data.UpdateContents[j].PR + "</a>) " + Data.UpdateContents[j].Description;
                                    }
                                    let UpdateDataCardLink = document.createElement("a");
                                    UpdateDataCardBody.appendChild(UpdateDataCardLink);
                                    UpdateDataCardLink.className = "card-link";
                                    UpdateDataCardLink.href = "https://github.com/XMOJ-Script-dev/XMOJ-Script/releases/tag/" + Version;
                                    UpdateDataCardLink.target = "_blank";
                                    UpdateDataCardLink.innerText = "查看该版本";
                                }
                            });
                    } else {
                        document.title = "修改账号";
                        let Nickname = document.getElementsByName("nick")[0].value;
                        let School = document.getElementsByName("school")[0].value;
                        let EmailAddress = document.getElementsByName("email")[0].value;
                        let CodeforcesAccount = document.getElementsByName("acc_cf")[0].value;
                        let AtcoderAccount = document.getElementsByName("acc_atc")[0].value;
                        let USACOAccount = document.getElementsByName("acc_usaco")[0].value;
                        let LuoguAccount = document.getElementsByName("acc_luogu")[0].value;
                        document.querySelector("body > div > div").innerHTML = `<div class="row g-2 align-items-center col-6 mb-1">
                    <div class="col-3"><label for="UserID" class="col-form-label">用户ID</label></div>
                    <div class="col-9"><input id="UserID" class="form-control" disabled readonly value="${CurrentUsername}"></div>
                </div>
                <div class="row g-2 align-items-center col-6 mb-1">
                    <div class="col-3"><label for="Avatar" class="col-form-label">头像</label></div>
                    <div class="col-9">
                        <img width="64" height="64" src="https://cravatar.cn/avatar/` + (await GetUserInfo(CurrentUsername)).EmailHash + `?d=retro">
                        <a href="https://cravatar.cn/avatars" target="_blank">修改头像</a>
                    </div>
                </div>
                <div class="row g-2 align-items-center col-6 pb-1 ps-2 pe-2 mt-3 mb-3 border" id="BadgeRow" style="display: none">
                    <div class="col-3">标签</div>
                    <div class="col-9">
                        <div class="row g-2 align-items-center mb-1">
                            <div class="col-3"><label for="BadgeContent" class="col-form-label">内容</label></div>
                            <div class="col-9"><input class="form-control" id="BadgeContent"></div>
                        </div>
                        <div class="row g-2 align-items-center mb-1">
                            <div class="col-3"><label for="BadgeBackgroundColor" class="col-form-label">背景颜色</label></div>
                            <div class="col-9"><input class="form-control form-control-color" type="color" id="BadgeBackgroundColor"></div>
                        </div>
                        <div class="row g-2 align-items-center mb-1">
                            <div class="col-3"><label for="BadgeColor" class="col-form-label">文字颜色</label></div>
                            <div class="col-9"><input class="form-control form-control-color" type="color" id="BadgeColor"></div>
                        </div>
                    </div>
                </div>
                <div class="row g-2 align-items-center col-6 mb-1">
                    <div class="col-3"><label for="Nickname" class="col-form-label">昵称</label></div>
                    <div class="col-9"><input id="Nickname" class="form-control"></div>
                </div>
                <div class="row g-2 align-items-center col-6 mb-1">
                    <div class="col-3"><label for="OldPassword" class="col-form-label">旧密码</label></div>
                    <div class="col-9"><input type="password" id="OldPassword" class="form-control"></div>
                </div>
                <div class="row g-2 align-items-center col-6 mb-1">
                    <div class="col-3"><label for="NewPassword" class="col-form-label">新密码</label></div>
                    <div class="col-9"><input type="password" id="NewPassword" class="form-control"></div>
                </div>
                <div class="row g-2 align-items-center col-6 mb-1">
                    <div class="col-3"><label for="NewPasswordAgain" class="col-form-label">请重复密码</label></div>
                    <div class="col-9"><input type="password" id="NewPasswordAgain" class="form-control"></div>
                </div>
                <div class="row g-2 align-items-center col-6 mb-1">
                    <div class="col-3"><label for="School" class="col-form-label">学校</label></div>
                    <div class="col-9"><input id="School" class="form-control"></div>
                </div>
                <div class="row g-2 align-items-center col-6 mb-1">
                    <div class="col-3"><label for="EmailAddress" class="col-form-label">电子邮箱</label></div>
                    <div class="col-9"><input id="EmailAddress" class="form-control"></div>
                </div>
                <div class="row g-2 align-items-center col-6 mb-1">
                    <div class="col-3"><label for="CodeforcesAccount" class="col-form-label">Codeforces账号</label></div>
                    <div class="col-9"><input id="CodeforcesAccount" class="form-control"></div>
                </div>
                <div class="row g-2 align-items-center col-6 mb-1">
                    <div class="col-3"><label for="AtcoderAccount" class="col-form-label">Atcoder账号</label></div>
                    <div class="col-9"><input id="AtcoderAccount" class="form-control"></div>
                </div>
                <div class="row g-2 align-items-center col-6 mb-1">
                    <div class="col-3"><label for="USACOAccount" class="col-form-label">USACO账号</label></div>
                    <div class="col-9"><input id="USACOAccount" class="form-control"></div>
                </div>
                <div class="row g-2 align-items-center col-6 mb-1">
                    <div class="col-3"><label for="LuoguAccount" class="col-form-label">洛谷账号</label></div>
                    <div class="col-9"><input id="LuoguAccount" class="form-control"></div>
                </div>
                <button type="submit" class="btn btn-primary mb-2" id="ModifyInfo">
                    修改
                    <span class="spinner-border spinner-border-sm" role="status" aria-hidden="true" style="display: none"></span>
                </button>
                <div class="alert alert-danger mb-3" role="alert" id="ErrorElement" style="display: none;"></div>
                <div class="alert alert-success mb-3" role="alert" id="SuccessElement" style="display: none;">修改成功</div>
                <br>`;
                        document.getElementById("Nickname").value = Nickname;
                        document.getElementById("School").value = School;
                        document.getElementById("EmailAddress").value = EmailAddress;
                        document.getElementById("CodeforcesAccount").value = CodeforcesAccount;
                        document.getElementById("AtcoderAccount").value = AtcoderAccount;
                        document.getElementById("USACOAccount").value = USACOAccount;
                        document.getElementById("LuoguAccount").value = LuoguAccount;
                        RequestAPI("GetBadge", {
                            "UserID": String(CurrentUsername)
                        }, (Response) => {
                            if (Response.Success) {
                                BadgeRow.style.display = "";
                                BadgeContent.value = Response.Data.Content;
                                BadgeBackgroundColor.value = Response.Data.BackgroundColor;
                                BadgeColor.value = Response.Data.Color;
                                let Temp = [];
                                for (let i = 0; i < localStorage.length; i++) {
                                    if (localStorage.key(i).startsWith("UserScript-User-" + CurrentUsername + "-Badge-")) {
                                        Temp.push(localStorage.key(i));
                                    }
                                }
                                for (let i = 0; i < Temp.length; i++) {
                                    localStorage.removeItem(Temp[i]);
                                }
                            }
                        });
                        ModifyInfo.addEventListener("click", async () => {
                            ModifyInfo.disabled = true;
                            ModifyInfo.querySelector("span").style.display = "";
                            ErrorElement.style.display = "none";
                            SuccessElement.style.display = "none";
                            let BadgeContent = document.querySelector("#BadgeContent").value;
                            let BadgeBackgroundColor = document.querySelector("#BadgeBackgroundColor").value;
                            let BadgeColor = document.querySelector("#BadgeColor").value;
                            await new Promise((Resolve) => {
                                RequestAPI("EditBadge", {
                                    "UserID": String(CurrentUsername),
                                    "Content": String(BadgeContent),
                                    "BackgroundColor": String(BadgeBackgroundColor),
                                    "Color": String(BadgeColor)
                                }, (Response) => {
                                    if (Response.Success) {
                                        Resolve();
                                    } else {
                                        ModifyInfo.disabled = false;
                                        ModifyInfo.querySelector("span").style.display = "none";
                                        ErrorElement.style.display = "block";
                                        ErrorElement.innerText = Response.Message;
                                    }
                                });
                            });
                            let Nickname = document.querySelector("#Nickname").value;
                            let OldPassword = document.querySelector("#OldPassword").value;
                            let NewPassword = document.querySelector("#NewPassword").value;
                            let NewPasswordAgain = document.querySelector("#NewPasswordAgain").value;
                            let School = document.querySelector("#School").value;
                            let EmailAddress = document.querySelector("#EmailAddress").value;
                            let CodeforcesAccount = document.querySelector("#CodeforcesAccount").value;
                            let AtcoderAccount = document.querySelector("#AtcoderAccount").value;
                            let USACOAccount = document.querySelector("#USACOAccount").value;
                            let LuoguAccount = document.querySelector("#LuoguAccount").value;
                            await fetch("https://www.xmoj.tech/modify.php", {
                                "headers": {
                                    "content-type": "application/x-www-form-urlencoded"
                                },
                                "referrer": location.href,
                                "method": "POST",
                                "body": "nick=" + encodeURIComponent(Nickname) + "&" + "opassword=" + encodeURIComponent(OldPassword) + "&" + "npassword=" + encodeURIComponent(NewPassword) + "&" + "rptpassword=" + encodeURIComponent(NewPasswordAgain) + "&" + "school=" + encodeURIComponent(School) + "&" + "email=" + encodeURIComponent(EmailAddress) + "&" + "acc_cf=" + encodeURIComponent(CodeforcesAccount) + "&" + "acc_atc=" + encodeURIComponent(AtcoderAccount) + "&" + "acc_usaco=" + encodeURIComponent(USACOAccount) + "&" + "acc_luogu=" + encodeURIComponent(LuoguAccount)
                            });
                            ModifyInfo.disabled = false;
                            ModifyInfo.querySelector("span").style.display = "none";
                            SuccessElement.style.display = "block";
                        });
                        if (UtilityEnabled("ExportACCode")) {
                            let ExportACCode = document.createElement("button");
                            document.querySelector("body > div.container > div").appendChild(ExportACCode);
                            ExportACCode.innerText = "导出AC代码";
                            ExportACCode.className = "btn btn-outline-secondary";
                            ExportACCode.addEventListener("click", () => {
                                ExportACCode.disabled = true;
                                ExportACCode.innerText = "正在导出...";
                                let Request = new XMLHttpRequest();
                                Request.addEventListener("readystatechange", () => {
                                    if (Request.readyState == 4) {
                                        if (Request.status == 200) {
                                            let Response = Request.responseText;
                                            let ACCode = Response.split("------------------------------------------------------\r\n");
                                            let ScriptElement = document.createElement("script");
                                            ScriptElement.src = "https://s4.zstatic.net/ajax/libs/jszip/3.10.1/jszip.min.js";
                                            if (UtilityEnabled("cdnjs")) {
                                                ScriptElement.src = "https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js";
                                            }
                                            document.head.appendChild(ScriptElement);
                                            ScriptElement.onload = () => {
                                                var Zip = new JSZip();
                                                for (let i = 0; i < ACCode.length; i++) {
                                                    let CurrentCode = ACCode[i];
                                                    if (CurrentCode != "") {
                                                        let CurrentQuestionID = CurrentCode.substring(7, 11);
                                                        CurrentCode = CurrentCode.substring(14);
                                                        CurrentCode = CurrentCode.replaceAll("\r", "");
                                                        Zip.file(CurrentQuestionID + ".cpp", CurrentCode);
                                                    }
                                                }
                                                ExportACCode.innerText = "正在生成压缩包……";
                                                Zip.generateAsync({type: "blob"})
                                                    .then(function (Content) {
                                                        saveAs(Content, "ACCodes.zip");
                                                        ExportACCode.innerText = "AC代码导出成功";
                                                        ExportACCode.disabled = false;
                                                        setTimeout(() => {
                                                            ExportACCode.innerText = "导出AC代码";
                                                        }, 1000);
                                                    });
                                            };
                                        } else {
                                            ExportACCode.disabled = false;
                                            ExportACCode.innerText = "AC代码导出失败";
                                            setTimeout(() => {
                                                ExportACCode.innerText = "导出AC代码";
                                            }, 1000);
                                        }
                                    }
                                });
                                Request.open("GET", "https://www.xmoj.tech/export_ac_code.php", true);
                                Request.send();
                            });
                        }
                    }
                } else if (location.pathname == "/userinfo.php") {
                    if (SearchParams.get("ByUserScript") === null) {
                        if (UtilityEnabled("RemoveUseless")) {
                            let Temp = document.getElementById("submission").childNodes;
                            for (let i = 0; i < Temp.length; i++) {
                                Temp[i].remove();
                            }
                        }
                        eval(document.querySelector("body > script:nth-child(5)").innerHTML);
                        document.querySelector("#statics > tbody > tr:nth-child(1)").remove();

                        let Temp = document.querySelector("#statics > tbody").children;
                        for (let i = 0; i < Temp.length; i++) {
                            if (Temp[i].children[0] != undefined) {
                                if (Temp[i].children[0].innerText == "Statistics") {
                                    Temp[i].children[0].innerText = "统计";
                                } else if (Temp[i].children[0].innerText == "Email:") {
                                    Temp[i].children[0].innerText = "电子邮箱";
                                }
                                Temp[i].children[1].removeAttribute("align");
                            }
                        }

                        Temp = document.querySelector("#statics > tbody > tr:nth-child(1) > td:nth-child(3)").childNodes;
                        let ACProblems = [];
                        for (let i = 0; i < Temp.length; i++) {
                            if (Temp[i].tagName == "A" && Temp[i].href.indexOf("problem.php?id=") != -1) {
                                ACProblems.push(Number(Temp[i].innerText.trim()));
                            }
                        }
                        document.querySelector("#statics > tbody > tr:nth-child(1) > td:nth-child(3)").remove();

                        let UserID, UserNick;
                        [UserID, UserNick] = document.querySelector("#statics > caption").childNodes[0].data.trim().split("--");
                        document.querySelector("#statics > caption").remove();
                        document.title = "用户 " + UserID + " 的个人中心";
                        let Row = document.createElement("div");
                        Row.className = "row";
                        let LeftDiv = document.createElement("div");
                        LeftDiv.className = "col-md-5";
                        Row.appendChild(LeftDiv);

                        let LeftTopDiv = document.createElement("div");
                        LeftTopDiv.className = "row mb-2";
                        LeftDiv.appendChild(LeftTopDiv);
                        let AvatarContainer = document.createElement("div");
                        AvatarContainer.classList.add("col-auto");
                        let AvatarElement = document.createElement("img");
                        let UserEmailHash = (await GetUserInfo(UserID)).EmailHash;
                        if (UserEmailHash == undefined) {
                            AvatarElement.src = `https://cravatar.cn/avatar/00000000000000000000000000000000?d=mp&f=y`;
                        } else {
                            AvatarElement.src = `https://cravatar.cn/avatar/${UserEmailHash}?d=retro`;
                        }
                        AvatarElement.classList.add("rounded", "me-2");
                        AvatarElement.style.height = "120px";
                        AvatarContainer.appendChild(AvatarElement);
                        LeftTopDiv.appendChild(AvatarContainer);

                        let UserInfoElement = document.createElement("div");
                        UserInfoElement.classList.add("col-auto");
                        UserInfoElement.style.lineHeight = "40px";
                        UserInfoElement.innerHTML += "用户名:" + UserID + "<br>";
                        UserInfoElement.innerHTML += "昵称:" + UserNick + "<br>";
                        if (UtilityEnabled("Rating")) {
                            UserInfoElement.innerHTML += "评分:" + ((await GetUserInfo(UserID)).Rating) + "<br>";
                        }
                        // Create a placeholder for the last online time
                        let lastOnlineElement = document.createElement('div');
                        lastOnlineElement.innerHTML = "最后在线:加载中...<br>";
                        UserInfoElement.appendChild(lastOnlineElement);
                        let BadgeInfo = await GetUserBadge(UserID);
                        if (IsAdmin) {
                            if (BadgeInfo.Content !== "") {
                                let DeleteBadgeButton = document.createElement("button");
                                DeleteBadgeButton.className = "btn btn-outline-danger btn-sm";
                                DeleteBadgeButton.innerText = "删除标签";
                                DeleteBadgeButton.addEventListener("click", async () => {
                                    if (confirm("您确定要删除此标签吗?")) {
                                        RequestAPI("DeleteBadge", {
                                            "UserID": UserID
                                        }, (Response) => {
                                            if (UtilityEnabled("DebugMode")) console.log(Response);
                                            if (Response.Success) {
                                                let Temp = [];
                                                for (let i = 0; i < localStorage.length; i++) {
                                                    if (localStorage.key(i).startsWith("UserScript-User-" + UserID + "-Badge-")) {
                                                        Temp.push(localStorage.key(i));
                                                    }
                                                }
                                                for (let i = 0; i < Temp.length; i++) {
                                                    localStorage.removeItem(Temp[i]);
                                                }
                                                window.location.reload();
                                            } else {
                                                SmartAlert(Response.Message);
                                            }
                                        });
                                    }
                                });
                                UserInfoElement.appendChild(DeleteBadgeButton);
                            } else {
                                let AddBadgeButton = document.createElement("button");
                                AddBadgeButton.className = "btn btn-outline-primary btn-sm";
                                AddBadgeButton.innerText = "添加标签";
                                AddBadgeButton.addEventListener("click", async () => {
                                    RequestAPI("NewBadge", {
                                        "UserID": UserID
                                    }, (Response) => {
                                        if (Response.Success) {
                                            let Temp = [];
                                            for (let i = 0; i < localStorage.length; i++) {
                                                if (localStorage.key(i).startsWith("UserScript-User-" + UserID + "-Badge-")) {
                                                    Temp.push(localStorage.key(i));
                                                }
                                            }
                                            for (let i = 0; i < Temp.length; i++) {
                                                localStorage.removeItem(Temp[i]);
                                            }
                                            window.location.reload();
                                        } else {
                                            SmartAlert(Response.Message);
                                        }
                                    });
                                });
                                UserInfoElement.appendChild(AddBadgeButton);
                            }
                        }
                        RequestAPI("LastOnline", {"Username": UserID}, (result) => {
                            if (result.Success) {
                                if (UtilityEnabled("DebugMode")) {
                                    console.log('lastOnline:' + result.Data.logintime);
                                }
                                lastOnlineElement.innerHTML = "最后在线:" + GetRelativeTime(result.Data.logintime) + "<br>";
                            } else {
                                lastOnlineElement.innerHTML = "最后在线:近三个月内从未<br>";
                            }
                        });
                        LeftTopDiv.appendChild(UserInfoElement);
                        LeftDiv.appendChild(LeftTopDiv);

                        let LeftTable = document.querySelector("body > div > div > center > table");
                        LeftDiv.appendChild(LeftTable);
                        let RightDiv = document.createElement("div");
                        RightDiv.className = "col-md-7";
                        Row.appendChild(RightDiv);
                        RightDiv.innerHTML = "<h5>已解决题目</h5>";
                        for (let i = 0; i < ACProblems.length; i++) {
                            RightDiv.innerHTML += "<a href=\"https://www.xmoj.tech/problem.php?id=" + ACProblems[i] + "\" target=\"_blank\">" + ACProblems[i] + "</a> ";
                        }
                        document.querySelector("body > div > div").innerHTML = "";
                        document.querySelector("body > div > div").appendChild(Row);
                    } else {
                        document.title = "上传标程";
                        document.querySelector("body > div > div.mt-3").innerHTML = `<button id="UploadStd" class="btn btn-primary mb-2">上传标程</button>
                <div class="alert alert-danger mb-3" role="alert" id="ErrorElement" style="display: none;"></div>
                <div class="progress" role="progressbar">
                    <div id="UploadProgress" class="progress-bar progress-bar-striped" style="width: 0%">0%</div>
                </div>
                <p class="mt-2 text-muted">
                    您必须要上传标程以后才能使用“查看标程”功能。点击“上传标程”按钮以后,系统会自动上传标程,请您耐心等待。<br>
                    首次上传标程可能会比较慢,请耐心等待。后续将可以自动上传AC代码。<br>
                    系统每过30天会自动提醒您上传标程,您必须要上传标程,否则将会被禁止使用“查看标程”功能。<br>
                </p>`;
                        UploadStd.addEventListener("click", async () => {
                            UploadStd.disabled = true;
                            ErrorElement.style.display = "none";
                            ErrorElement.innerText = "";
                            UploadProgress.classList.remove("bg-success");
                            UploadProgress.classList.remove("bg-warning");
                            UploadProgress.classList.remove("bg-danger");
                            UploadProgress.classList.add("progress-bar-animated");
                            UploadProgress.style.width = "0%";
                            UploadProgress.innerText = "0%";
                            let ACList = [];
                            await fetch("https://www.xmoj.tech/userinfo.php?user=" + CurrentUsername)
                                .then((Response) => {
                                    return Response.text();
                                }).then((Response) => {
                                    let ParsedDocument = new DOMParser().parseFromString(Response, "text/html");
                                    let ScriptData = ParsedDocument.querySelector("#statics > tbody > tr:nth-child(2) > td:nth-child(3) > script").innerText;
                                    ScriptData = ScriptData.substr(ScriptData.indexOf("}") + 1).trim();
                                    ScriptData = ScriptData.split(";");
                                    for (let i = 0; i < ScriptData.length; i++) {
                                        ACList.push(Number(ScriptData[i].substring(2, ScriptData[i].indexOf(","))));
                                    }
                                });
                            RequestAPI("GetStdList", {}, async (Result) => {
                                if (Result.Success) {
                                    let StdList = Result.Data.StdList;
                                    for (let i = 0; i < ACList.length; i++) {
                                        if (StdList.indexOf(ACList[i]) === -1 && ACList[i] !== 0) {
                                            await new Promise((Resolve) => {
                                                RequestAPI("UploadStd", {
                                                    "ProblemID": Number(ACList[i])
                                                }, (Result) => {
                                                    if (!Result.Success) {
                                                        ErrorElement.style.display = "block";
                                                        ErrorElement.innerText += Result.Message + "\n";
                                                        UploadProgress.classList.add("bg-warning");
                                                    }
                                                    UploadProgress.innerText = (i / ACList.length * 100).toFixed(1) + "% (" + ACList[i] + ")";
                                                    UploadProgress.style.width = (i / ACList.length * 100) + "%";
                                                    Resolve();
                                                });
                                            });
                                        }
                                    }
                                    UploadProgress.classList.add("bg-success");
                                    UploadProgress.classList.remove("progress-bar-animated");
                                    UploadProgress.innerText = "100%";
                                    UploadProgress.style.width = "100%";
                                    UploadStd.disabled = false;
                                    localStorage.setItem("UserScript-LastUploadedStdTime", new Date().getTime());
                                } else {
                                    ErrorElement.style.display = "block";
                                    ErrorElement.innerText = Result.Message;
                                    UploadStd.disabled = false;
                                }
                            });
                        });
                    }
                } else if (location.pathname == "/conteststatistics.php") {
                    if (new URL(location.href).searchParams.get("cid") != null) {
                        document.title = "比赛 " + new URL(location.href).searchParams.get("cid") + " 统计";
                    }
                    document.querySelector("body > div > div.mt-3 > center > h3").innerText = "比赛统计";
                    if (UtilityEnabled("ResetType")) {
                        let Temp = document.getElementById("submission").childNodes;
                        for (let i = 0; i < Temp.length; i++) {
                            Temp[i].remove();
                        }
                        eval(document.querySelector("body > div.container > div > center > table:nth-child(4) > script:nth-child(6)").innerHTML);
                        document.querySelector("#cs > thead > tr > th:nth-child(1)").innerText = "题目编号";
                        document.querySelector("#cs > thead > tr > th:nth-child(10)").remove();
                        document.querySelector("#cs > thead > tr > th:nth-child(11)").innerText = "总和";
                        document.querySelector("#cs > thead > tr > th:nth-child(12)").remove();
                        document.querySelector("#cs > thead > tr > th:nth-child(12)").remove();
                        document.querySelector("#cs > thead > tr > th:nth-child(12)").remove();
                        document.querySelector("#cs > tbody > tr:last-child > td").innerText = "总和";
                        TidyTable(document.getElementById("cs"));
                        Temp = document.querySelector("#cs > tbody").children;
                        for (let i = 0; i < Temp.length; i++) {
                            let CurrentRowChildren = Temp[i].children;
                            CurrentRowChildren[9].remove();
                            CurrentRowChildren[11].remove();
                            CurrentRowChildren[11].remove();
                            CurrentRowChildren[11].remove();
                            for (let j = 0; j < CurrentRowChildren.length; j++) {
                                if (CurrentRowChildren[j].innerText == "") {
                                    CurrentRowChildren[j].innerText = "0";
                                }
                            }
                        }
                    }
                } else if (location.pathname == "/comparesource.php") {
                    if (UtilityEnabled("CompareSource")) {
                        if (location.search == "") {
                            document.querySelector("body > div.container > div").innerHTML = "";
                            let LeftCodeText = document.createElement("span");
                            document.querySelector("body > div.container > div").appendChild(LeftCodeText);
                            LeftCodeText.innerText = "左侧代码的运行编号:";
                            let LeftCode = document.createElement("input");
                            document.querySelector("body > div.container > div").appendChild(LeftCode);
                            LeftCode.classList.add("form-control");
                            LeftCode.style.width = "40%";
                            LeftCode.style.marginBottom = "5px";
                            let RightCodeText = document.createElement("span");
                            document.querySelector("body > div.container > div").appendChild(RightCodeText);
                            RightCodeText.innerText = "右侧代码的运行编号:";
                            let RightCode = document.createElement("input");
                            document.querySelector("body > div.container > div").appendChild(RightCode);
                            RightCode.classList.add("form-control");
                            RightCode.style.width = "40%";
                            RightCode.style.marginBottom = "5px";
                            let CompareButton = document.createElement("button");
                            document.querySelector("body > div.container > div").appendChild(CompareButton);
                            CompareButton.innerText = "比较";
                            CompareButton.className = "btn btn-primary";
                            CompareButton.addEventListener("click", () => {
                                location.href = "https://www.xmoj.tech/comparesource.php?left=" + Number(LeftCode.value) + "&right=" + Number(RightCode.value);
                            });
                        } else {
                            document.querySelector("body > div > div.mt-3").innerHTML = `
                        <div class="form-check">
                            <input class="form-check-input" type="checkbox" checked id="IgnoreWhitespace">
                            <label class="form-check-label" for="IgnoreWhitespace">忽略空白</label>
                        </div>
                        <div id="CompareElement"></div>`;

                            let LeftCode = "";
                            await fetch("https://www.xmoj.tech/getsource.php?id=" + SearchParams.get("left"))
                                .then((Response) => {
                                    return Response.text();
                                }).then((Response) => {
                                    LeftCode = Response.substring(0, Response.indexOf("/**************************************************************")).trim();
                                });
                            let RightCode = "";
                            await fetch("https://www.xmoj.tech/getsource.php?id=" + SearchParams.get("right"))
                                .then((Response) => {
                                    return Response.text();
                                }).then((Response) => {
                                    RightCode = Response.substring(0, Response.indexOf("/**************************************************************")).trim();
                                });

                            let MergeViewElement = CodeMirror.MergeView(CompareElement, {
                                value: LeftCode,
                                origLeft: null,
                                orig: RightCode,
                                lineNumbers: true,
                                mode: "text/x-c++src",
                                collapseIdentical: "true",
                                readOnly: true,
                                theme: (UtilityEnabled("DarkMode") ? "darcula" : "default"),
                                revertButtons: false,
                                ignoreWhitespace: true
                            });

                            IgnoreWhitespace.addEventListener("change", () => {
                                MergeViewElement.ignoreWhitespace = ignorews.checked;
                            });
                        }
                    }
                } else if (location.pathname == "/loginpage.php") {
                    if (UtilityEnabled("NewBootstrap")) {
                        document.querySelector("#login").innerHTML = `<form id="login" action="login.php" method="post">
            <div class="row g-3 align-items-center mb-3">
                <div class="col-auto">
                <label for="user_id" class="col-form-label">用户名(学号)</label>
                </div>
                <div class="col-auto">
                <input type="text" id="user_id" name="user_id" class="form-control">
                </div>
            </div>
            <div class="row g-3 align-items-center mb-3">
                <div class="col-auto">
                <label for="password" class="col-form-label">密码</label>
                </div>
                <div class="col-auto">
                <input type="password" id="password" name="password" class="form-control">
                </div>
            </div>
            <div class="row g-3 align-items-center mb-3">
                <div class="col-auto">
                <button name="submit" type="button" class="btn btn-primary">登录</button>
                </div>
                <div class="col-auto">
                <a class="btn btn-warning" href="https://www.xmoj.tech/lostpassword.php">忘记密码</a>
                </div>
            </div>
            </form > `;
                    }
                    let ErrorText = document.createElement("div");
                    ErrorText.style.color = "red";
                    ErrorText.style.marginBottom = "5px";
                    document.querySelector("#login").appendChild(ErrorText);
                    let LoginButton = document.getElementsByName("submit")[0];
                    LoginButton.addEventListener("click", async () => {
                        let Username = document.getElementsByName("user_id")[0].value;
                        let Password = document.getElementsByName("password")[0].value;
                        if (Username == "" || Password == "") {
                            ErrorText.innerText = "用户名或密码不能为空";
                        } else {
                            await fetch("https://www.xmoj.tech/login.php", {
                                method: "POST", headers: {
                                    "Content-Type": "application/x-www-form-urlencoded"
                                }, body: "user_id=" + encodeURIComponent(Username) + "&password=" + hex_md5(Password)
                            })
                                .then((Response) => {
                                    return Response.text();
                                })
                                .then((Response) => {
                                    if (UtilityEnabled("LoginFailed")) {
                                        if (Response.indexOf("history.go(-2);") != -1) {
                                            if (UtilityEnabled("SavePassword")) {
                                                localStorage.setItem("UserScript-Username", Username);
                                                localStorage.setItem("UserScript-Password", Password);
                                            }
                                            let NewPage = localStorage.getItem("UserScript-LastPage");
                                            if (NewPage == null) {
                                                NewPage = "https://www.xmoj.tech/index.php";
                                            }
                                            location.href = NewPage;
                                        } else {
                                            if (UtilityEnabled("SavePassword")) {
                                                localStorage.removeItem("UserScript-Username");
                                                localStorage.removeItem("UserScript-Password");
                                            }
                                            Response = Response.substring(Response.indexOf("alert('") + 7);
                                            Response = Response.substring(0, Response.indexOf("');"));
                                            if (Response == "UserName or Password Wrong!") {
                                                ErrorText.innerText = "用户名或密码错误!";
                                            } else {
                                                ErrorText.innerText = Response;
                                            }
                                        }
                                    } else {
                                        document.innerHTML = Response;
                                    }
                                });
                        }
                    });
                    if (UtilityEnabled("SavePassword") && localStorage.getItem("UserScript-Username") != null && localStorage.getItem("UserScript-Password") != null) {
                        document.querySelector("#login > div:nth-child(1) > div > input").value = localStorage.getItem("UserScript-Username");
                        document.querySelector("#login > div:nth-child(2) > div > input").value = localStorage.getItem("UserScript-Password");
                        LoginButton.click();
                    }
                } else if (location.pathname == "/contest_video.php" || location.pathname == "/problem_video.php") {
                    let ScriptData = document.querySelector("body > div > div.mt-3 > center > script").innerHTML;
                    if (document.getElementById("J_prismPlayer0").innerHTML != "") {
                        document.getElementById("J_prismPlayer0").innerHTML = "";
                        if (player) {
                            player.dispose();
                        }
                        eval(ScriptData);
                    }
                    if (UtilityEnabled("DownloadPlayback")) {
                        ScriptData = ScriptData.substring(ScriptData.indexOf("{"));
                        ScriptData = ScriptData.substring(0, ScriptData.indexOf("}") + 1);
                        ScriptData = ScriptData.replace(/([a-zA-Z0-9]+) ?:/g, "\"$1\":");
                        ScriptData = ScriptData.replace(/'/g, "\"");
                        let VideoData = JSON.parse(ScriptData);
                        let RandomUUID = () => {
                            let t = "0123456789abcdef";
                            let e = [];
                            for (let r = 0; r < 36; r++) e[r] = t.substr(Math.floor(16 * Math.random()), 1);
                            e[14] = "4";
                            e[19] = t.substr(3 & e[19] | 8, 1);
                            e[8] = e[13] = e[18] = e[23] = "-";
                            return e.join("");
                        };
                        let URLParams = new URLSearchParams({
                            "AccessKeyId": VideoData.accessKeyId,
                            "Action": "GetPlayInfo",
                            "VideoId": VideoData.vid,
                            "Formats": "",
                            "AuthTimeout": 7200,
                            "Rand": RandomUUID(),
                            "SecurityToken": VideoData.securityToken,
                            "StreamType": "video",
                            "Format": "JSON",
                            "Version": "2017-03-21",
                            "SignatureMethod": "HMAC-SHA1",
                            "SignatureVersion": "1.0",
                            "SignatureNonce": RandomUUID(),
                            "PlayerVersion": "2.9.3",
                            "Channel": "HTML5"
                        });
                        URLParams.sort();
                        await fetch("https://vod." + VideoData.region + ".aliyuncs.com/?" + URLParams.toString() + "&Signature=" + encodeURIComponent(CryptoJS.HmacSHA1("GET&%2F&" + encodeURIComponent(URLParams.toString()), VideoData.accessKeySecret + "&").toString(CryptoJS.enc.Base64)))
                            .then((Response) => {
                                return Response.json();
                            })
                            .then((Response) => {
                                let DownloadButton = document.createElement("a");
                                DownloadButton.className = "btn btn-outline-secondary";
                                DownloadButton.innerText = "下载";
                                DownloadButton.href = Response.PlayInfoList.PlayInfo[0].PlayURL;
                                DownloadButton.download = Response.VideoBase.Title;
                                document.querySelector("body > div > div.mt-3 > center").appendChild(DownloadButton);
                            });
                    }
                } else if (location.pathname == "/reinfo.php") {
                    document.title = "测试点信息: " + SearchParams.get("sid");
                    if (document.querySelector("#results > div") == undefined) {
                        document.querySelector("#results").parentElement.innerHTML = "没有测试点信息";
                    } else {
                        for (let i = 0; i < document.querySelector("#results > div").children.length; i++) {
                            let CurrentElement = document.querySelector("#results > div").children[i].children[0].children[0].children[0];
                            let Temp = CurrentElement.innerText.substring(0, CurrentElement.innerText.length - 2).split("/");
                            CurrentElement.innerText = TimeToStringTime(Temp[0]) + "/" + SizeToStringSize(Temp[1]);
                        }
                        if (document.getElementById("apply_data")) {
                            let ApplyDiv = document.getElementById("apply_data").parentElement;
                            console.log("启动!!!");
                            if (UtilityEnabled("ApplyData")) {
                                let GetDataButton = document.createElement("button");
                                GetDataButton.className = "ms-2 btn btn-outline-secondary";
                                GetDataButton.innerText = "获取数据";
                                console.log("按钮创建成功");
                                ApplyDiv.appendChild(GetDataButton);
                                GetDataButton.addEventListener("click", async () => {
                                    GetDataButton.disabled = true;
                                    GetDataButton.innerText = "正在获取数据...";
                                    let PID = localStorage.getItem("UserScript-Solution-" + SearchParams.get("sid") + "-Problem");
                                    if (PID == null) {
                                        GetDataButton.innerText = "失败! 无法获取PID";
                                        GetDataButton.disabled = false;
                                        await new Promise((resolve) => {
                                            setTimeout(resolve, 800);
                                        });
                                        GetDataButton.innerText = "获取数据";
                                        return;
                                    }
                                    let Code = "";
                                    if (localStorage.getItem(`UserScript-Problem-${PID}-IOFilename`) !== null) {
                                        Code = `#define IOFile "${localStorage.getItem(`UserScript-Problem-${PID}-IOFilename`)}"\n`;
                                    }
                                    Code += `//XMOJ-Script 获取数据代码
                            #include <bits/stdc++.h>
using namespace std;
string Base64Encode(string Input)
{
    const string Base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    string Output;
    for (int i = 0; i < Input.length(); i += 3)
    {
        Output.push_back(i + 0 > Input.length() ? '=' : Base64Chars[(Input[i + 0] & 0xfc) >> 2]);
        Output.push_back(i + 1 > Input.length() ? '=' : Base64Chars[((Input[i + 0] & 0x03) << 4) + ((Input[i + 1] & 0xf0) >> 4)]);
        Output.push_back(i + 2 > Input.length() ? '=' : Base64Chars[((Input[i + 1] & 0x0f) << 2) + ((Input[i + 2] & 0xc0) >> 6)]);
        Output.push_back(i + 3 > Input.length() ? '=' : Base64Chars[Input[i + 2] & 0x3f]);
    }
    return Output;
}
int main()
{
#ifdef IOFile
    freopen(IOFile ".in", "r", stdin);
    freopen(IOFile ".out", "w", stdout);
#endif
    string Input;
    while (1)
    {
        char Data = getchar();
        if (Data == EOF)
            break;
        Input.push_back(Data);
    }
    throw runtime_error("[" + Base64Encode(Input.c_str()) + "]");
    return 0;
}`;

                                    await fetch("https://www.xmoj.tech/submit.php", {
                                        "headers": {
                                            "content-type": "application/x-www-form-urlencoded"
                                        },
                                        "referrer": "https://www.xmoj.tech/submitpage.php?id=" + PID,
                                        "method": "POST",
                                        "body": "id=" + PID + "&" + "language=1&" + "source=" + encodeURIComponent(Code) + "&" + "enable_O2=on"
                                    });

                                    let SID = await fetch("https://www.xmoj.tech/status.php").then((Response) => {
                                        return Response.text();
                                    }).then((Response) => {
                                        let ParsedDocument = new DOMParser().parseFromString(Response, "text/html");
                                        return ParsedDocument.querySelector("#result-tab > tbody > tr:nth-child(1) > td:nth-child(2)").innerText;
                                    });

                                    await new Promise((Resolve) => {
                                        let Interval = setInterval(async () => {
                                            await fetch("status-ajax.php?solution_id=" + SID).then((Response) => {
                                                return Response.text();
                                            }).then((Response) => {
                                                if (Response.split(",")[0] >= 4) {
                                                    clearInterval(Interval);
                                                    Resolve();
                                                }
                                            });
                                        }, 500);
                                    });

                                    await fetch(`https://www.xmoj.tech/reinfo.php?sid=${SID}`).then((Response) => {
                                        return Response.text();
                                    }).then((Response) => {
                                        let ParsedDocument = new DOMParser().parseFromString(Response, "text/html");
                                        let ErrorData = ParsedDocument.getElementById("errtxt").innerText;
                                        let MatchResult = ErrorData.match(/\what\(\):  \[([A-Za-z0-9+\/=]+)\]/g);
                                        if (MatchResult === null) {
                                            GetDataButton.innerText = "获取数据失败";
                                            GetDataButton.disabled = false;
                                            return;
                                        }
                                        for (let i = 0; i < MatchResult.length; i++) {
                                            let Data = CryptoJS.enc.Base64.parse(MatchResult[i].substring(10, MatchResult[i].length - 1)).toString(CryptoJS.enc.Utf8);
                                            ApplyDiv.appendChild(document.createElement("hr"));
                                            ApplyDiv.appendChild(document.createTextNode("数据" + (i + 1) + ":"));
                                            let CodeElement = document.createElement("div");
                                            ApplyDiv.appendChild(CodeElement);
                                            CodeMirror(CodeElement, {
                                                value: Data,
                                                theme: (UtilityEnabled("DarkMode") ? "darcula" : "default"),
                                                lineNumbers: true,
                                                readOnly: true
                                            }).setSize("100%", "auto");
                                        }
                                        GetDataButton.innerText = "获取数据成功";
                                        GetDataButton.disabled = false;
                                    });
                                });
                            }
                            document.getElementById("apply_data").addEventListener("click", () => {
                                let ApplyElements = document.getElementsByClassName("data");
                                for (let i = 0; i < ApplyElements.length; i++) {
                                    ApplyElements[i].style.display = (ApplyElements[i].style.display == "block" ? "" : "block");
                                }
                            });
                        }
                        let ApplyElements = document.getElementsByClassName("data");
                        for (let i = 0; i < ApplyElements.length; i++) {
                            ApplyElements[i].addEventListener("click", async () => {
                                await fetch("https://www.xmoj.tech/data_distribute_ajax_apply.php", {
                                    method: "POST",
                                    headers: {
                                        "Content-Type": "application/x-www-form-urlencoded"
                                    },
                                    body: "user_id=" + CurrentUsername + "&" + "solution_id=" + SearchParams.get("sid") + "&" + "name=" + ApplyElements[i].getAttribute("name")
                                }).then((Response) => {
                                    return Response.json();
                                }).then((Response) => {
                                    ApplyElements[i].innerText = Response.msg;
                                    setTimeout(() => {
                                        ApplyElements[i].innerText = "申请数据";
                                    }, 1000);
                                });
                            });
                        }
                    }
                } else if (location.pathname == "/downloads.php") {
                    let SoftwareList = document.querySelector("body > div > ul");
                    SoftwareList.remove();
                    SoftwareList = document.createElement("ul");
                    SoftwareList.className = "software_list";
                    let Container = document.createElement("div");
                    document.querySelector("body > div").appendChild(Container);
                    Container.className = "mt-3";
                    Container.appendChild(SoftwareList);
                    if (UtilityEnabled("NewDownload")) {
                        let Softwares = [{
                            "Name": "Bloodshed Dev-C++",
                            "Image": "https://a.fsdn.com/allura/p/dev-cpp/icon",
                            "URL": "https://sourceforge.net/projects/dev-cpp/"
                        }, {
                            "Name": "DevC++ 5.11 TDM-GCC 4.9.2",
                            "Image": "https://www.xmoj.tech/image/devcpp.png",
                            "URL": "https://www.xmoj.tech/downloads/Dev-Cpp+5.11+TDM-GCC+4.9.2+Setup.exe"
                        }, {
                            "Name": "Orwell Dev-C++",
                            "Image": "https://a.fsdn.com/allura/p/orwelldevcpp/icon",
                            "URL": "https://sourceforge.net/projects/orwelldevcpp/"
                        }, {
                            "Name": "Embarcadero Dev-C++",
                            "Image": "https://a.fsdn.com/allura/s/embarcadero-dev-cpp/icon",
                            "URL": "https://sourceforge.net/software/product/Embarcadero-Dev-Cpp/"
                        }, {
                            "Name": "RedPanda C++",
                            "Image": "https://a.fsdn.com/allura/p/redpanda-cpp/icon",
                            "URL": "https://sourceforge.net/projects/redpanda-cpp/"
                        }, {
                            "Name": "CP Editor",
                            "Image": "https://a.fsdn.com/allura/mirror/cp-editor/icon?c35437565079e4135a985ba557ef2fdbe97de6bafb27aceafd76bc54490c26e3?&w=90",
                            "URL": "https://cpeditor.org/zh/download/"
                        }, {
                            "Name": "CLion",
                            "Image": "https://resources.jetbrains.com/storage/products/company/brand/logos/CLion_icon.png",
                            "URL": "https://www.jetbrains.com/clion/download"
                        }, {
                            "Name": "CP Editor",
                            "Image": "https://a.fsdn.com/allura/mirror/cp-editor/icon",
                            "URL": "https://sourceforge.net/projects/cp-editor.mirror/"
                        }, {
                            "Name": "Code::Blocks",
                            "Image": "https://a.fsdn.com/allura/p/codeblocks/icon",
                            "URL": "https://sourceforge.net/projects/codeblocks/"
                        }, {
                            "Name": "Visual Studio Code",
                            "Image": "https://code.visualstudio.com/favicon.ico",
                            "URL": "https://code.visualstudio.com/Download"
                        }, {
                            "Name": "Lazarus",
                            "Image": "https://a.fsdn.com/allura/p/lazarus/icon",
                            "URL": "https://sourceforge.net/projects/lazarus/"
                        }, {
                            "Name": "Geany",
                            "Image": "https://www.geany.org/static/img/geany.svg",
                            "URL": "https://www.geany.org/download/releases/"
                        }, {
                            "Name": "NOI Linux",
                            "Image": "https://www.noi.cn/upload/resources/image/2021/07/16/163780.jpg",
                            "URL": "https://www.noi.cn/gynoi/jsgz/2021-07-16/732450.shtml"
                        }, {
                            "Name": "VirtualBox",
                            "Image": "https://www.virtualbox.org/graphics/vbox_logo2_gradient.png",
                            "URL": "https://www.virtualbox.org/wiki/Downloads"
                        }, {
                            "Name": "MinGW",
                            "Image": "https://www.mingw-w64.org/logo.svg",
                            "URL": "https://sourceforge.net/projects/mingw/"
                        }];
                        for (let i = 0; i < Softwares.length; i++) {
                            SoftwareList.innerHTML += "<li class=\"software_item\">" + "<a href=\"" + Softwares[i].URL + "\">" + "<div class=\"item-info\">" + "<div class=\"item-img\">" + "<img height=\"50\" src=\"" + Softwares[i].Image + "\" alt=\"点击下载\">" + "</div>" + "<div class=\"item-txt\">" + Softwares[i].Name + "</div>" + "</div>" + "</a>" + "</li>";
                        }
                    }
                } else if (location.pathname == "/problemstatus.php") {
                    document.querySelector("body > div > div.mt-3 > center").insertBefore(document.querySelector("#statics"), document.querySelector("body > div > div.mt-3 > center > table"));
                    document.querySelector("body > div > div.mt-3 > center").insertBefore(document.querySelector("#problemstatus"), document.querySelector("body > div > div.mt-3 > center > table"));

                    document.querySelector("body > div > div.mt-3 > center > table:nth-child(3)").remove();
                    let Temp = document.querySelector("#statics").rows;
                    for (let i = 0; i < Temp.length; i++) {
                        Temp[i].removeAttribute("class");
                    }

                    document.querySelector("#problemstatus > thead > tr").innerHTML = document.querySelector("#problemstatus > thead > tr").innerHTML.replaceAll("td", "th");
                    document.querySelector("#problemstatus > thead > tr > th:nth-child(2)").innerText = "运行编号";
                    document.querySelector("#problemstatus > thead > tr > th:nth-child(4)").remove();
                    document.querySelector("#problemstatus > thead > tr > th:nth-child(4)").remove();
                    document.querySelector("#problemstatus > thead > tr > th:nth-child(4)").remove();
                    document.querySelector("#problemstatus > thead > tr > th:nth-child(4)").remove();
                    Temp = document.querySelector("#problemstatus > thead > tr").children;
                    for (let i = 0; i < Temp.length; i++) {
                        Temp[i].removeAttribute("class");
                    }
                    Temp = document.querySelector("#problemstatus > tbody").children;
                    for (let i = 0; i < Temp.length; i++) {
                        if (Temp[i].children[5].children[0] != null) {
                            Temp[i].children[1].innerHTML = `<a href="${Temp[i].children[5].children[0].href}">${escapeHTML(Temp[i].children[1].innerText.trim())}</a>`;
                        }
                        GetUsernameHTML(Temp[i].children[2], Temp[i].children[2].innerText);
                        Temp[i].children[3].remove();
                        Temp[i].children[3].remove();
                        Temp[i].children[3].remove();
                        Temp[i].children[3].remove();
                    }


                    let CurrentPage = parseInt(SearchParams.get("page") || 0);
                    let PID = Number(SearchParams.get("id"));
                    document.title = "问题 " + PID + " 状态";
                    let Pagination = `<nav class="center"><ul class="pagination justify-content-center">`;
                    if (CurrentPage !== 0) {
                        Pagination += `<li class="page-item"><a href="https://www.xmoj.tech/problemstatus.php?id=${PID + `&page=0" class="page-link">&laquo;</a></li><li class="page-item"><a href="https://www.xmoj.tech/problemstatus.php?id=` + PID + `&page=` + (CurrentPage - 1) + `" class="page-link">` + (CurrentPage)}</a></li>`;
                    }
                    Pagination += `<li class="active page-item"><a href="https://www.xmoj.tech/problemstatus.php?id=${PID + `&page=` + CurrentPage + `" class="page-link">` + (CurrentPage + 1)}</a></li>`;
                    if (document.querySelector("#problemstatus > tbody").children != null && document.querySelector("#problemstatus > tbody").children.length == 20) {
                        Pagination += `<li class="page-item"><a href="https://www.xmoj.tech/problemstatus.php?id=${PID + `&page=` + (CurrentPage + 1) + `" class="page-link">` + (CurrentPage + 2) + `</a></li><li class="page-item"><a href="https://www.xmoj.tech/problemstatus.php?id=` + PID + `&page=` + (CurrentPage + 1)}" class="page-link">&raquo;</a></li>`;
                    }
                    Pagination += `</ul></nav>`;
                    document.querySelector("body > div > div.mt-3 > center").innerHTML += Pagination;
                } else if (location.pathname == "/problem_solution.php") {
                    if (UtilityEnabled("RemoveUseless")) {
                        document.querySelector("h2.lang_en").remove(); //fixes #332
                    }
                    if (UtilityEnabled("CopyMD")) {
                        await fetch(location.href).then((Response) => {
                            return Response.text();
                        }).then((Response) => {
                            let ParsedDocument = new DOMParser().parseFromString(Response, "text/html");
                            let CopyMDButton = document.createElement("button");
                            CopyMDButton.className = "btn btn-sm btn-outline-secondary copy-btn";
                            CopyMDButton.innerText = "复制";
                            CopyMDButton.style.marginLeft = "10px";
                            CopyMDButton.type = "button";
                            document.querySelector("body > div > div.mt-3 > center > h2").appendChild(CopyMDButton);
                            CopyMDButton.addEventListener("click", () => {
                                GM_setClipboard(ParsedDocument.querySelector("body > div > div > div").innerText.trim().replaceAll("\n\t", "\n").replaceAll("\n\n", "\n"));
                                CopyMDButton.innerText = "复制成功";
                                setTimeout(() => {
                                    CopyMDButton.innerText = "复制";
                                }, 1000);
                            });
                        });
                    }
                    let Temp = document.getElementsByClassName("prettyprint");
                    for (let i = 0; i < Temp.length; i++) {
                        let Code = Temp[i].innerText;
                        Temp[i].outerHTML = `<textarea class="prettyprint"></textarea>`;
                        Temp[i].value = Code;
                    }
                    for (let i = 0; i < Temp.length; i++) {
                        CodeMirror.fromTextArea(Temp[i], {
                            lineNumbers: true,
                            mode: "text/x-c++src",
                            readOnly: true,
                            theme: (UtilityEnabled("DarkMode") ? "darcula" : "default")
                        }).setSize("100%", "auto");
                    }
                } else if (location.pathname == "/open_contest.php") {
                    let Temp = document.querySelector("body > div > div.mt-3 > div > div.col-md-8").children;
                    let NewsData = [];
                    for (let i = 0; i < Temp.length; i += 2) {
                        let Title = Temp[i].children[0].innerText;
                        let Time = 0;
                        if (Temp[i].children[1] != null) {
                            Time = Temp[i].children[1].innerText;
                        }
                        let Body = Temp[i + 1].innerHTML;
                        NewsData.push({"Title": Title, "Time": new Date(Time), "Body": Body});
                    }
                    document.querySelector("body > div > div.mt-3 > div > div.col-md-8").innerHTML = "";
                    for (let i = 0; i < NewsData.length; i++) {
                        let NewsRow = document.createElement("div");
                        NewsRow.className = "cnt-row";
                        let NewsRowHead = document.createElement("div");
                        NewsRowHead.className = "cnt-row-head title";
                        NewsRowHead.innerText = NewsData[i].Title;
                        if (NewsData[i].Time.getTime() != 0) {
                            NewsRowHead.innerHTML += "<small class=\"ms-3\">" + NewsData[i].Time.toLocaleDateString() + "</small>";
                        }
                        NewsRow.appendChild(NewsRowHead);
                        let NewsRowBody = document.createElement("div");
                        NewsRowBody.className = "cnt-row-body";
                        NewsRowBody.innerHTML = NewsData[i].Body;
                        NewsRow.appendChild(NewsRowBody);
                        document.querySelector("body > div > div.mt-3 > div > div.col-md-8").appendChild(NewsRow);
                    }
                    let MyContestData = document.querySelector("body > div > div.mt-3 > div > div.col-md-4 > div:nth-child(2)").innerHTML;
                    let CountDownData = document.querySelector("#countdown_list").innerHTML;
                    document.querySelector("body > div > div.mt-3 > div > div.col-md-4").innerHTML = `<div class="cnt-row">
                        <div class="cnt-row-head title">我的月赛</div>
                        <div class="cnt-row-body">${MyContestData}</div>
                    </div>
                    <div class="cnt-row">
                        <div class="cnt-row-head title">倒计时</div>
                        <div class="cnt-row-body">${CountDownData}</div>
                    </div>`;
                } else if (location.pathname == "/showsource.php") {
                    let Code = "";
                    if (SearchParams.get("ByUserScript") == null) {
                        document.title = "查看代码: " + SearchParams.get("id");
                        await fetch("https://www.xmoj.tech/getsource.php?id=" + SearchParams.get("id"))
                            .then((Response) => {
                                return Response.text();
                            }).then((Response) => {
                                Code = Response.replace("\n<!--not cached-->\n", "");
                            });
                    } else {
                        document.title = "查看标程: " + SearchParams.get("pid");
                        if (localStorage.getItem("UserScript-LastUploadedStdTime") === undefined || new Date().getTime() - localStorage.getItem("UserScript-LastUploadedStdTime") > 1000 * 60 * 60 * 24 * 30) {
                            location.href = "https://www.xmoj.tech/userinfo.php?ByUserScript=1";
                        }
                        await new Promise((Resolve) => {
                            RequestAPI("GetStd", {
                                "ProblemID": Number(SearchParams.get("pid"))
                            }, (Response) => {
                                if (Response.Success) {
                                    Code = Response.Data.StdCode;
                                } else {
                                    Code = Response.Message;
                                }
                                Resolve();
                            });
                        });
                    }
                    document.querySelector("body > div > div.mt-3").innerHTML = `<textarea>${Code}</textarea>`;
                    CodeMirror.fromTextArea(document.querySelector("body > div > div.mt-3 > textarea"), {
                        lineNumbers: true,
                        mode: "text/x-c++src",
                        readOnly: true,
                        theme: (UtilityEnabled("DarkMode") ? "darcula" : "default")
                    }).setSize("100%", "auto");
                } else if (location.pathname == "/ceinfo.php") {
                    await fetch(location.href)
                        .then((Result) => {
                            return Result.text();
                        }).then((Result) => {
                            let ParsedDocument = new DOMParser().parseFromString(Result, "text/html");
                            document.querySelector("body > div > div.mt-3").innerHTML = "";
                            let CodeElement = document.createElement("div");
                            CodeElement.className = "mb-3";
                            document.querySelector("body > div > div.mt-3").appendChild(CodeElement);
                            CodeMirror(CodeElement, {
                                value: ParsedDocument.getElementById("errtxt").innerHTML.replaceAll("&lt;", "<").replaceAll("&gt;", ">"),
                                lineNumbers: true,
                                mode: "text/x-c++src",
                                readOnly: true,
                                theme: (UtilityEnabled("DarkMode") ? "darcula" : "default")
                            }).setSize("100%", "auto");
                        });
                } else if (location.pathname == "/problem_std.php") {
                    await fetch("https://www.xmoj.tech/problem_std.php?cid=" + SearchParams.get("cid") + "&pid=" + SearchParams.get("pid"))
                        .then((Response) => {
                            return Response.text();
                        }).then((Response) => {
                            let ParsedDocument = new DOMParser().parseFromString(Response, "text/html");
                            let Temp = ParsedDocument.getElementsByTagName("pre");
                            document.querySelector("body > div > div.mt-3").innerHTML = "";
                            for (let i = 0; i < Temp.length; i++) {
                                let CodeElement = document.createElement("div");
                                CodeElement.className = "mb-3";
                                document.querySelector("body > div > div.mt-3").appendChild(CodeElement);
                                CodeMirror(CodeElement, {
                                    value: Temp[i].innerText,
                                    lineNumbers: true,
                                    mode: "text/x-c++src",
                                    readOnly: true,
                                    theme: (UtilityEnabled("DarkMode") ? "darcula" : "default")
                                }).setSize("100%", "auto");
                            }
                        });
                } else if (location.pathname == "/mail.php") {
                    if (SearchParams.get("to_user") == null) {
                        document.querySelector("body > div > div.mt-3").innerHTML = `<div class="row g-2 align-items-center">
                        <div class="col-auto form-floating">
                            <input class="form-control" id="Username" placeholder=" " spellcheck="false" data-ms-editor="true">
                            <label for="Username">搜索新用户</label>
                        </div>
                        <div class="col-auto form-floating">
                            <button class="btn btn-outline-secondary" id="AddUser">
                                添加
                                <div class="spinner-border spinner-border-sm" role="status" style="display: none;">
                            </button>
                        </div>
                    </div>
                    <table class="table mb-3" id="ReceiveTable">
                        <thead>
                            <tr>
                                <td class="col-3">接收者</td>
                                <td class="col-7">最新消息</td>
                                <td class="col-2">最后联系时间</td>
                            </tr>
                        </thead>
                        <tbody></tbody>
                    </table>
                    <div class="alert alert-danger mb-3" role="alert" id="ErrorElement" style="display: none;"></div>`;
                        let RefreshMessageList = (Silent = true) => {
                            if (!Silent) {
                                ReceiveTable.children[1].innerHTML = "";
                                for (let i = 0; i < 10; i++) {
                                    let Row = document.createElement("tr");
                                    ReceiveTable.children[1].appendChild(Row);
                                    for (let j = 0; j < 3; j++) {
                                        let Cell = document.createElement("td");
                                        Row.appendChild(Cell);
                                        Cell.innerHTML = `<span class="placeholder col-${Math.ceil(Math.random() * 12)}"></span>`;
                                    }
                                }
                            }
                            RequestAPI("GetMailList", {}, async (ResponseData) => {
                                if (ResponseData.Success) {
                                    ErrorElement.style.display = "none";
                                    let Data = ResponseData.Data.MailList;
                                    ReceiveTable.children[1].innerHTML = "";
                                    for (let i = 0; i < Data.length; i++) {
                                        let Row = document.createElement("tr");
                                        ReceiveTable.children[1].appendChild(Row);
                                        let UsernameCell = document.createElement("td");
                                        Row.appendChild(UsernameCell);
                                        let UsernameSpan = document.createElement("span");
                                        UsernameCell.appendChild(UsernameSpan);
                                        GetUsernameHTML(UsernameSpan, Data[i].OtherUser, false, "https://www.xmoj.tech/mail.php?to_user=");
                                        if (Data[i].UnreadCount != 0) {
                                            let UnreadCountSpan = document.createElement("span");
                                            UsernameCell.appendChild(UnreadCountSpan);
                                            UnreadCountSpan.className = "ms-1 badge text-bg-danger";
                                            UnreadCountSpan.innerText = Data[i].UnreadCount;
                                        }
                                        let LastsMessageCell = document.createElement("td");
                                        Row.appendChild(LastsMessageCell);
                                        LastsMessageCell.innerText = replaceMarkdownImages(Data[i].LastsMessage, '[image]');
                                        let SendTimeCell = document.createElement("td");
                                        Row.appendChild(SendTimeCell);
                                        SendTimeCell.innerHTML = GetRelativeTime(Data[i].SendTime);
                                    }
                                } else {
                                    ErrorElement.innerText = ResponseData.Message;
                                    ErrorElement.style.display = "";
                                }
                            });
                        };
                        Username.addEventListener("input", () => {
                            Username.classList.remove("is-invalid");
                        });
                        AddUser.addEventListener("click", () => {
                            let UsernameData = Username.value;
                            if (UsernameData == "") {
                                Username.classList.add("is-invalid");
                                return;
                            }
                            AddUser.children[0].style.display = "";
                            AddUser.disabled = true;
                            RequestAPI("SendMail", {
                                "ToUser": String(UsernameData),
                                "Content": String("您好,我是" + localStorage.getItem("UserScript-Username"))
                            }, (ResponseData) => {
                                AddUser.children[0].style.display = "none";
                                AddUser.disabled = false;
                                if (ResponseData.Success) {
                                    ErrorElement.style.display = "none";
                                    RefreshMessageList();
                                } else {
                                    ErrorElement.innerText = ResponseData.Message;
                                    ErrorElement.style.display = "";
                                }
                            });
                        });
                        RefreshMessageList(false);
                        addEventListener("focus", RefreshMessageList);
                    } else {
                        document.querySelector("body > div > div.mt-3").innerHTML = `<div class="row g-2 mb-3">
                        <div class="col-md form-floating">
                            <div class="form-control" id="ToUser"></div>
                            <label for="ToUser">接收用户</label>
                        </div>
                        <div class="col-md form-floating">
                            <input spellcheck="true" class="form-control" id="Content" placeholder=" ">
                            <label for="Content">内容</label>
                        </div>
                    </div>
                    <button id="Send" type="submit" class="btn btn-primary mb-1">
                        发送
                        <div class="spinner-border spinner-border-sm" role="status" style="display: none;">
                    </button>
                    <div id="ErrorElement" class="alert alert-danger mb-3" role="alert" style="display: none;"></div>
                    <table class="table mb-3" id="MessageTable">
                        <thead>
                            <tr>
                                <td class="col-3">发送者</td>
                                <td class="col-7">内容</td>
                                <td class="col-1">发送时间</td>
                                <td class="col-1">阅读状态</td>
                            </tr>
                        </thead>
                        <tbody></tbody>
                    </table>`;
                        GetUsernameHTML(ToUser, SearchParams.get("to_user"));
                        let RefreshMessage = (Silent = true) => {
                            if (!Silent) {
                                MessageTable.children[1].innerHTML = "";
                                for (let i = 0; i < 10; i++) {
                                    let Row = document.createElement("tr");
                                    MessageTable.children[1].appendChild(Row);
                                    for (let j = 0; j < 4; j++) {
                                        let Cell = document.createElement("td");
                                        Row.appendChild(Cell);
                                        Cell.innerHTML = `<span class="placeholder col-${Math.ceil(Math.random() * 12)}"></span>`;
                                    }
                                }
                            }
                            RequestAPI("ReadUserMailMention", {
                                "UserID": String(SearchParams.get("to_user"))
                            });
                            RequestAPI("GetMail", {
                                "OtherUser": String(SearchParams.get("to_user"))
                            }, async (ResponseData) => {
                                if (ResponseData.Success) {
                                    ErrorElement.style.display = "none";
                                    let Data = ResponseData.Data.Mail;
                                    MessageTable.children[1].innerHTML = "";
                                    for (let i = 0; i < Data.length; i++) {
                                        let Row = document.createElement("tr");
                                        MessageTable.children[1].appendChild(Row);
                                        if (!Data[i].IsRead && Data[i].FromUser != CurrentUsername) {
                                            Row.className = "table-info";
                                        }
                                        let UsernameCell = document.createElement("td");
                                        Row.appendChild(UsernameCell);
                                        GetUsernameHTML(UsernameCell, Data[i].FromUser);
                                        let ContentCell = document.createElement("td");
                                        let ContentDiv = document.createElement("div");
                                        ContentDiv.style.display = "flex";
                                        ContentDiv.style.maxWidth = window.innerWidth - 300 + "px";
                                        ContentDiv.style.maxHeight = "500px";
                                        ContentDiv.style.overflowX = "auto";
                                        ContentDiv.style.overflowY = "auto";
                                        ContentDiv.innerHTML = PurifyHTML(marked.parse(Data[i].Content));
                                        let mediaElements = ContentDiv.querySelectorAll('img, video');
                                        for (let media of mediaElements) {
                                            media.style.objectFit = 'contain';
                                            media.style.maxWidth = '100%';
                                            media.style.maxHeight = '100%';
                                        }
                                        ContentCell.appendChild(ContentDiv);
                                        Row.appendChild(ContentCell);
                                        let SendTimeCell = document.createElement("td");
                                        Row.appendChild(SendTimeCell);
                                        SendTimeCell.innerHTML = GetRelativeTime(Data[i].SendTime);
                                        let IsReadCell = document.createElement("td");
                                        Row.appendChild(IsReadCell);
                                        IsReadCell.innerHTML = (Data[i].IsRead ? "已读" : "未读");
                                    }
                                } else {
                                    ErrorElement.innerText = ResponseData.Message;
                                    ErrorElement.style.display = "";
                                }
                            });
                        };
                        Content.addEventListener("input", () => {
                            Content.classList.remove("is-invalid");
                        });
                        Content.addEventListener("paste", (EventData) => {
                            let Items = EventData.clipboardData.items;
                            if (Items.length !== 0) {
                                for (let i = 0; i < Items.length; i++) {
                                    if (Items[i].type.indexOf("image") != -1) {
                                        let Reader = new FileReader();
                                        Reader.readAsDataURL(Items[i].getAsFile());
                                        Reader.onload = () => {
                                            let Before = Content.value.substring(0, Content.selectionStart);
                                            let After = Content.value.substring(Content.selectionEnd, Content.value.length);
                                            const UploadMessage = "![正在上传图片...]()";
                                            Content.value = Before + UploadMessage + After;
                                            Content.dispatchEvent(new Event("input"));
                                            RequestAPI("UploadImage", {
                                                "Image": Reader.result
                                            }, (ResponseData) => {
                                                if (ResponseData.Success) {
                                                    Content.value = Before + `![](https://assets.xmoj-bbs.me/GetImage?ImageID=${ResponseData.Data.ImageID})` + After;
                                                    Content.dispatchEvent(new Event("input"));
                                                } else {
                                                    Content.value = Before + `![上传失败!` + ResponseData.Message + `]()` + After;
                                                    Content.dispatchEvent(new Event("input"));
                                                }
                                            });
                                        };
                                    }
                                }
                            }
                        });
                        Content.addEventListener("keydown", (Event) => {
                            if (Event.keyCode == 13) {
                                Send.click();
                            }
                        });
                        Send.addEventListener("click", () => {
                            if (Content.value == "") {
                                Content.classList.add("is-invalid");
                                return;
                            }
                            Send.disabled = true;
                            Send.children[0].style.display = "";
                            let ContentData = Content.value;
                            RequestAPI("SendMail", {
                                "ToUser": String(SearchParams.get("to_user")), "Content": String(ContentData)
                            }, (ResponseData) => {
                                Send.disabled = false;
                                Send.children[0].style.display = "none";
                                if (ResponseData.Success) {
                                    ErrorElement.style.display = "none";
                                    Content.value = "";
                                    RefreshMessage();
                                } else {
                                    ErrorElement.innerText = ResponseData.Message;
                                    ErrorElement.style.display = "";
                                }
                            });
                        });
                        RefreshMessage(false);
                        addEventListener("focus", RefreshMessage);
                    }
                } else if (location.pathname.indexOf("/discuss3") != -1) {
                    if (UtilityEnabled("Discussion")) {
                        Discussion.classList.add("active");
                        if (location.pathname == "/discuss3/discuss.php") {
                            document.title = "讨论列表";
                            let ProblemID = parseInt(SearchParams.get("pid"));
                            let BoardID = parseInt(SearchParams.get("bid"));
                            let Page = Number(SearchParams.get("page")) || 1;
                            document.querySelector("body > div > div").innerHTML = `<h3>讨论列表${(isNaN(ProblemID) ? "" : ` - 题目` + ProblemID)}</h3>
                    <button id="NewPost" type="button" class="btn btn-primary">发布新讨论</button>
                    <nav>
                    <ul class="pagination justify-content-center" id="DiscussPagination">
                    <li class="page-item"><a class="page-link" href="#"><span>&laquo;</span></a></li>
                    <li class="page-item"><a class="page-link" href="#">${Page - 1}</a></li>
                    <li class="page-item"><a class="page-link active" href="#">${Page}</a></li>
                    <li class="page-item"><a class="page-link" href="#">${Page + 1}</a></li>
                    <li class="page-item"><a class="page-link" href="#"><span>&raquo;</span></a></li>
                    </ul>
                    </nav>
                    <div id="GotoBoard"></div>
                    <div id="ErrorElement" class="alert alert-danger" role="alert" style="display: none;"></div>
                    <table id="PostList" class="table table-hover">
                        <thead>
                            <tr>
                                <th class="col-1">编号</th>
                                <th class="col-3">标题</th>
                                <th class="col-3">作者</th>
                                <th class="col-1">题目编号</th>
                                <th class="col-1">发布时间</th>
                                <th class="col-1">回复数</th>
                                <th class="col-1">最后回复</th>
                            </tr>
                        </thead>
                        <tbody>
                        </tbody>
                    </table>`;
                            NewPost.addEventListener("click", () => {
                                if (!isNaN(ProblemID)) {
                                    location.href = "https://www.xmoj.tech/discuss3/newpost.php?pid=" + ProblemID;
                                } else if (SearchParams.get("bid") != null) {
                                    location.href = "https://www.xmoj.tech/discuss3/newpost.php?bid=" + SearchParams.get("bid");
                                } else {
                                    location.href = "https://www.xmoj.tech/discuss3/newpost.php";
                                }
                            });
                            const RefreshPostList = (Silent = true) => {
                                if (!Silent) {
                                    PostList.children[1].innerHTML = "";
                                    for (let i = 0; i < 10; i++) {
                                        let Row = document.createElement("tr");
                                        PostList.children[1].appendChild(Row);
                                        for (let j = 0; j < 7; j++) {
                                            let Cell = document.createElement("td");
                                            Row.appendChild(Cell);
                                            Cell.innerHTML = `<span class="placeholder col-${Math.ceil(Math.random() * 12)}"></span>`;
                                        }
                                    }
                                }
                                RequestAPI("GetPosts", {
                                    "ProblemID": Number(ProblemID || 0),
                                    "Page": Number(Page),
                                    "BoardID": Number(SearchParams.get("bid") || -1)
                                }, async (ResponseData) => {
                                    if (ResponseData.Success == true) {
                                        ErrorElement.style.display = "none";
                                        if (!Silent) {
                                            DiscussPagination.children[0].children[0].href = "https://www.xmoj.tech/discuss3/discuss.php?" + (isNaN(ProblemID) ? "" : "pid=" + ProblemID + "&") + (isNaN(BoardID) ? "" : "bid=" + BoardID + "&") + "page=1";
                                            DiscussPagination.children[1].children[0].href = "https://www.xmoj.tech/discuss3/discuss.php?" + (isNaN(ProblemID) ? "" : "pid=" + ProblemID + "&") + (isNaN(BoardID) ? "" : "bid=" + BoardID + "&") + "page=" + (Page - 1);
                                            DiscussPagination.children[2].children[0].href = "https://www.xmoj.tech/discuss3/discuss.php?" + (isNaN(ProblemID) ? "" : "pid=" + ProblemID + "&") + (isNaN(BoardID) ? "" : "bid=" + BoardID + "&") + "page=" + Page;
                                            DiscussPagination.children[3].children[0].href = "https://www.xmoj.tech/discuss3/discuss.php?" + (isNaN(ProblemID) ? "" : "pid=" + ProblemID + "&") + (isNaN(BoardID) ? "" : "bid=" + BoardID + "&") + "page=" + (Page + 1);
                                            DiscussPagination.children[4].children[0].href = "https://www.xmoj.tech/discuss3/discuss.php?" + (isNaN(ProblemID) ? "" : "pid=" + ProblemID + "&") + (isNaN(BoardID) ? "" : "bid=" + BoardID + "&") + "page=" + ResponseData.Data.PageCount;
                                            if (Page <= 1) {
                                                DiscussPagination.children[0].classList.add("disabled");
                                                DiscussPagination.children[1].remove();
                                            }
                                            if (Page >= ResponseData.Data.PageCount) {
                                                DiscussPagination.children[DiscussPagination.children.length - 1].classList.add("disabled");
                                                DiscussPagination.children[DiscussPagination.children.length - 2].remove();
                                            }
                                        }
                                        let Posts = ResponseData.Data.Posts;
                                        PostList.children[1].innerHTML = "";
                                        if (Posts.length == 0) {
                                            PostList.children[1].innerHTML = `<tr><td colspan="7">暂无数据</td></tr>`;
                                        }
                                        for (let i = 0; i < Posts.length; i++) {
                                            let Row = document.createElement("tr");
                                            PostList.children[1].appendChild(Row);
                                            let IDCell = document.createElement("td");
                                            Row.appendChild(IDCell);
                                            IDCell.innerText = Posts[i].PostID + " " + Posts[i].BoardName;
                                            let TitleCell = document.createElement("td");
                                            Row.appendChild(TitleCell);
                                            let TitleLink = document.createElement("a");
                                            TitleCell.appendChild(TitleLink);
                                            TitleLink.href = "https://www.xmoj.tech/discuss3/thread.php?tid=" + Posts[i].PostID;
                                            if (Posts[i].Lock.Locked) {
                                                TitleLink.classList.add("link-secondary");
                                                TitleLink.innerHTML = "🔒 ";
                                            }
                                            TitleLink.innerHTML += Posts[i].Title;
                                            let AuthorCell = document.createElement("td");
                                            Row.appendChild(AuthorCell);
                                            GetUsernameHTML(AuthorCell, Posts[i].UserID);
                                            let ProblemIDCell = document.createElement("td");
                                            Row.appendChild(ProblemIDCell);
                                            if (Posts[i].ProblemID != 0) {
                                                let ProblemIDLink = document.createElement("a");
                                                ProblemIDCell.appendChild(ProblemIDLink);
                                                ProblemIDLink.href = "https://www.xmoj.tech/problem.php?id=" + Posts[i].ProblemID;
                                                ProblemIDLink.innerText = Posts[i].ProblemID;
                                            }
                                            let PostTimeCell = document.createElement("td");
                                            Row.appendChild(PostTimeCell);
                                            PostTimeCell.innerHTML = GetRelativeTime(Posts[i].PostTime);
                                            let ReplyCountCell = document.createElement("td");
                                            Row.appendChild(ReplyCountCell);
                                            ReplyCountCell.innerText = Posts[i].ReplyCount;
                                            let LastReplyTimeCell = document.createElement("td");
                                            Row.appendChild(LastReplyTimeCell);
                                            LastReplyTimeCell.innerHTML = GetRelativeTime(Posts[i].LastReplyTime);
                                        }
                                    } else {
                                        ErrorElement.innerText = ResponseData.Message;
                                        ErrorElement.style.display = "block";
                                    }
                                });
                            };
                            RefreshPostList(false);
                            addEventListener("focus", RefreshPostList);
                            RequestAPI("GetBoards", {}, (ResponseData) => {
                                if (ResponseData.Success === true) {
                                    let LinkElement = document.createElement("a");
                                    LinkElement.href = "https://www.xmoj.tech/discuss3/discuss.php";
                                    LinkElement.classList.add("me-2");
                                    LinkElement.innerText = "全部";
                                    GotoBoard.appendChild(LinkElement);
                                    for (let i = 0; i < ResponseData.Data.Boards.length; i++) {
                                        let LinkElement = document.createElement("a");
                                        LinkElement.href = "https://www.xmoj.tech/discuss3/discuss.php?bid=" + ResponseData.Data.Boards[i].BoardID;
                                        LinkElement.classList.add("me-2");
                                        LinkElement.innerText = ResponseData.Data.Boards[i].BoardName;
                                        GotoBoard.appendChild(LinkElement);
                                    }
                                }
                            });
                        } else if (location.pathname == "/discuss3/newpost.php") {
                            let ProblemID = parseInt(SearchParams.get("pid"));
                            document.querySelector("body > div > div").innerHTML = `<h3>发布新讨论` + (!isNaN(ProblemID) ? ` - 题目` + ProblemID : ``) + `</h3>
                    <div class="form-group mb-3" id="BoardSelect">
                        <label for="Board" class="mb-1">请选择要发布的板块</label>
                        <div class="row ps-3" id="Board">
                        </div>
                    </div>
                    <div class="form-group mb-3">
                        <label for="Title" class="mb-1">标题</label>
                        <input spellcheck="true" type="text" class="form-control" id="TitleElement" placeholder="请输入标题">
                    </div>
                    <div>
                        <label for="ContentElement" class="mb-1">回复</label>
                        <div class="input-group">
                            <textarea spellcheck="true" class="col-6 form-control" id="ContentElement" rows="3" placeholder="请输入内容"></textarea>
                            <div class="col-6 form-control" id="PreviewTab"></div>
                        </div>
                        <div class="cf-turnstile mt-2" id="CaptchaContainer"></div>
                        <button id="SubmitElement" type="button" class="btn btn-primary mb-2" disabled>
                            发布
                            <div class="spinner-border spinner-border-sm" role="status" style="display: none;">
                        </button>
                    </div>
                    <div id="ErrorElement" class="alert alert-danger" role="alert" style="display: none;"></div>`;
                            let CaptchaSecretKey = "";
                            unsafeWindow.CaptchaLoadedCallback = () => {
                                turnstile.render("#CaptchaContainer", {
                                    sitekey: CaptchaSiteKey, callback: function (CaptchaSecretKeyValue) {
                                        CaptchaSecretKey = CaptchaSecretKeyValue;
                                        SubmitElement.disabled = false;
                                    },
                                });
                            };
                            let TurnstileScript = document.createElement("script");
                            TurnstileScript.src = "https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit&onload=CaptchaLoadedCallback";
                            document.body.appendChild(TurnstileScript);
                            ContentElement.addEventListener("keydown", (Event) => {
                                if (Event.ctrlKey && Event.keyCode == 13) {
                                    SubmitElement.click();
                                }
                            });
                            ContentElement.addEventListener("input", () => {
                                ContentElement.classList.remove("is-invalid");
                                PreviewTab.innerHTML = PurifyHTML(marked.parse(ContentElement.value));
                                RenderMathJax();
                            });
                            TitleElement.addEventListener("input", () => {
                                TitleElement.classList.remove("is-invalid");
                            });
                            ContentElement.addEventListener("paste", (EventData) => {
                                let Items = EventData.clipboardData.items;
                                if (Items.length !== 0) {
                                    for (let i = 0; i < Items.length; i++) {
                                        if (Items[i].type.indexOf("image") != -1) {
                                            let Reader = new FileReader();
                                            Reader.readAsDataURL(Items[i].getAsFile());
                                            Reader.onload = () => {
                                                let Before = ContentElement.value.substring(0, ContentElement.selectionStart);
                                                let After = ContentElement.value.substring(ContentElement.selectionEnd, ContentElement.value.length);
                                                const UploadMessage = "![正在上传图片...]()";
                                                ContentElement.value = Before + UploadMessage + After;
                                                ContentElement.dispatchEvent(new Event("input"));
                                                RequestAPI("UploadImage", {
                                                    "Image": Reader.result
                                                }, (ResponseData) => {
                                                    if (ResponseData.Success) {
                                                        ContentElement.value = Before + `![](https://assets.xmoj-bbs.me/GetImage?ImageID=${ResponseData.Data.ImageID})` + After;
                                                        ContentElement.dispatchEvent(new Event("input"));
                                                    } else {
                                                        ContentElement.value = Before + `![上传失败!]()` + After;
                                                        ContentElement.dispatchEvent(new Event("input"));
                                                    }
                                                });
                                            };
                                        }
                                    }
                                }
                            });
                            SubmitElement.addEventListener("click", async () => {
                                ErrorElement.style.display = "none";
                                let Title = TitleElement.value;
                                let Content = ContentElement.value;
                                let ProblemID = parseInt(SearchParams.get("pid"));
                                if (Title === "") {
                                    TitleElement.classList.add("is-invalid");
                                    return;
                                }
                                if (Content === "") {
                                    ContentElement.classList.add("is-invalid");
                                    return;
                                }
                                if (document.querySelector("#Board input:checked") === null) {
                                    ErrorElement.innerText = "请选择要发布的板块";
                                    ErrorElement.style.display = "block";
                                    return;
                                }
                                SubmitElement.disabled = true;
                                SubmitElement.children[0].style.display = "inline-block";
                                RequestAPI("NewPost", {
                                    "Title": String(Title),
                                    "Content": String(Content),
                                    "ProblemID": Number(isNaN(ProblemID) ? 0 : ProblemID),
                                    "CaptchaSecretKey": String(CaptchaSecretKey),
                                    "BoardID": Number(document.querySelector("#Board input:checked").value)
                                }, (ResponseData) => {
                                    SubmitElement.disabled = false;
                                    SubmitElement.children[0].style.display = "none";
                                    if (ResponseData.Success == true) {
                                        location.href = "https://www.xmoj.tech/discuss3/thread.php?tid=" + ResponseData.Data.PostID;
                                    } else {
                                        ErrorElement.innerText = ResponseData.Message;
                                        ErrorElement.style.display = "block";
                                    }
                                });
                            });
                            RequestAPI("GetBoards", {}, (ResponseData) => {
                                if (ResponseData.Success === true) {
                                    let Data = ResponseData.Data.Boards;
                                    for (let i = 0; i < Data.length; i++) {
                                        let RadioElement = document.createElement("div");
                                        RadioElement.className = "col-auto form-check form-check-inline";
                                        let RadioInput = document.createElement("input");
                                        RadioInput.className = "form-check-input";
                                        RadioInput.type = "radio";
                                        RadioInput.name = "Board";
                                        RadioInput.id = "Board" + Data[i].BoardID;
                                        RadioInput.value = Data[i].BoardID;
                                        RadioElement.appendChild(RadioInput);
                                        if (SearchParams.get("bid") !== null && SearchParams.get("bid") == Data[i].BoardID) {
                                            RadioInput.checked = true;
                                        }
                                        if (!isNaN(ProblemID)) {
                                            RadioInput.disabled = true;
                                        }
                                        if (Data[i].BoardID == 4) {
                                            if (!isNaN(ProblemID)) RadioInput.checked = true;
                                            RadioInput.disabled = true;
                                        }
                                        let RadioLabel = document.createElement("label");
                                        RadioLabel.className = "form-check-label";
                                        RadioLabel.htmlFor = "Board" + Data[i].BoardID;
                                        RadioLabel.innerText = Data[i].BoardName;
                                        RadioElement.appendChild(RadioLabel);
                                        Board.appendChild(RadioElement);
                                    }
                                }
                            });
                        } else if (location.pathname == "/discuss3/thread.php") {
                            if (SearchParams.get("tid") == null) {
                                location.href = "https://www.xmoj.tech/discuss3/discuss.php";
                            } else {
                                let ThreadID = SearchParams.get("tid");
                                let Page = Number(SearchParams.get("page")) || 1;
                                document.querySelector("body > div > div").innerHTML = `<h3 id="PostTitle"></h3>
                        <div class="row mb-3">
                            <span class="col-5 text-muted">作者:<div style="display: inline-block;" id="PostAuthor"></div></span>
                            <span class="col-3 text-muted">发布时间:<span id="PostTime"></span></span>
                            <span class="col-2 text-muted">板块:<span id="PostBoard"></span></span>
                            <span class="col-2">
                                <button id="Delete" type="button" class="btn btn-sm btn-danger" style="display: none;">
                                    删除
                                    <div class="spinner-border spinner-border-sm" role="status" style="display: none;">
                                </button>
                            </span>
                        </div>
                        <div id="PostReplies"></div>
                        <nav>
                            <ul class="pagination justify-content-center" id="DiscussPagination">
                                <li class="page-item"><a class="page-link" href="#"><span>&laquo;</span></a></li>
                                <li class="page-item"><a class="page-link" href="#">${(Page - 1)}</a></li>
                                <li class="page-item"><a class="page-link active" href="#">${Page}</a></li>
                                <li class="page-item"><a class="page-link" href="#">${(Page + 1)}</a></li>
                                <li class="page-item"><a class="page-link" href="#"><span>&raquo;</span></a></li>
                            </ul>
                        </nav>
                        <div>
                            <div class="container p-0 m-0">
                                <div class="row">
                                    <div class="col">
                                        <label for="ContentElement" class="mb-1">回复</label>
                                    </div>
                                    <div class="col">
                                        <div class="form-check form-switch" id="ToggleLock" style="display: none">
                                            <input class="form-check-input" type="checkbox" role="switch" id="ToggleLockButton">
                                            <label class="form-check-label" for="ToggleLockButton">锁定本讨论</label>
                                        </div>
                                    </div>
                                </div>
                            </div>
                            <div class="input-group">
                                <textarea spellcheck="true" class="col-6 form-control" id="ContentElement" rows="3" placeholder="请输入内容"></textarea>
                                <div class="col-6 form-control" id="PreviewTab"></div>
                            </div>
                            <div class="cf-turnstile mt-2" id="CaptchaContainer"></div>
                            <button id="SubmitElement" type="button" class="btn btn-primary mb-2" disabled>
                                发布
                                <div class="spinner-border spinner-border-sm" role="status" style="display: none;">
                            </button>
                        </div>
                        <div id="ErrorElement" class="alert alert-danger" role="alert" style="display: none;"></div>`;
                                let CaptchaSecretKey = "";
                                unsafeWindow.CaptchaLoadedCallback = () => {
                                    turnstile.render("#CaptchaContainer", {
                                        theme: UtilityEnabled("DarkMode") ? "dark" : "light", language: "zh-cn",
                                        sitekey: CaptchaSiteKey, callback: function (CaptchaSecretKeyValue) {
                                            CaptchaSecretKey = CaptchaSecretKeyValue;
                                            SubmitElement.disabled = false;
                                        },
                                    });
                                };
                                let TurnstileScript = document.createElement("script");
                                TurnstileScript.src = "https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit&onload=CaptchaLoadedCallback";
                                document.body.appendChild(TurnstileScript);
                                ContentElement.addEventListener("keydown", (Event) => {
                                    if (Event.ctrlKey && Event.keyCode == 13) {
                                        SubmitElement.click();
                                    }
                                });
                                ContentElement.addEventListener("input", () => {
                                    PreviewTab.innerHTML = PurifyHTML(marked.parse(ContentElement.value));
                                    RenderMathJax();
                                });
                                ContentElement.addEventListener("paste", (EventData) => {
                                    let Items = EventData.clipboardData.items;
                                    if (Items.length !== 0) {
                                        for (let i = 0; i < Items.length; i++) {
                                            if (Items[i].type.indexOf("image") != -1) {
                                                let Reader = new FileReader();
                                                Reader.readAsDataURL(Items[i].getAsFile());
                                                Reader.onload = () => {
                                                    let Before = ContentElement.value.substring(0, ContentElement.selectionStart);
                                                    let After = ContentElement.value.substring(ContentElement.selectionEnd, ContentElement.value.length);
                                                    const UploadMessage = "![正在上传图片...]()";
                                                    ContentElement.value = Before + UploadMessage + After;
                                                    ContentElement.dispatchEvent(new Event("input"));
                                                    RequestAPI("UploadImage", {
                                                        "Image": Reader.result
                                                    }, (ResponseData) => {
                                                        if (ResponseData.Success) {
                                                            ContentElement.value = Before + `![](https://assets.xmoj-bbs.me/GetImage?ImageID=${ResponseData.Data.ImageID})` + After;
                                                            ContentElement.dispatchEvent(new Event("input"));
                                                        } else {
                                                            ContentElement.value = Before + `![上传失败!]()` + After;
                                                            ContentElement.dispatchEvent(new Event("input"));
                                                        }
                                                    });
                                                };
                                            }
                                        }
                                    }
                                });
                                let RefreshReply = (Silent = true) => {
                                    if (!Silent) {
                                        PostTitle.innerHTML = `<span class="placeholder col-${Math.ceil(Math.random() * 6)}"></span>`;
                                        PostAuthor.innerHTML = `<span class="placeholder col-${Math.ceil(Math.random() * 6)}"></span>`;
                                        PostTime.innerHTML = `<span class="placeholder col-${Math.ceil(Math.random() * 6)}"></span>`;
                                        PostBoard.innerHTML = `<span class="placeholder col-${Math.ceil(Math.random() * 6)}"></span>`;
                                        PostReplies.innerHTML = "";
                                        for (let i = 0; i < 10; i++) {
                                            PostReplies.innerHTML += `<div class="card mb-3">
                                        <div class="card-body">
                                            <div class="row mb-3">
                                            <span class="col-6"><span class="placeholder col-${Math.ceil(Math.random() * 6)}"></span></span>
                                            <span class="col-6"><span class="placeholder col-${Math.ceil(Math.random() * 6)}"></span></span>
                                            </div>
                                            <hr>
                                            <span class="placeholder col-${Math.ceil(Math.random() * 12)}"></span>
                                            <span class="placeholder col-${Math.ceil(Math.random() * 12)}"></span>
                                            <span class="placeholder col-${Math.ceil(Math.random() * 12)}"></span>
                                        </div>
                                    </div>`;
                                        }
                                    }
                                    RequestAPI("GetPost", {
                                        "PostID": Number(ThreadID), "Page": Number(Page)
                                    }, async (ResponseData) => {
                                        if (ResponseData.Success == true) {
                                            let OldScrollTop = document.documentElement.scrollTop;
                                            let LockButtons = !IsAdmin && ResponseData.Data.Lock.Locked;
                                            if (!Silent) {
                                                DiscussPagination.children[0].children[0].href = "https://www.xmoj.tech/discuss3/thread.php?tid=" + ThreadID + "&page=1";
                                                DiscussPagination.children[1].children[0].href = "https://www.xmoj.tech/discuss3/thread.php?tid=" + ThreadID + "&page=" + (Page - 1);
                                                DiscussPagination.children[2].children[0].href = "https://www.xmoj.tech/discuss3/thread.php?tid=" + ThreadID + "&page=" + Page;
                                                DiscussPagination.children[3].children[0].href = "https://www.xmoj.tech/discuss3/thread.php?tid=" + ThreadID + "&page=" + (Page + 1);
                                                DiscussPagination.children[4].children[0].href = "https://www.xmoj.tech/discuss3/thread.php?tid=" + ThreadID + "&page=" + ResponseData.Data.PageCount;
                                                if (Page <= 1) {
                                                    DiscussPagination.children[0].classList.add("disabled");
                                                    DiscussPagination.children[1].remove();
                                                }
                                                if (Page >= ResponseData.Data.PageCount) {
                                                    DiscussPagination.children[DiscussPagination.children.length - 1].classList.add("disabled");
                                                    DiscussPagination.children[DiscussPagination.children.length - 2].remove();
                                                }
                                                if (IsAdmin || ResponseData.Data.UserID == CurrentUsername) {
                                                    Delete.style.display = "";
                                                }
                                            }
                                            PostTitle.innerHTML = ResponseData.Data.Title + (ResponseData.Data.ProblemID == 0 ? "" : ` - 题目` + ` <a href="https://www.xmoj.tech/problem.php?id=` + ResponseData.Data.ProblemID + `">` + ResponseData.Data.ProblemID + `</a>`);
                                            document.title = "讨论" + ThreadID + ": " + ResponseData.Data.Title;
                                            PostAuthor.innerHTML = "<span></span>";
                                            GetUsernameHTML(PostAuthor.children[0], ResponseData.Data.UserID);
                                            PostTime.innerHTML = GetRelativeTime(ResponseData.Data.PostTime);
                                            PostBoard.innerHTML = ResponseData.Data.BoardName;
                                            let Replies = ResponseData.Data.Reply;
                                            PostReplies.innerHTML = "";
                                            for (let i = 0; i < Replies.length; i++) {
                                                let CardElement = document.createElement("div");
                                                PostReplies.appendChild(CardElement);
                                                CardElement.className = "card mb-3";
                                                let CardBodyElement = document.createElement("div");
                                                CardElement.appendChild(CardBodyElement);
                                                CardBodyElement.className = "card-body row";
                                                let CardBodyRowElement = document.createElement("div");
                                                CardBodyElement.appendChild(CardBodyRowElement);
                                                CardBodyRowElement.className = "row mb-3";
                                                let AuthorElement = document.createElement("span");
                                                CardBodyRowElement.appendChild(AuthorElement);
                                                AuthorElement.className = "col-4 text-muted";
                                                let AuthorSpanElement = document.createElement("span");
                                                AuthorElement.appendChild(AuthorSpanElement);
                                                AuthorSpanElement.innerText = "作者:";
                                                let AuthorUsernameElement = document.createElement("span");
                                                AuthorElement.appendChild(AuthorUsernameElement);
                                                GetUsernameHTML(AuthorUsernameElement, Replies[i].UserID);
                                                let SendTimeElement = document.createElement("span");
                                                CardBodyRowElement.appendChild(SendTimeElement);
                                                SendTimeElement.className = "col-4 text-muted";
                                                SendTimeElement.innerHTML = "发布时间:" + GetRelativeTime(Replies[i].ReplyTime);

                                                let OKButton;
                                                if (!LockButtons) {
                                                    let ButtonsElement = document.createElement("span");
                                                    CardBodyRowElement.appendChild(ButtonsElement);
                                                    ButtonsElement.className = "col-4";
                                                    let ReplyButton = document.createElement("button");
                                                    ButtonsElement.appendChild(ReplyButton);
                                                    ReplyButton.type = "button";
                                                    ReplyButton.className = "btn btn-sm btn-info";
                                                    ReplyButton.innerText = "回复";
                                                    ReplyButton.addEventListener("click", () => {
                                                        let Content = Replies[i].Content;
                                                        Content = Content.split("\n").map((Line) => {
                                                            // Count the number of '>' characters at the beginning of the line
                                                            let nestingLevel = 0;
                                                            while (Line.startsWith(">")) {
                                                                nestingLevel++;
                                                                Line = Line.substring(1).trim();
                                                            }
                                                            // If the line is nested more than 2 levels deep, skip it
                                                            if (nestingLevel > 2) {
                                                                return null;
                                                            }
                                                            // Reconstruct the line with the appropriate number of '>' characters
                                                            return "> ".repeat(nestingLevel + 1) + Line;
                                                        }).filter(Line => Line !== null)  // Remove null entries
                                                            .join("\n");
                                                        ContentElement.value += Content + `\n\n@${Replies[i].UserID} `;
                                                        ContentElement.focus();
                                                    });
                                                    let DeleteButton = document.createElement("button");
                                                    ButtonsElement.appendChild(DeleteButton);
                                                    DeleteButton.type = "button";
                                                    DeleteButton.className = "btn btn-sm btn-danger ms-1";
                                                    DeleteButton.innerText = "删除";
                                                    DeleteButton.style.display = (IsAdmin || Replies[i].UserID == CurrentUsername ? "" : "none");
                                                    DeleteButton.addEventListener("click", () => {
                                                        DeleteButton.disabled = true;
                                                        DeleteButton.lastChild.style.display = "";
                                                        RequestAPI("DeleteReply", {
                                                            "ReplyID": Number(Replies[i].ReplyID)
                                                        }, (ResponseData) => {
                                                            if (ResponseData.Success == true) {
                                                                RefreshReply();
                                                            } else {
                                                                DeleteButton.disabled = false;
                                                                DeleteButton.lastChild.style.display = "none";
                                                                ErrorElement.innerText = ResponseData.Message;
                                                                ErrorElement.style.display = "";
                                                            }
                                                        });
                                                    });
                                                    let DeleteSpin = document.createElement("div");
                                                    DeleteButton.appendChild(DeleteSpin);
                                                    DeleteSpin.className = "spinner-border spinner-border-sm";
                                                    DeleteSpin.role = "status";
                                                    DeleteSpin.style.display = "none";
                                                    OKButton = document.createElement("button");
                                                    ButtonsElement.appendChild(OKButton);
                                                    OKButton.type = "button";
                                                    OKButton.style.display = "none";
                                                    OKButton.className = "btn btn-sm btn-success ms-1";
                                                    OKButton.innerText = "确认";
                                                    let OKSpin = document.createElement("div");
                                                    OKButton.appendChild(OKSpin);
                                                    OKSpin.className = "spinner-border spinner-border-sm";
                                                    OKSpin.role = "status";
                                                    OKSpin.style.display = "none";
                                                    OKButton.addEventListener("click", () => {
                                                        OKButton.disabled = true;
                                                        OKButton.lastChild.style.display = "";
                                                        RequestAPI("EditReply", {
                                                            ReplyID: Number(Replies[i].ReplyID),
                                                            Content: String(ContentEditor.value)
                                                        }, (ResponseData) => {
                                                            if (ResponseData.Success == true) {
                                                                RefreshReply();
                                                            } else {
                                                                OKButton.disabled = false;
                                                                OKButton.lastChild.style.display = "none";
                                                                ErrorElement.innerText = ResponseData.Message;
                                                                ErrorElement.style.display = "";
                                                            }
                                                        });
                                                    });
                                                    let CancelButton = document.createElement("button");
                                                    ButtonsElement.appendChild(CancelButton);
                                                    CancelButton.type = "button";
                                                    CancelButton.style.display = "none";
                                                    CancelButton.className = "btn btn-sm btn-secondary ms-1";
                                                    CancelButton.innerText = "取消";
                                                    CancelButton.addEventListener("click", () => {
                                                        CardBodyElement.children[2].style.display = "";
                                                        CardBodyElement.children[3].style.display = "none";
                                                        EditButton.style.display = "";
                                                        OKButton.style.display = "none";
                                                        CancelButton.style.display = "none";
                                                    });
                                                    let EditButton = document.createElement("button");
                                                    ButtonsElement.appendChild(EditButton);
                                                    EditButton.type = "button";
                                                    EditButton.className = "btn btn-sm btn-warning ms-1";
                                                    EditButton.innerText = "编辑";
                                                    EditButton.style.display = (IsAdmin || Replies[i].UserID == CurrentUsername ? "" : "none");
                                                    EditButton.addEventListener("click", () => {
                                                        CardBodyElement.children[2].style.display = "none";
                                                        CardBodyElement.children[3].style.display = "";
                                                        EditButton.style.display = "none";
                                                        OKButton.style.display = "";
                                                        CancelButton.style.display = "";
                                                    });
                                                }

                                                let CardBodyHRElement = document.createElement("hr");
                                                CardBodyElement.appendChild(CardBodyHRElement);

                                                let ReplyContentElement = document.createElement("div");
                                                CardBodyElement.appendChild(ReplyContentElement);
                                                ReplyContentElement.innerHTML = PurifyHTML(marked.parse(Replies[i].Content)).replaceAll(/@([a-zA-Z0-9]+)/g, `<b>@</b><span class="ms-1 Usernames">$1</span>`);
                                                if (Replies[i].EditTime != null) {
                                                    if (Replies[i].EditPerson == Replies[i].UserID) {
                                                        ReplyContentElement.innerHTML += `<span class="text-muted" style="font-size: 12px">最后编辑于${GetRelativeTime(Replies[i].EditTime)}</span>`;
                                                    } else {
                                                        ReplyContentElement.innerHTML += `<span class="text-muted" style="font-size: 12px">最后被<span class="Usernames">${Replies[i].EditPerson}</span>编辑于${GetRelativeTime(Replies[i].EditTime)}</span>`;
                                                    }
                                                }
                                                let ContentEditElement = document.createElement("div");
                                                CardBodyElement.appendChild(ContentEditElement);
                                                ContentEditElement.classList.add("input-group");
                                                ContentEditElement.style.display = "none";
                                                let ContentEditor = document.createElement("textarea");
                                                ContentEditElement.appendChild(ContentEditor);
                                                ContentEditor.className = "form-control col-6";
                                                ContentEditor.rows = 3;
                                                ContentEditor.value = Replies[i].Content;
                                                if (ContentEditor.value.indexOf("<br>") != -1) {
                                                    ContentEditor.value = ContentEditor.value.substring(0, ContentEditor.value.indexOf("<br>"));
                                                }
                                                ContentEditor.addEventListener("keydown", (Event) => {
                                                    if (Event.ctrlKey && Event.keyCode == 13) {
                                                        OKButton.click();
                                                    }
                                                });
                                                let PreviewTab = document.createElement("div");
                                                ContentEditElement.appendChild(PreviewTab);
                                                PreviewTab.className = "form-control col-6";
                                                PreviewTab.innerHTML = PurifyHTML(marked.parse(ContentEditor.value));
                                                ContentEditor.addEventListener("input", () => {
                                                    PreviewTab.innerHTML = PurifyHTML(marked.parse(ContentEditor.value));
                                                    RenderMathJax();
                                                });
                                                ContentEditor.addEventListener("paste", (EventData) => {
                                                    let Items = EventData.clipboardData.items;
                                                    if (Items.length !== 0) {
                                                        for (let i = 0; i < Items.length; i++) {
                                                            if (Items[i].type.indexOf("image") != -1) {
                                                                let Reader = new FileReader();
                                                                Reader.readAsDataURL(Items[i].getAsFile());
                                                                Reader.onload = () => {
                                                                    let Before = ContentEditor.value.substring(0, ContentEditor.selectionStart);
                                                                    let After = ContentEditor.value.substring(ContentEditor.selectionEnd, ContentEditor.value.length);
                                                                    const UploadMessage = "![正在上传图片...]()";
                                                                    ContentEditor.value = Before + UploadMessage + After;
                                                                    ContentEditor.dispatchEvent(new Event("input"));
                                                                    RequestAPI("UploadImage", {
                                                                        "Image": Reader.result
                                                                    }, (ResponseData) => {
                                                                        if (ResponseData.Success) {
                                                                            ContentEditor.value = Before + `![](https://assets.xmoj-bbs.me/GetImage?ImageID=${ResponseData.Data.ImageID})` + After;
                                                                            ContentEditor.dispatchEvent(new Event("input"));
                                                                        } else {
                                                                            ContentEditor.value = Before + `![上传失败!]()` + After;
                                                                            ContentEditor.dispatchEvent(new Event("input"));
                                                                        }
                                                                    });
                                                                };
                                                            }
                                                        }
                                                    }
                                                });
                                            }

                                            let UsernameElements = document.getElementsByClassName("Usernames");
                                            for (let i = 0; i < UsernameElements.length; i++) {
                                                GetUsernameHTML(UsernameElements[i], UsernameElements[i].innerText, true);
                                            }

                                            let CodeElements = document.querySelectorAll("#PostReplies > div > div > div:nth-child(3) > pre > code");
                                            for (let i = 0; i < CodeElements.length; i++) {
                                                let ModeName = "text/x-c++src";
                                                if (CodeElements[i].className == "language-c") {
                                                    ModeName = "text/x-csrc";
                                                } else if (CodeElements[i].className == "language-cpp") {
                                                    ModeName = "text/x-c++src";
                                                }
                                                CodeMirror(CodeElements[i].parentElement, {
                                                    value: CodeElements[i].innerText,
                                                    mode: ModeName,
                                                    theme: (UtilityEnabled("DarkMode") ? "darcula" : "default"),
                                                    lineNumbers: true,
                                                    readOnly: true
                                                }).setSize("100%", "auto");
                                                CodeElements[i].remove();
                                            }

                                            if (LockButtons) {
                                                let LockElement = ContentElement.parentElement.parentElement;
                                                LockElement.innerHTML = "讨论已于 " + await GetRelativeTime(ResponseData.Data.Lock.LockTime) + " 被 ";
                                                let LockUsernameSpan = document.createElement("span");
                                                LockElement.appendChild(LockUsernameSpan);
                                                GetUsernameHTML(LockUsernameSpan, ResponseData.Data.Lock.LockPerson);
                                                LockElement.innerHTML += " 锁定";
                                                LockElement.classList.add("mb-5");
                                            }

                                            if (IsAdmin) {
                                                ToggleLock.style.display = "inline-block";
                                                ToggleLockButton.checked = ResponseData.Data.Lock.Locked;
                                                ToggleLockButton.onclick = () => {
                                                    ToggleLockButton.disabled = true;
                                                    ErrorElement.style.display = "none";
                                                    RequestAPI((ToggleLockButton.checked ? "LockPost" : "UnlockPost"), {
                                                        "PostID": Number(ThreadID)
                                                    }, (LockResponseData) => {
                                                        ToggleLockButton.disabled = false;
                                                        if (LockResponseData.Success) {
                                                            RefreshReply();
                                                        } else {
                                                            ErrorElement.style.display = "";
                                                            ErrorElement.innerText = "错误:" + LockResponseData.Message;
                                                            ToggleLockButton.checked = !ToggleLockButton.checked;
                                                        }
                                                    });
                                                };
                                            }

                                            Style.innerHTML += "img {";
                                            Style.innerHTML += "    width: 50%;";
                                            Style.innerHTML += "}";

                                            RenderMathJax();

                                            if (Silent) {
                                                scrollTo({
                                                    top: OldScrollTop, behavior: "instant"
                                                });
                                            }
                                        } else {
                                            PostTitle.innerText = "错误:" + ResponseData.Message;
                                        }
                                    });
                                };
                                Delete.addEventListener("click", () => {
                                    Delete.disabled = true;
                                    Delete.children[0].style.display = "inline-block";
                                    RequestAPI("DeletePost", {
                                        "PostID": Number(SearchParams.get("tid"))
                                    }, (ResponseData) => {
                                        Delete.disabled = false;
                                        Delete.children[0].style.display = "none";
                                        if (ResponseData.Success == true) {
                                            location.href = "https://www.xmoj.tech/discuss3/discuss.php";
                                        } else {
                                            ErrorElement.innerText = ResponseData.Message;
                                            ErrorElement.style.display = "block";
                                        }
                                    });
                                });
                                SubmitElement.addEventListener("click", async () => {
                                    ErrorElement.style.display = "none";
                                    SubmitElement.disabled = true;
                                    SubmitElement.children[0].style.display = "inline-block";
                                    RequestAPI("NewReply", {
                                        "PostID": Number(SearchParams.get("tid")),
                                        "Content": String(ContentElement.value),
                                        "CaptchaSecretKey": String(CaptchaSecretKey)
                                    }, async (ResponseData) => {
                                        SubmitElement.disabled = false;
                                        SubmitElement.children[0].style.display = "none";
                                        if (ResponseData.Success == true) {
                                            RefreshReply();
                                            ContentElement.value = "";
                                            PreviewTab.innerHTML = "";
                                            while (PostReplies.innerHTML.indexOf("placeholder") != -1) {
                                                await new Promise((resolve) => {
                                                    setTimeout(resolve, 100);
                                                });
                                            }
                                            ContentElement.focus();
                                            ContentElement.scrollIntoView();
                                            turnstile.reset();
                                        } else {
                                            ErrorElement.innerText = ResponseData.Message;
                                            ErrorElement.style.display = "block";
                                        }
                                    });
                                });
                                RefreshReply(false);
                                addEventListener("focus", RefreshReply);
                            }
                        }
                    }
                }
            }
        }
    } catch (e) {
        console.error(e);
        if (UtilityEnabled("DebugMode")) {
            SmartAlert("XMOJ-Script internal error!\n\n" + e + "\n\n" + "If you see this message, please report it to the developer.\nDon't forget to include console logs and a way to reproduce the error!\n\nDon't want to see this message? Disable DebugMode.");
        }
    }
}

main().then(r => {
    console.log("XMOJ-Script loaded successfully!");
});