[
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]\npatreon: f1dbeditor\nopen_collective: # Replace with a single Open Collective username\nko_fi: # Replace with a single Ko-fi username\ntidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\nliberapay: # Replace with a single Liberapay username\nissuehunt: # Replace with a single IssueHunt username\notechie: # Replace with a single Otechie username\nlfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: \"[BUG]\"\nlabels: bug\nassignees: ''\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Save file and log.txt**\nAttach a link to any file transfer web where you sharen your save and log.txt (located in the same folder as your save in the DBEditor) so I can try to reproduce the bug\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: \"[FEATURE]\"\nlabels: enhancement\nassignees: ''\n\n---\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/workflows/nightly.yml",
    "content": "name: Nightly Vercel Deploy\non:\n  schedule:\n    - cron: '0 2 * * *'   # 02:00 UTC → 03:00/04:00 en Madrid según DST\n  workflow_dispatch:        # para probarlo a mano\n\njobs:\n  trigger:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Trigger Vercel Deploy Hook\n        run: curl -sSf -X POST \"$VERCEL_DEPLOY_HOOK_URL\"\n        env:\n          VERCEL_DEPLOY_HOOK_URL: ${{ secrets.VERCEL_DEPLOY_HOOK_URL }}\n"
  },
  {
    "path": ".gitignore",
    "content": "node_modules\nresult\nlicenses\nbackup\nlog.txt\n**/build/back\n**/__pycache__\n*.sav\nconfigs/*.json\nDBEditor\nassets/custom/*.png\nassets/custom/*.jpg\nassets/custom/*.jpeg\n!base24_config.json\ndist/\n/patreon/\n*.txt\nresize_images.js\n.vscode/\ntest/\n.env\n.vercel/\n.env*.local\nAGENTS.md\n*.tsx\n.vercel\nscripts/"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "<img width=\"1875\" height=\"625\" alt=\"Copia de DATABASE EDITOR F1 MANAGER 23\" src=\"https://github.com/user-attachments/assets/7cb4d0ae-f6a5-4d79-9ab5-139e5f5513e2\" />\n\n<h3>OPEN SOURCE TOOL TO EDIT YOUR SAVE FILES FROM F1 MANAGER 23 & 24</h3>\n<h4>Supports every bit of cuistomization you can imagine, and even more</h4>\n\n[![Discord](https://img.shields.io/badge/Discord-Community-5865F2?style=flat-square&logo=discord&logoColor=white)](https://discord.gg/3QXg3hsD8B)\n[![Patreon](https://img.shields.io/badge/Patreon-Support%20the%20project-F96854?style=flat-square&logo=patreon&logoColor=white)](https://www.patreon.com/f1dbeditor)\n[![GitHub Release](https://img.shields.io/github/v/release/IUrreta/DatabaseEditor?style=flat-square&logo=github&logoColor=white)](https://github.com/IUrreta/DatabaseEditor/releases/latest)\n[![GitHub Stars](https://img.shields.io/github/stars/IUrreta/DatabaseEditor?style=flat-square&logo=github&logoColor=white)](https://github.com/IUrreta/DatabaseEditor/stargazers)\n\n## Features Overview\n\n### Driver & Staff Management\n\n- **Transfers** between teams for both drivers and staff  \n- **Edit contracts**, including future deals and salaries  \n- **View pre-contracts** at a glance with icons  \n- **Edit stats**, mentality, and marketability  \n- **Rename** any driver or staff member (even abbreviations)  \n- **Compare** two drivers or staff members side-by-side\n- **Visualize** next year's grid\n\n<p align=\"center\">\n  <img width=\"45%\" src=\"https://github.com/user-attachments/assets/a20915e9-c7ce-48b5-8e51-d4a6c72e01f3\" />\n  <img width=\"45%\" src=\"https://github.com/user-attachments/assets/5b73f044-feb7-4f43-9841-fa21a7eeea07\" /><br/>\n  <img width=\"45%\" src=\"https://github.com/user-attachments/assets/ac01d8ac-e03d-45ce-94e6-f4bd4ef425e7\" />\n  <img width=\"45%\" src=\"https://github.com/user-attachments/assets/c69be6f8-9056-4e69-8632-952a190d2283\" />\n</p>\n\n---\n\n### Season & Calendar Customization\n\n- **Edit race calendar**, including race order and weather  \n- **Difficulty presets** — make your save harder with adjustable challenges  \n- **Freeze mentality system** if you don’t want it affecting your gameplay  \n- **Fix AI not refurbishing facilities**  \n- **Change team** at any moment  \n\n<p align=\"center\">\n  <img width=\"90%\" src=\"https://github.com/user-attachments/assets/0dfaa612-3ae6-405d-8b06-217d018507af\" />\n  <img width=\"90%\" src=\"https://github.com/user-attachments/assets/447c9aab-87ce-4693-8166-a36cd543e837\" />\n</p>\n\n> [!CAUTION]\n> For editing the **order or number of races**, it’s still recommended to do it before the first race of the season.  \n> You can safely edit race weather anytime.\n\n---\n\n### Car & Engine Management\n\n- **Edit every car stat** from all teams, including **espertise**\n- **View performance evolution** across the season and details in all areas  \n- **Compare performance** attributes with graphs  \n- **Edit or add new engine suppliers**  \n\n<p align=\"center\">\n  <img width=\"45%\" src=\"https://github.com/user-attachments/assets/aac7145b-624e-4de0-b3dc-d41027dc8290\" />\n  <img width=\"45%\" src=\"https://github.com/user-attachments/assets/5ca943d5-43f9-4872-8710-c23bbe95c39e\" /><br/>\n  <img width=\"45%\" src=\"https://github.com/user-attachments/assets/7e61cdbb-c2a8-4874-9144-2d967c4a86bc\" />\n  <img width=\"45%\" src=\"https://github.com/user-attachments/assets/a488a752-b45e-4313-bd87-28f62261c1ad\" />\n</p>\n\n---\n\n### Team Management\n\n- Edit **facilities**, **budget cap**, **objectives**, **pit crew**, and more  \n- Change **engine supplier** instantly  \n\n<p align=\"center\">\n  <img width=\"90%\" src=\"https://github.com/user-attachments/assets/aa316454-6437-45e1-aa03-7e0a0be4af96\" />\n</p>\n\n---\n\n### Career History & Stats\n- View past seasons in a **Wikipedia-style table**   (including F2/F3)\n- Check **career records** (wins, poles, podiums, WDCs, points...)\n- See **all details at once** with Season Review\n- See **every session result** and **edit race results**\n- Compare **drivers and teams** through detailed **Head-to-Head** charts  \n\n<p align=\"center\">\n  <img width=\"45%\" src=\"https://github.com/user-attachments/assets/6318515c-abaf-45c0-b1be-199c1e64397b\" />\n  <img width=\"45%\" src=\"https://github.com/user-attachments/assets/771ffc67-07e1-49b7-a4ef-01b9b0e0a713\" />\n  <img width=\"45%\"  src=\"https://github.com/user-attachments/assets/ed5b3f84-ef60-4062-b558-21730841a062\" />\n  <img width=\"45%\" src=\"https://github.com/user-attachments/assets/a1b33991-0d53-4a26-83be-e203c3a02b5c\" />\n  <img width=\"90%\" src=\"https://github.com/user-attachments/assets/601100a0-ffa0-4eef-9aba-ed45ec7111b6\" />\n\n</p>\n\n---\n\n### News System & Turning Points\n\n- Follow your career’s storylines through the **News Tab**  \n- **Decide outcomes** of major events with the new **Turning Points** system  \n- All news and outcomes are stored directly in your save file  \n\n<p align=\"center\">\n  <img width=\"90%\" src=\"https://github.com/user-attachments/assets/4673f79d-acaa-464b-8631-fea0315e64d7\" /><br/>\n  <img width=\"90%\" src=\"https://github.com/user-attachments/assets/9e550082-4922-40db-9be1-3b892f405484\" />\n</p>\n\n---\n\n### Seasonal Mods\n\nUpdate your freshly created save to the 2025 or 2026 seasons with a complete database overhaul with **driver transfers**, **car and engine performance**, **driver ratings**, **calendars**, **regulations** and even **FREE TURNING POINTS** for engine development in the 2026 Season Update! (also available in Settings -> Editor)\n\n<p align=\"center\">\n  <img width=\"45%\" src=\"https://github.com/user-attachments/assets/288239ee-0cee-4ffe-8c8e-34462eadf38f\" />\n  <img width=\"45%\" src=\"https://github.com/user-attachments/assets/9011a678-9aee-462d-b9ce-3fe4d81abc81\" />\n</p>\n\n---\n\n### Credits\n\n- [xAranaktu for the Save Repacker](https://github.com/xAranaktu/F1-Manager-2022-SaveFile-Repacker)\n- F1 Dark font: Font used under CC BY 4.0  Source: https://www.onlinewebfonts.com\n"
  },
  {
    "path": "api/ask-openai.js",
    "content": "import OpenAI from \"openai\";\nimport { getUserTierServer } from \"../lib/getUserTierServer.js\";\nimport { getDailyLimitForTier } from \"../lib/rateLimits.js\";\nimport { redis } from \"../lib/redis.js\";\n\nconst client = new OpenAI({\n  apiKey: process.env.OPENAI_API_KEY,\n});\n\nexport default async function handler(req, res) {\n  try {\n    const body =\n      typeof req.body === \"string\" ? JSON.parse(req.body) : req.body;\n\n    const { messages, max_tokens } = body;\n\n    // 1️⃣ Auth\n    const user = getUserTierServer(req);\n    if (!user.isLoggedIn) {\n      return res.status(401).json({ error: \"Not logged in\" });\n    }\n\n    const tier = user.tier;\n    const userId = user.id;\n\n    // 2️⃣ Limit desde ENV\n    const limit = getDailyLimitForTier(tier);\n\n    // 3️⃣ Redis key\n    const today = new Date().toISOString().slice(0, 10);\n    const redisKey = `ratelimit:${userId}:${today}`;\n\n    let used = Number(await redis.get(redisKey)) || 0;\n\n    // 4️⃣ Rate limit\n    if (used >= limit) {\n      return res.status(429).json({\n        error: \"Daily limit reached\",\n      });\n    }\n\n    // 5️⃣ Incremento\n    await redis.incr(redisKey);\n    await redis.expire(redisKey, 60 * 60 * 24);\n\n    // 6️⃣ OpenAI\n    let aiModel = \"gpt-5-mini\";\n    if (tier === \"Backer\") {\n      aiModel = \"gpt-5-nano\";\n    }\n    else if (tier === \"Insider\") {\n      const firstHalfLimit = Math.ceil(limit / 2);\n      aiModel = used < firstHalfLimit ? \"gpt-5-mini\" : \"gpt-5-nano\";\n    }\n    const safeMaxTokens = Math.min(max_tokens || 1500, 4000);\n\n    const input = messages.map(m => ({\n      role: m.role,\n      content: m.content\n    }));\n\n    const response = await client.responses.create({\n      model: aiModel,\n      input,\n      max_output_tokens: safeMaxTokens,\n      reasoning: {\"effort\": \"low\"}\n    });\n\n    const text = response.output_text || \"\";\n\n    return res.status(200).json({\n      text,\n      used: used + 1,\n      limit\n    });\n\n  } catch (err) {\n    console.error(\"OpenAI API error:\", err);\n    return res.status(500).json({ error: err.message });\n  }\n}\n"
  },
  {
    "path": "api/auth/patreon/login.js",
    "content": "export default function handler(req, res) {\n    const { PATREON_CLIENT_ID, PATREON_REDIRECT_URI } = process.env;\n\n    if (!PATREON_CLIENT_ID || !PATREON_REDIRECT_URI) {\n        return res.status(500).json({ error: 'Missing Patreon environment variables' });\n    }\n\n    // Scopes: identity (profile), identity.memberships (campaign info)\n    const scopes = 'identity identity.memberships';\n    const redirectUrl = `https://www.patreon.com/oauth2/authorize?response_type=code&client_id=${PATREON_CLIENT_ID}&redirect_uri=${encodeURIComponent(PATREON_REDIRECT_URI)}&scope=${encodeURIComponent(scopes)}`;\n\n    res.redirect(redirectUrl);\n}\n"
  },
  {
    "path": "api/auth/patreon/logout.js",
    "content": "import { serialize } from 'cookie';\n\nexport default function handler(req, res) {\n    const cookie = serialize('auth_token', '', {\n        httpOnly: true,\n        secure: process.env.NODE_ENV === 'production',\n        sameSite: 'strict',\n        path: '/',\n        maxAge: -1,\n    });\n\n    res.setHeader('Set-Cookie', cookie);\n\n    res.status(200).json({ success: true, message: 'Logged out successfully' });\n}"
  },
  {
    "path": "api/auth/patreon/verify.js",
    "content": "import jwt from 'jsonwebtoken';\nimport { serialize } from 'cookie';\nimport { getEffectiveTier } from '../../../lib/accessControl.js';\n\nexport default async function handler(req, res) {\n    const { code } = req.query;\n    const { PATREON_CLIENT_ID, PATREON_CLIENT_SECRET, PATREON_REDIRECT_URI } = process.env;\n\n    if (!code) {\n        return res.status(400).json({ error: 'Missing code parameter' });\n    }\n\n    if (!PATREON_CLIENT_ID || !PATREON_CLIENT_SECRET || !PATREON_REDIRECT_URI) {\n        return res.status(500).json({ error: 'Missing Patreon environment variables' });\n    }\n\n    try {\n        // 1. Exchange code for access token\n        const tokenResponse = await fetch('https://www.patreon.com/api/oauth2/token', {\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application/x-www-form-urlencoded',\n            },\n            body: new URLSearchParams({\n                code,\n                grant_type: 'authorization_code',\n                client_id: PATREON_CLIENT_ID,\n                client_secret: PATREON_CLIENT_SECRET,\n                redirect_uri: PATREON_REDIRECT_URI,\n            }),\n        });\n\n        const tokenData = await tokenResponse.json();\n\n        if (!tokenResponse.ok) {\n            console.error('Token exchange failed:', tokenData);\n            return res.status(tokenResponse.status).json({ error: 'Failed to exchange token', details: tokenData });\n        }\n\n        const accessToken = tokenData.access_token;\n\n        // 2. Fetch user identity and memberships\n        // Using API v2\n        const identityResponse = await fetch('https://www.patreon.com/api/oauth2/v2/identity?include=memberships.currently_entitled_tiers&fields%5Buser%5D=full_name,thumb_url&fields%5Bmember%5D=patron_status,currently_entitled_amount_cents&fields%5Btier%5D=title', {\n            headers: {\n                Authorization: `Bearer ${accessToken}`,\n            },\n        });\n\n        const identityData = await identityResponse.json();\n\n        if (!identityResponse.ok) {\n            console.error('Identity fetch failed:', identityData);\n            return res.status(identityResponse.status).json({ error: 'Failed to fetch identity', details: identityData });\n        }\n\n        // 3. Parse membership data to find tier\n        const memberships = identityData.included || [];\n        let isMember = false;\n        let tier = 'Free';\n        let amountCents = 0;\n        let tierName = 'None';\n\n        const tierIDs = [\"25157070\", \"25124139\", \"25132338\"];\n        const paidTiers = [\"Backer\", \"Insider\", \"Founder\"];\n        const patronStatusOrder = {\n            \"None\": 0,\n            \"Free\": 0,\n            \"Backer\": 1,\n            \"Insider\": 2,\n            \"Founder\": 3\n        };\n\n        // Logic to determine tier based on memberships\n        for (const item of memberships) {\n            if (item.type === 'member' && item.attributes.patron_status === 'active_patron') {\n                isMember = true;\n                amountCents = item.attributes.currently_entitled_amount_cents;\n            }\n            if (item.type === 'tier' && tierIDs.includes(item.id)) {\n                //get the highest, order is backer -> insider -> founder\n                if (patronStatusOrder[item.attributes.title] > patronStatusOrder[tierName]) {\n                    tierName = item.attributes.title;\n                }\n            }\n        }\n\n        if (isMember) {\n            tier = tierName;\n        }\n\n        const fullName = identityData?.data?.attributes?.full_name || \"\";\n        const baseTier = tier;\n        const { tier: effectiveTier, whitelisted } = getEffectiveTier({ name: fullName, baseTier });\n        const isPaid = paidTiers.includes(effectiveTier);\n        const tierNumbers = {\n            \"Free\": 0,\n            \"Backer\": 1,\n            \"Insider\": 2,\n            \"Founder\": 3\n        };\n\n        const patreonUser = {\n            name: fullName,\n            thumbUrl: identityData.data.attributes.thumb_url,\n            isMember,\n            amountCents,\n            tier: effectiveTier,\n        };\n\n        const token = jwt.sign(\n            {\n                name: patreonUser.name,\n                tier: baseTier,\n                patreonId: identityData.data.id\n            },\n            process.env.JWT_SECRET,\n            { expiresIn: '30d' }\n        );\n\n        const serializedCookie = serialize('auth_token', token, {\n            httpOnly: true,  // VITAL: Browser JS cannot read this\n            secure: process.env.NODE_ENV === 'production', // HTTPS only\n            sameSite: 'strict',\n            maxAge: 60 * 60 * 24 * 30, // 30 days\n            path: '/'\n        });\n\n        res.setHeader('Set-Cookie', serializedCookie);\n\n        return res.status(200).json({\n            success: true,\n            user: { fullName: patreonUser.name },\n            tier: patreonUser.tier,\n            tierNumber: tierNumbers[patreonUser.tier] ?? 0,\n            whitelisted,\n            isLoggedIn: true,\n            paidMember: isPaid\n        });\n\n    } catch (error) {\n        console.error('Server error:', error);\n        return res.status(500).json({ error: 'Internal server error', message: error.message });\n    }\n}\n"
  },
  {
    "path": "api/check-cookie.js",
    "content": "import jwt from \"jsonwebtoken\";\nimport { serialize } from \"cookie\";\n\nexport default function handler(req, res) {\n  const { auth_token } = req.cookies || {};\n\n  if (!auth_token) {\n    // No cookie present: user is simply not logged in; no redirect needed.\n    return res.status(200).json({ ok: true, hasCookie: false, valid: true });\n  }\n\n  try {\n    const decoded = jwt.verify(auth_token, process.env.JWT_SECRET);\n\n    if (!decoded.patreonId) {\n      // Delete cookie\n      const del = serialize(\"auth_token\", \"\", {\n        httpOnly: true,\n        secure: process.env.NODE_ENV === \"production\",\n        sameSite: \"strict\",\n        expires: new Date(0),\n        path: \"/\",\n      });\n\n      res.setHeader(\"Set-Cookie\", del);\n      return res.status(200).json({ ok: true, hasCookie: true, valid: false });\n    }\n\n    return res.status(200).json({ ok: true, hasCookie: true, valid: true });\n  } catch (err) {\n    // Bad cookie → borrar también\n    const del = serialize(\"auth_token\", \"\", {\n      httpOnly: true,\n      secure: process.env.NODE_ENV === \"production\",\n      sameSite: \"strict\",\n      expires: new Date(0),\n      path: \"/\",\n    });\n\n    res.setHeader(\"Set-Cookie\", del);\n    return res.status(200).json({ ok: true, hasCookie: true, valid: false });\n  }\n}\n"
  },
  {
    "path": "api/me.js",
    "content": "import jwt from 'jsonwebtoken';\nimport { getEffectiveTier } from '../lib/accessControl.js';\n\nexport default function handler(req, res) {\n    // Vercel parses the cookie string automatically into req.cookies\n    const { auth_token } = req.cookies;\n\n    if (!auth_token) {\n        return res.json({\n            isLoggedIn: false,\n            paidMember: false,\n            tier: 'Free',\n            whitelisted: false\n        });\n    }\n\n    try {\n        // Verify the token signature\n        const decoded = jwt.verify(auth_token, process.env.JWT_SECRET);\n\n        const paidTiers = [\"Backer\", \"Insider\", \"Founder\"];\n        const { tier, whitelisted } = getEffectiveTier({ name: decoded.name, baseTier: decoded.tier });\n        const isPaid = paidTiers.includes(tier);\n        const tierNumbers = {\n            \"Free\": 0,\n            \"Backer\": 1,\n            \"Insider\": 2,\n            \"Founder\": 3\n        }\n\n        return res.json({\n            isLoggedIn: true,\n            paidMember: isPaid,\n            tier: tier,\n            tierNumber: tierNumbers[tier] ?? 0,\n            whitelisted,\n            user: { fullName: decoded.name },\n        });\n\n    } catch (err) {\n        // Token is invalid or expired\n        return res.json({\n            isLoggedIn: false,\n            paidMember: false,\n            tier: 'Free',\n            whitelisted: false\n        });\n    }\n}\n"
  },
  {
    "path": "api/usage-today.js",
    "content": "import { getUserTierServer } from \"../lib/getUserTierServer.js\";\nimport { getDailyLimitForTier } from \"../lib/rateLimits.js\";\nimport { redis } from \"../lib/redis.js\";\n\nexport default async function handler(req, res) {\n  try {\n    const user = getUserTierServer(req);\n\n    if (!user.isLoggedIn) {\n      return res.status(401).json({ error: \"Not logged in\" });\n    }\n\n    const userId = user.id;\n    const tier = user.tier;\n    const limit = getDailyLimitForTier(tier);\n\n    const today = new Date().toISOString().slice(0, 10);\n    const redisKey = `ratelimit:${userId}:${today}`;\n\n    let used = await redis.get(redisKey);\n    if (!used) used = 0;\n    used = Number(used);\n\n    const percentage = limit > 0\n      ? Math.min(100, Math.round((used / limit) * 100))\n      : 0;\n\n    return res.status(200).json({\n      used,\n      limit,\n      percentage\n    });\n\n  } catch (err) {\n    console.error(\"Usage endpoint error:\", err);\n    return res.status(500).json({ error: err.message });\n  }\n}\n"
  },
  {
    "path": "assets/custom/.gitkeep",
    "content": ""
  },
  {
    "path": "lib/accessControl.js",
    "content": "const TIER_ORDER = {\n  Free: 0,\n  Backer: 1,\n  Insider: 2,\n  Founder: 3,\n};\n\nfunction normalizeName(name) {\n  return String(name || \"\").trim().toLowerCase();\n}\n\nfunction parseEnvList(value) {\n  if (!value) return new Set();\n  return new Set(\n    String(value)\n      .split(/[,\\n]/g)\n      .map((item) => normalizeName(item))\n      .filter(Boolean)\n  );\n}\n\nfunction maxTier(a, b) {\n  const aOrder = TIER_ORDER[a] ?? -1;\n  const bOrder = TIER_ORDER[b] ?? -1;\n  return aOrder >= bOrder ? a : b;\n}\n\n/**\n * Applies server-side access overrides controlled by env vars.\n *\n * Env vars:\n * - DEVELOPER_NAME: exact Patreon `full_name` to force \"Founder\"\n * - INSIDER_WHITELIST: comma/newline-separated names to grant at least \"Founder\"\n */\nexport function getEffectiveTier({ name, baseTier }) {\n  const normalizedUserName = normalizeName(name);\n  let tier = baseTier || \"Free\";\n  let whitelisted = false;\n\n  const developerName = normalizeName(process.env.DEVELOPER_NAME);\n  if (developerName && normalizedUserName === developerName) {\n    return { tier: \"Founder\", whitelisted: false };\n  }\n\n  const insiderWhitelist = parseEnvList(process.env.INSIDER_WHITELIST);\n  if (insiderWhitelist.has(normalizedUserName)) {\n    tier = maxTier(tier, \"Founder\");\n    whitelisted = true;\n  }\n\n  return { tier, whitelisted };\n}\n\n"
  },
  {
    "path": "lib/getUserTierServer.js",
    "content": "import jwt from \"jsonwebtoken\";\nimport { getEffectiveTier } from \"./accessControl.js\";\n\nexport function getUserTierServer(req) {\n  const { auth_token } = req.cookies || {};\n\n  if (!auth_token) {\n    return {\n      isLoggedIn: false,\n      paidMember: false,\n      tier: \"Free\",\n      whitelisted: false,\n      user: null,\n      id: null\n    };\n  }\n\n  try {\n    const decoded = jwt.verify(auth_token, process.env.JWT_SECRET);\n\n    const paidTiers = [\"Backer\", \"Insider\", \"Founder\"];\n    const { tier, whitelisted } = getEffectiveTier({ name: decoded.name, baseTier: decoded.tier });\n    const isPaid = paidTiers.includes(tier);\n\n    return {\n      isLoggedIn: true,\n      paidMember: isPaid,\n      tier,\n      whitelisted,\n      user: { fullName: decoded.name },\n      id: decoded.patreonId\n    };\n\n  } catch (err) {\n    return {\n      isLoggedIn: false,\n      paidMember: false,\n      tier: \"Free\",\n      whitelisted: false,\n      user: null,\n      id: null\n    };\n  }\n}\n"
  },
  {
    "path": "lib/rateLimits.js",
    "content": "export function getDailyLimitForTier(tier) {\n  const limits = {\n    Founder: Number(process.env.DAILY_LIMIT_FOUNDER),\n    Insider: Number(process.env.DAILY_LIMIT_INSIDER),\n    Backer: Number(process.env.DAILY_LIMIT_BACKER),\n    Free: Number(process.env.DAILY_LIMIT_FREE),\n  };\n\n  return limits[tier] ?? limits.Free;\n}"
  },
  {
    "path": "lib/redis.js",
    "content": "import { Redis } from \"@upstash/redis\";\n\nexport const redis = Redis.fromEnv();"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"Database Editor F1 Manager\",\n  \"version\": \"3.5.13\",\n  \"description\": \"A tool that will let you edit your save file from F1 Manager games\",\n  \"main\": \"main.js\",\n  \"scripts\": {\n    \"build\": \"webpack\",\n    \"optimize:logos\": \"node scripts/optimize-team-logos.js\"\n  },\n  \"repository\": \"https://github.com/IUrreta/DatabaseEditor\",\n  \"author\": \"IUrreta\",\n  \"license\": \"LGPL-3.0-or-later\",\n  \"dependencies\": {\n    \"@upstash/redis\": \"^1.35.7\",\n    \"@vercel/analytics\": \"^1.5.0\",\n    \"@vercel/speed-insights\": \"^1.2.0\",\n    \"autoprefixer\": \"^10.4.20\",\n    \"babel-loader\": \"^9.2.1\",\n    \"bootstrap\": \"^5.3.3\",\n    \"bootstrap-icons\": \"^1.11.0\",\n    \"buffer\": \"^6.0.3\",\n    \"chart.js\": \"^4.4.0\",\n    \"chartjs-plugin-annotation\": \"^3.0.1\",\n    \"chartjs-plugin-datalabels\": \"^2.2.0\",\n    \"cookie\": \"^1.0.2\",\n    \"copy-webpack-plugin\": \"^12.0.2\",\n    \"crypto-browserify\": \"^3.12.1\",\n    \"css-loader\": \"^7.1.2\",\n    \"csv-parser\": \"^3.2.0\",\n    \"dompurify\": \"^3.3.0\",\n    \"file-saver\": \"^2.0.5\",\n    \"html-webpack-plugin\": \"^5.6.3\",\n    \"idb-keyval\": \"^6.2.2\",\n    \"image-minimizer-webpack-plugin\": \"^4.1.3\",\n    \"interactjs\": \"^1.10.17\",\n    \"jsonwebtoken\": \"^9.0.2\",\n    \"lz-string\": \"^1.5.0\",\n    \"marked\": \"^7.0.3\",\n    \"mini-css-extract-plugin\": \"^2.9.2\",\n    \"openai\": \"^6.10.0\",\n    \"pako\": \"^2.1.0\",\n    \"playwright\": \"^1.57.0\",\n    \"postcss-loader\": \"^8.1.1\",\n    \"sass\": \"^1.84.0\",\n    \"sass-loader\": \"^16.0.4\",\n    \"sharp\": \"^0.33.5\",\n    \"simple-git\": \"^3.19.1\",\n    \"sql.js\": \"^1.13.0\",\n    \"style-loader\": \"^4.0.0\",\n    \"turndown\": \"^7.2.2\",\n    \"webpack\": \"^5.97.1\",\n    \"webpack-cli\": \"^5.1.4\"\n  },\n  \"devDependencies\": {\n    \"@playwright/test\": \"^1.57.0\"\n  }\n}\n"
  },
  {
    "path": "src/data/2025_changes.json",
    "content": "{\n    \"Stats\": [\n        {\n            \"Max\": 100,\n            \"StaffID\": 1,\n            \"StatID\": 2,\n            \"Val\": 93\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 1,\n            \"StatID\": 3,\n            \"Val\": 95\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 1,\n            \"StatID\": 4,\n            \"Val\": 92\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 1,\n            \"StatID\": 5,\n            \"Val\": 90\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 1,\n            \"StatID\": 6,\n            \"Val\": 90\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 1,\n            \"StatID\": 7,\n            \"Val\": 90\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 1,\n            \"StatID\": 8,\n            \"Val\": 94\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 1,\n            \"StatID\": 9,\n            \"Val\": 86\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 1,\n            \"StatID\": 10,\n            \"Val\": 83\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 2,\n            \"StatID\": 2,\n            \"Val\": 96\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 2,\n            \"StatID\": 3,\n            \"Val\": 96\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 2,\n            \"StatID\": 4,\n            \"Val\": 89\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 2,\n            \"StatID\": 5,\n            \"Val\": 86\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 2,\n            \"StatID\": 6,\n            \"Val\": 89\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 2,\n            \"StatID\": 7,\n            \"Val\": 87\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 2,\n            \"StatID\": 8,\n            \"Val\": 91\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 2,\n            \"StatID\": 9,\n            \"Val\": 86\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 2,\n            \"StatID\": 10,\n            \"Val\": 85\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 3,\n            \"StatID\": 2,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 3,\n            \"StatID\": 3,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 3,\n            \"StatID\": 4,\n            \"Val\": 85\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 3,\n            \"StatID\": 5,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 3,\n            \"StatID\": 6,\n            \"Val\": 85\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 3,\n            \"StatID\": 7,\n            \"Val\": 84\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 3,\n            \"StatID\": 8,\n            \"Val\": 86\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 3,\n            \"StatID\": 9,\n            \"Val\": 87\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 3,\n            \"StatID\": 10,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 8,\n            \"StatID\": 2,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 8,\n            \"StatID\": 3,\n            \"Val\": 82\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 8,\n            \"StatID\": 4,\n            \"Val\": 90\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 8,\n            \"StatID\": 5,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 8,\n            \"StatID\": 6,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 8,\n            \"StatID\": 7,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 8,\n            \"StatID\": 8,\n            \"Val\": 83\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 8,\n            \"StatID\": 9,\n            \"Val\": 82\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 8,\n            \"StatID\": 10,\n            \"Val\": 89\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 10,\n            \"StatID\": 2,\n            \"Val\": 96\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 10,\n            \"StatID\": 3,\n            \"Val\": 97\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 10,\n            \"StatID\": 4,\n            \"Val\": 92\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 10,\n            \"StatID\": 5,\n            \"Val\": 89\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 10,\n            \"StatID\": 6,\n            \"Val\": 91\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 10,\n            \"StatID\": 7,\n            \"Val\": 92\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 10,\n            \"StatID\": 8,\n            \"Val\": 98\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 10,\n            \"StatID\": 9,\n            \"Val\": 92\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 10,\n            \"StatID\": 10,\n            \"Val\": 87\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 11,\n            \"StatID\": 2,\n            \"Val\": 90\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 11,\n            \"StatID\": 3,\n            \"Val\": 92\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 11,\n            \"StatID\": 4,\n            \"Val\": 86\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 11,\n            \"StatID\": 5,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 11,\n            \"StatID\": 6,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 11,\n            \"StatID\": 7,\n            \"Val\": 90\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 11,\n            \"StatID\": 8,\n            \"Val\": 94\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 11,\n            \"StatID\": 9,\n            \"Val\": 87\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 11,\n            \"StatID\": 10,\n            \"Val\": 86\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 12,\n            \"StatID\": 2,\n            \"Val\": 88\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 12,\n            \"StatID\": 3,\n            \"Val\": 89\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 12,\n            \"StatID\": 4,\n            \"Val\": 96\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 12,\n            \"StatID\": 5,\n            \"Val\": 95\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 12,\n            \"StatID\": 6,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 12,\n            \"StatID\": 7,\n            \"Val\": 86\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 12,\n            \"StatID\": 8,\n            \"Val\": 87\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 12,\n            \"StatID\": 9,\n            \"Val\": 85\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 12,\n            \"StatID\": 10,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 13,\n            \"StatID\": 2,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 13,\n            \"StatID\": 3,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 13,\n            \"StatID\": 4,\n            \"Val\": 82\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 13,\n            \"StatID\": 5,\n            \"Val\": 86\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 13,\n            \"StatID\": 6,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 13,\n            \"StatID\": 7,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 13,\n            \"StatID\": 8,\n            \"Val\": 82\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 13,\n            \"StatID\": 9,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 13,\n            \"StatID\": 10,\n            \"Val\": 83\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 14,\n            \"StatID\": 2,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 14,\n            \"StatID\": 3,\n            \"Val\": 77\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 14,\n            \"StatID\": 4,\n            \"Val\": 84\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 14,\n            \"StatID\": 5,\n            \"Val\": 83\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 14,\n            \"StatID\": 6,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 14,\n            \"StatID\": 7,\n            \"Val\": 83\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 14,\n            \"StatID\": 8,\n            \"Val\": 84\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 14,\n            \"StatID\": 9,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 14,\n            \"StatID\": 10,\n            \"Val\": 93\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 15,\n            \"StatID\": 2,\n            \"Val\": 84\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 15,\n            \"StatID\": 3,\n            \"Val\": 83\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 15,\n            \"StatID\": 4,\n            \"Val\": 91\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 15,\n            \"StatID\": 5,\n            \"Val\": 88\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 15,\n            \"StatID\": 6,\n            \"Val\": 93\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 15,\n            \"StatID\": 7,\n            \"Val\": 83\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 15,\n            \"StatID\": 8,\n            \"Val\": 82\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 15,\n            \"StatID\": 9,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 15,\n            \"StatID\": 10,\n            \"Val\": 76\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 17,\n            \"StatID\": 2,\n            \"Val\": 82\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 17,\n            \"StatID\": 3,\n            \"Val\": 82\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 17,\n            \"StatID\": 4,\n            \"Val\": 87\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 17,\n            \"StatID\": 5,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 17,\n            \"StatID\": 6,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 17,\n            \"StatID\": 7,\n            \"Val\": 91\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 17,\n            \"StatID\": 8,\n            \"Val\": 84\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 17,\n            \"StatID\": 9,\n            \"Val\": 86\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 17,\n            \"StatID\": 10,\n            \"Val\": 82\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 18,\n            \"StatID\": 2,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 18,\n            \"StatID\": 3,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 18,\n            \"StatID\": 4,\n            \"Val\": 76\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 18,\n            \"StatID\": 5,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 18,\n            \"StatID\": 6,\n            \"Val\": 92\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 18,\n            \"StatID\": 7,\n            \"Val\": 83\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 18,\n            \"StatID\": 8,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 18,\n            \"StatID\": 9,\n            \"Val\": 76\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 18,\n            \"StatID\": 10,\n            \"Val\": 85\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 20,\n            \"StatID\": 2,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 20,\n            \"StatID\": 3,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 20,\n            \"StatID\": 4,\n            \"Val\": 86\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 20,\n            \"StatID\": 5,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 20,\n            \"StatID\": 6,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 20,\n            \"StatID\": 7,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 20,\n            \"StatID\": 8,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 20,\n            \"StatID\": 9,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 20,\n            \"StatID\": 10,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 22,\n            \"StatID\": 2,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 22,\n            \"StatID\": 3,\n            \"Val\": 76\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 22,\n            \"StatID\": 4,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 22,\n            \"StatID\": 5,\n            \"Val\": 70\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 22,\n            \"StatID\": 6,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 22,\n            \"StatID\": 7,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 22,\n            \"StatID\": 8,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 22,\n            \"StatID\": 9,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 22,\n            \"StatID\": 10,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 23,\n            \"StatID\": 2,\n            \"Val\": 85\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 23,\n            \"StatID\": 3,\n            \"Val\": 87\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 23,\n            \"StatID\": 4,\n            \"Val\": 88\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 23,\n            \"StatID\": 5,\n            \"Val\": 85\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 23,\n            \"StatID\": 6,\n            \"Val\": 96\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 23,\n            \"StatID\": 7,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 23,\n            \"StatID\": 8,\n            \"Val\": 86\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 23,\n            \"StatID\": 9,\n            \"Val\": 85\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 23,\n            \"StatID\": 10,\n            \"Val\": 92\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 76,\n            \"StatID\": 2,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 76,\n            \"StatID\": 3,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 76,\n            \"StatID\": 4,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 76,\n            \"StatID\": 5,\n            \"Val\": 82\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 76,\n            \"StatID\": 6,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 76,\n            \"StatID\": 7,\n            \"Val\": 77\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 76,\n            \"StatID\": 8,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 76,\n            \"StatID\": 9,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 76,\n            \"StatID\": 10,\n            \"Val\": 86\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 77,\n            \"StatID\": 2,\n            \"Val\": 90\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 77,\n            \"StatID\": 3,\n            \"Val\": 90\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 77,\n            \"StatID\": 4,\n            \"Val\": 94\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 77,\n            \"StatID\": 5,\n            \"Val\": 87\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 77,\n            \"StatID\": 6,\n            \"Val\": 86\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 77,\n            \"StatID\": 7,\n            \"Val\": 91\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 77,\n            \"StatID\": 8,\n            \"Val\": 91\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 77,\n            \"StatID\": 9,\n            \"Val\": 86\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 77,\n            \"StatID\": 10,\n            \"Val\": 88\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 80,\n            \"StatID\": 2,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 80,\n            \"StatID\": 3,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 80,\n            \"StatID\": 4,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 80,\n            \"StatID\": 5,\n            \"Val\": 62\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 80,\n            \"StatID\": 6,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 80,\n            \"StatID\": 7,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 80,\n            \"StatID\": 8,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 80,\n            \"StatID\": 9,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 80,\n            \"StatID\": 10,\n            \"Val\": 83\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 81,\n            \"StatID\": 2,\n            \"Val\": 83\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 81,\n            \"StatID\": 3,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 81,\n            \"StatID\": 4,\n            \"Val\": 77\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 81,\n            \"StatID\": 5,\n            \"Val\": 82\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 81,\n            \"StatID\": 6,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 81,\n            \"StatID\": 7,\n            \"Val\": 85\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 81,\n            \"StatID\": 8,\n            \"Val\": 83\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 81,\n            \"StatID\": 9,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 81,\n            \"StatID\": 10,\n            \"Val\": 89\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 83,\n            \"StatID\": 2,\n            \"Val\": 82\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 83,\n            \"StatID\": 3,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 83,\n            \"StatID\": 4,\n            \"Val\": 88\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 83,\n            \"StatID\": 5,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 83,\n            \"StatID\": 6,\n            \"Val\": 86\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 83,\n            \"StatID\": 7,\n            \"Val\": 82\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 83,\n            \"StatID\": 8,\n            \"Val\": 85\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 83,\n            \"StatID\": 9,\n            \"Val\": 88\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 83,\n            \"StatID\": 10,\n            \"Val\": 85\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 95,\n            \"StatID\": 2,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 95,\n            \"StatID\": 3,\n            \"Val\": 85\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 95,\n            \"StatID\": 4,\n            \"Val\": 86\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 95,\n            \"StatID\": 5,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 95,\n            \"StatID\": 6,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 95,\n            \"StatID\": 7,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 95,\n            \"StatID\": 8,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 95,\n            \"StatID\": 9,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 95,\n            \"StatID\": 10,\n            \"Val\": 82\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 99,\n            \"StatID\": 2,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 99,\n            \"StatID\": 3,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 99,\n            \"StatID\": 4,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 99,\n            \"StatID\": 5,\n            \"Val\": 77\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 99,\n            \"StatID\": 6,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 99,\n            \"StatID\": 7,\n            \"Val\": 70\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 99,\n            \"StatID\": 8,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 99,\n            \"StatID\": 9,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 99,\n            \"StatID\": 10,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 102,\n            \"StatID\": 2,\n            \"Val\": 83\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 102,\n            \"StatID\": 3,\n            \"Val\": 86\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 102,\n            \"StatID\": 4,\n            \"Val\": 90\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 102,\n            \"StatID\": 5,\n            \"Val\": 87\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 102,\n            \"StatID\": 6,\n            \"Val\": 88\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 102,\n            \"StatID\": 7,\n            \"Val\": 84\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 102,\n            \"StatID\": 8,\n            \"Val\": 83\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 102,\n            \"StatID\": 9,\n            \"Val\": 85\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 102,\n            \"StatID\": 10,\n            \"Val\": 85\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 105,\n            \"StatID\": 2,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 105,\n            \"StatID\": 3,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 105,\n            \"StatID\": 4,\n            \"Val\": 84\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 105,\n            \"StatID\": 5,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 105,\n            \"StatID\": 6,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 105,\n            \"StatID\": 7,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 105,\n            \"StatID\": 8,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 105,\n            \"StatID\": 9,\n            \"Val\": 77\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 105,\n            \"StatID\": 10,\n            \"Val\": 77\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 106,\n            \"StatID\": 2,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 106,\n            \"StatID\": 3,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 106,\n            \"StatID\": 4,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 106,\n            \"StatID\": 5,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 106,\n            \"StatID\": 6,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 106,\n            \"StatID\": 7,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 106,\n            \"StatID\": 8,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 106,\n            \"StatID\": 9,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 106,\n            \"StatID\": 10,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 107,\n            \"StatID\": 2,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 107,\n            \"StatID\": 3,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 107,\n            \"StatID\": 4,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 107,\n            \"StatID\": 5,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 107,\n            \"StatID\": 6,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 107,\n            \"StatID\": 7,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 107,\n            \"StatID\": 8,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 107,\n            \"StatID\": 9,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 107,\n            \"StatID\": 10,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 109,\n            \"StatID\": 2,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 109,\n            \"StatID\": 3,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 109,\n            \"StatID\": 4,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 109,\n            \"StatID\": 5,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 109,\n            \"StatID\": 6,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 109,\n            \"StatID\": 7,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 109,\n            \"StatID\": 8,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 109,\n            \"StatID\": 9,\n            \"Val\": 70\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 109,\n            \"StatID\": 10,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 116,\n            \"StatID\": 2,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 116,\n            \"StatID\": 3,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 116,\n            \"StatID\": 4,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 116,\n            \"StatID\": 5,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 116,\n            \"StatID\": 6,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 116,\n            \"StatID\": 7,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 116,\n            \"StatID\": 8,\n            \"Val\": 76\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 116,\n            \"StatID\": 9,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 116,\n            \"StatID\": 10,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 119,\n            \"StatID\": 2,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 119,\n            \"StatID\": 3,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 119,\n            \"StatID\": 4,\n            \"Val\": 76\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 119,\n            \"StatID\": 5,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 119,\n            \"StatID\": 6,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 119,\n            \"StatID\": 7,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 119,\n            \"StatID\": 8,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 119,\n            \"StatID\": 9,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 119,\n            \"StatID\": 10,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 120,\n            \"StatID\": 2,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 120,\n            \"StatID\": 3,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 120,\n            \"StatID\": 4,\n            \"Val\": 76\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 120,\n            \"StatID\": 5,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 120,\n            \"StatID\": 6,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 120,\n            \"StatID\": 7,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 120,\n            \"StatID\": 8,\n            \"Val\": 76\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 120,\n            \"StatID\": 9,\n            \"Val\": 77\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 120,\n            \"StatID\": 10,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 121,\n            \"StatID\": 2,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 121,\n            \"StatID\": 3,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 121,\n            \"StatID\": 4,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 121,\n            \"StatID\": 5,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 121,\n            \"StatID\": 6,\n            \"Val\": 62\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 121,\n            \"StatID\": 7,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 121,\n            \"StatID\": 8,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 121,\n            \"StatID\": 9,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 121,\n            \"StatID\": 10,\n            \"Val\": 70\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 123,\n            \"StatID\": 2,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 123,\n            \"StatID\": 3,\n            \"Val\": 60\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 123,\n            \"StatID\": 4,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 123,\n            \"StatID\": 5,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 123,\n            \"StatID\": 6,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 123,\n            \"StatID\": 7,\n            \"Val\": 61\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 123,\n            \"StatID\": 8,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 123,\n            \"StatID\": 9,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 123,\n            \"StatID\": 10,\n            \"Val\": 62\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 127,\n            \"StatID\": 2,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 127,\n            \"StatID\": 3,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 127,\n            \"StatID\": 4,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 127,\n            \"StatID\": 5,\n            \"Val\": 60\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 127,\n            \"StatID\": 6,\n            \"Val\": 70\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 127,\n            \"StatID\": 7,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 127,\n            \"StatID\": 8,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 127,\n            \"StatID\": 9,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 127,\n            \"StatID\": 10,\n            \"Val\": 76\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 130,\n            \"StatID\": 2,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 130,\n            \"StatID\": 3,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 130,\n            \"StatID\": 4,\n            \"Val\": 82\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 130,\n            \"StatID\": 5,\n            \"Val\": 70\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 130,\n            \"StatID\": 6,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 130,\n            \"StatID\": 7,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 130,\n            \"StatID\": 8,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 130,\n            \"StatID\": 9,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 130,\n            \"StatID\": 10,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 135,\n            \"StatID\": 2,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 135,\n            \"StatID\": 3,\n            \"Val\": 76\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 135,\n            \"StatID\": 4,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 135,\n            \"StatID\": 5,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 135,\n            \"StatID\": 6,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 135,\n            \"StatID\": 7,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 135,\n            \"StatID\": 8,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 135,\n            \"StatID\": 9,\n            \"Val\": 83\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 135,\n            \"StatID\": 10,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 142,\n            \"StatID\": 2,\n            \"Val\": 86\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 142,\n            \"StatID\": 3,\n            \"Val\": 83\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 142,\n            \"StatID\": 4,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 142,\n            \"StatID\": 5,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 142,\n            \"StatID\": 6,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 142,\n            \"StatID\": 7,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 142,\n            \"StatID\": 8,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 142,\n            \"StatID\": 9,\n            \"Val\": 87\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 142,\n            \"StatID\": 10,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 144,\n            \"StatID\": 2,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 144,\n            \"StatID\": 3,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 144,\n            \"StatID\": 4,\n            \"Val\": 83\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 144,\n            \"StatID\": 5,\n            \"Val\": 76\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 144,\n            \"StatID\": 6,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 144,\n            \"StatID\": 7,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 144,\n            \"StatID\": 8,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 144,\n            \"StatID\": 9,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 144,\n            \"StatID\": 10,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 242,\n            \"StatID\": 2,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 242,\n            \"StatID\": 3,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 242,\n            \"StatID\": 4,\n            \"Val\": 86\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 242,\n            \"StatID\": 5,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 242,\n            \"StatID\": 6,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 242,\n            \"StatID\": 7,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 242,\n            \"StatID\": 8,\n            \"Val\": 77\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 242,\n            \"StatID\": 9,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 242,\n            \"StatID\": 10,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 245,\n            \"StatID\": 2,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 245,\n            \"StatID\": 3,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 245,\n            \"StatID\": 4,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 245,\n            \"StatID\": 5,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 245,\n            \"StatID\": 6,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 245,\n            \"StatID\": 7,\n            \"Val\": 70\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 245,\n            \"StatID\": 8,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 245,\n            \"StatID\": 9,\n            \"Val\": 70\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 245,\n            \"StatID\": 10,\n            \"Val\": 70\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 248,\n            \"StatID\": 2,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 248,\n            \"StatID\": 3,\n            \"Val\": 77\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 248,\n            \"StatID\": 4,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 248,\n            \"StatID\": 5,\n            \"Val\": 77\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 248,\n            \"StatID\": 6,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 248,\n            \"StatID\": 7,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 248,\n            \"StatID\": 8,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 248,\n            \"StatID\": 9,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 248,\n            \"StatID\": 10,\n            \"Val\": 82\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 252,\n            \"StatID\": 2,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 252,\n            \"StatID\": 3,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 252,\n            \"StatID\": 4,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 252,\n            \"StatID\": 5,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 252,\n            \"StatID\": 6,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 252,\n            \"StatID\": 7,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 252,\n            \"StatID\": 8,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 252,\n            \"StatID\": 9,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 252,\n            \"StatID\": 10,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 255,\n            \"StatID\": 2,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 255,\n            \"StatID\": 3,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 255,\n            \"StatID\": 4,\n            \"Val\": 83\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 255,\n            \"StatID\": 5,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 255,\n            \"StatID\": 6,\n            \"Val\": 91\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 255,\n            \"StatID\": 7,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 255,\n            \"StatID\": 8,\n            \"Val\": 76\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 255,\n            \"StatID\": 9,\n            \"Val\": 83\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 255,\n            \"StatID\": 10,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 279,\n            \"StatID\": 2,\n            \"Val\": 77\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 279,\n            \"StatID\": 3,\n            \"Val\": 77\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 279,\n            \"StatID\": 4,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 279,\n            \"StatID\": 5,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 279,\n            \"StatID\": 6,\n            \"Val\": 76\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 279,\n            \"StatID\": 7,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 279,\n            \"StatID\": 8,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 279,\n            \"StatID\": 9,\n            \"Val\": 77\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 279,\n            \"StatID\": 10,\n            \"Val\": 83\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 280,\n            \"StatID\": 2,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 280,\n            \"StatID\": 3,\n            \"Val\": 76\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 280,\n            \"StatID\": 4,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 280,\n            \"StatID\": 5,\n            \"Val\": 61\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 280,\n            \"StatID\": 6,\n            \"Val\": 77\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 280,\n            \"StatID\": 7,\n            \"Val\": 62\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 280,\n            \"StatID\": 8,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 280,\n            \"StatID\": 9,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 280,\n            \"StatID\": 10,\n            \"Val\": 55\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 281,\n            \"StatID\": 2,\n            \"Val\": 77\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 281,\n            \"StatID\": 3,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 281,\n            \"StatID\": 4,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 281,\n            \"StatID\": 5,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 281,\n            \"StatID\": 6,\n            \"Val\": 77\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 281,\n            \"StatID\": 7,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 281,\n            \"StatID\": 8,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 281,\n            \"StatID\": 9,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 281,\n            \"StatID\": 10,\n            \"Val\": 76\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 282,\n            \"StatID\": 2,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 282,\n            \"StatID\": 3,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 282,\n            \"StatID\": 4,\n            \"Val\": 62\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 282,\n            \"StatID\": 5,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 282,\n            \"StatID\": 6,\n            \"Val\": 76\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 282,\n            \"StatID\": 7,\n            \"Val\": 59\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 282,\n            \"StatID\": 8,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 282,\n            \"StatID\": 9,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 282,\n            \"StatID\": 10,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 283,\n            \"StatID\": 2,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 283,\n            \"StatID\": 3,\n            \"Val\": 61\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 283,\n            \"StatID\": 4,\n            \"Val\": 61\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 283,\n            \"StatID\": 5,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 283,\n            \"StatID\": 6,\n            \"Val\": 56\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 283,\n            \"StatID\": 7,\n            \"Val\": 51\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 283,\n            \"StatID\": 8,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 283,\n            \"StatID\": 9,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 283,\n            \"StatID\": 10,\n            \"Val\": 55\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 284,\n            \"StatID\": 2,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 284,\n            \"StatID\": 3,\n            \"Val\": 60\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 284,\n            \"StatID\": 4,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 284,\n            \"StatID\": 5,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 284,\n            \"StatID\": 6,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 284,\n            \"StatID\": 7,\n            \"Val\": 55\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 284,\n            \"StatID\": 8,\n            \"Val\": 77\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 284,\n            \"StatID\": 9,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 284,\n            \"StatID\": 10,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 285,\n            \"StatID\": 2,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 285,\n            \"StatID\": 3,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 285,\n            \"StatID\": 4,\n            \"Val\": 77\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 285,\n            \"StatID\": 5,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 285,\n            \"StatID\": 6,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 285,\n            \"StatID\": 7,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 285,\n            \"StatID\": 8,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 285,\n            \"StatID\": 9,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 285,\n            \"StatID\": 10,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 286,\n            \"StatID\": 2,\n            \"Val\": 61\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 286,\n            \"StatID\": 3,\n            \"Val\": 60\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 286,\n            \"StatID\": 4,\n            \"Val\": 62\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 286,\n            \"StatID\": 5,\n            \"Val\": 56\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 286,\n            \"StatID\": 6,\n            \"Val\": 62\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 286,\n            \"StatID\": 7,\n            \"Val\": 57\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 286,\n            \"StatID\": 8,\n            \"Val\": 59\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 286,\n            \"StatID\": 9,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 286,\n            \"StatID\": 10,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 288,\n            \"StatID\": 2,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 288,\n            \"StatID\": 3,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 288,\n            \"StatID\": 4,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 288,\n            \"StatID\": 5,\n            \"Val\": 56\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 288,\n            \"StatID\": 6,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 288,\n            \"StatID\": 7,\n            \"Val\": 53\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 288,\n            \"StatID\": 8,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 288,\n            \"StatID\": 9,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 288,\n            \"StatID\": 10,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 289,\n            \"StatID\": 2,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 289,\n            \"StatID\": 3,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 289,\n            \"StatID\": 4,\n            \"Val\": 77\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 289,\n            \"StatID\": 5,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 289,\n            \"StatID\": 6,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 289,\n            \"StatID\": 7,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 289,\n            \"StatID\": 8,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 289,\n            \"StatID\": 9,\n            \"Val\": 55\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 289,\n            \"StatID\": 10,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 301,\n            \"StatID\": 2,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 301,\n            \"StatID\": 3,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 301,\n            \"StatID\": 4,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 301,\n            \"StatID\": 5,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 301,\n            \"StatID\": 6,\n            \"Val\": 62\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 301,\n            \"StatID\": 7,\n            \"Val\": 51\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 301,\n            \"StatID\": 8,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 301,\n            \"StatID\": 9,\n            \"Val\": 47\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 301,\n            \"StatID\": 10,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 305,\n            \"StatID\": 2,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 305,\n            \"StatID\": 3,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 305,\n            \"StatID\": 4,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 305,\n            \"StatID\": 5,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 305,\n            \"StatID\": 6,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 305,\n            \"StatID\": 7,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 305,\n            \"StatID\": 8,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 305,\n            \"StatID\": 9,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 305,\n            \"StatID\": 10,\n            \"Val\": 56\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 306,\n            \"StatID\": 2,\n            \"Val\": 60\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 306,\n            \"StatID\": 3,\n            \"Val\": 57\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 306,\n            \"StatID\": 4,\n            \"Val\": 70\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 306,\n            \"StatID\": 5,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 306,\n            \"StatID\": 6,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 306,\n            \"StatID\": 7,\n            \"Val\": 62\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 306,\n            \"StatID\": 8,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 306,\n            \"StatID\": 9,\n            \"Val\": 58\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 306,\n            \"StatID\": 10,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 308,\n            \"StatID\": 2,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 308,\n            \"StatID\": 3,\n            \"Val\": 62\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 308,\n            \"StatID\": 4,\n            \"Val\": 59\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 308,\n            \"StatID\": 5,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 308,\n            \"StatID\": 6,\n            \"Val\": 57\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 308,\n            \"StatID\": 7,\n            \"Val\": 58\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 308,\n            \"StatID\": 8,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 308,\n            \"StatID\": 9,\n            \"Val\": 56\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 308,\n            \"StatID\": 10,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 322,\n            \"StatID\": 2,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 322,\n            \"StatID\": 3,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 322,\n            \"StatID\": 4,\n            \"Val\": 62\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 322,\n            \"StatID\": 5,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 322,\n            \"StatID\": 6,\n            \"Val\": 76\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 322,\n            \"StatID\": 7,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 322,\n            \"StatID\": 8,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 322,\n            \"StatID\": 9,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 322,\n            \"StatID\": 10,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 373,\n            \"StatID\": 2,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 373,\n            \"StatID\": 3,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 373,\n            \"StatID\": 4,\n            \"Val\": 60\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 373,\n            \"StatID\": 5,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 373,\n            \"StatID\": 6,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 373,\n            \"StatID\": 7,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 373,\n            \"StatID\": 8,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 373,\n            \"StatID\": 9,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 373,\n            \"StatID\": 10,\n            \"Val\": 70\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 374,\n            \"StatID\": 2,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 374,\n            \"StatID\": 3,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 374,\n            \"StatID\": 4,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 374,\n            \"StatID\": 5,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 374,\n            \"StatID\": 6,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 374,\n            \"StatID\": 7,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 374,\n            \"StatID\": 8,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 374,\n            \"StatID\": 9,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 374,\n            \"StatID\": 10,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 375,\n            \"StatID\": 2,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 375,\n            \"StatID\": 3,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 375,\n            \"StatID\": 4,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 375,\n            \"StatID\": 5,\n            \"Val\": 62\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 375,\n            \"StatID\": 6,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 375,\n            \"StatID\": 7,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 375,\n            \"StatID\": 8,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 375,\n            \"StatID\": 9,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 375,\n            \"StatID\": 10,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 376,\n            \"StatID\": 2,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 376,\n            \"StatID\": 3,\n            \"Val\": 85\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 376,\n            \"StatID\": 4,\n            \"Val\": 62\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 376,\n            \"StatID\": 5,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 376,\n            \"StatID\": 6,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 376,\n            \"StatID\": 7,\n            \"Val\": 81\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 376,\n            \"StatID\": 8,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 376,\n            \"StatID\": 9,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 376,\n            \"StatID\": 10,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 377,\n            \"StatID\": 2,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 377,\n            \"StatID\": 3,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 377,\n            \"StatID\": 4,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 377,\n            \"StatID\": 5,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 377,\n            \"StatID\": 6,\n            \"Val\": 70\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 377,\n            \"StatID\": 7,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 377,\n            \"StatID\": 8,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 377,\n            \"StatID\": 9,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 377,\n            \"StatID\": 10,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 378,\n            \"StatID\": 2,\n            \"Val\": 73\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 378,\n            \"StatID\": 3,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 378,\n            \"StatID\": 4,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 378,\n            \"StatID\": 5,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 378,\n            \"StatID\": 6,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 378,\n            \"StatID\": 7,\n            \"Val\": 77\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 378,\n            \"StatID\": 8,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 378,\n            \"StatID\": 9,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 378,\n            \"StatID\": 10,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 379,\n            \"StatID\": 2,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 379,\n            \"StatID\": 3,\n            \"Val\": 61\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 379,\n            \"StatID\": 4,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 379,\n            \"StatID\": 5,\n            \"Val\": 58\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 379,\n            \"StatID\": 6,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 379,\n            \"StatID\": 7,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 379,\n            \"StatID\": 8,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 379,\n            \"StatID\": 9,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 379,\n            \"StatID\": 10,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 380,\n            \"StatID\": 2,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 380,\n            \"StatID\": 3,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 380,\n            \"StatID\": 4,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 380,\n            \"StatID\": 5,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 380,\n            \"StatID\": 6,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 380,\n            \"StatID\": 7,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 380,\n            \"StatID\": 8,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 380,\n            \"StatID\": 9,\n            \"Val\": 60\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 380,\n            \"StatID\": 10,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 381,\n            \"StatID\": 2,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 381,\n            \"StatID\": 3,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 381,\n            \"StatID\": 4,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 381,\n            \"StatID\": 5,\n            \"Val\": 57\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 381,\n            \"StatID\": 6,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 381,\n            \"StatID\": 7,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 381,\n            \"StatID\": 8,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 381,\n            \"StatID\": 9,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 381,\n            \"StatID\": 10,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 382,\n            \"StatID\": 2,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 382,\n            \"StatID\": 3,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 382,\n            \"StatID\": 4,\n            \"Val\": 61\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 382,\n            \"StatID\": 5,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 382,\n            \"StatID\": 6,\n            \"Val\": 62\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 382,\n            \"StatID\": 7,\n            \"Val\": 57\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 382,\n            \"StatID\": 8,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 382,\n            \"StatID\": 9,\n            \"Val\": 60\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 382,\n            \"StatID\": 10,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 383,\n            \"StatID\": 2,\n            \"Val\": 57\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 383,\n            \"StatID\": 3,\n            \"Val\": 61\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 383,\n            \"StatID\": 4,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 383,\n            \"StatID\": 5,\n            \"Val\": 59\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 383,\n            \"StatID\": 6,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 383,\n            \"StatID\": 7,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 383,\n            \"StatID\": 8,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 383,\n            \"StatID\": 9,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 383,\n            \"StatID\": 10,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 384,\n            \"StatID\": 2,\n            \"Val\": 62\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 384,\n            \"StatID\": 3,\n            \"Val\": 62\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 384,\n            \"StatID\": 4,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 384,\n            \"StatID\": 5,\n            \"Val\": 58\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 384,\n            \"StatID\": 6,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 384,\n            \"StatID\": 7,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 384,\n            \"StatID\": 8,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 384,\n            \"StatID\": 9,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 384,\n            \"StatID\": 10,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 385,\n            \"StatID\": 2,\n            \"Val\": 55\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 385,\n            \"StatID\": 3,\n            \"Val\": 60\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 385,\n            \"StatID\": 4,\n            \"Val\": 61\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 385,\n            \"StatID\": 5,\n            \"Val\": 48\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 385,\n            \"StatID\": 6,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 385,\n            \"StatID\": 7,\n            \"Val\": 61\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 385,\n            \"StatID\": 8,\n            \"Val\": 60\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 385,\n            \"StatID\": 9,\n            \"Val\": 62\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 385,\n            \"StatID\": 10,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 386,\n            \"StatID\": 2,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 386,\n            \"StatID\": 3,\n            \"Val\": 58\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 386,\n            \"StatID\": 4,\n            \"Val\": 60\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 386,\n            \"StatID\": 5,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 386,\n            \"StatID\": 6,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 386,\n            \"StatID\": 7,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 386,\n            \"StatID\": 8,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 386,\n            \"StatID\": 9,\n            \"Val\": 61\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 386,\n            \"StatID\": 10,\n            \"Val\": 59\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 387,\n            \"StatID\": 2,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 387,\n            \"StatID\": 3,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 387,\n            \"StatID\": 4,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 387,\n            \"StatID\": 5,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 387,\n            \"StatID\": 6,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 387,\n            \"StatID\": 7,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 387,\n            \"StatID\": 8,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 387,\n            \"StatID\": 9,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 387,\n            \"StatID\": 10,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 388,\n            \"StatID\": 2,\n            \"Val\": 57\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 388,\n            \"StatID\": 3,\n            \"Val\": 61\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 388,\n            \"StatID\": 4,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 388,\n            \"StatID\": 5,\n            \"Val\": 59\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 388,\n            \"StatID\": 6,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 388,\n            \"StatID\": 7,\n            \"Val\": 62\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 388,\n            \"StatID\": 8,\n            \"Val\": 61\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 388,\n            \"StatID\": 9,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 388,\n            \"StatID\": 10,\n            \"Val\": 57\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 390,\n            \"StatID\": 2,\n            \"Val\": 61\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 390,\n            \"StatID\": 3,\n            \"Val\": 62\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 390,\n            \"StatID\": 4,\n            \"Val\": 57\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 390,\n            \"StatID\": 5,\n            \"Val\": 56\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 390,\n            \"StatID\": 6,\n            \"Val\": 60\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 390,\n            \"StatID\": 7,\n            \"Val\": 65\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 390,\n            \"StatID\": 8,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 390,\n            \"StatID\": 9,\n            \"Val\": 59\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 390,\n            \"StatID\": 10,\n            \"Val\": 63\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 394,\n            \"StatID\": 2,\n            \"Val\": 62\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 394,\n            \"StatID\": 3,\n            \"Val\": 58\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 394,\n            \"StatID\": 4,\n            \"Val\": 59\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 394,\n            \"StatID\": 5,\n            \"Val\": 54\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 394,\n            \"StatID\": 6,\n            \"Val\": 61\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 394,\n            \"StatID\": 7,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 394,\n            \"StatID\": 8,\n            \"Val\": 60\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 394,\n            \"StatID\": 9,\n            \"Val\": 58\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 394,\n            \"StatID\": 10,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 398,\n            \"StatID\": 2,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 398,\n            \"StatID\": 3,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 398,\n            \"StatID\": 4,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 398,\n            \"StatID\": 5,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 398,\n            \"StatID\": 6,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 398,\n            \"StatID\": 7,\n            \"Val\": 80\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 398,\n            \"StatID\": 8,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 398,\n            \"StatID\": 9,\n            \"Val\": 77\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 398,\n            \"StatID\": 10,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 399,\n            \"StatID\": 2,\n            \"Val\": 70\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 399,\n            \"StatID\": 3,\n            \"Val\": 60\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 399,\n            \"StatID\": 4,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 399,\n            \"StatID\": 5,\n            \"Val\": 55\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 399,\n            \"StatID\": 6,\n            \"Val\": 62\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 399,\n            \"StatID\": 7,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 399,\n            \"StatID\": 8,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 399,\n            \"StatID\": 9,\n            \"Val\": 60\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 399,\n            \"StatID\": 10,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 411,\n            \"StatID\": 2,\n            \"Val\": 67\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 411,\n            \"StatID\": 3,\n            \"Val\": 68\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 411,\n            \"StatID\": 4,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 411,\n            \"StatID\": 5,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 411,\n            \"StatID\": 6,\n            \"Val\": 64\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 411,\n            \"StatID\": 7,\n            \"Val\": 74\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 411,\n            \"StatID\": 8,\n            \"Val\": 66\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 411,\n            \"StatID\": 9,\n            \"Val\": 69\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 411,\n            \"StatID\": 10,\n            \"Val\": 58\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 413,\n            \"StatID\": 2,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 413,\n            \"StatID\": 3,\n            \"Val\": 78\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 413,\n            \"StatID\": 4,\n            \"Val\": 71\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 413,\n            \"StatID\": 5,\n            \"Val\": 72\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 413,\n            \"StatID\": 6,\n            \"Val\": 76\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 413,\n            \"StatID\": 7,\n            \"Val\": 76\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 413,\n            \"StatID\": 8,\n            \"Val\": 75\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 413,\n            \"StatID\": 9,\n            \"Val\": 79\n        },\n        {\n            \"Max\": 100,\n            \"StaffID\": 413,\n            \"StatID\": 10,\n            \"Val\": 78\n        }\n    ],\n    \"Calendar\": [\n        {\n            \"TrackID\": 1,\n            \"Day\": 45732,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 3,\n            \"Day\": 45739,\n            \"WeekendType\": 1\n        },\n        {\n            \"TrackID\": 17,\n            \"Day\": 45753,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 2,\n            \"Day\": 45760,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 11,\n            \"Day\": 45767,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 22,\n            \"Day\": 45781,\n            \"WeekendType\": 1\n        },\n        {\n            \"TrackID\": 24,\n            \"Day\": 45795,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 6,\n            \"Day\": 45802,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 5,\n            \"Day\": 45809,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 7,\n            \"Day\": 45823,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 9,\n            \"Day\": 45837,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 10,\n            \"Day\": 45844,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 13,\n            \"Day\": 45865,\n            \"WeekendType\": 1\n        },\n        {\n            \"TrackID\": 12,\n            \"Day\": 45872,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 23,\n            \"Day\": 45900,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 14,\n            \"Day\": 45907,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 4,\n            \"Day\": 45921,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 15,\n            \"Day\": 45935,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 19,\n            \"Day\": 45949,\n            \"WeekendType\": 1\n        },\n        {\n            \"TrackID\": 18,\n            \"Day\": 45956,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 20,\n            \"Day\": 45970,\n            \"WeekendType\": 1\n        },\n        {\n            \"TrackID\": 25,\n            \"Day\": 45983,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 26,\n            \"Day\": 45991,\n            \"WeekendType\": 1\n        },\n        {\n            \"TrackID\": 21,\n            \"Day\": 45998,\n            \"WeekendType\": 0\n        }\n    ],\n    \"DriverStandings\": [\n        {\n            \"DriverID\": 1,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 223,\n            \"Position\": 7,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024\n        },\n        {\n            \"DriverID\": 2,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 356,\n            \"Position\": 3,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024\n        },\n        {\n            \"DriverID\": 3,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 12,\n            \"Position\": 16,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024\n        },\n        {\n            \"DriverID\": 8,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 0,\n            \"Position\": 19,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024\n        },\n        {\n            \"DriverID\": 10,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 437,\n            \"Position\": 1,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024\n        },\n        {\n            \"DriverID\": 11,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 290,\n            \"Position\": 5,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024\n        },\n        {\n            \"DriverID\": 12,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 374,\n            \"Position\": 2,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024\n        },\n        {\n            \"DriverID\": 13,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 12,\n            \"Position\": 17,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024\n        },\n        {\n            \"DriverID\": 14,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 23,\n            \"Position\": 14,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024\n        },\n        {\n            \"DriverID\": 15,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 42,\n            \"Position\": 10,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024\n        },\n        {\n            \"DriverID\": 17,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 152,\n            \"Position\": 8,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024\n        },\n        {\n            \"DriverID\": 18,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 24,\n            \"Position\": 13,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024\n        },\n        {\n            \"DriverID\": 23,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 245,\n            \"Position\": 6,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024\n        },\n        {\n            \"DriverID\": 77,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 70,\n            \"Position\": 9,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024\n        },\n        {\n            \"DriverID\": 81,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 30,\n            \"Position\": 12,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024\n        },\n        {\n            \"DriverID\": 83,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 41,\n            \"Position\": 11,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024\n        },\n        {\n            \"DriverID\": 102,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 292,\n            \"Position\": 4,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024\n        },\n        {\n            \"DriverID\": 105,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 4,\n            \"Position\": 18,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024\n        },\n        {\n            \"DriverID\": 116,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 0,\n            \"Position\": 20,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024\n        },\n        {\n            \"DriverID\": 255,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 16,\n            \"Position\": 15,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024\n        }\n    ],\n    \"TeamStandings\": [\n        {\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 652,\n            \"Position\": 2,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024,\n            \"TeamID\": 1\n        },\n        {\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 666,\n            \"Position\": 1,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024,\n            \"TeamID\": 2\n        },\n        {\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 589,\n            \"Position\": 3,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024,\n            \"TeamID\": 3\n        },\n        {\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 468,\n            \"Position\": 4,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024,\n            \"TeamID\": 4\n        },\n        {\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 65,\n            \"Position\": 6,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024,\n            \"TeamID\": 5\n        },\n        {\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 17,\n            \"Position\": 9,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024,\n            \"TeamID\": 6\n        },\n        {\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 58,\n            \"Position\": 7,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024,\n            \"TeamID\": 7\n        },\n        {\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 46,\n            \"Position\": 8,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024,\n            \"TeamID\": 8\n        },\n        {\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 4,\n            \"Position\": 10,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024,\n            \"TeamID\": 9\n        },\n        {\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 94,\n            \"Position\": 5,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2024,\n            \"TeamID\": 10\n        }\n    ],\n    \"Staff_BasicData\": [\n        {\n            \"StaffID\": 600,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Ella|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Lloyd|]\",\n            \"CountryID\": 186,\n            \"DOB\": 38553,\n            \"DOB_ISO\": \"2005-07-20\",\n            \"Gender\": 1,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 0,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 601,\n            \"FirstName\": \"[STRING_LITERAL:Value=|John|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Bennett|]\",\n            \"CountryID\": 186,\n            \"DOB\": 37879,\n            \"DOB_ISO\": \"2003-09-15\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 0,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 602,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Brando|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Badoer|]\",\n            \"CountryID\": 79,\n            \"DOB\": 38975,\n            \"DOB_ISO\": \"2006-09-15\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 1,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 603,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Antonio|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Fuoco|]\",\n            \"CountryID\": 79,\n            \"DOB\": 35205,\n            \"DOB_ISO\": \"1996-05-20\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 2,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 604,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Rafael|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Câmara|]\",\n            \"CountryID\": 23,\n            \"DOB\": 38477,\n            \"DOB_ISO\": \"2005-05-05\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 3,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 605,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Doriane|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Pin|]\",\n            \"CountryID\": 57,\n            \"DOB\": 37992,\n            \"DOB_ISO\": \"2004-01-06\",\n            \"Gender\": 1,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 1,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 606,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Nina|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Gademan|]\",\n            \"CountryID\": 120,\n            \"DOB\": 37894,\n            \"DOB_ISO\": \"2003-09-30\",\n            \"Gender\": 1,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 2,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 607,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Courtney|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Crone|]\",\n            \"CountryID\": 187,\n            \"DOB\": 36957,\n            \"DOB_ISO\": \"2001-03-07\",\n            \"Gender\": 1,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 3,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 608,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Jamie|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Chadwick|]\",\n            \"CountryID\": 186,\n            \"DOB\": 35935,\n            \"DOB_ISO\": \"1998-05-20\",\n            \"Gender\": 1,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 4,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 609,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Lia|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Block|]\",\n            \"CountryID\": 187,\n            \"DOB\": 38991,\n            \"DOB_ISO\": \"2006-10-01\",\n            \"Gender\": 1,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 5,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 610,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Noah|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Strømsted|]\",\n            \"CountryID\": 43,\n            \"DOB\": 39292,\n            \"DOB_ISO\": \"2007-07-29\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 4,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 611,\n            \"FirstName\": \"[STRING_LITERAL:Value=|James|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Wharton|]\",\n            \"CountryID\": 9,\n            \"DOB\": 38906,\n            \"DOB_ISO\": \"2006-07-08\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 5,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 612,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Gerrard|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Xie|]\",\n            \"CountryID\": 35,\n            \"DOB\": 38984,\n            \"DOB_ISO\": \"2006-09-24\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 4,\n            \"FaceIndex\": 0,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 613,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Bruno|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|del Pino|]\",\n            \"CountryID\": 160,\n            \"DOB\": 38888,\n            \"DOB_ISO\": \"2006-06-20\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 6,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 614,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Alessandro|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Giusti|]\",\n            \"CountryID\": 57,\n            \"DOB\": 38970,\n            \"DOB_ISO\": \"2006-09-10\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 7,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 615,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Théophile|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Naël|]\",\n            \"CountryID\": 57,\n            \"DOB\": 39255,\n            \"DOB_ISO\": \"2007-06-22\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 8,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 616,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Ivan|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Domingues|]\",\n            \"CountryID\": 136,\n            \"DOB\": 38842,\n            \"DOB_ISO\": \"2006-05-05\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 9,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 617,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Louis|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Sharp|]\",\n            \"CountryID\": 121,\n            \"DOB\": 39213,\n            \"DOB_ISO\": \"2007-05-11\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 10,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 618,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Roman|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Bilinski|]\",\n            \"CountryID\": 135,\n            \"DOB\": 38050,\n            \"DOB_ISO\": \"2004-03-04\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 11,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 619,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Javier|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Sagrera|]\",\n            \"CountryID\": 160,\n            \"DOB\": 37998,\n            \"DOB_ISO\": \"2004-01-12\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 12,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 620,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Nicola|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Marinangeli|]\",\n            \"CountryID\": 79,\n            \"DOB\": 37755,\n            \"DOB_ISO\": \"2003-05-14\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 13,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 621,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Christian|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Ho|]\",\n            \"CountryID\": 152,\n            \"DOB\": 39021,\n            \"DOB_ISO\": \"2006-10-31\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 4,\n            \"FaceIndex\": 1,\n            \"AgeType\": 0,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 622,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Bryan|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Bozzi|]\",\n            \"CountryID\": 79,\n            \"DOB\": 29221,\n            \"DOB_ISO\": \"1980-01-01\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 0,\n            \"AgeType\": 1,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 623,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Richard|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Wood|]\",\n            \"CountryID\": 186,\n            \"DOB\": 29221,\n            \"DOB_ISO\": \"1980-01-01\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 11,\n            \"AgeType\": 1,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 624,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Laura|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Mueller|]\",\n            \"CountryID\": 60,\n            \"DOB\": 32874,\n            \"DOB_ISO\": \"1990-01-01\",\n            \"Gender\": 1,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 0,\n            \"AgeType\": 1,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 625,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Ronan|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|O'Hare|]\",\n            \"CountryID\": 186,\n            \"DOB\": 29221,\n            \"DOB_ISO\": \"1980-01-01\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 11,\n            \"AgeType\": 1,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 626,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Ernesto|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Desiderio|]\",\n            \"CountryID\": 79,\n            \"DOB\": 29221,\n            \"DOB_ISO\": \"1980-01-01\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 1,\n            \"AgeType\": 1,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 628,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Rob|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Marshall|]\",\n            \"CountryID\": 186,\n            \"DOB\": 24942,\n            \"DOB_ISO\": \"1968-04-14\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 2,\n            \"AgeType\": 1,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 630,\n            \"FirstName\": \"[STRING_LITERAL:Value=|David|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Sanchez|]\",\n            \"CountryID\": 57,\n            \"DOB\": 29221,\n            \"DOB_ISO\": \"1980-01-01\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 3,\n            \"AgeType\": 1,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 633,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Selin|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Tur|]\",\n            \"CountryID\": 186,\n            \"DOB\": 28518,\n            \"DOB_ISO\": \"1978-01-28\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 1,\n            \"AgeType\": 1,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 635,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Sean|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Whitehead|]\",\n            \"CountryID\": 186,\n            \"DOB\": 23025,\n            \"DOB_ISO\": \"1963-01-14\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 11,\n            \"AgeType\": 1,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 636,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Mark|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Robinson|]\",\n            \"CountryID\": 186,\n            \"DOB\": 29221,\n            \"DOB_ISO\": \"1980-01-01\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 11,\n            \"AgeType\": 1,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 637,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Peter|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Machin|]\",\n            \"CountryID\": 186,\n            \"DOB\": 24838,\n            \"DOB_ISO\": \"1968-01-01\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 11,\n            \"AgeType\": 1,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 638,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Will|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Courtenay|]\",\n            \"CountryID\": 186,\n            \"DOB\": 29221,\n            \"DOB_ISO\": \"1980-01-01\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 4,\n            \"AgeType\": 1,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 639,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Richard|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Wolverson|]\",\n            \"CountryID\": 186,\n            \"DOB\": 29221,\n            \"DOB_ISO\": \"1980-01-01\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 5,\n            \"AgeType\": 1,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 640,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Mark|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Lowe|]\",\n            \"CountryID\": 187,\n            \"DOB\": 29221,\n            \"DOB_ISO\": \"1980-01-01\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 6,\n            \"AgeType\": 1,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 641,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Ignacio|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Rueda|]\",\n            \"CountryID\": 160,\n            \"DOB\": 28708,\n            \"DOB_ISO\": \"1978-08-06\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 7,\n            \"AgeType\": 1,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 642,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Loïc|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Serra|]\",\n            \"CountryID\": 57,\n            \"DOB\": 26388,\n            \"DOB_ISO\": \"1972-03-30\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 8,\n            \"AgeType\": 1,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 643,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Steven|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Petrik|]\",\n            \"CountryID\": 187,\n            \"DOB\": 29221,\n            \"DOB_ISO\": \"1980-01-01\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 9,\n            \"AgeType\": 1,\n            \"IsGeneratedForCustomTeam\": 0\n        },\n        {\n            \"StaffID\": 644,\n            \"FirstName\": \"[STRING_LITERAL:Value=|Jose Manuel|]\",\n            \"LastName\": \"[STRING_LITERAL:Value=|Lopez|]\",\n            \"CountryID\": 160,\n            \"DOB\": 29221,\n            \"DOB_ISO\": \"1980-01-01\",\n            \"Gender\": 0,\n            \"IsGeneratedStaff\": 1,\n            \"PhotoDay\": 45340,\n            \"FaceType\": 0,\n            \"FaceIndex\": 10,\n            \"AgeType\": 1,\n            \"IsGeneratedForCustomTeam\": 0\n        }\n    ],\n    \"Staff_PerformanceStats\": [\n        {\n            \"StaffID\": 600,\n            \"StatID\": 2,\n            \"Val\": 57,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 600,\n            \"StatID\": 3,\n            \"Val\": 57,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 600,\n            \"StatID\": 4,\n            \"Val\": 57,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 600,\n            \"StatID\": 5,\n            \"Val\": 57,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 600,\n            \"StatID\": 6,\n            \"Val\": 57,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 600,\n            \"StatID\": 7,\n            \"Val\": 57,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 600,\n            \"StatID\": 8,\n            \"Val\": 57,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 600,\n            \"StatID\": 9,\n            \"Val\": 57,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 600,\n            \"StatID\": 10,\n            \"Val\": 57,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 601,\n            \"StatID\": 2,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 601,\n            \"StatID\": 3,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 601,\n            \"StatID\": 4,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 601,\n            \"StatID\": 5,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 601,\n            \"StatID\": 6,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 601,\n            \"StatID\": 7,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 601,\n            \"StatID\": 8,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 601,\n            \"StatID\": 9,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 601,\n            \"StatID\": 10,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 602,\n            \"StatID\": 2,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 602,\n            \"StatID\": 3,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 602,\n            \"StatID\": 4,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 602,\n            \"StatID\": 5,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 602,\n            \"StatID\": 6,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 602,\n            \"StatID\": 7,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 602,\n            \"StatID\": 8,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 602,\n            \"StatID\": 9,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 602,\n            \"StatID\": 10,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 603,\n            \"StatID\": 2,\n            \"Val\": 75,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 603,\n            \"StatID\": 3,\n            \"Val\": 75,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 603,\n            \"StatID\": 4,\n            \"Val\": 75,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 603,\n            \"StatID\": 5,\n            \"Val\": 75,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 603,\n            \"StatID\": 6,\n            \"Val\": 75,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 603,\n            \"StatID\": 7,\n            \"Val\": 75,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 603,\n            \"StatID\": 8,\n            \"Val\": 75,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 603,\n            \"StatID\": 9,\n            \"Val\": 75,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 603,\n            \"StatID\": 10,\n            \"Val\": 75,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 604,\n            \"StatID\": 2,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 604,\n            \"StatID\": 3,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 604,\n            \"StatID\": 4,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 604,\n            \"StatID\": 5,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 604,\n            \"StatID\": 6,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 604,\n            \"StatID\": 7,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 604,\n            \"StatID\": 8,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 604,\n            \"StatID\": 9,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 604,\n            \"StatID\": 10,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 605,\n            \"StatID\": 2,\n            \"Val\": 61,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 605,\n            \"StatID\": 3,\n            \"Val\": 61,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 605,\n            \"StatID\": 4,\n            \"Val\": 61,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 605,\n            \"StatID\": 5,\n            \"Val\": 61,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 605,\n            \"StatID\": 6,\n            \"Val\": 61,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 605,\n            \"StatID\": 7,\n            \"Val\": 61,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 605,\n            \"StatID\": 8,\n            \"Val\": 61,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 605,\n            \"StatID\": 9,\n            \"Val\": 61,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 605,\n            \"StatID\": 10,\n            \"Val\": 61,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 606,\n            \"StatID\": 2,\n            \"Val\": 56,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 606,\n            \"StatID\": 3,\n            \"Val\": 56,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 606,\n            \"StatID\": 4,\n            \"Val\": 56,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 606,\n            \"StatID\": 5,\n            \"Val\": 56,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 606,\n            \"StatID\": 6,\n            \"Val\": 56,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 606,\n            \"StatID\": 7,\n            \"Val\": 56,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 606,\n            \"StatID\": 8,\n            \"Val\": 56,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 606,\n            \"StatID\": 9,\n            \"Val\": 56,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 606,\n            \"StatID\": 10,\n            \"Val\": 56,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 607,\n            \"StatID\": 2,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 607,\n            \"StatID\": 3,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 607,\n            \"StatID\": 4,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 607,\n            \"StatID\": 5,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 607,\n            \"StatID\": 6,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 607,\n            \"StatID\": 7,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 607,\n            \"StatID\": 8,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 607,\n            \"StatID\": 9,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 607,\n            \"StatID\": 10,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 608,\n            \"StatID\": 2,\n            \"Val\": 72,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 608,\n            \"StatID\": 3,\n            \"Val\": 72,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 608,\n            \"StatID\": 4,\n            \"Val\": 72,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 608,\n            \"StatID\": 5,\n            \"Val\": 72,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 608,\n            \"StatID\": 6,\n            \"Val\": 72,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 608,\n            \"StatID\": 7,\n            \"Val\": 72,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 608,\n            \"StatID\": 8,\n            \"Val\": 72,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 608,\n            \"StatID\": 9,\n            \"Val\": 72,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 608,\n            \"StatID\": 10,\n            \"Val\": 72,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 609,\n            \"StatID\": 2,\n            \"Val\": 56,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 609,\n            \"StatID\": 3,\n            \"Val\": 56,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 609,\n            \"StatID\": 4,\n            \"Val\": 56,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 609,\n            \"StatID\": 5,\n            \"Val\": 56,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 609,\n            \"StatID\": 6,\n            \"Val\": 56,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 609,\n            \"StatID\": 7,\n            \"Val\": 56,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 609,\n            \"StatID\": 8,\n            \"Val\": 56,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 609,\n            \"StatID\": 9,\n            \"Val\": 56,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 609,\n            \"StatID\": 10,\n            \"Val\": 56,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 610,\n            \"StatID\": 2,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 610,\n            \"StatID\": 3,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 610,\n            \"StatID\": 4,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 610,\n            \"StatID\": 5,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 610,\n            \"StatID\": 6,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 610,\n            \"StatID\": 7,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 610,\n            \"StatID\": 8,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 610,\n            \"StatID\": 9,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 610,\n            \"StatID\": 10,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 611,\n            \"StatID\": 2,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 611,\n            \"StatID\": 3,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 611,\n            \"StatID\": 4,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 611,\n            \"StatID\": 5,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 611,\n            \"StatID\": 6,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 611,\n            \"StatID\": 7,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 611,\n            \"StatID\": 8,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 611,\n            \"StatID\": 9,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 611,\n            \"StatID\": 10,\n            \"Val\": 64,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 612,\n            \"StatID\": 2,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 612,\n            \"StatID\": 3,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 612,\n            \"StatID\": 4,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 612,\n            \"StatID\": 5,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 612,\n            \"StatID\": 6,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 612,\n            \"StatID\": 7,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 612,\n            \"StatID\": 8,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 612,\n            \"StatID\": 9,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 612,\n            \"StatID\": 10,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 613,\n            \"StatID\": 2,\n            \"Val\": 61,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 613,\n            \"StatID\": 3,\n            \"Val\": 61,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 613,\n            \"StatID\": 4,\n            \"Val\": 61,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 613,\n            \"StatID\": 5,\n            \"Val\": 61,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 613,\n            \"StatID\": 6,\n            \"Val\": 61,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 613,\n            \"StatID\": 7,\n            \"Val\": 61,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 613,\n            \"StatID\": 8,\n            \"Val\": 61,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 613,\n            \"StatID\": 9,\n            \"Val\": 61,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 613,\n            \"StatID\": 10,\n            \"Val\": 61,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 614,\n            \"StatID\": 2,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 614,\n            \"StatID\": 3,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 614,\n            \"StatID\": 4,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 614,\n            \"StatID\": 5,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 614,\n            \"StatID\": 6,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 614,\n            \"StatID\": 7,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 614,\n            \"StatID\": 8,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 614,\n            \"StatID\": 9,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 614,\n            \"StatID\": 10,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 615,\n            \"StatID\": 2,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 615,\n            \"StatID\": 3,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 615,\n            \"StatID\": 4,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 615,\n            \"StatID\": 5,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 615,\n            \"StatID\": 6,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 615,\n            \"StatID\": 7,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 615,\n            \"StatID\": 8,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 615,\n            \"StatID\": 9,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 615,\n            \"StatID\": 10,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 616,\n            \"StatID\": 2,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 616,\n            \"StatID\": 3,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 616,\n            \"StatID\": 4,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 616,\n            \"StatID\": 5,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 616,\n            \"StatID\": 6,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 616,\n            \"StatID\": 7,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 616,\n            \"StatID\": 8,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 616,\n            \"StatID\": 9,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 616,\n            \"StatID\": 10,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 617,\n            \"StatID\": 2,\n            \"Val\": 59,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 617,\n            \"StatID\": 3,\n            \"Val\": 59,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 617,\n            \"StatID\": 4,\n            \"Val\": 59,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 617,\n            \"StatID\": 5,\n            \"Val\": 59,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 617,\n            \"StatID\": 6,\n            \"Val\": 59,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 617,\n            \"StatID\": 7,\n            \"Val\": 59,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 617,\n            \"StatID\": 8,\n            \"Val\": 59,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 617,\n            \"StatID\": 9,\n            \"Val\": 59,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 617,\n            \"StatID\": 10,\n            \"Val\": 59,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 618,\n            \"StatID\": 2,\n            \"Val\": 63,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 618,\n            \"StatID\": 3,\n            \"Val\": 63,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 618,\n            \"StatID\": 4,\n            \"Val\": 63,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 618,\n            \"StatID\": 5,\n            \"Val\": 63,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 618,\n            \"StatID\": 6,\n            \"Val\": 63,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 618,\n            \"StatID\": 7,\n            \"Val\": 63,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 618,\n            \"StatID\": 8,\n            \"Val\": 63,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 618,\n            \"StatID\": 9,\n            \"Val\": 63,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 618,\n            \"StatID\": 10,\n            \"Val\": 63,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 619,\n            \"StatID\": 2,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 619,\n            \"StatID\": 3,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 619,\n            \"StatID\": 4,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 619,\n            \"StatID\": 5,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 619,\n            \"StatID\": 6,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 619,\n            \"StatID\": 7,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 619,\n            \"StatID\": 8,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 619,\n            \"StatID\": 9,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 619,\n            \"StatID\": 10,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 620,\n            \"StatID\": 2,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 620,\n            \"StatID\": 3,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 620,\n            \"StatID\": 4,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 620,\n            \"StatID\": 5,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 620,\n            \"StatID\": 6,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 620,\n            \"StatID\": 7,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 620,\n            \"StatID\": 8,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 620,\n            \"StatID\": 9,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 620,\n            \"StatID\": 10,\n            \"Val\": 60,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 621,\n            \"StatID\": 2,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 621,\n            \"StatID\": 3,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 621,\n            \"StatID\": 4,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 621,\n            \"StatID\": 5,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 621,\n            \"StatID\": 6,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 621,\n            \"StatID\": 7,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 621,\n            \"StatID\": 8,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 621,\n            \"StatID\": 9,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 621,\n            \"StatID\": 10,\n            \"Val\": 58,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 622,\n            \"StatID\": 13,\n            \"Val\": 86,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 622,\n            \"StatID\": 25,\n            \"Val\": 86,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 622,\n            \"StatID\": 43,\n            \"Val\": 84,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 623,\n            \"StatID\": 13,\n            \"Val\": 87,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 623,\n            \"StatID\": 25,\n            \"Val\": 86,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 623,\n            \"StatID\": 43,\n            \"Val\": 88,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 624,\n            \"StatID\": 13,\n            \"Val\": 78,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 624,\n            \"StatID\": 25,\n            \"Val\": 80,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 624,\n            \"StatID\": 43,\n            \"Val\": 76,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 625,\n            \"StatID\": 13,\n            \"Val\": 84,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 625,\n            \"StatID\": 25,\n            \"Val\": 81,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 625,\n            \"StatID\": 43,\n            \"Val\": 82,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 626,\n            \"StatID\": 13,\n            \"Val\": 81,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 626,\n            \"StatID\": 25,\n            \"Val\": 78,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 626,\n            \"StatID\": 43,\n            \"Val\": 80,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 628,\n            \"StatID\": 0,\n            \"Val\": 94,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 628,\n            \"StatID\": 1,\n            \"Val\": 94,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 628,\n            \"StatID\": 14,\n            \"Val\": 91,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 628,\n            \"StatID\": 15,\n            \"Val\": 90,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 628,\n            \"StatID\": 16,\n            \"Val\": 90,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 628,\n            \"StatID\": 17,\n            \"Val\": 91,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 630,\n            \"StatID\": 0,\n            \"Val\": 89,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 630,\n            \"StatID\": 1,\n            \"Val\": 87,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 630,\n            \"StatID\": 14,\n            \"Val\": 87,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 630,\n            \"StatID\": 15,\n            \"Val\": 85,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 630,\n            \"StatID\": 16,\n            \"Val\": 86,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 630,\n            \"StatID\": 17,\n            \"Val\": 88,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 633,\n            \"StatID\": 0,\n            \"Val\": 82,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 633,\n            \"StatID\": 1,\n            \"Val\": 82,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 633,\n            \"StatID\": 14,\n            \"Val\": 85,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 633,\n            \"StatID\": 15,\n            \"Val\": 81,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 633,\n            \"StatID\": 16,\n            \"Val\": 81,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 633,\n            \"StatID\": 17,\n            \"Val\": 83,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 635,\n            \"StatID\": 19,\n            \"Val\": 89,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 635,\n            \"StatID\": 20,\n            \"Val\": 89,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 635,\n            \"StatID\": 26,\n            \"Val\": 89,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 635,\n            \"StatID\": 27,\n            \"Val\": 92,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 635,\n            \"StatID\": 28,\n            \"Val\": 90,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 635,\n            \"StatID\": 29,\n            \"Val\": 90,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 635,\n            \"StatID\": 30,\n            \"Val\": 90,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 635,\n            \"StatID\": 31,\n            \"Val\": 91,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 636,\n            \"StatID\": 19,\n            \"Val\": 89,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 636,\n            \"StatID\": 20,\n            \"Val\": 88,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 636,\n            \"StatID\": 26,\n            \"Val\": 86,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 636,\n            \"StatID\": 27,\n            \"Val\": 86,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 636,\n            \"StatID\": 28,\n            \"Val\": 85,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 636,\n            \"StatID\": 29,\n            \"Val\": 87,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 636,\n            \"StatID\": 30,\n            \"Val\": 86,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 636,\n            \"StatID\": 31,\n            \"Val\": 86,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 637,\n            \"StatID\": 19,\n            \"Val\": 87,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 637,\n            \"StatID\": 20,\n            \"Val\": 83,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 637,\n            \"StatID\": 26,\n            \"Val\": 84,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 637,\n            \"StatID\": 27,\n            \"Val\": 85,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 637,\n            \"StatID\": 28,\n            \"Val\": 83,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 637,\n            \"StatID\": 29,\n            \"Val\": 83,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 637,\n            \"StatID\": 30,\n            \"Val\": 84,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 637,\n            \"StatID\": 31,\n            \"Val\": 86,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 638,\n            \"StatID\": 11,\n            \"Val\": 88,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 638,\n            \"StatID\": 22,\n            \"Val\": 88,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 638,\n            \"StatID\": 23,\n            \"Val\": 86,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 638,\n            \"StatID\": 24,\n            \"Val\": 88,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 639,\n            \"StatID\": 11,\n            \"Val\": 91,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 639,\n            \"StatID\": 22,\n            \"Val\": 87,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 639,\n            \"StatID\": 23,\n            \"Val\": 87,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 639,\n            \"StatID\": 24,\n            \"Val\": 89,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 640,\n            \"StatID\": 11,\n            \"Val\": 81,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 640,\n            \"StatID\": 22,\n            \"Val\": 80,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 640,\n            \"StatID\": 23,\n            \"Val\": 80,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 640,\n            \"StatID\": 24,\n            \"Val\": 79,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 641,\n            \"StatID\": 11,\n            \"Val\": 88,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 641,\n            \"StatID\": 22,\n            \"Val\": 87,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 641,\n            \"StatID\": 23,\n            \"Val\": 86,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 641,\n            \"StatID\": 24,\n            \"Val\": 87,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 642,\n            \"StatID\": 0,\n            \"Val\": 81,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 642,\n            \"StatID\": 1,\n            \"Val\": 83,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 642,\n            \"StatID\": 14,\n            \"Val\": 81,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 642,\n            \"StatID\": 15,\n            \"Val\": 84,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 642,\n            \"StatID\": 16,\n            \"Val\": 82,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 642,\n            \"StatID\": 17,\n            \"Val\": 84,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 643,\n            \"StatID\": 13,\n            \"Val\": 85,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 643,\n            \"StatID\": 25,\n            \"Val\": 81,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 643,\n            \"StatID\": 43,\n            \"Val\": 80,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 644,\n            \"StatID\": 13,\n            \"Val\": 79,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 644,\n            \"StatID\": 25,\n            \"Val\": 78,\n            \"Max\": 100\n        },\n        {\n            \"StaffID\": 644,\n            \"StatID\": 43,\n            \"Val\": 84,\n            \"Max\": 100\n        }\n    ],\n    \"Staff_State\": [\n        {\n            \"StaffID\": 600,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 601,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 602,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 603,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 604,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 605,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 606,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 607,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 608,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 609,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 610,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 611,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 612,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 613,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 614,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 615,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 616,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 617,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 618,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 619,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 620,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 621,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 622,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 623,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 624,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 625,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 626,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 628,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 630,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 633,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 635,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 636,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 637,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 638,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 639,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 640,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 641,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        },\n        {\n            \"StaffID\": 642,\n            \"UnspentXP\": 0,\n            \"XPGainedLastRace\": 0,\n            \"XPGainedLastWeek\": 0,\n            \"Mentality\": 80,\n            \"MentalityOpinion\": 2\n        }\n    ],\n    \"Staff_DriverData\": [\n        {\n            \"StaffID\": 600,\n            \"Improvability\": 80,\n            \"Aggression\": 63,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|LLO|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 0,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 80,\n            \"TargetMarketability\": 80,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        },\n        {\n            \"StaffID\": 601,\n            \"Improvability\": 72,\n            \"Aggression\": 41,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|BEN|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 0,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 67,\n            \"TargetMarketability\": 67,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        },\n        {\n            \"StaffID\": 602,\n            \"Improvability\": 75,\n            \"Aggression\": 57,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|BAD|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 0,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 40,\n            \"TargetMarketability\": 40,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        },\n        {\n            \"StaffID\": 603,\n            \"Improvability\": 68,\n            \"Aggression\": 51,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|FUO|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 1,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 70,\n            \"TargetMarketability\": 70,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        },\n        {\n            \"StaffID\": 604,\n            \"Improvability\": 87,\n            \"Aggression\": 68,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|CAM|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 0,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 72,\n            \"TargetMarketability\": 72,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        },\n        {\n            \"StaffID\": 605,\n            \"Improvability\": 67,\n            \"Aggression\": 73,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|PIN|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 0,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 54,\n            \"TargetMarketability\": 54,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        },\n        {\n            \"StaffID\": 606,\n            \"Improvability\": 84,\n            \"Aggression\": 76,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|GAD|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 0,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 69,\n            \"TargetMarketability\": 69,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        },\n        {\n            \"StaffID\": 607,\n            \"Improvability\": 74,\n            \"Aggression\": 57,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|CRO|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 0,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 44,\n            \"TargetMarketability\": 44,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        },\n        {\n            \"StaffID\": 608,\n            \"Improvability\": 65,\n            \"Aggression\": 52,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|CHA|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 0,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 65,\n            \"TargetMarketability\": 65,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        },\n        {\n            \"StaffID\": 609,\n            \"Improvability\": 71,\n            \"Aggression\": 54,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|BLO|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 0,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 73,\n            \"TargetMarketability\": 73,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        },\n        {\n            \"StaffID\": 610,\n            \"Improvability\": 71,\n            \"Aggression\": 55,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|STR|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 0,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 49,\n            \"TargetMarketability\": 49,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        },\n        {\n            \"StaffID\": 611,\n            \"Improvability\": 77,\n            \"Aggression\": 76,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|WHA|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 0,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 50,\n            \"TargetMarketability\": 50,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        },\n        {\n            \"StaffID\": 612,\n            \"Improvability\": 75,\n            \"Aggression\": 40,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|XIE|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 0,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 52,\n            \"TargetMarketability\": 52,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        },\n        {\n            \"StaffID\": 613,\n            \"Improvability\": 79,\n            \"Aggression\": 69,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|DEL|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 0,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 76,\n            \"TargetMarketability\": 76,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        },\n        {\n            \"StaffID\": 614,\n            \"Improvability\": 79,\n            \"Aggression\": 69,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|GIU|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 0,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 42,\n            \"TargetMarketability\": 42,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        },\n        {\n            \"StaffID\": 615,\n            \"Improvability\": 75,\n            \"Aggression\": 56,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|NAE|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 0,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 49,\n            \"TargetMarketability\": 49,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        },\n        {\n            \"StaffID\": 616,\n            \"Improvability\": 70,\n            \"Aggression\": 43,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|DOM|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 0,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 42,\n            \"TargetMarketability\": 42,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        },\n        {\n            \"StaffID\": 617,\n            \"Improvability\": 70,\n            \"Aggression\": 51,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|SHA|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 0,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 48,\n            \"TargetMarketability\": 48,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        },\n        {\n            \"StaffID\": 618,\n            \"Improvability\": 72,\n            \"Aggression\": 41,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|BIL|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 0,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 54,\n            \"TargetMarketability\": 54,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        },\n        {\n            \"StaffID\": 619,\n            \"Improvability\": 75,\n            \"Aggression\": 45,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|SAG|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 0,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 66,\n            \"TargetMarketability\": 66,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        },\n        {\n            \"StaffID\": 620,\n            \"Improvability\": 75,\n            \"Aggression\": 58,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|MAR|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 0,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 63,\n            \"TargetMarketability\": 63,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        },\n        {\n            \"StaffID\": 621,\n            \"Improvability\": 73,\n            \"Aggression\": 42,\n            \"DriverCode\": \"[STRING_LITERAL:Value=|HO|]\",\n            \"WantsChampionDriverNumber\": 1,\n            \"LastKnownDriverNumber\": null,\n            \"AssignedCarNumber\": null,\n            \"HasSuperLicense\": 0,\n            \"HasWonF2\": null,\n            \"HasWonF3\": null,\n            \"HasRacedEnoughToJoinF1\": 0,\n            \"PerformanceEvaluationDay\": null,\n            \"Marketability\": 57,\n            \"TargetMarketability\": 57,\n            \"MarketabilityProgress\": 0,\n            \"FeederSeriesAssignedCarNumber\": null\n        }\n    ],\n    \"Staff_GameData\": [\n        {\n            \"StaffID\": 600,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 601,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 602,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 603,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": \"2\",\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 604,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 605,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 606,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 607,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 608,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 609,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 610,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 611,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 612,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 613,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 614,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 615,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 616,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 617,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 618,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 619,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 620,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 621,\n            \"StaffType\": 0,\n            \"RetirementAge\": 35,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 622,\n            \"StaffType\": 2,\n            \"RetirementAge\": 70,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 623,\n            \"StaffType\": 2,\n            \"RetirementAge\": 70,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 624,\n            \"StaffType\": 2,\n            \"RetirementAge\": 70,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 625,\n            \"StaffType\": 2,\n            \"RetirementAge\": 70,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 626,\n            \"StaffType\": 2,\n            \"RetirementAge\": 70,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 628,\n            \"StaffType\": 1,\n            \"RetirementAge\": 70,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 630,\n            \"StaffType\": 1,\n            \"RetirementAge\": 70,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 633,\n            \"StaffType\": 1,\n            \"RetirementAge\": 70,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 635,\n            \"StaffType\": 3,\n            \"RetirementAge\": 70,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 636,\n            \"StaffType\": 3,\n            \"RetirementAge\": 70,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 637,\n            \"StaffType\": 3,\n            \"RetirementAge\": 70,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 638,\n            \"StaffType\": 4,\n            \"RetirementAge\": 70,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 639,\n            \"StaffType\": 4,\n            \"RetirementAge\": 70,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 640,\n            \"StaffType\": 4,\n            \"RetirementAge\": 70,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 641,\n            \"StaffType\": 4,\n            \"RetirementAge\": 70,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 642,\n            \"StaffType\": 1,\n            \"RetirementAge\": 70,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 643,\n            \"StaffType\": 2,\n            \"RetirementAge\": 63,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        },\n        {\n            \"StaffID\": 644,\n            \"StaffType\": 2,\n            \"RetirementAge\": 61,\n            \"Retired\": 0,\n            \"PermaTraitSpawnBoost\": 0,\n            \"BestTeamFormula\": null,\n            \"BestF1PosInTeamSinceGameStart\": null,\n            \"DevelopmentPlan\": null,\n            \"ExpectedRankForTeam\": 5,\n            \"AchievementScore\": 0,\n            \"ExpectedQualityScore\": 0,\n            \"ExpectedTimeScore\": 0\n        }\n    ],\n    \"TeamLineUps\": [\n        {\n            \"TeamID\": 1,\n            \"Driver1\": 2,\n            \"Driver2\": 1,\n            \"Engineer1\": 622,\n            \"Engineer2\": 7,\n            \"TechnicalChief\": 642,\n            \"HeadAero\": 26,\n            \"SportingDirector\": 392\n        },\n        {\n            \"TeamID\": 2,\n            \"Driver1\": 12,\n            \"Driver2\": 102,\n            \"Engineer1\": 48,\n            \"Engineer2\": 47,\n            \"TechnicalChief\": 628,\n            \"HeadAero\": 337,\n            \"SportingDirector\": 638\n        },\n        {\n            \"TeamID\": 3,\n            \"Driver1\": 10,\n            \"Driver2\": 95,\n            \"Engineer1\": 50,\n            \"Engineer2\": 623,\n            \"TechnicalChief\": 28,\n            \"HeadAero\": 635,\n            \"SportingDirector\": 639\n        },\n        {\n            \"TeamID\": 4,\n            \"Driver1\": 23,\n            \"Driver2\": 376,\n            \"Engineer1\": 320,\n            \"Engineer2\": 51,\n            \"TechnicalChief\": 333,\n            \"HeadAero\": 38,\n            \"SportingDirector\": 292\n        },\n        {\n            \"TeamID\": 5,\n            \"Driver1\": 15,\n            \"Driver2\": 135,\n            \"Engineer1\": 415,\n            \"Engineer2\": 54,\n            \"TechnicalChief\": 630,\n            \"HeadAero\": 40,\n            \"SportingDirector\": 397\n        },\n        {\n            \"TeamID\": 6,\n            \"Driver1\": 11,\n            \"Driver2\": 3,\n            \"Engineer1\": 56,\n            \"Engineer2\": 55,\n            \"TechnicalChief\": 633,\n            \"HeadAero\": 369,\n            \"SportingDirector\": 370\n        },\n        {\n            \"TeamID\": 7,\n            \"Driver1\": 14,\n            \"Driver2\": 142,\n            \"Engineer1\": 624,\n            \"Engineer2\": 625,\n            \"TechnicalChief\": 403,\n            \"HeadAero\": 404,\n            \"SportingDirector\": 640\n        },\n        {\n            \"TeamID\": 8,\n            \"Driver1\": 144,\n            \"Driver2\": 81,\n            \"Engineer1\": 59,\n            \"Engineer2\": 626,\n            \"TechnicalChief\": 33,\n            \"HeadAero\": 637,\n            \"SportingDirector\": 295\n        },\n        {\n            \"TeamID\": 9,\n            \"Driver1\": 279,\n            \"Driver2\": 83,\n            \"Engineer1\": 644,\n            \"Engineer2\": 643,\n            \"TechnicalChief\": 334,\n            \"HeadAero\": 43,\n            \"SportingDirector\": 641\n        },\n        {\n            \"TeamID\": 10,\n            \"Driver1\": 77,\n            \"Driver2\": 18,\n            \"Engineer1\": 63,\n            \"Engineer2\": 58,\n            \"TechnicalChief\": 4,\n            \"HeadAero\": 636,\n            \"SportingDirector\": 367\n        }\n    ],\n    \"Performance\": [\n        {\n            \"TeamID\": 1,\n            \"Boost\": 1.100,\n            \"TyreDeg\": 4\n        },\n        {\n            \"TeamID\": 2,\n            \"Boost\": 1.139,\n            \"TyreDeg\": 1\n        },\n        {\n            \"TeamID\": 3,\n            \"Boost\": 1.011,\n            \"TyreDeg\": 2\n        },\n        {\n            \"TeamID\": 4,\n            \"Boost\": 1.207,\n            \"TyreDeg\": 10\n        },\n        {\n            \"TeamID\": 5,\n            \"Boost\": 1.320,\n            \"TyreDeg\": 8\n        },\n        {\n            \"TeamID\": 6,\n            \"Boost\": 1.257,\n            \"TyreDeg\": 6\n        },\n        {\n            \"TeamID\": 7,\n            \"Boost\": 1.161,\n            \"TyreDeg\": 3\n        },\n        {\n            \"TeamID\": 8,\n            \"Boost\": 1.137,\n            \"TyreDeg\": 9\n        },\n        {\n            \"TeamID\": 9,\n            \"Boost\": 1.277,\n            \"TyreDeg\": 5\n        },\n        {\n            \"TeamID\": 10,\n            \"Boost\": 1.052,\n            \"TyreDeg\": 5\n        },\n        {\n            \"TeamID\": 32,\n            \"Boost\": 1.166,\n            \"TyreDeg\": 6\n        }\n    ],\n    \"Fixes\": [\n        {\n            \"StaffID\": 600,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 600,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 600,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 601,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 601,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 601,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 602,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 602,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 602,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 603,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 603,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 2\n        },\n        {\n            \"StaffID\": 603,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 604,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 604,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 3\n        },\n        {\n            \"StaffID\": 604,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 605,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 605,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 605,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 606,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 606,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 2\n        },\n        {\n            \"StaffID\": 606,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 607,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 607,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 3\n        },\n        {\n            \"StaffID\": 607,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 608,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 608,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 4\n        },\n        {\n            \"StaffID\": 608,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 609,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 609,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 5\n        },\n        {\n            \"StaffID\": 609,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 610,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 610,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 4\n        },\n        {\n            \"StaffID\": 610,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 611,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 611,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 5\n        },\n        {\n            \"StaffID\": 611,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 612,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 4\n        },\n        {\n            \"StaffID\": 612,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 612,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 613,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 613,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 6\n        },\n        {\n            \"StaffID\": 613,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 614,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 614,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 7\n        },\n        {\n            \"StaffID\": 614,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 615,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 615,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 8\n        },\n        {\n            \"StaffID\": 615,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 616,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 616,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 9\n        },\n        {\n            \"StaffID\": 616,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 617,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 617,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 10\n        },\n        {\n            \"StaffID\": 617,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 618,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 618,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 11\n        },\n        {\n            \"StaffID\": 618,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 619,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 619,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 12\n        },\n        {\n            \"StaffID\": 619,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 620,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 620,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 13\n        },\n        {\n            \"StaffID\": 620,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 621,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 4\n        },\n        {\n            \"StaffID\": 621,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 621,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 622,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 622,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 622,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 623,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 623,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 11\n        },\n        {\n            \"StaffID\": 623,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 624,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 624,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 624,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 624,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"Gender\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 625,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 625,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 11\n        },\n        {\n            \"StaffID\": 625,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 626,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 626,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 626,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 628,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 628,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 2\n        },\n        {\n            \"StaffID\": 628,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 630,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 630,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 3\n        },\n        {\n            \"StaffID\": 630,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 633,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 633,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 633,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 633,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"Gender\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 635,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 635,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 11\n        },\n        {\n            \"StaffID\": 635,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 636,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 636,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 11\n        },\n        {\n            \"StaffID\": 636,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 637,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 637,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 11\n        },\n        {\n            \"StaffID\": 637,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 638,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 638,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 4\n        },\n        {\n            \"StaffID\": 638,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 639,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 639,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 5\n        },\n        {\n            \"StaffID\": 639,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 640,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 640,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 6\n        },\n        {\n            \"StaffID\": 640,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 641,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 641,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 7\n        },\n        {\n            \"StaffID\": 641,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 642,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 642,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 8\n        },\n        {\n            \"StaffID\": 642,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 643,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 643,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 9\n        },\n        {\n            \"StaffID\": 643,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 1\n        },\n        {\n            \"StaffID\": 644,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceType\",\n            \"Value\": 0\n        },\n        {\n            \"StaffID\": 644,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"FaceIndex\",\n            \"Value\": 10\n        },\n        {\n            \"StaffID\": 644,\n            \"Table\": \"Staff_BasicData\",\n            \"Column\": \"AgeType\",\n            \"Value\": 1\n        }\n    ]\n}"
  },
  {
    "path": "src/data/2026_changes.json",
    "content": "{\n    \"Calendar\": [\n        {\n            \"TrackID\": 1,\n            \"Day\": 46089,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 3,\n            \"Day\": 46096,\n            \"WeekendType\": 1\n        },\n        {\n            \"TrackID\": 17,\n            \"Day\": 46110,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 2,\n            \"Day\": 46124,\n            \"WeekendType\": 0,\n            \"deleteIfGameAdds\": true\n        },\n        {\n            \"TrackID\": 11,\n            \"Day\": 46131,\n            \"WeekendType\": 0,\n            \"deleteIfGameAdds\": true\n        },\n        {\n            \"TrackID\": 22,\n            \"Day\": 46145,\n            \"WeekendType\": 1,\n            \"isF2Weekend\": true\n        },\n        {\n            \"TrackID\": 7,\n            \"Day\": 46166,\n            \"WeekendType\": 1,\n            \"isF2Weekend\": true\n        },\n        {\n            \"TrackID\": 6,\n            \"Day\": 46180,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 5,\n            \"Day\": 46187,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 9,\n            \"Day\": 46201,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 10,\n            \"Day\": 46208,\n            \"WeekendType\": 1\n        },\n        {\n            \"TrackID\": 13,\n            \"Day\": 46222,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 12,\n            \"Day\": 46229,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 23,\n            \"Day\": 46257,\n            \"WeekendType\": 1,\n            \"isF2Weekend\": false\n        },\n        {\n            \"TrackID\": 14,\n            \"Day\": 46271,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": null,\n            \"Day\": 46278,\n            \"WeekendType\": 0,\n            \"deleteIfGameAdds\": true\n        },\n        {\n            \"TrackID\": 4,\n            \"Day\": 46292,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 15,\n            \"Day\": 46306,\n            \"WeekendType\": 1\n        },\n        {\n            \"TrackID\": 19,\n            \"Day\": 46320,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 18,\n            \"Day\": 46327,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 20,\n            \"Day\": 46334,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 25,\n            \"Day\": 46347,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 26,\n            \"Day\": 46355,\n            \"WeekendType\": 0\n        },\n        {\n            \"TrackID\": 21,\n            \"Day\": 46362,\n            \"WeekendType\": 0\n        }\n    ],\n    \"TeamStandings\": [\n        {\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 398,\n            \"Position\": 4,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025,\n            \"TeamID\": 1\n        },\n        {\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 833,\n            \"Position\": 1,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025,\n            \"TeamID\": 2\n        },\n        {\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 451,\n            \"Position\": 3,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025,\n            \"TeamID\": 3\n        },\n        {\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 469,\n            \"Position\": 2,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025,\n            \"TeamID\": 4\n        },\n        {\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 22,\n            \"Position\": 10,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025,\n            \"TeamID\": 5\n        },\n        {\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 137,\n            \"Position\": 5,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025,\n            \"TeamID\": 6\n        },\n        {\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 79,\n            \"Position\": 8,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025,\n            \"TeamID\": 7\n        },\n        {\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 92,\n            \"Position\": 6,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025,\n            \"TeamID\": 8\n        },\n        {\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 70,\n            \"Position\": 9,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025,\n            \"TeamID\": 9\n        },\n        {\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 89,\n            \"Position\": 7,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025,\n            \"TeamID\": 10\n        },\n        {\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 0,\n            \"Position\": 11,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025,\n            \"TeamID\": 32\n        }\n    ],\n    \"DriverStandings\": [\n        {\n            \"DriverID\": 1,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 156,\n            \"Position\": 6,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 2,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 242,\n            \"Position\": 5,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 3,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 73,\n            \"Position\": 8,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 8,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 0,\n            \"Position\": 23,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 10,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 421,\n            \"Position\": 2,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 11,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 64,\n            \"Position\": 9,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 12,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 423,\n            \"Position\": 1,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 14,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 38,\n            \"Position\": 15,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 15,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 22,\n            \"Position\": 18,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 17,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 0,\n            \"Position\": 22,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 18,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 33,\n            \"Position\": 16,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 23,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 319,\n            \"Position\": 4,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 77,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 56,\n            \"Position\": 10,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 81,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 33,\n            \"Position\": 17,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 83,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 51,\n            \"Position\": 11,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 102,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 410,\n            \"Position\": 3,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 376,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 150,\n            \"Position\": 7,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 144,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 51,\n            \"Position\": 12,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 142,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 41,\n            \"Position\": 13,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 95,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 38,\n            \"Position\": 14,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 279,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 19,\n            \"Position\": 19,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 248,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 0,\n            \"Position\": 20,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        },\n        {\n            \"DriverID\": 135,\n            \"LastPointsChange\": 0,\n            \"LastPositionChange\": 0,\n            \"Points\": 0,\n            \"Position\": 21,\n            \"RaceFormula\": 1,\n            \"SeasonID\": 2025\n        }\n    ],\n    \"EnginePerformance\": {\n        \"mercedes\": {\n            \"10\": 92,\n            \"6\": 80,\n            \"14\": 60,\n            \"18\": 63,\n            \"19\": 80\n        },\n        \"ferrari\": {\n            \"10\": 71,\n            \"6\": 95,\n            \"14\": 80,\n            \"18\": 75,\n            \"19\": 80\n        },\n        \"rbpt\": {\n            \"10\": 85,\n            \"6\": 73,\n            \"14\": 79,\n            \"18\": 75,\n            \"19\": 85\n        },\n        \"audi\": {\n            \"10\": 58,\n            \"6\": 75,\n            \"14\": 55,\n            \"18\": 70,\n            \"19\": 45\n        },\n        \"honda\": {\n            \"10\": 19,\n            \"6\": 70,\n            \"14\": 10,\n            \"18\": 10,\n            \"19\": 10\n        }\n    },\n    \"Performance\": [\n        {\n            \"TeamID\": 1,\n            \"Boost\": 0.60,\n            \"TyreDeg\": 10\n        },\n        {\n            \"TeamID\": 2,\n            \"Boost\": 0.52,\n            \"TyreDeg\": 1\n        },\n        {\n            \"TeamID\": 3,\n            \"Boost\": 0.41,\n            \"TyreDeg\": 8\n        },\n        {\n            \"TeamID\": 4,\n            \"Boost\": 0.63,\n            \"TyreDeg\": 1\n        },\n        {\n            \"TeamID\": 5,\n            \"Boost\": 0.59,\n            \"TyreDeg\": 10\n        },\n        {\n            \"TeamID\": 6,\n            \"Boost\": 0.32,\n            \"TyreDeg\": 10\n        },\n        {\n            \"TeamID\": 7,\n            \"Boost\": 0.55,\n            \"TyreDeg\": 1\n        },\n        {\n            \"TeamID\": 8,\n            \"Boost\": 0.45,\n            \"TyreDeg\": 10\n        },\n        {\n            \"TeamID\": 9,\n            \"Boost\": 0.56,\n            \"TyreDeg\": 10\n        },\n        {\n            \"TeamID\": 10,\n            \"Boost\": 0.4,\n            \"TyreDeg\": 4\n        },\n        {\n            \"TeamID\": 32,\n            \"Boost\": 0.30,\n            \"TyreDeg\": 6,\n            \"Objective\": 13.2\n        }\n    ],\n    \"Regulations\": [\n        {\n            \"Name\": \"SpendingCap\",\n            \"CurrentValue\": 215000000,\n            \"MinValue\": 125000000,\n            \"MaxValue\": 215000000\n        }\n    ],\n    \"Facilities\" : [\n        {\n            \"TeamID\": 10,\n            \"UpgradeBy\": 1\n        },\n        {\n            \"TeamID\": 9,\n            \"UpgradeBy\": 1\n        }\n    ],\n    \"Records\" : [\n        {\n            \"StaffID\": 12,\n            \"Wins\": 11,\n            \"Podiums\": 31,\n            \"Poles\": 15,\n            \"FastestLaps\": 12,\n            \"Championships\": 1\n        },\n        {\n            \"StaffID\": 10,\n            \"Wins\": 17,\n            \"Podiums\": 29,\n            \"Poles\": 16,\n            \"FastestLaps\": 6,\n            \"Championships\": 1\n        },\n        {\n            \"StaffID\": 102,\n            \"Wins\": 9,\n            \"Podiums\": 24,\n            \"Poles\": 6,\n            \"FastestLaps\": 7,\n            \"Championships\": 0\n        },\n        {\n            \"StaffID\": 23,\n            \"Wins\": 4,\n            \"Podiums\": 13,\n            \"Poles\": 6,\n            \"FastestLaps\": 5,\n            \"Championships\": 0\n        },\n        {\n            \"StaffID\": 376,\n            \"Wins\": 0,\n            \"Podiums\": 3,\n            \"Poles\": 0,\n            \"FastestLaps\": 3,\n            \"Championships\": 0\n        },\n        {\n            \"StaffID\": 2,\n            \"Wins\": 3,\n            \"Podiums\": 20,\n            \"Poles\": 4,\n            \"FastestLaps\": 4,\n            \"Championships\": 0\n        },\n        {\n            \"StaffID\": 11,\n            \"Wins\": 2,\n            \"Podiums\": 11,\n            \"Poles\": 1,\n            \"FastestLaps\": 1,\n            \"Championships\": 0\n        },\n        {\n            \"StaffID\": 1,\n            \"Wins\": 2,\n            \"Podiums\": 5,\n            \"Poles\": 0,\n            \"FastestLaps\": 3,\n            \"Championships\": 0\n        },\n        {\n            \"StaffID\": 17,\n            \"Wins\": 0,\n            \"Podiums\": 4,\n            \"Poles\": 0,\n            \"FastestLaps\": 1,\n            \"Championships\": 0\n        },\n        {\n            \"StaffID\": 77,\n            \"Wins\": 0,\n            \"Podiums\": 0,\n            \"Poles\": 0,\n            \"FastestLaps\": 2,\n            \"Championships\": 0\n        },\n        {\n            \"StaffID\": 3,\n            \"Wins\": 0,\n            \"Podiums\": 0,\n            \"Poles\": 0,\n            \"FastestLaps\": 1,\n            \"Championships\": 0\n        },\n        {\n            \"StaffID\": 14,\n            \"Wins\": 0,\n            \"Podiums\": 1,\n            \"Poles\": 0,\n            \"FastestLaps\": 1,\n            \"Championships\": 0\n        },\n        {   \n            \"StaffID\": 15,\n            \"Wins\": 0,\n            \"Podiums\": 1,\n            \"Poles\": 0,\n            \"FastestLaps\": 0,\n            \"Championships\": 0\n        },\n        {   \n            \"StaffID\": 83,\n            \"Wins\": 0,\n            \"Podiums\": 1,\n            \"Poles\": 0,\n            \"FastestLaps\": 0,\n            \"Championships\": 0\n        },\n        {\n            \"StaffID\": 13,\n            \"Wins\": 0,\n            \"Podiums\": 0,\n            \"Poles\": 0,\n            \"FastestLaps\": 1,\n            \"Championships\": 0\n        },\n        {\n            \"StaffID\": 255,\n            \"Wins\": 0,\n            \"Podiums\": 0,\n            \"Poles\": 0,\n            \"FastestLaps\": 1,\n            \"Championships\": 0\n        }\n    ]\n}\n"
  },
  {
    "path": "src/data/contracts_2025.json",
    "content": "{\n    \"Updates\": [\n        {\n            \"DriverID\": 10,\n            \"salary\": 52000000,\n            \"StartingBonus\": 2000000,\n            \"RaceBonus\": 1000000,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2028,\n            \"BreakoutClause\": 0.5\n        }, \n        {\n            \"DriverID\": 2,\n            \"salary\": 27000000,\n            \"StartingBonus\": 2000000,\n            \"RaceBonus\": 400000,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2028,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 23,\n            \"salary\": 12000000,\n            \"StartingBonus\": 1000000,\n            \"RaceBonus\": 100000,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2025,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 12,\n            \"salary\": 16000000,\n            \"StartingBonus\": 1000000,\n            \"RaceBonus\": 300000,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2027,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 102,\n            \"salary\": 15000000,\n            \"StartingBonus\": 3000000,\n            \"RaceBonus\": 100000,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2028,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 18,\n            \"salary\": 2300000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 77,\n            \"salary\": 16000000,\n            \"StartingBonus\": 1000000,\n            \"RaceBonus\": 400000,\n            \"RaceBonusTargetPos\": 3,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 15,\n            \"salary\": 8000000,\n            \"StartingBonus\": 200000,\n            \"RaceBonus\": 100000,\n            \"RaceBonusTargetPos\": 3,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 3,\n            \"salary\": 6300000,\n            \"StartingBonus\": 20000,\n            \"RaceBonus\": 50000,\n            \"RaceBonusTargetPos\": 4,\n            \"EndSeason\": 2027,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 81,\n            \"salary\": 1500000,\n            \"StartingBonus\": 20000,\n            \"RaceBonus\": 50000,\n            \"RaceBonusTargetPos\": 4,\n            \"EndSeason\": 2025,\n            \"BreakoutClause\": 0.5\n        }\n    ],\n    \"Fires\": [\n        {\n            \"DriverID\": 17,\n            \"TeamID\": 3,\n            \"PosInTeam\": 2\n        },\n        {\n            \"DriverID\": 11,\n            \"TeamID\": 1,\n            \"PosInTeam\": 2\n        },\n        {\n            \"DriverID\": 116,\n            \"TeamID\": 6,\n            \"PosInTeam\": 2\n        },\n        {\n            \"DriverID\": 1,\n            \"TeamID\": 4,\n            \"ExtraTeamID\": 1,\n            \"PosInTeam\": 2\n        },\n        {\n            \"DriverID\": 14,\n            \"TeamID\": 5,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 13,\n            \"TeamID\": 8,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 95,\n            \"TeamID\": 3,\n            \"PosInTeam\": 3\n        },\n        {\n            \"DriverID\": 83,\n            \"TeamID\": 7,\n            \"PosInTeam\": 2\n        },\n        {\n            \"DriverID\": 255,\n            \"TeamID\": 7,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 105,\n            \"TeamID\": 9,\n            \"PosInTeam\": 2\n        },\n        {\n            \"DriverID\": 8,\n            \"TeamID\": 9,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 376,\n            \"TeamID\": 4,\n            \"PosInTeam\": 5\n        },\n        {\n            \"DriverID\": 135,\n            \"TeamID\": 5,\n            \"PosInTeam\": 3\n        },\n        {\n            \"DriverID\": 144,\n            \"TeamID\": 3,\n            \"PosInTeam\": 4\n        },\n        {\n            \"DriverID\": 142,\n            \"TeamID\": 1,\n            \"PosInTeam\": 3\n        },\n        {\n            \"DriverID\": 279,\n            \"TeamID\": 2,\n            \"PosInTeam\": 5\n        },\n        {\n            \"DriverID\": 366,\n            \"TeamID\": 2,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 365,\n            \"TeamID\": 2,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 6,\n            \"TeamID\": 1,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 4,\n            \"TeamID\": 1,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 49,\n            \"TeamID\": 3,\n            \"PosInTeam\": 2\n        },\n        {\n            \"DriverID\": 37,\n            \"TeamID\": 3,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 291,\n            \"TeamID\": 3,\n            \"Retire\": 1,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 335,\n            \"TeamID\": 10,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 64,\n            \"TeamID\": 10,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 44,\n            \"TeamID\": 10,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 39,\n            \"TeamID\": 5,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 30,\n            \"TeamID\": 5,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 391,\n            \"TeamID\": 6,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 60,\n            \"TeamID\": 8,\n            \"PosInTeam\": 2\n        },\n        {\n            \"DriverID\": 414,\n            \"TeamID\": 8,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 293,\n            \"TeamID\": 8,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 299,\n            \"TeamID\": 9,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 368,\n            \"TeamID\": 7,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 321,\n            \"TeamID\": 7,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 58,\n            \"TeamID\": 7,\n            \"PosInTeam\": 2\n        },\n        {\n            \"DriverID\": 61,\n            \"TeamID\": 9,\n            \"PosInTeam\": 1\n        },\n        {\n            \"DriverID\": 393,\n            \"TeamID\": 9,\n            \"PosInTeam\": 2\n        }\n    ],\n    \"Hires\": [\n        {\n            \"DriverID\": 95,\n            \"TeamID\": 3,\n            \"PosInTeam\": 2,\n            \"Salary\": 800000,\n            \"StartingBonus\": 20000,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2025,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 11,\n            \"TeamID\": 6,\n            \"PosInTeam\": 2,\n            \"Salary\": 8000000,\n            \"StartingBonus\": 200000,\n            \"RaceBonus\": 100000,\n            \"RaceBonusTargetPos\": 3,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 1,\n            \"TeamID\": 1,\n            \"PosInTeam\": 2,\n            \"Salary\": 48000000,\n            \"StartingBonus\": 2000000,\n            \"RaceBonus\": 1000000,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 376,\n            \"TeamID\": 4,\n            \"PosInTeam\": 2,\n            \"Salary\": 1500000,\n            \"StartingBonus\": 10000,\n            \"RaceBonus\": 50000,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2025,\n            \"BreakoutClause\": 0.5,\n            \"GrantsSuperLicense\": 1\n        },\n        {\n            \"DriverID\": 135,\n            \"TeamID\": 5,\n            \"PosInTeam\": 1,\n            \"Salary\": 700000,\n            \"StartingBonus\": 10000,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2025,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 144,\n            \"TeamID\": 8,\n            \"PosInTeam\": 1,\n            \"Salary\": 700000,\n            \"StartingBonus\": 10000,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2025,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 142,\n            \"TeamID\": 7,\n            \"PosInTeam\": 1,\n            \"Salary\": 800000,\n            \"StartingBonus\": 10000,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 14,\n            \"TeamID\": 7,\n            \"PosInTeam\": 2,\n            \"Salary\": 5500000,\n            \"StartingBonus\": 100000,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 83,\n            \"TeamID\": 9,\n            \"PosInTeam\": 1,\n            \"Salary\": 5500000,\n            \"StartingBonus\": 100000,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 279,\n            \"TeamID\": 9,\n            \"PosInTeam\": 2,\n            \"Salary\": 1500000,\n            \"StartingBonus\": 70000,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5,\n            \"GrantsSuperLicense\": 1\n        }\n\n    ],\n    \"StaffHires\" : [\n        {\n            \"StaffID\": 628,\n            \"TeamID\": 2,\n            \"PosInTeam\": 1,\n            \"Salary\": 1500000,\n            \"StartingBonus\": 70000,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"StaffID\": 638,\n            \"TeamID\": 2,\n            \"PosInTeam\": 1,\n            \"Salary\": 2500000,\n            \"StartingBonus\": 70000,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"StaffID\": 622,\n            \"TeamID\": 1,\n            \"PosInTeam\": 1,\n            \"Salary\": 500000,\n            \"StartingBonus\": 70000,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"StaffID\": 623,\n            \"TeamID\": 3,\n            \"PosInTeam\": 2,\n            \"Salary\": 500000,\n            \"StartingBonus\": 70000,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2027,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"StaffID\": 635,\n            \"TeamID\": 3,\n            \"PosInTeam\": 1,\n            \"Salary\": 700000,\n            \"StartingBonus\": 70000,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2028,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"StaffID\": 639,\n            \"TeamID\": 3,\n            \"PosInTeam\": 1,\n            \"Salary\": 920000,\n            \"StartingBonus\": 70000,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2027,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"StaffID\": 4,\n            \"TeamID\": 10,\n            \"PosInTeam\": 1,\n            \"Salary\": 1120000,\n            \"StartingBonus\": 70000,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2027,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"StaffID\": 58,\n            \"TeamID\": 10,\n            \"PosInTeam\": 1,\n            \"Salary\": 1010000,\n            \"StartingBonus\": 70000,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"StaffID\": 636,\n            \"TeamID\": 10,\n            \"PosInTeam\": 1,\n            \"Salary\": 940000,\n            \"StartingBonus\": 70000,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"StaffID\": 630,\n            \"TeamID\": 5,\n            \"PosInTeam\": 1,\n            \"Salary\": 640000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"StaffID\": 40,\n            \"TeamID\": 5,\n            \"PosInTeam\": 1,\n            \"Salary\": 940000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2027,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"StaffID\": 624,\n            \"TeamID\": 7,\n            \"PosInTeam\": 1,\n            \"Salary\": 840000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"StaffID\": 625,\n            \"TeamID\": 7,\n            \"PosInTeam\": 2,\n            \"Salary\": 839000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2027,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"StaffID\": 640,\n            \"TeamID\": 7,\n            \"PosInTeam\": 1,\n            \"Salary\": 630000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2027,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"StaffID\": 626,\n            \"TeamID\": 8,\n            \"PosInTeam\": 2,\n            \"Salary\": 688000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"StaffID\": 637,\n            \"TeamID\": 8,\n            \"PosInTeam\": 1,\n            \"Salary\": 488000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"StaffID\": 295,\n            \"TeamID\": 8,\n            \"PosInTeam\": 1,\n            \"Salary\": 988000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"StaffID\": 633,\n            \"TeamID\": 6,\n            \"PosInTeam\": 1,\n            \"Salary\": 580000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"StaffID\": 641,\n            \"TeamID\": 9,\n            \"PosInTeam\": 1,\n            \"Salary\": 550000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"StaffID\": 642,\n            \"TeamID\": 1,\n            \"PosInTeam\": 1,\n            \"Salary\": 1650000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2027,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"StaffID\": 643,\n            \"TeamID\": 9,\n            \"PosInTeam\": 1,\n            \"Salary\": 430000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"StaffID\": 644,\n            \"TeamID\": 9,\n            \"PosInTeam\": 2,\n            \"Salary\": 490000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        }\n        \n\n    ],\n    \"Affiliates\" : [\n        {\n            \"DriverID\": 285,\n            \"TeamID\": 2,\n            \"PosInTeam\": 3,\n            \"Salary\": 500000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2027,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 411,\n            \"TeamID\": 2,\n            \"PosInTeam\": 4,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 375,\n            \"TeamID\": 2,\n            \"PosInTeam\": 5,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2025,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 399,\n            \"TeamID\": 2,\n            \"PosInTeam\": 6,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 105,\n            \"TeamID\": 1,\n            \"PosInTeam\": 3,\n            \"Salary\": 300000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2025,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 20,\n            \"TeamID\": 1,\n            \"PosInTeam\": 4,\n            \"Salary\": 300000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 282,\n            \"TeamID\": 1,\n            \"PosInTeam\": 5,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 419,\n            \"TeamID\": 1,\n            \"PosInTeam\": 6,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2025,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 439,\n            \"TeamID\": 1,\n            \"PosInTeam\": 7,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2027,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 418,\n            \"TeamID\": 1,\n            \"PosInTeam\": 8,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2025,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 132,\n            \"TeamID\": 1,\n            \"PosInTeam\": 9,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 264,\n            \"TeamID\": 3,\n            \"PosInTeam\": 3,\n            \"Salary\": 320000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2027,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 120,\n            \"TeamID\": 3,\n            \"PosInTeam\": 4,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2025,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 245,\n            \"TeamID\": 3,\n            \"PosInTeam\": 5,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 402,\n            \"TeamID\": 3,\n            \"PosInTeam\": 6,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 288,\n            \"TeamID\": 8,\n            \"PosInTeam\": 3,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 373,\n            \"TeamID\": 8,\n            \"PosInTeam\": 4,\n            \"Salary\": 150000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2028,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 379,\n            \"TeamID\": 8,\n            \"PosInTeam\": 5,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 286,\n            \"TeamID\": 8,\n            \"PosInTeam\": 6,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 8,\n            \"TeamID\": 4,\n            \"PosInTeam\": 3,\n            \"Salary\": 1300000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 107,\n            \"TeamID\": 4,\n            \"PosInTeam\": 4,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 610,\n            \"TeamID\": 4,\n            \"PosInTeam\": 5,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 106,\n            \"TeamID\": 10,\n            \"PosInTeam\": 3,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 22,\n            \"TeamID\": 10,\n            \"PosInTeam\": 4,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 408,\n            \"TeamID\": 10,\n            \"PosInTeam\": 5,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2025,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 409,\n            \"TeamID\": 10,\n            \"PosInTeam\": 6,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2025,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 121,\n            \"TeamID\": 10,\n            \"PosInTeam\": 7,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 248,\n            \"TeamID\": 5,\n            \"PosInTeam\": 3,\n            \"Salary\": 300000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 398,\n            \"TeamID\": 5,\n            \"PosInTeam\": 4,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 281,\n            \"TeamID\": 5,\n            \"PosInTeam\": 5,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 405,\n            \"TeamID\": 5,\n            \"PosInTeam\": 6,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 280,\n            \"TeamID\": 5,\n            \"PosInTeam\": 7,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 252,\n            \"TeamID\": 5,\n            \"PosInTeam\": 8,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2025,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 406,\n            \"TeamID\": 5,\n            \"PosInTeam\": 9,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2025,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 80,\n            \"TeamID\": 7,\n            \"PosInTeam\": 3,\n            \"Salary\": 220000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2025,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 247,\n            \"TeamID\": 6,\n            \"PosInTeam\": 3,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2025,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 322,\n            \"TeamID\": 6,\n            \"PosInTeam\": 4,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2026,\n            \"BreakoutClause\": 0.5\n        },\n        {\n            \"DriverID\": 401,\n            \"TeamID\": 9,\n            \"PosInTeam\": 3,\n            \"Salary\": 120000,\n            \"StartingBonus\": 0,\n            \"RaceBonus\": 0,\n            \"RaceBonusTargetPos\": 1,\n            \"EndSeason\": 2025,\n            \"BreakoutClause\": 0.5\n        }\n\n\n    ],\n    \"FeederSeries\" : [\n        {\n            \"DriverID\": 289,\n            \"TeamID\": 12,\n            \"PosInTeam\": 1,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 119,\n            \"TeamID\": 12,\n            \"PosInTeam\": 2,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 245,\n            \"TeamID\": 19,\n            \"PosInTeam\": 1,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 373,\n            \"TeamID\": 19,\n            \"PosInTeam\": 2,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 288,\n            \"TeamID\": 16,\n            \"PosInTeam\": 1,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 99,\n            \"TeamID\": 16,\n            \"PosInTeam\": 2,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 322,\n            \"TeamID\": 14,\n            \"PosInTeam\": 1,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 282,\n            \"TeamID\": 14,\n            \"PosInTeam\": 2,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 301,\n            \"TeamID\": 11,\n            \"PosInTeam\": 1,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 280,\n            \"TeamID\": 11,\n            \"PosInTeam\": 2,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 121,\n            \"TeamID\": 18,\n            \"PosInTeam\": 1,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 252,\n            \"TeamID\": 18,\n            \"PosInTeam\": 2,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 127,\n            \"TeamID\": 15,\n            \"PosInTeam\": 1,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 377,\n            \"TeamID\": 15,\n            \"PosInTeam\": 2,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 110,\n            \"TeamID\": 13,\n            \"PosInTeam\": 1,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 399,\n            \"TeamID\": 13,\n            \"PosInTeam\": 2,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 378,\n            \"TeamID\": 17,\n            \"PosInTeam\": 1,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 385,\n            \"TeamID\": 17,\n            \"PosInTeam\": 2,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 374,\n            \"TeamID\": 21,\n            \"PosInTeam\": 1,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 390,\n            \"TeamID\": 21,\n            \"PosInTeam\": 2,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 601,\n            \"TeamID\": 20,\n            \"PosInTeam\": 1,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 123,\n            \"TeamID\": 20,\n            \"PosInTeam\": 2,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 602,\n            \"TeamID\": 22,\n            \"PosInTeam\": 1,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 380,\n            \"TeamID\": 22,\n            \"PosInTeam\": 2,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 411,\n            \"TeamID\": 22,\n            \"PosInTeam\": 3,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 610,\n            \"TeamID\": 23,\n            \"PosInTeam\": 1,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 604,\n            \"TeamID\": 23,\n            \"PosInTeam\": 2,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 382,\n            \"TeamID\": 23,\n            \"PosInTeam\": 3,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 381,\n            \"TeamID\": 24,\n            \"PosInTeam\": 1,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 439,\n            \"TeamID\": 24,\n            \"PosInTeam\": 2,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 611,\n            \"TeamID\": 24,\n            \"PosInTeam\": 3,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 283,\n            \"TeamID\": 28,\n            \"PosInTeam\": 1,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 394,\n            \"TeamID\": 28,\n            \"PosInTeam\": 2,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 286,\n            \"TeamID\": 28,\n            \"PosInTeam\": 3,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 375,\n            \"TeamID\": 25,\n            \"PosInTeam\": 1,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 386,\n            \"TeamID\": 25,\n            \"PosInTeam\": 2,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 612,\n            \"TeamID\": 25,\n            \"PosInTeam\": 3,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 379,\n            \"TeamID\": 27,\n            \"PosInTeam\": 1,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 613,\n            \"TeamID\": 27,\n            \"PosInTeam\": 2,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 614,\n            \"TeamID\": 27,\n            \"PosInTeam\": 3,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 615,\n            \"TeamID\": 26,\n            \"PosInTeam\": 1,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 383,\n            \"TeamID\": 26,\n            \"PosInTeam\": 2,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 616,\n            \"TeamID\": 26,\n            \"PosInTeam\": 3,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 384,\n            \"TeamID\": 29,\n            \"PosInTeam\": 1,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 617,\n            \"TeamID\": 29,\n            \"PosInTeam\": 2,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 618,\n            \"TeamID\": 29,\n            \"PosInTeam\": 3,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 619,\n            \"TeamID\": 31,\n            \"PosInTeam\": 1,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 620,\n            \"TeamID\": 31,\n            \"PosInTeam\": 2,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 304,\n            \"TeamID\": 31,\n            \"PosInTeam\": 3,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 406,\n            \"TeamID\": 30,\n            \"PosInTeam\": 1,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 388,\n            \"TeamID\": 30,\n            \"PosInTeam\": 2,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        },\n        {\n            \"DriverID\": 621,\n            \"TeamID\": 30,\n            \"PosInTeam\": 3,\n            \"Salary\": 100000,\n            \"EndSeason\": 2025\n        }\n\n    ]\n}\n\n\n"
  },
  {
    "path": "src/data/members.json",
    "content": "[\n{\"name\":\"Viggo\",\"tier\":\"backer\"},\n{\"name\":\"The Logical Bass Fish\",\"tier\":\"backer\"},\n{\"name\":\"Kymani Clark\",\"tier\":\"backer\"},\n{\"name\":\"zagrebelnio\",\"tier\":\"backer\"},\n{\"name\":\"Cian In 't Holt\",\"tier\":\"founder\"},\n{\"name\":\"Alessio Romeo\",\"tier\":\"backer\"},\n{\"name\":\"Stuka Boy\",\"tier\":\"backer\"},\n{\"name\":\"Dave\",\"tier\":\"backer\"},\n{\"name\":\"Jaume Carbonell\",\"tier\":\"founder\"},\n{\"name\":\"JO96\",\"tier\":\"backer\"},\n{\"name\":\"Fynn Lemke\",\"tier\":\"backer\"},\n{\"name\":\"Evangelos Boukouris\",\"tier\":\"backer\"},\n{\"name\":\"alfonso castillo lemus\",\"tier\":\"backer\"},\n{\"name\":\"Diogo\",\"tier\":\"backer\"},\n{\"name\":\"Rob\",\"tier\":\"backer\"},\n{\"name\":\"Niklas\",\"tier\":\"backer\"},\n{\"name\":\"Coen Duggan\",\"tier\":\"backer\"},\n{\"name\":\"Flo lp64\",\"tier\":\"backer\"},\n{\"name\":\"World By Adam\",\"tier\":\"backer\"},\n{\"name\":\"Cardemir\",\"tier\":\"backer\"},\n{\"name\":\"Florian Paul\",\"tier\":\"backer\"},\n{\"name\":\"Kakub\",\"tier\":\"backer\"},\n{\"name\":\"Håvard Fredriksen\",\"tier\":\"backer\"},\n{\"name\":\"WHO IS MINICO?\",\"tier\":\"backer\"},\n{\"name\":\"Daniel Esterson\",\"tier\":\"backer\"},\n{\"name\":\"Lyliaan\",\"tier\":\"backer\"},\n{\"name\":\"Lukus Wright\",\"tier\":\"backer\"},\n{\"name\":\"retrop\",\"tier\":\"backer\"},\n{\"name\":\"Duarte Sardinha\",\"tier\":\"backer\"},\n{\"name\":\"Jose\",\"tier\":\"backer\"},\n{\"name\":\"Kevin Peltser\",\"tier\":\"supporter\"},\n{\"name\":\"Xabier\",\"tier\":\"backer\"},\n{\"name\":\"Khan Goatman\",\"tier\":\"backer\"},\n{\"name\":\"ccesvin\",\"tier\":\"backer\"},\n{\"name\":\"Artyom Sizov\",\"tier\":\"supporter\"},\n{\"name\":\"Commando1180\",\"tier\":\"backer\"},\n{\"name\":\"영민 이\",\"tier\":\"backer\"},\n{\"name\":\"Happy Oriley\",\"tier\":\"backer\"},\n{\"name\":\"Alexander Udeaja\",\"tier\":\"backer\"},\n{\"name\":\"Mackle\",\"tier\":\"backer\"},\n{\"name\":\"Eetu Väisänen\",\"tier\":\"backer\"},\n{\"name\":\"용준 김\",\"tier\":\"backer\"},\n{\"name\":\"Kevin Szilagyi\",\"tier\":\"backer\"},\n{\"name\":\"스tv 빅\",\"tier\":\"supporter\"},\n{\"name\":\"Jack Sives\",\"tier\":\"backer\"},\n{\"name\":\"Kunal Shah\",\"tier\":\"supporter\"},\n{\"name\":\"Wan Muhammad\",\"tier\":\"supporter\"},\n{\"name\":\"aalyx\",\"tier\":\"backer\"},\n{\"name\":\"JARNCJ\",\"tier\":\"backer\"},\n{\"name\":\"Shadow 2Jz 99\",\"tier\":\"backer\"},\n{\"name\":\"Vladuna\",\"tier\":\"backer\"},\n{\"name\":\"Tom\",\"tier\":\"backer\"},\n{\"name\":\"Schnupsi Dupsi\",\"tier\":\"supporter\"},\n{\"name\":\"Ian Ang\",\"tier\":\"backer\"},\n{\"name\":\"ysty04\",\"tier\":\"founder\"},\n{\"name\":\"선호 김\",\"tier\":\"supporter\"},\n{\"name\":\"Bruno Piris\",\"tier\":\"backer\"},\n{\"name\":\"YannAsdelion\",\"tier\":\"supporter\"},\n{\"name\":\"Eee\",\"tier\":\"backer\"},\n{\"name\":\"海宝賢一郎\",\"tier\":\"supporter\"},\n{\"name\":\"Brian Ferguson\",\"tier\":\"backer\"},\n{\"name\":\"Michael\",\"tier\":\"backer\"},\n{\"name\":\"RageEliteX\",\"tier\":\"supporter\"},\n{\"name\":\"Ericthebest\",\"tier\":\"supporter\"},\n{\"name\":\"Djocyk\",\"tier\":\"supporter\"},\n{\"name\":\"alex browne\",\"tier\":\"supporter\"},\n{\"name\":\"david garcia\",\"tier\":\"supporter\"},\n{\"name\":\"Joshua Herreen\",\"tier\":\"backer\"},\n{\"name\":\"SpeedCB28\",\"tier\":\"backer\"},\n{\"name\":\"Q9R\",\"tier\":\"supporter\"},\n{\"name\":\"Pepelino55\",\"tier\":\"backer\"},\n{\"name\":\"gspintel.\",\"tier\":\"supporter\"},\n{\"name\":\"MSC_SchumiWM2022\",\"tier\":\"backer\"},\n{\"name\":\"Kold\",\"tier\":\"founder\"},\n{\"name\":\"Darren2ickn9r\",\"tier\":\"founder\"},\n{\"name\":\"Jaume sl23\",\"tier\":\"supporter\"},\n{\"name\":\"Michael Parchaiski\",\"tier\":\"backer\"},\n{\"name\":\"Martin Schwingeweitzen\",\"tier\":\"supporter\"},\n{\"name\":\"Friedemann Der 1.\",\"tier\":\"backer\"},\n{\"name\":\"Billy Manson\",\"tier\":\"backer\"},\n{\"name\":\"matteo fournier\",\"tier\":\"backer\"},\n{\"name\":\"Abner Chao\",\"tier\":\"backer\"},\n{\"name\":\"katon\",\"tier\":\"backer\"},\n{\"name\":\"Wild Buzzer\",\"tier\":\"backer\"},\n{\"name\":\"LilHowza\",\"tier\":\"supporter\"},\n{\"name\":\"Carl Robinson\",\"tier\":\"backer\"},\n{\"name\":\"Anthony D'Amico\",\"tier\":\"supporter\"},\n{\"name\":\"Matej Lhotsky\",\"tier\":\"backer\"},\n{\"name\":\"Sarah Gregory\",\"tier\":\"backer\"},\n{\"name\":\"Bailey Sprecher\",\"tier\":\"backer\"},\n{\"name\":\"metin\",\"tier\":\"backer\"},\n{\"name\":\"Michael Gabriel\",\"tier\":\"founder\"},\n{\"name\":\"Nuttybong\",\"tier\":\"backer\"},\n{\"name\":\"Honk_04\",\"tier\":\"supporter\"},\n{\"name\":\"LGFT\",\"tier\":\"backer\"},\n{\"name\":\"Delay Delama\",\"tier\":\"founder\"},\n{\"name\":\"Odradek\",\"tier\":\"backer\"},\n{\"name\":\"Leikjarinn\",\"tier\":\"founder\"},\n{\"name\":\"Erik Spiering\",\"tier\":\"founder\"},\n{\"name\":\"JKing\",\"tier\":\"backer\"},\n{\"name\":\"Thomas\",\"tier\":\"backer\"},\n{\"name\":\"Brandon\",\"tier\":\"backer\"},\n{\"name\":\"Maikel Zwart\",\"tier\":\"supporter\"},\n{\"name\":\"William Slocombe\",\"tier\":\"backer\"},\n{\"name\":\"Shaun Thomas\",\"tier\":\"backer\"},\n{\"name\":\"Hadock\",\"tier\":\"backer\"},\n{\"name\":\"Joe\",\"tier\":\"supporter\"},\n{\"name\":\"Robin Rößler\",\"tier\":\"supporter\"},\n{\"name\":\"lee\",\"tier\":\"backer\"},\n{\"name\":\"Jack Alexander Naylor\",\"tier\":\"backer\"},\n{\"name\":\"Richard Hicks\",\"tier\":\"founder\"},\n{\"name\":\"BleedinEdge821\",\"tier\":\"backer\"},\n{\"name\":\"Kyle\",\"tier\":\"supporter\"},\n{\"name\":\"Old Mate Johno\",\"tier\":\"backer\"},\n{\"name\":\"Justin Gärtner\",\"tier\":\"backer\"},\n{\"name\":\"Krispy~\",\"tier\":\"backer\"},\n{\"name\":\"Sabrina Almer\",\"tier\":\"backer\"},\n{\"name\":\"Patryk Gadomski\",\"tier\":\"founder\"},\n{\"name\":\"aarava\",\"tier\":\"supporter\"},\n{\"name\":\"MickHulst\",\"tier\":\"backer\"},\n{\"name\":\"Cm382714\",\"tier\":\"backer\"},\n{\"name\":\"Robbles Quin\",\"tier\":\"backer\"},\n{\"name\":\"Qingou Liu\",\"tier\":\"backer\"},\n{\"name\":\"Kevin Brandsborg\",\"tier\":\"backer\"},\n{\"name\":\"Kevin Brogan\",\"tier\":\"supporter\"},\n{\"name\":\"Robin\",\"tier\":\"supporter\"},\n{\"name\":\"Axel Ravix\",\"tier\":\"backer\"},\n{\"name\":\"Cole Pelzer\",\"tier\":\"backer\"},\n{\"name\":\"kotemen89\",\"tier\":\"backer\"},\n{\"name\":\"Robin Frisk\",\"tier\":\"backer\"},\n{\"name\":\"senweg888\",\"tier\":\"founder\"},\n{\"name\":\"Jack Matthews\",\"tier\":\"backer\"},\n{\"name\":\"lovetoojacket\",\"tier\":\"supporter\"},\n{\"name\":\"Ryan\",\"tier\":\"supporter\"},\n{\"name\":\"Ross Patterson\",\"tier\":\"backer\"},\n{\"name\":\"Mark Wright\",\"tier\":\"backer\"},\n{\"name\":\"Sam_Fakt\",\"tier\":\"founder\"},\n{\"name\":\"Enhabe\",\"tier\":\"backer\"},\n{\"name\":\"Marcus Miller\",\"tier\":\"founder\"},\n{\"name\":\"Oliver Nelson\",\"tier\":\"supporter\"},\n{\"name\":\"FirearmofMutiny\",\"tier\":\"supporter\"},\n{\"name\":\"ollie\",\"tier\":\"backer\"},\n{\"name\":\"Harry Willetts\",\"tier\":\"founder\"},\n{\"name\":\"Roberto Cruz\",\"tier\":\"backer\"},\n{\"name\":\"Kaiowa McAninly\",\"tier\":\"backer\"},\n{\"name\":\"Ethan Tapa\",\"tier\":\"founder\"},\n{\"name\":\"tornado_ow\",\"tier\":\"founder\"},\n{\"name\":\"Anthony Taylor\",\"tier\":\"backer\"},\n{\"name\":\"averstance\",\"tier\":\"backer\"},\n{\"name\":\"Justin Logan\",\"tier\":\"backer\"},\n{\"name\":\"Noel Hernandez\",\"tier\":\"founder\"},\n{\"name\":\"Peregrin\",\"tier\":\"founder\"},\n{\"name\":\"Jayden Martis\",\"tier\":\"backer\"},\n{\"name\":\"Marcus Deamon\",\"tier\":\"backer\"},\n{\"name\":\"Aaron655\",\"tier\":\"founder\"},\n{\"name\":\"Parker Petrov\",\"tier\":\"backer\"}\n]"
  },
  {
    "path": "src/data/news/news_prompts_templates.json",
    "content": "[\n    {\n        \"id\": \"quali_result\",\n        \"new_type\": 1,\n        \"prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} summarizing the qualifying session of the {{circuit}} Grand Prix in {{season_year}} where {{pole_driver}} got pole position. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 350 and 450 words long. Focus on the results of the qualifying session and the starting grid, highlighting the pole position and the top qualifiers. Mention the key moments that determined the final positions, if provided, but do not speculate beyond the data given. Describe how the pole-sitter achieved the fastest time and highlight any unexpected performances or upsets. Use a flowing, paragraph-based structure like a typical F1 news report.\"\n    },\n    {\n        \"id\": \"race_result\",\n        \"new_type\": 2,\n        \"prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} summarizing the win that {{winner}} achieved at the {{circuit}} Grand Prix in {{season_year}}. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 350 and 450 words long. Focus on the race results and championship implications, but do not assume how dominant or dramatic the race was unless the gaps clearly suggest it. Mention the top finishers in a narrative way, without listing all drivers or repeating every time gap. Instead of exact time gaps with decimals, use natural phrases like “a few seconds ahead”, “closely followed by”, or “just behind”. Use a flowing, paragraph-based structure like a typical F1 news report.\"\n    },\n    {\n        \"id\": \"silly_season_recap\",\n        \"new_type\": 4,\n        \"prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} summarizing the current state of the {{season}} F1 silly season. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 400 and 500 words long. Focus on the driver market, mentioning key drivers who are rumored to be moving teams, and any confirmed moves. Discuss the implications of these changes for the teams and drivers involved. When talking about salaries, do not give overly specific figures, but rather discuss approximate amounts with a round number. Vary the phrasing when describing which seats are being targeted, so it does not sound repetitive. Use a flowing, paragraph-based structure like a typical F1 news report.\"\n    },\n    {\n        \"id\": \"made_up_rumor\",\n        \"new_type\": 7,\n        \"prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} covering a rumor about {{driver1}} potentially leaving {{team1}}. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Clearly indicate that the information is speculative and based on paddock gossip. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 350 and 450 words long. Discuss why this rumor has surfaced, mentioning any factors that might contribute to {{driver1}} considering a move. Highlight any potential destinations that have been suggested, but avoid stating anything as confirmed. Balance the tone between curiosity and skepticism, as the rumor has not been verified. Use a flowing, paragraph-based structure like a typical F1 news report.\"\n    },\n    {\n        \"id\": \"big_transfer\",\n        \"new_type\": 6,\n        \"prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} confirming the big transfer of {{driver1}} to {{team2}} from {{team1}}. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 350 and 450 words long. Focus on the details of the transfer, including the reasons behind it and the implications for both the driver and the team. Use a flowing, paragraph-based structure like a typical F1 news report.\"\n    },\n    {\n        \"id\": \"potential_champion\",\n        \"new_type\": 8,\n        \"prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} about {{driver_name}} having the potential to become the {{season_year}} Formula 1 World Champion at the upcoming {{circuit}} Grand Prix. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 350 and 450 words long. Explain the conditions under which {{driver_name}} would secure the championship at this race against {{rival_driver_name}}, considering the points currently held by both ({{driver_points}} vs {{rival_points}}).\"\n    },\n    {\n        \"id\": \"world_champion\",\n        \"new_type\": 9,\n        \"prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} about {{driver_name}} winning the {{season_year}} Formula 1 World Championship at the {{circuit}} Grand Prix. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 350 and 450 words long. Summarize how {{driver_name}} clinched the championship, detailing their performance throughout the season and the key moments that led to this achievement. Mention the final points tally, comparing it to their closest rival, {{rival_driver_name}}, and highlight any significant result differences. Discuss the implications of this victory for both {{driver_name}} and their team, including any records set or milestones achieved. Use a flowing, paragraph-based structure like a typical F1 news report.\"\n    },\n    {\n        \"id\": \"contract_renewal\",\n        \"new_type\": 10,\n        \"prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} about {{driver1}} renewing their contract with {{team1}}. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 350 and 450 words long. Focus on the details of the contract renewal, including the duration of the new contract and any improvements in terms or conditions. Discuss the reasons behind {{driver1}}'s decision to stay with {{team1}}, highlighting their performance and relationship with the team. Mention any statements from {{driver1}} or team representatives regarding the renewal. When talking about salaries, do not give overly specific figures, but rather discuss approximate amounts with a round number.\"\n    },\n    {\n        \"id\": \"team_comparison_bad\",\n        \"new_type\": 11,\n        \"prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} about {{team1}}'s performance in the {{actualSeason}} Formula 1 season so far, comparing it to their better {{lastSeason}}. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 400 and 500 words long. Explain with all the info given why they are scoring fewer points this season. Use a structured but flowing narrative, as in a typical F1 news report.\"\n    },\n    {\n        \"id\": \"team_comparison_good\",\n        \"new_type\": 12,\n        \"prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} about {{team1}}'s performance in the {{actualSeason}} Formula 1 season so far, comparing it to their worse {{lastSeason}}. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 400 and 500 words long. Explain with all the info given why they are scoring more points this season. Use a structured but flowing narrative, as in a typical F1 news report.\"\n    },\n    {\n        \"id\": \"driver_comparison\",\n        \"new_type\": 13,\n        \"prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} comparing the performances of {{driver1}} and {{driver2}} from {{team1}} in the {{actualSeason}} Formula 1 season so far. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 400 and 500 words long. Analyze their performances based on the provided statistics, including points scored, qualifying positions, and race results. Compare how many times each driver has outqualified the other and their and how many times each has finished ahead of the other.\"\n    },\n    {\n        \"id\": \"season_review\",\n        \"new_type\": 14,\n        \"prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} reviewing the {{season_year}} Formula 1 season so far, after the {{part}} third of the season has gone. {{driver1}} is leading the Drivers Championship followed by {{driver2}}, and {{team1}} is currently leading the Constructors Championship. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 400 and 500 words long. Summarize the key events of the season, including the championship battle, standout performances by drivers and teams, and any significant controversies or developments. Highlight the main storylines that defined the season and discuss their implications for the future of Formula 1. Use a flowing, paragraph-based structure like a typical F1 news report.\"\n    },\n    {\n        \"id\": \"season_review_end\",\n        \"new_type\": 15,\n        \"prompt\": \"Write ONLY the body (not the title) of a long, structured {{language}} news article reviewing the recently concluded {{season_year}} Formula 1 season. {{driver1}} won the Drivers’ Championship, followed by {{driver2}}, while {{team1}} secured the Constructors’ Championship.\\n\\nThe article should be written in a professional, analytical tone similar to Autosport or The Race — insightful, critical when needed, and entirely journalistic. Avoid any exaggerated language or fan-like tone.\\n\\nUse clear Markdown section headers (e.g. '# Season Overview', '## Winners and Strong Performers', '## Disappointments and Underperformers', '## Key Storylines', '## Final Thoughts'). Each section should include multiple paragraphs with coherent flow and strong analytical depth.\\n\\nYour analysis must:\\n- Be between 1000 and 1300 words.\\n- Discuss the championship battle, turning points, standout races, and key controversies.\\n- Evaluate both drivers and teams, distinguishing between those who exceeded expectations and those who fell short.\\n- Provide a critical, balanced assessment — not everything needs to be positive. Highlight underperforming drivers even within strong teams.\\n- Include direct intra-team comparisons when relevant (e.g. if one driver significantly outperformed their teammate, or if a veteran was outshined by a newcomer).\\n- Avoid generic praise: always explain *why* a driver or team performed well or poorly.\\n- End with a reflective section summarizing what the {{season_year}} season revealed about the competitive order and what might lie ahead for next year.\\n\\nMaintain a natural, flowing journalistic style with paragraph transitions, factual grounding, and the nuance expected from a professional F1 outlet.\"\n    },\n    {\n        \"id\": \"race_reaction\",\n        \"new_type\": 16,\n        \"prompt\": \"Write ONLY the body (not the title) of a detailed {{language}} news article compiling the post-race reactions from the {{season_year}} {{adjective}} Grand Prix at {{circuit}}. The article should include comments from both the most important drivers at {{adjective}} GP, as well as the top drivers in the championship.\\n\\nWrite in a professional and authentic journalistic tone similar to Autosport, The Race, or Motorsport.com — informative, balanced, and realistic. Avoid exaggerated or fan-like language. The goal is to recreate a genuine media article covering the emotional and analytical side of the race aftermath.\\n\\nUse **Markdown** for structure:\\n- Begin with a short introductory paragraph summarizing the main talking points of the {{adjective}} GP — key results and the general mood in the paddock.\\n- Then, divide the rest of the article into clear sections by driver using Markdown headings (e.g. '## {{happy_driver}}', '## {{unhappy_driver}}', '## Other Reactions'). Each section should include multiple paragraphs mixing direct quotes, paraphrased remarks, and short context about each driver's race.\\n\\nYour article must:\\n- Be as long as 1200 words.\\n- Use realistic, natural-sounding driver quotes (in quotation marks) blended into journalistic narration.\\n- Capture a range of emotions: joy, frustration, relief, disappointment, pride, etc.\\n- Mention contextual details such as the race result, strategy, mistakes, team performance, and weather or track conditions if relevant.\\n- Ensure transitions between sections are smooth and professional.\\n- Avoid cliché or repetitive expressions like 'amazing race' or 'we gave 110%'; aim for natural, grounded dialogue.\\n\\nMaintain a professional, immersive tone throughout, as if written for a top-tier F1 publication immediately after the race weekend.\"\n    },\n    {\n        \"id\": \"massive_exit\",\n        \"new_type\": 18,\n        \"prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} reporting that {{team1}} has confirmed that {{driver1}} will leave their team at the end of the season. It is still uncertain of where will {{driver1}} will go.. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 350 and 450 words long. Focus on the details of the transfer, including the reasons behind it and the implications for both the driver and the team. Use a flowing, paragraph-based structure like a typical F1 news report.\"\n    },\n    {\n        \"id\": \"next_season_grid\",\n        \"new_type\": 19,\n        \"prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} previewing the driver lineup for the upcoming {{season_year}} Formula 1 season. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 700 and 800 words long. Focus on the confirmed driver-team pairings for the new season, highlighting any significant changes from the previous year. Discuss the implications of these changes for both the drivers and the teams involved. Mention any notable rookies or returning drivers, as well as any shifts in team dynamics that may impact performance. Use a flowing, paragraph-based structure like a typical F1 news report.\"\n    },\n    {\n        \"id\": \"feeder_series_review\",\n        \"new_type\": 20,\n        \"prompt\": \"Write ONLY the body (not the title) of a professional season review article in {{language}} summarizing the {{season_year}} Formula 2 and Formula 3 seasons. In Formula 2, {{f2_champion}} won the championship, and in Formula 3, {{f3_champion}} claimed the title.\\n\\nThe article must be written in clear, natural {{language}}, using a neutral and professional journalistic tone similar to outlets such as Autosport or Motorsport.com. Avoid slang, hype, or overly dramatic language.\\n\\nThis article must function as a long-term historical recap of both seasons, suitable for readers who want to understand what happened in Formula 2 and Formula 3 during {{season_year}}. For each category, include:\\n- An overview of how the season unfolded\\n- Key championship battles and decisive moments\\n- A summary of race winners across the different Grands Prix\\n- Notable performances, consistency trends, and turning points\\n- How and why the eventual champion secured the title\\n\\nDo not invent events or results. Focus on clarity, structure, and factual-style narration. The article should read as a comprehensive end-of-season review rather than a single race report.\\n\\nMaximum length: 1000 words.\"\n    }\n]"
  },
  {
    "path": "src/data/news/news_titles_templates.json",
    "content": "[\n    {\n        \"id\": \"quali_result\",\n        \"new_type\": 1,\n        \"titles\": [\n            \"{{pole_driver}} takes pole position at {{circuit}} after a thrilling qualifying\",\n            \"{{pole_driver}} secures P1 in {{country}} following intense final laps\",\n            \"Pole for {{pole_driver}} after a masterful qualifying at the {{adjective}} Grand Prix\",\n            \"{{pole_driver}} delivers under pressure to take pole at {{circuit}}\",\n            \"Stunning lap from {{pole_driver}} secures top spot at {{circuit}}\",\n            \"{{pole_driver}} sets the benchmark with a blistering lap in {{country}} qualifying\",\n            \"Unstoppable {{pole_driver}} dominates qualifying at the {{adjective}} GP\",\n            \"Qualifying masterclass — {{pole_driver}} claims pole at {{circuit}}\",\n            \"{{pole_driver}} edges out rivals to take pole at {{circuit}}\",\n            \"Dominant performance from {{pole_driver}} in {{country}} qualifying session\",\n            \"Precision and pace — {{pole_driver}} delivers pole at the {{adjective}} Grand Prix\",\n            \"Blistering pace from {{pole_driver}} locks in P1 at the {{adjective}} GP qualifying\",\n            \"{{pole_driver}} beats the clock to secure pole in {{country}}\",\n            \"Nail-biting finish sees {{pole_driver}} grab pole at {{circuit}}\",\n            \"Perfect lap from {{pole_driver}} earns pole at the {{adjective}} GP\",\n            \"{{pole_driver}} steals the show in {{country}} qualifying session\",\n            \"{{pole_driver}} takes control of the grid with pole at {{circuit}}\",\n            \"Late heroics from {{pole_driver}} seal pole position at {{circuit}}\",\n            \"{{pole_driver}} pulls off stunning lap to top the {{adjective}} Grand Prix qualifying\",\n            \"A statement from {{pole_driver}} — pole secured at {{circuit}}\",\n            \"Final moments drama — {{pole_driver}} edges out rivals for P1 at {{circuit}}\",\n            \"{{pole_driver}} delivers when it matters most to clinch pole at {{circuit}}\",\n            \"Flawless execution from {{pole_driver}} leads to pole in {{country}}\",\n            \"Another qualifying masterclass — {{pole_driver}} starts from pole at the {{adjective}} GP\"\n        ]\n    },\n    {\n        \"id\": \"race_result\",\n        \"new_type\": 2,\n        \"titles\": [\n            \"{{winner}} wins the {{season_year}} {{adjective}} Grand Prix after an intense battle\",\n            \"Victory for {{winner}} at {{circuit}} – a flawless performance from lights to flag\",\n            \"{{winner}} triumphs in {{country}} after a thrilling race day\",\n            \"{{winner}} takes the checkered flag at {{circuit}} with dominant pace\",\n            \"{{winner}} secures a commanding win at the {{adjective}} GP\",\n            \"{{winner}} celebrates victory in {{country}} after a dramatic final stint\",\n            \"Dominant drive – {{winner}} takes victory at {{circuit}}\",\n            \"{{winner}} comes out on top at the {{adjective}} Grand Prix after tense strategy calls\",\n            \"{{winner}} finishes first at {{circuit}} in style\",\n            \"{{winner}} grabs victory in {{country}} following a nail-biting finale\",\n            \"Clinical drive from {{winner}} secures top spot at {{circuit}}\",\n            \"Perfect execution from {{winner}} brings home the win at {{country}}\",\n            \"{{winner}} dominates the {{circuit}} race to claim victory\",\n            \"A stunning performance – {{winner}} claims victory at the {{adjective}} GP\",\n            \"Masterclass drive from {{winner}} at the {{adjective}} Grand Prix\",\n            \"{{winner}} delivers an unstoppable drive to victory in {{country}}\",\n            \"{{winner}} crosses the line first after a thrilling race at {{circuit}}\",\n            \"{{winner}} proves unstoppable with a commanding win at the {{adjective}} GP\",\n            \"From lights out to victory – {{winner}} reigns supreme at {{circuit}}\",\n            \"{{winner}} holds firm under pressure to claim victory in {{country}}\",\n            \"Impeccable strategy pays off – {{winner}} wins the {{adjective}} GP\",\n            \"No one could stop {{winner}} – dominant at the {{adjective}} Grand Prix\",\n            \"{{winner}} takes the win at {{circuit}} after a perfect execution\"\n        ]\n    },\n    {\n        \"id\": \"silly_season_recap\",\n        \"new_type\": 4,\n        \"titles\": [\n            \"Silly Season chaos – {{driver1}}, {{driver2}}, and {{driver3}} linked with surprise moves\",\n            \"Driver market shake-up – {{driver1}} and {{driver2}} in talks with {{team1}} and {{team2}}\",\n            \"Rumors fly as {{driver1}}, {{driver2}}, and {{driver3}} consider team changes\",\n            \"{{driver1}} and {{driver2}} at the center of silly season speculation\",\n            \"Driver carousel turning fast – {{driver1}}, {{driver2}}, and {{driver3}} all in the mix\",\n            \"Big names on the move – {{driver1}} and {{driver2}} reportedly in discussions with {{team1}}\",\n            \"The paddock buzzes – {{driver1}} and {{driver3}} linked with major team switches\",\n            \"Transfer dominoes ready to fall – {{driver1}}, {{driver2}}, and {{driver3}} headline silly season\",\n            \"Driver market heating up – {{driver1}}, {{driver2}}, and {{driver3}} could be on the move\",\n            \"{{team1}} and {{team2}} in the spotlight as {{driver1}} and {{driver2}} explore new options\",\n            \"No one safe – {{driver1}}, {{driver2}}, and {{driver3}} all connected to potential moves\",\n            \"Changing seats – {{driver1}} and {{driver2}} rumored to switch teams for next season\",\n            \"BREAKING NEWS – {{driver1}} and {{driver2}} exploring offers from {{team1}} and {{team2}}\",\n            \"Silly Season madness continues – {{driver1}}, {{driver2}}, and {{driver3}} part of ongoing rumors\",\n            \"{{driver1}} and {{driver2}} shake up the market with talks involving {{team1}} and {{team2}}\",\n            \"Sources point to multiple driver swaps involving {{driver1}}, {{driver2}}, and {{driver3}}\",\n            \"Teams play musical chairs – {{driver1}}, {{driver2}}, and {{driver3}} could all move\",\n            \"{{driver1}}’s name surfaces again as silly season drama unfolds\",\n            \"Major shake-up coming? {{driver1}}, {{driver2}}, and {{driver3}} under contract speculation\",\n            \"HERE WE GO! Silly Season intensifies with {{driver1}}, {{driver2}}, and {{driver3}} in the rumor mill\",\n            \"{{driver1}} and {{driver2}} evaluating options as silly season enters crucial phase\",\n            \"Driver market chaos – {{driver1}} and {{driver2}} linked to shock transfers\",\n            \"Silly Season rolls on – {{driver1}} and {{driver3}} emerging as key figures\",\n            \"F1 gossip grows – {{driver1}} and {{driver2}} reportedly negotiating with {{team1}} and {{team2}}\",\n            \"The paddock in motion – {{driver1}}, {{driver2}}, and {{driver3}} eye new opportunities\"\n        ]\n    },\n    {\n        \"id\": \"big_transfer_rumor\",\n        \"new_type\": 5,\n        \"titles\": [\n            \"BREAKING NEWS – {{driver1}} in advanced talks to join {{team1}}\",\n            \"Major rumor – {{driver1}} could replace key seat at {{team1}}\",\n            \"Sources suggest {{driver1}} to {{team1}} move nearing agreement\",\n            \"Shock in the paddock – {{driver1}} linked with {{team1}} for next season\",\n            \"Insiders claim {{driver1}} preparing to leave {{originalTeam}} for {{team1}}\",\n            \"Could {{driver1}} be switching from {{originalTeam}} to {{team1}}? Signs point that way\",\n            \"{{team1}} ready to secure {{driver1}} in potential high-profile move\",\n            \"Big rumor – {{driver1}} leaving {{originalTeam}} for {{team1}} gaining momentum\",\n            \"Reports indicate {{driver1}} already in talks with {{team1}} over a future seat\",\n            \"{{driver1}} ready to leave {{originalTeam}} - {{team1}} emerges as top destination\",\n            \"{{driver1}} expected to join {{team1}} as talks intensify behind the scenes\",\n            \"{{team1}} and {{driver1}} closing in on surprise agreement\",\n            \"BREAKING – {{driver1}} to {{team1}} deal reportedly in final stages\",\n            \"{{driver1}} considering a switch to {{team1}} after internal tensions at {{originalTeam}}\",\n            \"Multiple sources confirm {{driver1}} to {{team1}} rumor gaining traction\",\n            \"Silly Season twist – {{team1}} emerges as frontrunner to sign {{driver1}}\",\n            \"{{driver1}}’s future uncertain as {{team1}} move looms large\",\n            \"The paddock reacts – {{driver1}} strongly linked to {{team1}}\",\n            \"{{team1}} reportedly preparing formal offer for {{driver1}}\",\n            \"{{driver1}} to {{team1}} rumor reignites amid contract silence at {{originalTeam}}\",\n            \"Deal close – {{driver1}} expected to race for {{team1}} soon\",\n            \"Sources claim {{driver1}} and {{team1}} have reached verbal understanding\",\n            \"Big move incoming – {{driver1}} to {{team1}} looking more likely by the day\",\n            \"Speculation mounts – {{driver1}} could replace outgoing driver at {{team1}}\",\n            \"{{driver1}} to {{team1}} rumor gains strength after latest paddock reports\",\n            \"Transfer talk intensifies – {{driver1}} and {{team1}} linked again ahead of next season\"\n        ]\n    },\n    {\n        \"id\": \"big_transfer\",\n        \"new_type\": 6,\n        \"titles\": [\n            \"It’s official – {{driver1}} signs with {{team2}}\",\n            \"Transfer confirmed – {{driver1}} leaves {{team1}} for {{team2}}\",\n            \"{{team2}} proudly announces the arrival of {{driver1}}\",\n            \"{{driver1}} joins {{team2}} for the upcoming season\",\n            \"DONE DEAL – {{driver1}} completes move to {{team2}}\",\n            \"Confirmed – {{driver1}} switches from {{team1}} to {{team2}}\",\n            \"HERE WE GO – {{driver1}} to {{team2}} finally confirmed\",\n            \"BREAKING NEWS – {{driver1}} officially joins {{team2}}\",\n            \"{{team2}} welcomes {{driver1}} to the team\",\n            \"Transfer news – {{driver1}} officially signs with {{team2}}\",\n            \"Big announcement – {{driver1}} will race for {{team2}} next season\",\n            \"HERE WE GO – {{driver1}} to {{team2}} is now official\",\n            \"{{driver1}} moves to {{team2}} after successful negotiations\",\n            \"Confirmed move – {{driver1}} set to drive for {{team2}} in the new season\",\n            \"{{team2}} confirms {{driver1}} as their latest signing\",\n            \"Major signing – {{driver1}} joins {{team2}} for {{season_year}}\",\n            \"{{driver1}} leaves {{team1}} and joins {{team2}} in a high-profile transfer\",\n            \"DONE DEAL – {{driver1}} unveiled as new {{team2}} driver\",\n            \"{{team2}} finalizes deal with {{driver1}} for the upcoming campaign\",\n            \"{{driver1}} officially announced as part of {{team2}}’s lineup\",\n            \"It’s done – {{driver1}} signs multi-year deal with {{team2}}\",\n            \"Contract signed – {{driver1}} will compete with {{team2}} starting {{season_year}}\",\n            \"Official statement – {{team2}} confirms arrival of {{driver1}}\",\n            \"HERE WE GO – {{driver1}} joins {{team2}} after weeks of speculation\",\n            \"The wait is over – {{driver1}} officially a {{team2}} driver\"\n        ]\n    },\n    {\n        \"id\": \"made_up_rumour\",\n        \"new_type\": 7,\n        \"titles\": [\n            \"EXCLUSIVE - {{driver1}} in talks to leave {{team1}}\",\n            \"Is {{driver1}} considering an exit from {{team1}}?\",\n            \"Rumor alert - {{driver1}} eyeing a move away from {{team1}}\",\n            \"Sources say {{driver1}} is eyeing options beyond {{team1}}\",\n            \"Insider info - {{driver1}} contemplating a switch from {{team1}}\",\n            \"Speculation mounts - {{driver1}} could be on the move from {{team1}}\",\n            \"Driver market buzz - {{driver1}} linked with a potential exit from {{team1}}\",\n            \"Could {{driver1}} be leaving {{team1}}?\",\n            \"{{driver1}} unhappy at {{team1}}? Rumors suggest a possible exit\",\n            \"BREAKING – {{driver1}} reportedly unhappy at {{team1}}\",\n            \"Rumor alert – {{driver1}} considering a move away from {{team1}}\",\n            \"Speculation grows around {{driver1}}’s future at {{team1}}\",\n            \"BREAKING - {{driver1}} ready to part ways with {{team1}}\",\n            \"'It's getting frustrating' – {{driver1}} prepared to leave {{team1}}\",\n            \"Paddock talk – {{driver1}} eyeing possible exit from {{team1}}\",\n            \"Reports suggest {{driver1}} may be exploring other options outside {{team1}}\",\n            \"{{driver1}} linked with potential departure from {{team1}}\",\n            \"Sources indicate {{driver1}} could leave {{team1}} at season’s end\",\n            \"Tension rising? {{driver1}} rumored to be frustrated within {{team1}}\",\n            \"Uncertainty surrounds {{driver1}} as rumors of exit from {{team1}} intensify\",\n            \"Media reports hint at {{driver1}} evaluating future away from {{team1}}\",\n            \"Paddock insiders claim {{driver1}} no longer comfortable at {{team1}}\",\n            \"Could {{driver1}} be preparing to leave {{team1}}? Rumors suggest so\",\n            \"The paddock is talking – {{driver1}}’s situation at {{team1}} under scrutiny\",\n            \"Breaking reports – {{driver1}} allegedly exploring options beyond {{team1}}\",\n            \"Early rumors connect {{driver1}} to alternative seat away from {{team1}}\",\n            \"Reports emerge suggesting {{driver1}} open to new challenges beyond {{team1}}\",\n            \"Sources unsure about {{driver1}}’s future as {{team1}} tensions rise\"\n        ]\n    },\n    {\n        \"id\": \"potential_champion\",\n        \"new_type\": 8,\n        \"titles\": [\n            \"{{driver_name}} on the brink of glory – can they clinch the title at {{circuit}}\",\n            \"Championship countdown – {{driver_name}} could secure the crown in {{country}}\",\n            \"All eyes on {{driver_name}} as they chase the world title at the {{adjective}} Grand Prix\",\n            \"{{driver_name}} just one step away from the championship at {{circuit}}\",\n            \"Title permutations – {{driver_name}} poised for glory at the {{adjective}} GP\",\n            \"{{driver_name}} eyes early championship celebration at {{circuit}}\",\n            \"Can {{driver_name}} seal the deal – championship on the line in {{country}}\",\n            \"{{driver_name}} approaches title decider at the {{adjective}} Grand Prix\",\n            \"One hand on the trophy – {{driver_name}} could be crowned at {{circuit}}\",\n            \"{{driver_name}} has a chance to wrap up the championship in {{country}}\",\n            \"History beckons – {{driver_name}} can clinch the title at {{circuit}}\",\n            \"The moment of truth – {{driver_name}} could become champion at the {{adjective}} GP\",\n            \"Glory within reach – {{driver_name}} heads into {{circuit}} with title hopes alive\",\n            \"{{driver_name}} eyes world championship glory in {{country}}\",\n            \"Crucial weekend ahead – {{driver_name}} could secure the title at {{circuit}}\",\n            \"{{driver_name}} set for potential championship celebration at the {{adjective}} GP\",\n            \"Mathematical chance – {{driver_name}} could seal the title in {{country}}\",\n            \"{{driver_name}} closing in on championship glory at {{circuit}}\",\n            \"Title tension rising – {{driver_name}} can finish the job at the {{adjective}} Grand Prix\",\n            \"{{driver_name}} ready to make history at {{circuit}} if results go their way\",\n            \"Everything to play for – {{driver_name}} could clinch the title this weekend\",\n            \"{{driver_name}} on the verge of sealing the championship in {{country}}\",\n            \"The crown within reach – {{driver_name}} faces decisive {{adjective}} GP\",\n            \"{{driver_name}} could become world champion at {{circuit}} depending on results\",\n            \"Title in sight – {{driver_name}} enters {{country}} weekend with everything to gain\"\n        ]\n    },\n    {\n        \"id\": \"world_champion\",\n        \"new_type\": 9,\n        \"titles\": [\n            \"{{driver_name}} crowned World Champion at the {{adjective}} Grand Prix\",\n            \"History made – {{driver_name}} secures World Championship title in {{country}}\",\n            \"Glory for {{driver_name}} – crowned champion at {{circuit}}\",\n            \"{{driver_name}} celebrates World Championship victory in {{country}}\",\n            \"Unstoppable {{driver_name}} – the new World Champion\",\n            \"{{driver_name}} clinches the World Drivers’ Championship at {{circuit}}\",\n            \"It’s done – {{driver_name}} becomes World Champion at the {{adjective}} GP\",\n            \"BREAKING NEWS – {{driver_name}} wins the World Championship at {{circuit}}\",\n            \"World Champion – {{driver_name}} takes the crown after the {{adjective}} Grand Prix\",\n            \"{{driver_name}} achieves ultimate glory with title win in {{country}}\",\n            \"Championship glory – {{driver_name}} officially crowned World Champion\",\n            \"Dominant season rewarded – {{driver_name}} secures the title in {{country}}\",\n            \"{{driver_name}} makes history with championship triumph at {{circuit}}\",\n            \"The dream achieved – {{driver_name}} becomes World Champion\",\n            \"Pure emotion – {{driver_name}} celebrates title win at the {{adjective}} GP\",\n            \"{{driver_name}} joins the legends after clinching the title in {{country}}\",\n            \"Unforgettable moment – {{driver_name}} takes championship glory at {{circuit}}\",\n            \"Championship secured – {{driver_name}} crowned king of Formula 1\",\n            \"{{driver_name}} seals the deal – now World Champion at the {{adjective}} GP\",\n            \"From contender to champion – {{driver_name}} completes incredible season\",\n            \"BREAKING – {{driver_name}} wins the World Championship after dramatic race in {{country}}\",\n            \"A new era begins – {{driver_name}} takes the throne at {{circuit}}\",\n            \"Historic day – {{driver_name}} crowned champion after the {{adjective}} Grand Prix\",\n            \"The crown belongs to {{driver_name}} – World Champion at {{circuit}}\",\n            \"What a season – {{driver_name}} takes the title and makes history\"\n        ]\n    },\n    {\n        \"id\": \"contract_renewal\",\n        \"new_type\": 10,\n        \"titles\": [\n            \"OFFICIAL – {{driver1}} extends contract with {{team1}}\",\n            \"Breaking – {{driver1}} signs new deal with {{team1}}\",\n            \"Contract renewal confirmed – {{driver1}} stays with {{team1}}\",\n            \"{{driver1}} commits future to {{team1}} with extended agreement\",\n            \"It’s official – {{driver1}} renews contract with {{team1}}\",\n            \"Long-term deal signed – {{driver1}} remains with {{team1}}\",\n            \"{{driver1}} and {{team1}} agree to multi-year contract extension\",\n            \"Confirmed – {{driver1}} continues racing with {{team1}}\",\n            \"New chapter – {{driver1}} stays at {{team1}} after signing fresh deal\",\n            \"Good news for fans – {{driver1}} extends stay with {{team1}}\",\n            \"OFFICIAL – {{driver1}} renews contract and remains part of {{team1}}’s lineup\",\n            \"Big announcement – {{driver1}} and {{team1}} continue partnership\",\n            \"Confirmed extension – {{driver1}} to stay with {{team1}} beyond this season\",\n            \"{{driver1}} secures new deal to continue with {{team1}}\",\n            \"{{team1}} confirms contract renewal for {{driver1}}\",\n            \"Mutual confidence – {{driver1}} and {{team1}} extend collaboration\",\n            \"Happy to stay – {{driver1}} signs new contract with {{team1}}\",\n            \"{{driver1}} remains loyal to {{team1}} with fresh multi-year deal\",\n            \"OFFICIAL NEWS – {{driver1}} continues with {{team1}} for upcoming seasons\",\n            \"{{team1}} announces renewed deal with {{driver1}}\",\n            \"Stability confirmed – {{driver1}} stays at {{team1}} after new agreement\",\n            \"New deal in place – {{driver1}} continues with {{team1}}\",\n            \"Commitment extended – {{driver1}} and {{team1}} strengthen their partnership\",\n            \"Confirmed – {{driver1}} to remain with {{team1}} into the next season\",\n            \"OFFICIAL – {{driver1}} renews contract and extends stay at {{team1}}\"\n        ]\n    },\n    {\n        \"id\": \"team_comparison_bad\",\n        \"new_type\": 11,\n        \"titles\": [\n            \"What’s going wrong at {{team1}} – performance decline continues\",\n            \"Pressure mounting at {{team1}} after another disappointing weekend\",\n            \"Inside {{team1}} – concerns grow as results fail to improve\",\n            \"{{team1}} struggling to match last year’s form\",\n            \"The situation at {{team1}} – tough season exposes key weaknesses\",\n            \"Setbacks for {{team1}} as performance drops below expectations\",\n            \"Tough times for {{team1}} – questions raised over development path\",\n            \"Struggles continue for {{team1}} as results disappoint again\",\n            \"Can {{team1}} turn things around – another poor showing raises doubts\",\n            \"{{team1}} faces internal pressure amid ongoing performance issues\",\n            \"The pressure is on – {{team1}} unable to replicate last season’s pace\",\n            \"{{team1}} under scrutiny after series of underwhelming results\",\n            \"What’s behind {{team1}}’s recent decline in performance\",\n            \"Frustration grows inside {{team1}} as rivals pull ahead\",\n            \"The downfall of {{team1}} – from contender to midfield struggler\",\n            \"{{team1}} faces tough questions after another weak weekend\",\n            \"Worrying trend – {{team1}} continues to fall behind competition\",\n            \"Time running out for {{team1}} to fix their performance issues\",\n            \"Critical period for {{team1}} as development struggles persist\",\n            \"Pressure builds within {{team1}} – disappointing results spark concern\",\n            \"Another setback – {{team1}} fails to deliver improvements\",\n            \"{{team1}}’s season unravels after difficult run of form\",\n            \"Uncertain future for {{team1}} – form slump continues\",\n            \"{{team1}} must find answers quickly after latest poor showing\",\n            \"Alarm bells ringing – {{team1}} slipping further down the order\"\n        ]\n    },\n    {\n        \"id\": \"team_comparison_good\",\n        \"new_type\": 12,\n        \"titles\": [\n            \"Positive momentum building at {{team1}} after strong performances\",\n            \"Encouraging signs – {{team1}} showing real progress this season\",\n            \"Inside {{team1}} – confidence rising after steady improvement\",\n            \"The turnaround continues – {{team1}} impressing with recent results\",\n            \"Progress for {{team1}} as upgrades begin to deliver performance\",\n            \"Optimism grows at {{team1}} following consistent results\",\n            \"Strong progress – {{team1}} emerging as a surprise of the season\",\n            \"Big step forward for {{team1}} after months of hard work\",\n            \"{{team1}} begins to close the gap to front-runners with improved pace\",\n            \"The rebuild paying off – {{team1}} showing clear signs of recovery\",\n            \"Upward trend – {{team1}} finding form and confidence again\",\n            \"Encouraging weekend for {{team1}} – steady progress continues\",\n            \"After a difficult year, {{team1}} finally back on the right path\",\n            \"Progress report – {{team1}} moving closer to the top\",\n            \"{{team1}} making strides after successful development updates\",\n            \"Positive results boost morale at {{team1}}\",\n            \"Consistency returns – {{team1}} looks stronger with each race\",\n            \"Step by step – {{team1}} climbing back up the grid\",\n            \"Encouraging pace from {{team1}} signals brighter future ahead\",\n            \"{{team1}} begins to surprise rivals with improved performance\",\n            \"Confidence growing – {{team1}} showing they belong among the top teams\",\n            \"Signs of revival – {{team1}} continuing to impress the paddock\",\n            \"Renewed energy at {{team1}} as progress becomes visible\",\n            \"{{team1}} turning heads after exceeding early expectations\",\n            \"From struggle to strength – {{team1}}’s comeback gathers pace\"\n        ]\n    },\n    {\n        \"id\": \"driver_comparison\",\n        \"new_type\": 13,\n        \"titles\": [\n            \"{{driver1}} outperforms {{driver2}} at {{team}} after another strong weekend\",\n            \"{{team}} – {{driver1}} continues to lead the internal battle over {{driver2}}\",\n            \"{{driver1}} showing stronger form than {{driver2}} as the season unfolds\",\n            \"Performance gap widening between {{driver1}} and {{driver2}} at {{team}}\",\n            \"{{driver1}} shines while {{driver2}} struggles to match pace at {{team}}\",\n            \"{{team}} teammate comparison – {{driver1}} ahead of {{driver2}} once again\",\n            \"{{driver1}} gaining the edge over {{driver2}} within {{team}}\",\n            \"{{driver1}} continues to outpace {{driver2}} at {{team}} with consistent results\",\n            \"{{driver1}} vs {{driver2}} – momentum clearly shifting inside {{team}}\",\n            \"Inside {{team}} – {{driver1}} asserting dominance over {{driver2}}\",\n            \"{{driver1}} sets the pace while {{driver2}} plays catch-up at {{team}}\",\n            \"{{driver1}} extends advantage over {{driver2}} in the {{adjective}} GP weekend\",\n            \"Confidence growing for {{driver1}} as {{driver2}} seeks answers at {{team}}\",\n            \"{{driver1}} delivers again for {{team}} while {{driver2}} struggles with balance\",\n            \"Improved pace from {{driver1}} puts pressure on teammate {{driver2}}\",\n            \"{{driver1}} emerging as {{team}}’s clear leader after latest results\",\n            \"{{driver2}} left searching for answers as {{driver1}} raises the bar at {{team}}\",\n            \"Another strong outing for {{driver1}} keeps them ahead of {{driver2}} in {{team}} battle\",\n            \"{{team}} management impressed by {{driver1}}’s form compared to {{driver2}}\",\n            \"{{driver1}} building momentum as {{driver2}} endures a tough run at {{team}}\",\n            \"{{driver1}}’s consistency giving them the upper hand at {{team}}\",\n            \"The tide turns inside {{team}} – {{driver1}} now firmly ahead of {{driver2}}\",\n            \"{{driver1}}’s performance sparks talk within {{team}} about teammate balance\",\n            \"Steady progress – {{driver1}} keeping {{driver2}} under pressure at {{team}}\",\n            \"{{driver1}} continues to prove their worth at {{team}} while {{driver2}} trails behind\"\n        ]\n    },\n    {\n        \"id\": \"season_review_mid\",\n        \"new_type\": 14,\n        \"titles\": [\n            \"{{driver1}} sets the benchmark in the championship battle\",\n            \"Halfway there – {{driver1}} leads the way as the season unfolds\",\n            \"The title fight intensifies as {{driver1}} and {{driver2}} trade blows\",\n            \"{{driver1}} strengthens championship bid with consistent form\",\n            \"{{driver1}} holds the upper hand over {{driver2}} heading into the break\",\n            \"Momentum with {{driver1}} as rivals struggle to keep up\",\n            \"All eyes on {{driver1}} after impressive first half of the season\",\n            \"Pressure building on {{driver2}} as {{driver1}} extends their lead\",\n            \"Championship picture shifting with {{driver1}} in control\",\n            \"Strong first half for {{driver1}} sets the tone for title push\",\n            \"{{driver1}} emerges as clear favourite after dominant mid-season run\",\n            \"The battle continues – {{driver1}} and {{driver2}} locked in close fight\",\n            \"{{driver1}} takes charge of the standings heading into summer break\",\n            \"Confidence growing for {{driver1}} as momentum carries through the grid\",\n            \"Mid-season reflections – {{driver1}} establishing themselves as the driver to beat\",\n            \"Championship tension builds as {{driver1}} keeps {{driver2}} under pressure\",\n            \"Momentum shifts – {{driver1}} asserting control in the standings\",\n            \"Halfway through – {{driver1}} looking unstoppable in title race\",\n            \"Strong mid-season form puts {{driver1}} ahead in the title chase\",\n            \"Pressure rises for {{driver2}} as {{driver1}} continues dominant streak\",\n            \"Consistency pays off – {{driver1}} on top after mid-season surge\",\n            \"At the halfway mark – {{driver1}} sets the pace for championship glory\",\n            \"{{driver1}} tightening grip on the championship after latest results\",\n            \"The road to the title – {{driver1}} continues to deliver when it matters\"\n        ]\n    },\n    {\n        \"id\": \"season_review_end\",\n        \"new_type\": 15,\n        \"titles\": [\n            \"Winners and losers of the {{season_year}} Formula 1 season\",\n            \"Who impressed and who struggled in {{season_year}}\",\n            \"Season in review – standout drivers and surprises of {{season_year}}\",\n            \"Reflecting on {{season_year}} – the highs, lows and turning points\",\n            \"{{driver1}} crowned champion, but who else shone in {{season_year}}\",\n            \"From dominance to disaster – the full story of the {{season_year}} season\",\n            \"The good, the bad and the surprising from {{season_year}} Formula 1\",\n            \"Our verdict – who defined the {{season_year}} F1 season\",\n            \"Reviewing a dramatic year – standout performances from {{season_year}}\",\n            \"A year to remember – key stories that shaped the {{season_year}} championship\",\n            \"Season analysis – winners, surprises and disappointments of {{season_year}}\",\n            \"From champions to underdogs – the defining moments of {{season_year}}\",\n            \"End of season report – how every team and driver fared in {{season_year}}\",\n            \"The title fight, the surprises and the heartbreaks of {{season_year}}\",\n            \"Comprehensive review – the ups and downs of the {{season_year}} campaign\",\n            \"A season of twists – what made {{season_year}} truly unforgettable\",\n            \"Full recap – everything that mattered in the {{season_year}} Formula 1 season\",\n            \"Looking back – {{season_year}} delivered excitement and shock in equal measure\",\n            \"The season comes to a close – analysing who exceeded expectations in {{season_year}}\",\n            \"Big takeaways from {{season_year}} – the stories behind the results\",\n            \"Season finale reflections – what we learned from {{season_year}}\",\n            \"Closing chapter – key lessons from an unpredictable {{season_year}}\",\n            \"Final thoughts – {{season_year}} gave us triumph, drama and redemption\",\n            \"After a thrilling year, {{season_year}} leaves behind unforgettable storylines\",\n            \"The curtain falls on {{season_year}} – who came out on top and who fell short\"\n        ]\n    },\n    {\n        \"id\": \"driver_reactions_post_race\",\n        \"new_type\": 16,\n        \"titles\": [\n            \"Driver reactions after the {{adjective}} Grand Prix weekend\",\n            \"Voices from the paddock – emotions run high after the {{adjective}} GP\",\n            \"Hear what the grid had to say after the {{country}} Grand Prix\",\n            \"Post-race roundup – reactions from the {{circuit}} paddock\",\n            \"Inside the paddock – driver comments after {{country}} GP drama\",\n            \"Post-race emotions overflow after the {{adjective}} GP at {{circuit}}\",\n            \"The {{country}} GP in words – joy, frustration and everything in between\",\n            \"Drivers share their thoughts after a wild weekend in {{country}}\",\n            \"What the drivers said after an intense battle at {{circuit}}\",\n            \"The paddock reacts to the {{adjective}} GP – contrasting emotions across the field\",\n            \"Driver quotes after the {{country}} Grand Prix – highs and lows everywhere\",\n            \"All the post-race quotes from the {{adjective}} GP at {{circuit}}\",\n            \"From joy to despair – driver reactions after the {{country}} GP\",\n            \"Press room roundup – what the drivers had to say after {{adjective}} GP Sunday\",\n            \"After the flag – drivers reflect on a challenging {{country}} Grand Prix\",\n            \"Hot takes from {{country}} – how drivers summed up the {{adjective}} GP\",\n            \"Emotions boil over after {{country}} GP – full driver reactions\",\n            \"Post-race microphones catch every emotion after {{adjective}} GP\",\n            \"Who smiled and who frowned after the {{country}} GP?\",\n            \"{{happy_driver}}: \\\"That was one of my best races ever\\\"\",\n            \"{{happy_driver}}: \\\"We executed perfectly – I’m really proud\\\"\",\n            \"{{happy_driver}} delighted after strong {{country}} GP result\",\n            \"{{happy_driver}} full of praise for {{happy_team}} after {{adjective}} GP success\",\n            \"{{happy_driver}}: \\\"We nailed it today, this is what we’ve been working for\\\"\",\n            \"{{happy_driver}} reflects on ‘incredible’ {{adjective}} Grand Prix at {{circuit}}\",\n            \"{{happy_driver}} thanks the team after emotional {{country}} GP\",\n            \"{{happy_driver}} upbeat after solid performance at {{circuit}}\",\n            \"{{happy_driver}} hails team’s effort following {{adjective}} GP heroics\",\n            \"{{happy_driver}} confident momentum will continue after {{country}} GP\",\n            \"Smiles in the {{happy_team}} garage after strong {{adjective}} GP result\",\n            \"{{happy_driver}}: \\\"We’ve proven our potential today\\\"\",\n            \"{{happy_driver}}: \\\"The car was amazing – huge credit to {{happy_team}}\\\"\",\n            \"{{happy_driver}} thrilled with progress after tough {{adjective}} GP\",\n            \"{{happy_driver}}: \\\"It feels so good to be back at the front\\\"\",\n            \"Positive vibes in {{happy_team}} camp after encouraging {{country}} GP\",\n            \"{{unhappy_driver}}: \\\"We should’ve done much better today\\\"\",\n            \"{{unhappy_driver}} frustrated after chaotic {{country}} Grand Prix\",\n            \"{{unhappy_driver}}: \\\"Strategy calls didn’t go our way\\\"\",\n            \"{{unhappy_driver}} left disappointed after missed opportunity in {{adjective}} GP\",\n            \"{{unhappy_driver}}: \\\"The pace was there, but luck wasn’t\\\"\",\n            \"{{unhappy_driver}} vents frustration after difficult {{circuit}} weekend\",\n            \"{{unhappy_driver}} admits disappointment after underwhelming {{country}} GP\",\n            \"{{unhappy_driver}}: \\\"We threw away good points today\\\"\",\n            \"{{unhappy_driver}} critical after team error at {{circuit}}\",\n            \"{{unhappy_driver}} calls for answers after frustrating {{country}} GP\",\n            \"Frustration for {{unhappy_driver}} as {{unhappy_team}} miss out on key result\",\n            \"{{unhappy_driver}}: \\\"We had the car to fight, but it didn’t come together\\\"\",\n            \"{{unhappy_driver}} remains optimistic despite {{adjective}} GP struggles\",\n            \"{{happy_driver}} and {{unhappy_driver}} give contrasting reactions after {{country}} GP\",\n            \"{{happy_driver}} upbeat, {{unhappy_driver}} dejected after {{country}} GP\",\n            \"Post-race reflections – joy for {{happy_driver}}, frustration for {{unhappy_driver}}\",\n            \"Paddock emotions split after {{adjective}} GP at {{circuit}}\",\n            \"Drivers speak out – highs and lows from {{country}} Grand Prix\",\n            \"Relief for some, regret for others after {{adjective}} GP weekend\",\n            \"After the chequered flag – how the drivers reacted in {{country}}\",\n            \"Reactions from {{circuit}} – elation, frustration and everything in between\",\n            \"Drivers reflect on a rollercoaster {{adjective}} GP weekend\",\n            \"Post-race press quotes – how the grid reacted to {{country}} GP\",\n            \"What did the drivers think? Full reactions after {{adjective}} GP\",\n            \"How did the drivers feel about their {{country}} GP performances?\",\n            \"{{unhappy_driver}} hinting possible exit from {{unhappy_team}}?\",\n            \"The {{adjective}} GP aftermath – honest words from the drivers\",\n            \"Paddock chatter – the best driver quotes from {{circuit}}\",\n            \"After the chaos – drivers give their takes on {{country}} Grand Prix\",\n            \"From joy to disappointment – {{country}} GP reaction roundup\",\n            \"Straight from the drivers – post-race words from {{circuit}}\",\n            \"Post-race press buzz – top quotes from {{adjective}} GP\",\n            \"Hear it from the drivers – full reaction to {{country}} GP\",\n            \"Raw emotions on display after {{adjective}} GP at {{circuit}}\",\n            \"Behind the microphones – everything drivers said after {{country}} GP\",\n            \"Words from the paddock – weekend reactions from {{country}}\",\n            \"The weekend in words – drivers react to {{adjective}} Grand Prix\",\n            \"Top quotes from {{circuit}} – a mix of smiles and frustration\",\n            \"Paddock roundup – what everyone’s saying after {{country}} GP\",\n            \"The best post-race comments from {{circuit}}\",\n            \"Driver reactions flood in after {{adjective}} Grand Prix weekend\",\n            \"What they said – all the driver quotes from {{country}} GP\",\n            \"Every emotion in the book – {{adjective}} GP reaction roundup\",\n            \"Reactions, emotions, and lessons learned from {{country}} GP\",\n            \"Voices of the weekend – the drivers react to {{adjective}} GP\",\n            \"The paddock speaks – all the post-race emotions from {{circuit}}\",\n            \"Post-race press conference recap from {{country}} GP\",\n            \"The {{country}} Grand Prix aftermath – from elation to disappointment\",\n            \"How the drivers summed up their {{adjective}} GP experiences\"\n        ]\n    },\n    {\n        \"id\": \"massive_exit\",\n        \"new_type\": 17,\n        \"titles\": [\n            \"SHOCKING – {{driver1}} to leave {{team1}} at the end of the season\",\n            \"Breaking news – {{driver1}} set to exit {{team1}} after {{season_year}}\",\n            \"Major announcement – {{driver1}} parts ways with {{team1}}\",\n            \"{{driver1}} confirms departure from {{team1}} after {{season_year}} campaign\",\n            \"Surprise exit – {{driver1}} to leave {{team1}} in a stunning move\",\n            \"{{driver1}} and {{team1}} to go separate ways after {{season_year}}\",\n            \"BREAKING – {{driver1}} ends tenure with {{team1}} at season’s end\",\n            \"{{driver1}} announces exit from {{team1}}, leaving fans stunned\",\n            \"End of an era – {{driver1}} to depart {{team1}} after {{season_year}}\",\n            \"It's done – {{driver1}} set to leave {{team1}}\",\n            \"{{driver1}} to bid farewell to {{team1}} after the conclusion of {{season_year}}\",\n            \"Unexpected move – {{driver1}} parts ways with {{team1}}\",\n            \"{{driver1}} confirms exit from {{team1}}, sparking speculation about future\",\n            \"Breaking – {{driver1}} to leave {{team1}}, ending a significant chapter\",\n            \"{{driver1}} set to exit {{team1}}, leaving fans and pundits surprised\",\n            \"Major shake-up – {{driver1}} to depart from {{team1}} after {{season_year}}\",\n            \"'It just hasn't worked out' – {{driver1}} to leave {{team1}}\",\n            \"OFFICIAL - {{driver1}} to leave {{team1}} at the end of the season\",\n            \"{{driver1}} and {{team1}} will part ways at the end of the season, {{team1}} confirms\",\n            \"'We're grateful for his time here' – {{team1}} announces {{driver1}}'s exit\",\n            \"{{driver1}} will leave {{team1}} at the end of the season, {{team1}} confirms\"\n        ]\n    },\n    {\n        \"id\": \"massive_signing\",\n        \"new_type\": 18,\n        \"titles\": [\n            \"BREAKING – {{driver1}} signs with {{team2}} for the upcoming season\",\n            \"Major signing – {{driver1}} joins {{team2}} in a stunning move\",\n            \"{{driver1}} confirmed as new driver for {{team2}}\",\n            \"SHOCKING – {{driver1}} to race for {{team2}} next season\",\n            \"HERE WE GO - {{driver1}} makes the switch  to {{team2}}\",\n            \"'We're very excited to have him' – {{team2}} announces signing of {{driver1}}\",\n            \"{{driver1}} to join {{team2}} after signing multi-year deal\",\n            \"OFFICIAL - {{driver1}} signs with {{team2}} for the next season\",\n            \"Huge move – {{driver1}} officially joins {{team2}} for next season\",\n            \"Blockbuster transfer – {{driver1}} signs with {{team2}}\",\n            \"Confirmed – {{driver1}} becomes new {{team2}} driver for the upcoming season\",\n            \"Big announcement – {{team2}} secures the signing of {{driver1}}\",\n            \"It’s done – {{driver1}} to race with {{team2}} from next year\",\n            \"Massive shake-up – {{driver1}} officially moves to {{team2}}\",\n            \"{{driver1}} completes major switch to {{team2}}\",\n            \"{{team2}} lands top talent – {{driver1}} confirmed for next season\",\n            \"Official statement – {{driver1}} joins {{team2}} on a long-term deal\",\n            \"{{team2}} announces the signing of {{driver1}} in major transfer news\",\n            \"Big news – {{driver1}} set to partner with {{team2}} from next year\",\n            \"Transfer bombshell – {{driver1}} officially heading to {{team2}}\",\n            \"{{driver1}} signs with {{team2}} in one of the biggest moves of the season\",\n            \"Statement move – {{team2}} secures star driver {{driver1}}\",\n            \"'I am looking forward to this new challenge' – {{driver1}} joins {{team2}}\",\n            \"{{driver1}} makes sensational switch to {{team2}} for the upcoming season\"\n        ]\n    },\n    {\n        \"id\": \"next_season_grid\",\n        \"new_type\": 19,\n        \"titles\": [\n            \"The {{season_year}} F1 grid – all confirmed driver line-ups\",\n            \"Looking ahead to {{season_year}} – complete driver roster revealed\",\n            \"Next season’s grid – who’s where in {{season_year}} Formula 1\",\n            \"{{season_year}} driver line-ups confirmed – full team-by-team guide\",\n            \"The future is set – {{season_year}} F1 driver line-ups announced\",\n            \"Breaking down the {{season_year}} Formula 1 grid – who’s driving for whom\",\n            \"Complete guide to the {{season_year}} F1 driver roster\",\n            \"What to expect in {{season_year}} – full driver line-ups revealed\",\n            \"Team-by-team look at the {{season_year}} Formula 1 grid\",\n            \"{{season_year}} F1 driver line-ups – all you need to know\"\n        ]\n    },\n    {\n        \"id\": \"feeder_series_review\",\n        \"new_type\": 20,\n        \"titles\": [\n            \"How did the F2 and F3 seasons unfold in {{season_year}}?\",\n            \"Reviewing the {{season_year}} F2 and F3 championships – {{f2_champion}} and {{f3_champion}} crowned\",\n            \"Standout moments from the {{season_year}} F2 and F3 seasons\",\n            \"{{f2_champion}} and {{f3_champion}} take the crowns – a look back at {{season_year}}\",\n            \"The rise of future stars – highlights from {{season_year}} F2 and F3\",\n            \"'We knew he had something special' – reflecting on {{f2_champion}}'s {{season_year}} F2 title\",\n            \"From the juniors to the spotlight – {{season_year}} F2 and F3 season review\",\n            \"Key takeaways from the {{season_year}} F2 and F3 championships\",\n            \"How did {{f2_champion}} and {{f3_champion}} clinch their titles in {{season_year}}?\",\n            \"{{f2_champion}} and {{f3_champion}} crowned – a look back at the {{season_year}} feeder series seasons\",\n            \"Rising stars of {{season_year}} – reviewing the F2 and F3 championships\",\n            \"The journey to F1 – highlights from the {{season_year}} F2 and F3 seasons\",\n            \"Season review of the {{season_year}} F2 and F3 championships\",\n            \"From contenders to champions – how {{f2_champion}} and {{f3_champion}} won in {{season_year}}\"\n        ]\n    }\n]"
  },
  {
    "path": "src/data/news/turning_points_prompts_templates.json",
    "content": "[\n    {\n        \"id\": \"technical_directive\",\n        \"new_type\": 100,\n        \"prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} about how the FIA is considering introducing a new technical directive that would impact the {{component}} designs already this season. The objective of the directive is to {{reason}}. Include quotes from the FIA technical delegate and make up some change in the said {{component}}. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 400 and 500 words long.\",\n        \"positive_prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} about how the FIA has announced a new technical directive that will impact the {{component}} designs already this season. The objective of the directive is to {{reason}}. Include quotes from the FIA technical delegate explaining the changes and their expected impact on performance. Paddock says that {{best_team}} seems to be the most benefited from the change, while {{second_best}} is close. {{worse_team}} appears to be struggling with the new techniocal directive, the same as {{second_worse}}. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 400 and 500 words long.\",\n        \"negative_prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} about how the FIA has decided not to implement a proposed technical directive that would have impacted the {{component}} designs already this season. The objective of the directive is to {{reason}}. Include quotes from the FIA technical delegate explaining the decision and expressing confidence in the current regulations and the quality of racing it brings. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 400 and 500 words long.\"\n    },\n    {\n        \"id\": \"mid_season_transfer\",\n        \"new_type\": 101,\n        \"prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} about how the team {{team}} is looking to sign {{driver_in}} from {{driver_in_team}} during the season to replace {{driver_out}}. {{driver_substitute_part}} Include quotes from the team principal and the incoming driver teasing it a bit, as it can't be confirmed yet. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 400 and 500 words long.\",\n        \"positive_prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} about how the team {{team}} has announced that {{driver_in}} will join them from {{driver_in_team}} during the season to replace {{driver_out}}. {{driver_substitute_part}} Include quotes from the team principal and the incoming driver expressing excitement about this new chapter. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 400 and 500 words long.\",\n        \"negative_prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} about how the team {{team}} has decided not to pursue the signing of {{driver_in}} from {{driver_in_team}} during the season to replace {{driver_out}}. {{driver_substitute_part}} Include quotes from the team principal explaining the decision and expressing confidence in their current driver lineup. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 400 and 500 words long.\"\n    },\n    {\n        \"id\": \"investment_takeover\",\n        \"new_type\": 102,\n        \"prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} about rumors suggesting that investors from {{country}} are preparing a potential {{amount}} million investment in {{team}}, possibly acquiring around {{share}}% of the team. Describe how this has stirred discussions within the paddock and how it could reshape the team's financial future. Include quotes from insiders or unnamed team sources offering cautious comments, emphasizing that nothing has been confirmed yet. Use clear, natural {{language}} in a professional journalistic tone, similar to Autosport or Motorsport.com. Avoid slang, exaggeration, or unnecessary drama. The article should be between 400 and 500 words long.\",\n        \"positive_prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} confirming that {{team}} has officially secured a {{amount}} million investment deal with a {{country}} consortium, giving them a {{share}}% stake in the team. Describe how this new funding will strengthen {{team}}’s long-term ambitions and stability, and what the deal means for their competitiveness in Formula 1. Include quotes from the team principal and a representative of the {{country}} investors expressing optimism about the partnership. Use clear, professional {{language}} in the tone of Autosport or Motorsport.com. Avoid exaggeration or unnecessary flair. The article should be between 400 and 500 words long.\",\n        \"negative_prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} about how {{team}} has denied reports of an impending {{amount}} million investment or takeover bid from {{country}} investors, despite widespread speculation. Explain how the rumors emerged, why the team decided to clarify the situation, and how this reflects on their current financial independence. Include quotes from the team principal dismissing the claims and reaffirming the team's direction. Use clear, natural {{language}} in a professional journalistic tone similar to Autosport or Motorsport.com. Avoid slang, exaggeration, or sensational language. The article should be between 400 and 500 words long.\"\n    },\n    {\n        \"id\": \"dsq\",\n        \"new_type\": 103,\n        \"prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} explaining that the team {{team}} may get both cars disqualified from the {{adjective}} Grand Prix due to a technical infringement found during post-race inspection related to their {{component}}. {{driver_1}} finishing position was P{{driver_1_pos}} and got {{driver_1_points}} points, while {{driver_2}} finished in P{{driver_2_pos}} and earned {{driver_2_points}} points. Include quotes from their team principal expressing confidence in their innocence. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 400 and 500 words long.\",\n        \"positive_prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} explaining that the team {{team}} has had both cars disqualified from the {{adjective}} Grand Prix due to a technical infringement found during post-race inspection related to their {{component}}. {{driver_1}} finishing position was P{{driver_1_pos}} and got {{driver_1_points}} points before the disqualification, while {{driver_2}} finished in P{{driver_2_pos}} and earned {{driver_2_points}} points that he then got stripped away of. Include quotes from their team principal expressing confidence in their innocence. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 400 and 500 words long.\",\n        \"negative_prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} explaining that the team {{team}} has finally avoided disqualification for their cars at the {{adjective}} Grand Prix after a technical infringement found during post-race inspection related to their {{component}} was overturned on appeal. Include quotes from their team principal expressing relief and satisfaction with the outcome. Use clear, natural {{language}} in a professional journalistic style, similar to outlets like Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 400 and 500 words long.\"\n    },\n    {\n        \"id\": \"race_substitution\",\n        \"new_type\": 105,\n        \"prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} explaining that the {{original_race}} Grand Prix is reportedly at risk of cancellation due to {{reason}}. Mention that the FIA and Formula 1 are evaluating possible replacements, with {{substitute_race}} GP emerging as one of the leading candidates to take its place on the calendar. Include background on the situation, quotes from F1 officials or local organizers expressing caution or optimism, and context about how such changes impact the championship. Use clear, professional language similar to Autosport or Motorsport.com. Avoid sensationalism or unnecessary adjectives. The article should be between 400 and 500 words long.\",\n        \"positive_prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} explaining that the {{original_race}} Grand Prix has officially been cancelled due to {{reason}}, and that {{substitute_race}} GP will take its place on the Formula 1 calendar. Describe how the decision was made, include official statements from the FIA and Formula 1 Management confirming the change, and mention the reaction from fans and teams. Provide background on {{substitute_race}} returning or joining the calendar and how this affects travel logistics and the season's balance. Use clear, professional {{language}} in a realistic news tone similar to Autosport or Motorsport.com. Avoid sensationalism, exaggeration, or flowery language. The article should be between 400 and 500 words long.\",\n        \"negative_prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} explaining that the {{original_race}} Grand Prix will go ahead as originally planned after weeks of uncertainty caused by {{reason}}. Mention that concerns about a potential cancellation or replacement have been resolved following confirmation from the FIA and local organizers. Include quotes from key officials expressing relief and confidence in the event’s preparation, and describe how the confirmation stabilizes the remainder of the calendar. Use clear, professional {{language}} in a journalistic tone similar to Autosport or Motorsport.com. Avoid exaggeration or unnecessary drama. The article should be between 400 and 500 words long.\"\n    },\n    {\n        \"id\": \"driver_injury\",\n        \"new_type\": 106,\n        \"prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} explaining that {{driver}} from {{team}} is dealing with {{condition}} caused by {{reason}}. Mention that the issue could force the driver to miss {{races_affected_count}} Grand Prix events, depending on recovery progress. The expected comeback race would be the {{expectedReturnCountry}} GP. Describe how the situation developed, what the team has said publicly. {{reserve_driver_part}} Include brief medical context about the condition and how it can affect a Formula 1 driver’s performance or comfort in the cockpit. Use clear, factual, professional {{language}} in a tone similar to Autosport or Motorsport.com. Avoid sensationalism or exaggeration. The article should be between 400 and 500 words long.\",\n        \"positive_prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} confirming that {{driver}} from {{team}} will indeed miss the upcoming {{races_affected_count}} Grand Prix events due to {{condition}} following {{reason}}. {{reserve_driver_part}} {{driver}} is expected around the {{expectedReturnCountry}} Grand Prix. Include quotes from team officials about prioritizing the driver’s recovery, reactions from the paddock, and context on how this absence may affect {{team}}’s performance in the championship. Maintain a professional, journalistic tone similar to Autosport or Motorsport.com, avoiding exaggeration or dramatic phrasing. The article should be between 400 and 500 words long.\",\n        \"negative_prompt\": \"Write ONLY the body (not the title) of a news article in {{language}} confirming that {{driver}} from {{team}} will take part in the upcoming Grand Prix despite recent concerns about {{condition}} caused by {{reason}}. Mention that after medical checks and physiotherapy, the driver has been cleared to race, ending speculation about a potential absence. Include comments from {{driver}} or team representatives expressing relief and determination to continue competing. {{reserve_driver_part}} Emphasize that the team will monitor {{driver}}’s condition closely over the next races. Use clear, professional, and realistic {{language}} in a tone similar to Autosport or Motorsport.com. Avoid unnecessary drama or exaggeration. The article should be between 400 and 500 words long.\"\n    },\n    {\n        \"id\":  \"turning_point_engine_regulation\",\n        \"new_type\":  107,\n        \"prompt\":  \"Write ONLY the body (not the title) of a news article in {{language}} about how the FIA is considering a {{type}} change to engine regulations for next season, with a focus on {{change_area}}. Explain how the discussion emerged, why this area is under review, and what it could mean for manufacturers. Include quotes from FIA officials about maintaining fairness and performance balance. Paddock opinion suggests that {{winner_names}} could benefit, while {{loser_names}} may be hindered if the changes are approved. Use clear, natural {{language}} in a professional journalistic style similar to Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 400 and 500 words long.\",\n        \"positive_prompt\":  \"Write ONLY the body (not the title) of a news article in {{language}} confirming that the FIA has approved a {{type}} change to engine regulations for next season, focused on {{change_area}}. Describe the key points of the change and what it means for teams and manufacturers. Include quotes from FIA officials and at least one team principal reacting to the decision. The paddock expects {{winner_names}} to benefit from the new direction, while {{loser_names}} could face a tougher adjustment. Use clear, natural {{language}} in a professional journalistic style similar to Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 400 and 500 words long.\",\n        \"negative_prompt\":  \"Write ONLY the body (not the title) of a news article in {{language}} about how the FIA has decided not to proceed with a proposed {{type}} change to engine regulations focused on {{change_area}}. Explain the reasoning behind the decision and note that the current engine rules will remain in place. Include quotes from FIA officials about stability and cost control. Mention that the paddock had expected {{winner_names}} to benefit and {{loser_names}} to be hindered, but those shifts will not materialize. Use clear, natural {{language}} in a professional journalistic style similar to Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 400 and 500 words long.\"\n    },\n    {\n        \"id\":  \"young_drivers\",\n        \"new_type\":  108,\n        \"prompt\":  \"Write ONLY the body (not the title) of a news article in {{language}} about how the paddock is buzzing about a new wave of young driver prospects led by {{driver1}} and {{driver2}} after standout seasons on the junior ladder. Use the list below for names, ages, series, and standings: {{prospects_list}}. Mention their ages and results, and explain why teams are tracking them as future F1 talent. Include quotes from a team principal and a junior team manager. Use clear, natural {{language}} in a professional journalistic style similar to Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 400 and 500 words long.\",\n        \"positive_prompt\":  \"Write ONLY the body (not the title) of a news article in {{language}} about how {{driver1}} and {{driver2}} have convinced much of the paddock that they are ready for bigger opportunities after strong performances on the junior ladder. Use the list below for names, ages, series, and standings: {{prospects_list}}. Highlight praise from F1 teams and explain what makes their performances stand out. Include quotes from a team principal and a driver mentor. Use clear, natural {{language}} in a professional journalistic style similar to Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 400 and 500 words long.\",\n        \"negative_prompt\":  \"Write ONLY the body (not the title) of a news article in {{language}} about how the hype around {{driver1}} and {{driver2}} has been tempered despite strong junior results. Use the list below for names, ages, series, and standings: {{prospects_list}}. Explain why some teams believe they need more seasoning before stepping up. Include quotes from a team principal and a junior series observer. Use clear, natural {{language}} in a professional journalistic style similar to Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 400 and 500 words long.\"\n    },\n    {\n        \"id\":  \"aduo_engine\",\n        \"new_type\":  109,\n        \"prompt\":  \"Write ONLY the body (not the title) of a news article in {{language}} about the FIA opening an ADUO (Additional Development and Upgrade Opportunities) window during the {{number_period}} quarter of the season. ADUO is a system created by the FIA to help less powerful engine manufacturers improve through the season by allowing targeted upgrades within strict cost and fairness controls. Explain why the system exists, how the window works in broad terms, and what the paddock expects from it. The manufacturers expected to take advantage of this window are: {{manufacturers}}. Below is a qualitative summary of the expected changes (do not use numbers or percentages):\\n\\n{{upgrade_summary}}\\n\\nInclude quotes from an FIA spokesperson and at least one team principal or engine representative reacting to the window. Use clear, natural {{language}} in a professional journalistic style similar to Autosport or Motorsport.com. Avoid slang, overly dramatic phrasing, or unnecessary flourishes. The article should be between 500 and 650 words long.\"\n    }\n]\n"
  },
  {
    "path": "src/data/news/turning_points_titles_templates.json",
    "content": "[\n    {\n        \"id\":  \"fia_directive\",\n        \"new_type\":  100,\n        \"turning_titles\":  [\n                               \"FIA reportedly drafting new technical directive on {{component}}\",\n                               \"Rumors suggest FIA preparing a rule adjustment concerning {{component}}\",\n                               \"Sources indicate FIA is considering action over {{component}} performance\",\n                               \"Potential FIA intervention expected regarding {{component}} regulations\",\n                               \"Whispers in the paddock - FIA to address {{component}} issues soon\",\n                               \"A new technical directive on {{component}} could be imminent, say insiders\",\n                               \"FIA looking into possible changes for {{component}} rules\",\n                               \"Teams brace for potential FIA directive on {{component}} performance\",\n                               \"Earthquake in the paddock? FIA thinks about new regulations on {{component}}\",\n                               \"'It is a possibility' – FIA on upcoming {{component}} technical directive\",\n                               \"Shake-up ahead? FIA technical directive on {{component}} rumored to be in the works\"\n                           ],\n        \"positive_titles\":  [\n                                \"FIA enforces new directive affecting {{component}} performance across the grid\",\n                                \"Official - FIA technical directive on {{component}} now in effect\",\n                                \"Teams react as FIA implements new {{component}} rules\",\n                                \"FIA confirms new regulation changes regarding {{component}}\",\n                                \"FIA's new {{component}} directive shakes up the competition\",\n                                \"New FIA rules on {{component}} expected to impact car performance\",\n                                \"FIA's {{component}} directive sparks debate among teams\",\n                                \"FIA's latest technical directive on {{component}} set to change the landscape\",\n                                \"'We have to adapt quickly' – Teams respond to FIA's {{component}} directive\",\n                                \"'It wont change much' – FIA downplays impact of new {{component}} directive\"\n                            ],\n        \"negative_titles\":  [\n                                \"FIA shelves planned directive on {{component}} after internal review\",\n                                \"Rumored {{component}} directive abandoned following team objections\",\n                                \"No changes to {{component}} regulations after FIA evaluation\",\n                                \"FIA denies reports of imminent {{component}} technical directive\",\n                                \"FIA decides against new {{component}} rules after consultation\",\n                                \"Relief among teams as FIA drops {{component}} directive plans\",\n                                \"FIA opts not to pursue new {{component}} regulations\",\n                                \"FIA confirms no changes to {{component}} rules at this time\",\n                                \"'We found no need for changes' – FIA on scrapped {{component}} directive\",\n                                \"'It was never going to happen' – FIA on rumors of {{component}} technical directive\"\n                            ]\n    },\n    {\n        \"id\":  \"mid_season_transfer\",\n        \"new_type\":  101,\n        \"turning_titles\":  [\n                               \"{{team}} reportedly considering replacing {{driver_out}} with {{driver_in}} as soon as possible\",\n                               \"Internal tension at {{team}} as rumors link {{driver_in}} to {{driver_out}}’s seat\",\n                               \"Sources suggest {{team}} evaluating a possible swap involving {{driver_out}} and {{driver_in}}\",\n                               \"Speculation grows around {{team}}’s lineup after disappointing results from {{driver_out}}\",\n                               \"Whispers in the paddock - {{driver_in}} could be set to replace {{driver_out}} at {{team}}\",\n                               \"Rumors of a mid-season driver change at {{team}} involving {{driver_out}} and {{driver_in}}\",\n                               \"{{team}} is thinking about releasing {{driver_out}} – could {{driver_in}} be the replacement?\",\n                               \"Insiders hint at potential driver shuffle at {{team}} with {{driver_in}} eyeing {{driver_out}}’s position\",\n                               \"'We think about every option' – {{team}} on possible driver change\"\n                           ],\n        \"positive_titles\":  [\n                                \"It’s official - {{driver_in}} replaces {{driver_out}} at {{team}} for the remainder of the season\",\n                                \"{{team}} confirms driver change – {{driver_out}} out, {{driver_in}} in\",\n                                \"{{driver_in}} steps in for {{driver_out}} as {{team}} reshuffles lineup\",\n                                \"Confirmed - {{driver_in}} joins {{team}} for the next race, replacing {{driver_out}}\",\n                                \"{{team}} makes bold move, swaps {{driver_out}} for {{driver_in}}\",\n                                \"{{team}} shakes up lineup with a surprise move involving {{driver_in}}\",\n                                \"HERE WE GO - {{driver_in}} takes over {{driver_out}}’s seat at {{team}}\",\n                                \"{{team}} announces mid-season driver change, {{driver_in}} to replace {{driver_out}}\",\n                                \"'I'm excited for the challenge' – {{driver_in}} on joining {{team}} for the next race\"\n                            ],\n        \"negative_titles\":  [\n                                \"{{team}} denies rumors of replacing {{driver_out}} as soon as possible\",\n                                \"No changes at {{team}} as management reaffirms trust in {{driver_out}}\",\n                                \"Rumors dismissed - {{driver_out}} keeps seat at {{team}} despite speculation\",\n                                \"{{team}} closes talks of a driver change during the season\",\n                                \"{{team}} stands by {{driver_out}}, quashes replacement rumors\",\n                                \"Relief for {{driver_out}} as {{team}} confirms no driver changes\",\n                                \"{{team}} rebuffs speculation, {{driver_out}} remains in the lineup\",\n                                \"{{team}} puts an end to the silly season driver change rumors, {{driver_out}} safe\",\n                                \"{{team}} reaffirms commitment to {{driver_out}}, denies replacement talks\",\n                                \"'I never felt threatened' – {{driver_out}} on rumors of being replaced at {{team}}\"\n                            ]\n    },\n    {\n        \"id\":  \"investment_takeover\",\n        \"new_type\":  102,\n        \"turning_titles\":  [\n                               \"Reports hint at {{amount}}M {{country}} investment in {{team}}\",\n                               \"{{team}} in talks with {{country}} investors for {{share}}% stake\",\n                               \"Rumors grow of {{amount}}M {{country}} deal for {{team}}\",\n                               \"{{team}} draws {{country}} interest worth about {{amount}}M\",\n                               \"Whispers - {{team}} set for {{country}} funding near {{amount}}M\",\n                               \"Insiders point to {{country}} group eyeing {{share}}% of {{team}}\",\n                               \"Could {{team}} face a {{share}}% takeover bid from {{country}}?\",\n                               \"Speculation over {{country}}-{{team}} deal valued at {{amount}}M\"\n                           ],\n        \"positive_titles\":  [\n                                \"Confirmed - {{team}} lands {{amount}}M {{country}} deal ({{share}}%)\",\n                                \"{{team}} finalizes {{amount}}M {{country}} investment boost\",\n                                \"{{team}} partners with {{country}} investors ({{share}}% stake)\",\n                                \"Huge boost as {{country}} group buys {{share}}% of {{team}}\",\n                                \"{{team}} announces {{amount}}M {{country}} investment\",\n                                \"{{team}} welcomes {{country}} investors ({{share}}%)\",\n                                \"{{team}} secures {{amount}}M {{country}} funding\",\n                                \"BREAKING - {{team}} confirms {{country}} {{amount}}M deal\",\n                                \"{{team}} celebrates {{country}} partnership worth {{amount}}M\"\n                            ],\n        \"negative_titles\":  [\n                                \"{{team}} denies {{amount}}M {{country}} talks\",\n                                \"No {{amount}}M {{country}} deal for {{team}}\",\n                                \"{{team}} and {{country}} group fail to reach deal\",\n                                \"{{team}}–{{country}} investment collapsed after {{share}}% talks\",\n                                \"{{team}} ends {{country}} takeover speculation ({{share}}%)\",\n                                \"{{team}} {{country}} talks fall through – {{amount}}M off table\",\n                                \"{{team}} rebuffs {{country}} investment rumors\",\n                                \"No {{share}}% deal between {{team}} and {{country}} group\",\n                                \"'We are not for sale' – {{team}} shuts down {{country}} rumors\"\n                            ]\n    },\n    {\n        \"id\":  \"turning_point_dsq\",\n        \"new_type\":  103,\n        \"turning_titles\":  [\n                               \"FIA reportedly investigating {{team}} for irregularities at the {{adjective}} Grand Prix\",\n                               \"Post-race inspection raises questions over {{team}}’s {{component}} compliance\",\n                               \"Sources claim {{team}} could face disqualification from {{circuit}}\",\n                               \"Controversy brewing as {{team}} is under FIA scrutiny after {{adjective}} Grand Prix\",\n                               \"Whispers in the paddock - {{team}} may be in breach of regulations after {{country}}\",\n                               \"Rumors of potential penalties for {{team}} following {{adjective}} GP\",\n                               \"Insiders hint at possible disqualification for {{team}} after {{adjective}} Grand Prix race\",\n                               \"{{team}} faces FIA probe over {{component}} legality after {{adjective}} GP inspection\",\n                               \"'At the moment we are gathering information' – FIA on {{team}} investigation\"\n                           ],\n        \"positive_titles\":  [\n                                \"FIA confirms {{team}} disqualified from {{adjective}} Grand Prix following irregularities\",\n                                \"Both {{team}} cars disqualified from {{adjective}} GP – FIA releases statement\",\n                                \"Major blow for {{team}} as post-race penalties confirmed at {{adjective}} Grand Prix\",\n                                \"{{team}} loses {{adjective}} GP results after FIA investigation outcome on {{component}}\",\n                                \"FIA rules against {{team}}, disqualifies them from {{country}}\",\n                                \"{{team}} stripped of {{adjective}} Grand Prix points after {{component}} breach confirmed\",\n                                \"Disappointment for {{team}} as FIA enforces disqualification from {{circuit}}\",\n                                \"BREAKING - {{team}} disqualified from {{adjective}} GP after FIA review on their {{component}}\",\n                                \"'We don't agree with the decision' – {{team}} responds to {{country}} disqualification\"\n                            ],\n        \"negative_titles\":  [\n                                \"FIA clears {{team}} of wrongdoing after {{adjective}} investigation into {{component}}\",\n                                \"Investigation closed - {{team}} retains {{adjective}} GP results\",\n                                \"{{team}} exonerated as FIA finds no breach after {{circuit}} review of {{component}}\",\n                                \"Rumors dismissed – no penalties issued to {{team}} after {{circuit}}\",\n                                \"Relief for {{team}} as FIA ends probe with no action taken\",\n                                \"{{team}} avoids disqualification, FIA confirms compliance after {{adjective}} GP\",\n                                \"{{team}} retains points after FIA investigation finds no irregularities with their {{component}}\",\n                                \"{{team}} cleared of any violations following {{adjective}} GP\",\n                                \"'I knew we didn't do anything wrong' – {{team}} on FIA investigation outcome\"\n                            ]\n    },\n    {\n        \"id\":  \"engine_update\",\n        \"new_type\":  104,\n        \"turning_titles\":  [\n                               \"{{engine_supplier}} preparing major power unit upgrade for next races\",\n                               \"Reports indicate {{engine_supplier}} developing improved engine spec\",\n                               \"Rumors of significant {{engine_supplier}} update spark excitement in the paddock\",\n                               \"Insiders hint at performance boost from upcoming {{engine_supplier}} power unit\",\n                               \"Whispers in the paddock - {{engine_supplier}} set to unveil new engine update\",\n                               \"Sources suggest {{engine_supplier}} working on competitive engine upgrade\",\n                               \"Could {{engine_supplier}}’s new engine spec be a game-changer?\",\n                               \"Speculation grows over potential performance leap from {{engine_supplier}} update\",\n                               \"'I think it's a step in the right direction' – {{engine_supplier}} on upcoming upgrade\"\n                           ],\n        \"positive_titles\":  [\n                                \"Success for {{engine_supplier}} as new power unit delivers strong results\",\n                                \"{{engine_supplier}}’s latest engine spec praised for improved performance\",\n                                \"Positive outcome – {{engine_supplier}} upgrade boosts customer teams\",\n                                \"New {{engine_supplier}} engine update proves decisive improvement\",\n                                \"{{engine_supplier}} engine upgrade impresses teams with performance gains\",\n                                \"Teams laud {{engine_supplier}} for effective power unit update\",\n                                \"BREAKING - {{engine_supplier}} engine update shows promising results\",\n                                \"'We are very happy with the progress' – {{engine_supplier}} on new engine spec\"\n                            ],\n        \"negative_titles\":  [\n                                \"No improvement seen after {{engine_supplier}} engine update\",\n                                \"{{engine_supplier}} engine upgrade fails to deliver expected gains\",\n                                \"Disappointment as {{engine_supplier}} update shows no performance increase\",\n                                \"{{engine_supplier}} engine spec remains unchanged after recent update\",\n                                \"Relief for rival teams as {{engine_supplier}} upgrade falls short\",\n                                \"{{engine_supplier}} engine update does not meet performance expectations\",\n                                \"{{engine_supplier}} confirms no significant changes after latest upgrade\",\n                                \"'It's not the step we hoped for' – {{engine_supplier}} on engine update results\"\n                            ]\n    },\n    {\n        \"id\":  \"race_substitution\",\n        \"new_type\":  105,\n        \"turning_titles\":  [\n                               \"{{original_race}} Grand Prix at risk of cancellation due to {{reason}}\",\n                               \"Reports suggest {{original_race}} GP may be called off amid {{reason}} concerns\",\n                               \"Sources indicate potential cancellation of {{original_race}} Grand Prix\",\n                               \"FIA considering alternatives as {{original_race}} GP faces {{reason}} issues\",\n                               \"Could {{substitute_race}} replace {{original_race}} GP this season?\",\n                               \"Speculation grows over possible cancellation of {{original_race}} Grand Prix\",\n                               \"'It doesn't look good' – insiders on {{original_race}} GP status amid {{reason}}\",\n                               \"'We're exploring options' – FIA on potential changes to {{original_race}} GP\",\n                               \"{{original_race}} GP future uncertain as organizers struggle with {{reason}}\",\n                               \"Calendar shake-up likely - {{original_race}} GP in doubt over {{reason}}\",\n                               \"Backup venues being evaluated after concerns surrounding {{original_race}} GP\",\n                               \"{{substitute_race}} emerges as leading candidate to replace {{original_race}} Grand Prix\",\n                               \"Talks intensify between FOM and {{substitute_race}} officials amid {{original_race}} GP uncertainty\",\n                               \"Calendar rumors suggest {{original_race}} GP may be swapped for {{substitute_race}} due to {{reason}}\",\n                               \"Officials admit contingency discussions underway for {{original_race}} GP amid {{reason}} concerns\"\n                           ],\n        \"positive_titles\":  [\n                                \"Confirmed - {{original_race}} Grand Prix cancelled, {{substitute_race}} to take its place\",\n                                \"{{substitute_race}} officially announced as replacement for {{original_race}} GP\",\n                                \"Calendar update - {{substitute_race}} joins F1 schedule after {{original_race}} GP cancellation\",\n                                \"FIA confirms {{substitute_race}} will step in following {{original_race}} Grand Prix cancellation\",\n                                \"{{substitute_race}} steps up as replacement event after {{original_race}} GP called off\",\n                                \"Formula 1 confirms {{substitute_race}} as official substitute for {{original_race}} Grand Prix\",\n                                \"Breaking - {{original_race}} GP cancelled — {{substitute_race}} fills the gap in this year's calendar\",\n                                \"{{substitute_race}} to make surprise return as {{original_race}} GP replacement\",\n                                \"F1 calendar reshuffled - {{substitute_race}} replaces {{original_race}} Grand Prix\",\n                                \"Official statement - {{original_race}} GP dropped, {{substitute_race}} joins the lineup\",\n                                \"'We're excited to host F1 again' – {{substitute_race}} organizers on replacing {{original_race}} GP\",\n                                \"FIA and FOM confirm {{substitute_race}} as new venue after {{original_race}} cancellation\"\n                            ],\n        \"negative_titles\":  [\n                                \"FIA confirms {{original_race}} Grand Prix will go ahead as planned despite {{reason}} concerns\",\n                                \"{{original_race}} GP officially back on as issues surrounding {{reason}} resolved\",\n                                \"After weeks of uncertainty, {{original_race}} Grand Prix confirmed to proceed as scheduled\",\n                                \"Rumors dismissed - {{original_race}} GP to take place as originally planned\",\n                                \"FIA statement ends speculation – {{original_race}} Grand Prix safe for this season\",\n                                \"Organizers confirm {{original_race}} GP will happen after resolving {{reason}} complications\",\n                                \"False alarm - {{original_race}} GP remains on the calendar despite earlier doubts\",\n                                \"{{original_race}} organizers secure final approval, event to go ahead as planned\",\n                                \"{{original_race}} GP cleared to proceed following successful FIA inspection\",\n                                \"All systems go - {{original_race}} Grand Prix confirmed following resolution of {{reason}}\",\n                                \"Confirmed - {{original_race}} Grand Prix to proceed as scheduled\",\n                                \"'At the end of the day, we all wanted to race there' – FIA on {{original_race}} GP confirmation\"\n                            ]\n    },\n    {\n        \"id\":  \"driver_injury_or_illness\",\n        \"new_type\":  106,\n        \"turning_titles\":  [\n                               \"{{driver}} ({{team}}) doubtful for {{next_race}} due to {{condition}}; {{reserve_driver}} on standby\",\n                               \"Concerns grow over {{driver}}'s fitness amid {{condition}} — {{reserve_driver}} ready to step in\",\n                               \"{{driver}} faces {{condition}} ahead of {{next_race}}; {{reserve_driver}} preparing just in case\",\n                               \"Medical checks for {{driver}} after {{condition}}; participation in {{next_race}} uncertain\",\n                               \"{{team}} monitoring {{driver}} closely due to {{condition}}; decision expected soon\",\n                               \"Training setback for {{driver}} — {{condition}} raises doubts over {{next_race}}\",\n                               \"{{reserve_driver}} could replace {{driver}} as {{condition}} affects race prep\",\n                               \"Rumors in the paddock - {{driver}} struggling with {{condition}}, {{reserve_driver}} may step in\",\n                               \"Sources - {{driver}} dealing with {{condition}}; {{next_race}} start not guaranteed\",\n                               \"Fitness concerns at {{team}} — {{driver}} under observation for {{condition}}\",\n                               \"{{driver}} limited by {{condition}} during prep; {{reserve_driver}} on alert\",\n                               \"Question mark for {{driver}} ahead of {{next_race}} due to {{condition}}\",\n                               \"{{team}} weighing options as {{driver}} recovers from {{condition}}\",\n                               \"Could {{driver}} miss {{races_affected_count}} race(s)? {{condition}} putting timeline at risk\",\n                               \"Setback for {{team}} - {{driver}} coping with {{condition}} ahead of {{next_race}}\"\n                           ],\n        \"positive_titles\":  [\n                                \"Confirmed - {{driver}} sidelined with {{condition}}; {{reserve_driver}} to race until {{expected_return}}\",\n                                \"{{team}} statement - {{driver}} to miss {{races_affected_count}} race(s) due to {{condition}}; {{reserve_driver}} steps in\",\n                                \"{{driver}} officially ruled out of {{next_race}} after {{condition}}; {{reserve_driver}} to replace him\",\n                                \"It’s official — {{driver}} out with {{condition}}, {{reserve_driver}} takes over for {{team}}\",\n                                \"Timeline set - {{driver}} targeting {{expected_return}} return after {{condition}}; {{reserve_driver}} fills the gap\",\n                                \"‘Health comes first’ - {{team}} confirms absence for {{driver}} due to {{condition}}\",\n                                \"{{reserve_driver}} to make appearance as {{driver}} recovers from {{condition}}\",\n                                \"{{driver}} to skip upcoming events — recovery from {{condition}} ongoing\",\n                                \"Confirmed - {{driver}} to miss {{races_affected_count}} race(s) — {{condition}} behind the decision\",\n                                \"Doctors advise rest - {{driver}} sidelined until {{expected_return}} due to {{condition}}\",\n                                \"{{team}} - ‘We’ll support {{driver}} through recovery’; {{reserve_driver}} takes his place at {{next_race}}\"\n                            ],\n        \"negative_titles\":  [\n                                \"Cleared to race - {{driver}} fit for {{next_race}} despite {{condition}} scare\",\n                                \"Good news for {{team}} — {{driver}} passed medical checks after {{condition}}\",\n                                \"Speculation ends - {{driver}} will race at {{next_race}} despite {{condition}} concerns\",\n                                \"All clear — {{driver}} given the green light following {{condition}} recovery\",\n                                \"{{driver}} confident - ‘I’m ready to race’ after dealing with {{condition}}\",\n                                \"No layoff needed - {{driver}} completes treatment and will start {{next_race}}\",\n                                \"False alarm - {{driver}} available despite earlier {{condition}} reports\",\n                                \"Fitness confirmed - {{driver}} back to full form after {{condition}}; {{reserve_driver}} stands down\",\n                                \"{{driver}} resumes normal training after {{condition}} clearance\",\n                                \"Update - {{driver}} avoids time on the sidelines following {{condition}} check\",\n                                \"‘We’re good to go’ — {{team}} confirms {{driver}} ready after {{condition}} review\",\n                                \"Cleared - {{driver}} set for {{next_race}} — {{condition}} no longer an issue\"\n                            ]\n    },\n    {\n        \"id\":  \"turning_point_engine_regulation\",\n        \"new_type\":  107,\n        \"turning_titles\":  [\n                               \"Late {{type}} engine regulation changes could shake up the grid, insiders say\",\n                               \"Could the FIA's last-minute {{type}} engine rules alter the championship dynamics?\",\n                               \"'It could happen' - whispers of sudden {{type}} engine regulation tweaks\",\n                               \"Speculation grows over potential late {{type}} engine regulation adjustments\",\n                               \"Teams brace for possible last-minute {{type}} engine rule changes\",\n                               \"Rumors of unexpected {{type}} engine regulation shifts circulate in the paddock\",\n                               \"'We're preparing for anything' - teams on possible {{type}} engine rule changes\",\n                               \"Next season engines face uncertainty amid {{type}} regulation change talks\",\n                               \"'It's a possibility' - FIA on potential late {{type}} engine regulation changes\",\n                               \"Insiders hint at sudden {{type}} engine updates for {{change_area}}\"\n                           ],\n        \"positive_titles\":  [\n                                \"FIA implements new {{type}} engine regulations, teams react to the changes\",\n                                \"Confirmed - {{type}} engine regulation changes set to impact next season\",\n                                \"Teams adapt to FIA's new {{type}} engine rules ahead of the upcoming season\",\n                                \"FIA's {{type}} engine regulation overhaul expected to reshape team strategies\",\n                                \"New {{type}} engine regulations announced, teams prepare for the challenges\",\n                                \"FIA's latest {{type}} engine rules spark debate among teams and drivers\",\n                                \"BREAKING - FIA confirms significant {{type}} engine regulation changes\",\n                                \"'We have to adapt quickly' - teams respond to new {{type}} engine regulations\",\n                                \"FIA confirms {{type}} changes focused on {{change_area}}\",\n                                \"Teams prepare for {{type}} {{change_area}} regulation changes\"\n                            ],\n        \"negative_titles\":  [\n                                \"FIA decides against proposed {{type}} engine regulation changes\",\n                                \"No {{type}} changes to engine regulations after FIA review\",\n                                \"Rumors dismissed - {{type}} engine regulations remain unchanged\",\n                                \"FIA confirms no {{type}} alterations to engine rules for the upcoming season\",\n                                \"Relief among teams as FIA maintains current {{type}} engine regulations\",\n                                \"FIA opts not to pursue {{type}} engine regulation changes\",\n                                \"FIA reassures teams with decision to keep {{type}} engine rules intact\",\n                                \"'We found no need for changes' - FIA on maintaining {{type}} engine regulations\",\n                                \"Proposed {{type}} {{change_area}} changes will not go ahead\",\n                                \"FIA shelves {{type}} {{change_area}} regulation changes\"\n                            ]\n    },\n    {\n        \"id\":  \"young_drivers\",\n        \"new_type\":  108,\n        \"turning_titles\":  [\n                               \"The future generation of F1: {{driver1}} and {{driver2}}. Can they make it?\",\n                               \"Rising stars on the radar: {{driver1}} and {{driver2}} turn heads in the junior ranks\",\n                               \"Young guns impress: {{driver1}} and {{driver2}} lead the next wave toward F1\",\n                               \"Paddock buzz grows around {{driver1}} and {{driver2}} as F1's next generation\",\n                               \"Who is next? {{driver1}} and {{driver2}} emerge as standout prospects\"\n                           ],\n        \"positive_titles\":  [\n                                \"F1's future looks bright: {{driver1}} and {{driver2}} earn major praise\",\n                                \"Prospects shine: {{driver1}} and {{driver2}} hailed as the real deal\",\n                                \"Breakout year for {{driver1}} and {{driver2}} fuels F1 hype\",\n                                \"{{driver1}} and {{driver2}} impress teams with standout junior seasons\",\n                                \"Paddock raves about {{driver1}} and {{driver2}} as top prospects\"\n                            ],\n        \"negative_titles\":  [\n                                \"Hype cools on {{driver1}} and {{driver2}} despite junior success\",\n                                \"Not the finished product: doubts linger over {{driver1}} and {{driver2}}\",\n                                \"Paddock splits on {{driver1}} and {{driver2}} as F1 prospects\",\n                                \"{{driver1}} and {{driver2}} face skepticism over F1 readiness\",\n                                \"Promising, but not proven: {{driver1}} and {{driver2}} still have work to do\"\n                            ]\n    },\n    {\n        \"id\": \"aduo_engine\",\n        \"new_type\": 109,\n        \"turning_titles\": [\n            \"Will {{manufacturers}} benefit from the {{number_period}} ADUO window?\",\n            \"ADUO window opens: {{manufacturers}} eye performance boost\",\n            \"Finally {{manufacturers}} can make changes during the {{number_period}} ADUO window\",\n            \"ADUO window arrives: {{manufacturers}} prepare for potential upgrades\",\n            \"ADUO window opens: {{manufacturers}} ready to optimize performance\",\n            \"‘We’ve been waiting for this’ – {{manufacturers}} on the {{number_period}} ADUO window\",\n            \"Sources claim {{manufacturers}} had been preparing for the {{number_period}} ADUO window for months\",\n            \"{{manufacturers}} ready to make the most of the {{number_period}} ADUO window as it opens\",\n            \"ADUO window opens: {{manufacturers}} set to unleash performance improvements\",\n            \"How much will {{manufacturers}} gain from the {{number_period}} ADUO window? Insiders weigh in\",\n            \"‘It’s a great opportunity’ – {{manufacturers}} on the potential impact of the {{number_period}} ADUO window\"\n        ]\n    }\n]\n"
  },
  {
    "path": "src/data/nightly_patch_notes.md",
    "content": "## 18th january\n- Added Show/Hide details in standings view to show positions gaines/lodst and gap to leader\n- Added many team replacement options (Williams -> BMW, Aston -> Racing Poitn, Jaguar, Red Bull -> Ford, Alpine -> Cadilac, Haas -> Toyota)\n- Added \"Season review\" in Records tab and made it the defualt screen to see all data from one season\n- Seasn review items can be clicked and will move the user to that Record/Standings/Comparison view. Team mates head to head can be clicked as well\n- Added Driver of the day and team records (some)\n- Added team pictures in records entries\n\n## 21st january\n- Added \"Session Results\" in Records dropdown\n- You can view session results from every session in the current season, only Races/Sprint races from past 5 seasons\n- Added Edit button in \"Session Results\" to edit race results. Drag rows to change position, and also ability to change race time (\"DNF\" will put DNF to that driver)\n\n## 22nd january\n- Drivers and teams standings are now updated after editing a race result\n- Records are also updated (not last win/podium)\n\n## 23rd january\n- Sprint races results are now editable\n- Label beside¡'s driver names to reflect driver of the day in race results\n- Sprint qualifying sessions will now show all drivers\n- Driver of the day now doesn't have % of votes details\n\n## 19th february\n- Updated calendar UI (drag/delete interactions, hover states, completed icons)\n- Added driver line ups viewer\n- Added support for 11 team lineups and team ordering in line ups\n- Head-to-head headers now use team logos\n- Added new team themes (Ferrari, Red Bull, Aston Martin, Mercedes, McLaren) plus nightly theme\n- Team logos resized for improved performance\n- Stronger contract protection logic (F2/F3 contract bug fixed)\n\n## 28th february\n- Added 2026 Season mod option in \"Mods\" tab\n- Added performance overview in \"Performance\" tab\n- Added expertise editing in \"Performance\" tab\n- Added engine upgrades over performance chart in \"Performance\" tab\n- Added ADUO (Additional Development and Upgrade Opportunities) turning points, toggable from the \"Settings\" modal and the 2026 season mod tab\n- Added engine upgrades annotations and annotations toggle in \"Performance\" tab\n- Changed F2/F3 logos to improve readability\n- Minor UI fixes\n- Fixed bug that would cause F2/F3 teams to have NaN points\n- Fixed an issue that would prevent the user from toggling \"driver line ups\" in the 2025 Season DLC if he reloaded the page and uploaded his save with extra drivers again"
  },
  {
    "path": "src/data/records.json",
    "content": "[\n  {\n    \"id\": -1,\n    \"name\": \"Michael Schumacher\",\n    \"firstRace\": { \"season\": 1991, \"trackName\": \"Belgium\" },\n    \"firstPodium\": { \"season\": 1992, \"trackName\": \"Mexico\" },\n    \"firstWin\": { \"season\": 1992, \"trackName\": \"Belgium\" },\n    \"lastWin\": { \"season\": 2006, \"trackName\": \"China\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 7,\n    \"totalFastestLaps\": 77,\n    \"totalPodiums\": 155,\n    \"totalPointsScored\": 1566,\n    \"totalPoles\": 68,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 306,\n    \"totalWins\": 91,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Alain Prost\",\n    \"firstRace\": { \"season\": 1980, \"trackName\": \"Argentina\" },\n    \"firstPodium\": { \"season\": 1981, \"trackName\": \"United States\" },\n    \"firstWin\": { \"season\": 1981, \"trackName\": \"France\" },\n    \"lastWin\": { \"season\": 1993, \"trackName\": \"Germany\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 4,\n    \"totalFastestLaps\": 41,\n    \"totalPodiums\": 106,\n    \"totalPointsScored\": 768.5,\n    \"totalPoles\": 33,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 202,\n    \"totalWins\": 51,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Ayrton Senna\",\n    \"firstRace\": { \"season\": 1984, \"trackName\": \"Brazil\" },\n    \"firstPodium\": { \"season\": 1984, \"trackName\": \"Monaco\" },\n    \"firstWin\": { \"season\": 1985, \"trackName\": \"Portugal\" },\n    \"lastWin\": { \"season\": 1993, \"trackName\": \"Australia\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 3,\n    \"totalFastestLaps\": 19,\n    \"totalPodiums\": 80,\n    \"totalPointsScored\": 614,\n    \"totalPoles\": 65,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 162,\n    \"totalWins\": 41,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Nigel Mansell\",\n    \"firstRace\": { \"season\": 1980, \"trackName\": \"Austria\" },\n    \"firstPodium\": { \"season\": 1981, \"trackName\": \"Belgium\" },\n    \"firstWin\": { \"season\": 1985, \"trackName\": \"Europe\" },\n    \"lastWin\": { \"season\": 1994, \"trackName\": \"Australia\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 1,\n    \"totalFastestLaps\": 30,\n    \"totalPodiums\": 59,\n    \"totalPointsScored\": 482,\n    \"totalPoles\": 32,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 187,\n    \"totalWins\": 31,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Niki Lauda\",\n    \"firstRace\": { \"season\": 1971, \"trackName\": \"Austria\" },\n    \"firstPodium\": { \"season\": 1973, \"trackName\": \"Monaco\" },\n    \"firstWin\": { \"season\": 1974, \"trackName\": \"Spain\" },\n    \"lastWin\": { \"season\": 1985, \"trackName\": \"Netherlands\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 3,\n    \"totalFastestLaps\": 24,\n    \"totalPodiums\": 54,\n    \"totalPointsScored\": 420.5,\n    \"totalPoles\": 24,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 171,\n    \"totalWins\": 25,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Jim Clark\",\n    \"firstRace\": { \"season\": 1960, \"trackName\": \"Netherlands\" },\n    \"firstPodium\": { \"season\": 1962, \"trackName\": \"Netherlands\" },\n    \"firstWin\": { \"season\": 1962, \"trackName\": \"Belgium\" },\n    \"lastWin\": { \"season\": 1968, \"trackName\": \"South Africa\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 2,\n    \"totalFastestLaps\": 28,\n    \"totalPodiums\": 32,\n    \"totalPointsScored\": 274,\n    \"totalPoles\": 33,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 72,\n    \"totalWins\": 25,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Jackie Stewart\",\n    \"firstRace\": { \"season\": 1965, \"trackName\": \"South Africa\" },\n    \"firstPodium\": { \"season\": 1965, \"trackName\": \"South Africa\" },\n    \"firstWin\": { \"season\": 1965, \"trackName\": \"Italy\" },\n    \"lastWin\": { \"season\": 1973, \"trackName\": \"Germany\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 3,\n    \"totalFastestLaps\": 15,\n    \"totalPodiums\": 43,\n    \"totalPointsScored\": 360,\n    \"totalPoles\": 17,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 99,\n    \"totalWins\": 27,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Nico Rosberg\",\n    \"firstRace\": { \"season\": 2006, \"trackName\": \"Bahrain\" },\n    \"firstPodium\": { \"season\": 2008, \"trackName\": \"Australia\" },\n    \"firstWin\": { \"season\": 2012, \"trackName\": \"China\" },\n    \"lastWin\": { \"season\": 2016, \"trackName\": \"Japan\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 1,\n    \"totalFastestLaps\": 20,\n    \"totalPodiums\": 57,\n    \"totalPointsScored\": 1594.5,\n    \"totalPoles\": 30,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 206,\n    \"totalWins\": 23,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Kimi Räikkönen\",\n    \"firstRace\": { \"season\": 2001, \"trackName\": \"Australia\" },\n    \"firstPodium\": { \"season\": 2002, \"trackName\": \"Australia\" },\n    \"firstWin\": { \"season\": 2003, \"trackName\": \"Malaysia\" },\n    \"lastWin\": { \"season\": 2018, \"trackName\": \"United States\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 1,\n    \"totalFastestLaps\": 46,\n    \"totalPodiums\": 103,\n    \"totalPointsScored\": 1873,\n    \"totalPoles\": 18,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 349,\n    \"totalWins\": 21,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Mika Häkkinen\",\n    \"firstRace\": { \"season\": 1991, \"trackName\": \"United States\" },\n    \"firstPodium\": { \"season\": 1993, \"trackName\": \"San Marino\" },\n    \"firstWin\": { \"season\": 1997, \"trackName\": \"Europe\" },\n    \"lastWin\": { \"season\": 2001, \"trackName\": \"United States\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 2,\n    \"totalFastestLaps\": 25,\n    \"totalPodiums\": 51,\n    \"totalPointsScored\": 420,\n    \"totalPoles\": 26,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 165,\n    \"totalWins\": 20,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Juan Manuel Fangio\",\n    \"firstRace\": { \"season\": 1950, \"trackName\": \"United Kingdom\" },\n    \"firstPodium\": { \"season\": 1950, \"trackName\": \"Monaco\" },\n    \"firstWin\": { \"season\": 1950, \"trackName\": \"Monaco\" },\n    \"lastWin\": { \"season\": 1957, \"trackName\": \"Germany\" },\n    \"record\": \"wins\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 5,\n    \"totalFastestLaps\": 23,\n    \"totalPodiums\": 35,\n    \"totalPointsScored\": 277.64,\n    \"totalPoles\": 29,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 51,\n    \"totalWins\": 24,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Nelson Piquet\",\n    \"firstRace\": { \"season\": 1978, \"trackName\": \"Germany\" },\n    \"firstPodium\": { \"season\": 1979, \"trackName\": \"United States\" },\n    \"firstWin\": { \"season\": 1980, \"trackName\": \"United States\" },\n    \"lastWin\": { \"season\": 1991, \"trackName\": \"Canada\" },\n    \"record\": \"wins\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 3,\n    \"totalFastestLaps\": 23,\n    \"totalPodiums\": 60,\n    \"totalPointsScored\": 485.5,\n    \"totalPoles\": 24,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 204,\n    \"totalWins\": 23,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Damon Hill\",\n    \"firstRace\": { \"season\": 1992, \"trackName\": \"United Kingdom\" },\n    \"firstPodium\": { \"season\": 1993, \"trackName\": \"Spain\" },\n    \"firstWin\": { \"season\": 1993, \"trackName\": \"Hungary\" },\n    \"lastWin\": { \"season\": 1998, \"trackName\": \"Belgium\" },\n    \"record\": \"wins\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 1,\n    \"totalFastestLaps\": 19,\n    \"totalPodiums\": 42,\n    \"totalPointsScored\": 360,\n    \"totalPoles\": 20,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 115,\n    \"totalWins\": 22,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Stirling Moss\",\n    \"firstRace\": { \"season\": 1951, \"trackName\": \"Switzerland\" },\n    \"firstPodium\": { \"season\": 1954, \"trackName\": \"Belgium\" },\n    \"firstWin\": { \"season\": 1955, \"trackName\": \"United Kingdom\" },\n    \"lastWin\": { \"season\": 1961, \"trackName\": \"Germany\" },\n    \"record\": \"wins\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 19,\n    \"totalPodiums\": 24,\n    \"totalPointsScored\": 186,\n    \"totalPoles\": 16,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 67,\n    \"totalWins\": 16,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Graham Hill\",\n    \"firstRace\": { \"season\": 1958, \"trackName\": \"Monaco\" },\n    \"firstPodium\": { \"season\": 1960, \"trackName\": \"Netherlands\" },\n    \"firstWin\": { \"season\": 1962, \"trackName\": \"Netherlands\" },\n    \"lastWin\": { \"season\": 1969, \"trackName\": \"Monaco\" },\n    \"record\": \"wins\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 2,\n    \"totalFastestLaps\": 10,\n    \"totalPodiums\": 36,\n    \"totalPointsScored\": 289,\n    \"totalPoles\": 13,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 176,\n    \"totalWins\": 14,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Emerson Fittipaldi\",\n    \"firstRace\": { \"season\": 1970, \"trackName\": \"United Kingdom\" },\n    \"firstPodium\": { \"season\": 1970, \"trackName\": \"United States\" },\n    \"firstWin\": { \"season\": 1970, \"trackName\": \"United States\" },\n    \"lastWin\": { \"season\": 1975, \"trackName\": \"Great Britain\" },\n    \"record\": \"wins\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 2,\n    \"totalFastestLaps\": 6,\n    \"totalPodiums\": 35,\n    \"totalPointsScored\": 281,\n    \"totalPoles\": 6,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 144,\n    \"totalWins\": 14,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Jack Brabham\",\n    \"firstRace\": { \"season\": 1955, \"trackName\": \"United Kingdom\" },\n    \"firstPodium\": { \"season\": 1958, \"trackName\": \"Monaco\" },\n    \"firstWin\": { \"season\": 1959, \"trackName\": \"Monaco\" },\n    \"lastWin\": { \"season\": 1970, \"trackName\": \"South Africa\" },\n    \"record\": \"wins\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 3,\n    \"totalFastestLaps\": 12,\n    \"totalPodiums\": 31,\n    \"totalPointsScored\": 261,\n    \"totalPoles\": 13,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 128,\n    \"totalWins\": 14,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Alberto Ascari\",\n    \"firstRace\": { \"season\": 1950, \"trackName\": \"Monaco\" },\n    \"firstPodium\": { \"season\": 1950, \"trackName\": \"Italy\" },\n    \"firstWin\": { \"season\": 1951, \"trackName\": \"Germany\" },\n    \"lastWin\": { \"season\": 1953, \"trackName\": \"Switzerland\" },\n    \"record\": \"wins\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 2,\n    \"totalFastestLaps\": 12,\n    \"totalPodiums\": 17,\n    \"totalPointsScored\": 140,\n    \"totalPoles\": 14,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 32,\n    \"totalWins\": 13,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"David Coulthard\",\n    \"firstRace\": { \"season\": 1994, \"trackName\": \"Spain\" },\n    \"firstPodium\": { \"season\": 1994, \"trackName\": \"Italy\" },\n    \"firstWin\": { \"season\": 1995, \"trackName\": \"Portugal\" },\n    \"lastWin\": { \"season\": 2003, \"trackName\": \"Australia\" },\n    \"record\": \"wins\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 18,\n    \"totalPodiums\": 62,\n    \"totalPointsScored\": 535,\n    \"totalPoles\": 12,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 247,\n    \"totalWins\": 13,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Carlos Reutemann\",\n    \"firstRace\": { \"season\": 1972, \"trackName\": \"Argentina\" },\n    \"firstPodium\": { \"season\": 1972, \"trackName\": \"South Africa\" },\n    \"firstWin\": { \"season\": 1974, \"trackName\": \"South Africa\" },\n    \"lastWin\": { \"season\": 1981, \"trackName\": \"Belgium\" },\n    \"record\": \"wins\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 6,\n    \"totalPodiums\": 45,\n    \"totalPointsScored\": 309,\n    \"totalPoles\": 24,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 146,\n    \"totalWins\": 12,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Mario Andretti\",\n    \"firstRace\": { \"season\": 1968, \"trackName\": \"United States\" },\n    \"firstPodium\": { \"season\": 1970, \"trackName\": \"Spain\" },\n    \"firstWin\": { \"season\": 1971, \"trackName\": \"South Africa\" },\n    \"lastWin\": { \"season\": 1978, \"trackName\": \"Netherlands\" },\n    \"record\": \"wins\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 1,\n    \"totalFastestLaps\": 10,\n    \"totalPodiums\": 19,\n    \"totalPointsScored\": 180,\n    \"totalPoles\": 18,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 128,\n    \"totalWins\": 12,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Rubens Barrichello\",\n    \"firstRace\": { \"season\": 1993, \"trackName\": \"South Africa\" },\n    \"firstPodium\": { \"season\": 1994, \"trackName\": \"Pacific\" },\n    \"firstWin\": { \"season\": 2000, \"trackName\": \"Germany\" },\n    \"lastWin\": { \"season\": 2009, \"trackName\": \"Italy\" },\n    \"record\": \"wins\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 17,\n    \"totalPodiums\": 68,\n    \"totalPointsScored\": 658,\n    \"totalPoles\": 14,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 322,\n    \"totalWins\": 11,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Jacques Villeneuve\",\n    \"firstRace\": { \"season\": 1996, \"trackName\": \"Australia\" },\n    \"firstPodium\": { \"season\": 1996, \"trackName\": \"Australia\" },\n    \"firstWin\": { \"season\": 1996, \"trackName\": \"Europe\" },\n    \"lastWin\": { \"season\": 1997, \"trackName\": \"Luxembourg\" },\n    \"record\": \"wins\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 1,\n    \"totalFastestLaps\": 9,\n    \"totalPodiums\": 23,\n    \"totalPointsScored\": 235,\n    \"totalPoles\": 13,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 165,\n    \"totalWins\": 11,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Gerhard Berger\",\n    \"firstRace\": { \"season\": 1984, \"trackName\": \"Austria\" },\n    \"firstPodium\": { \"season\": 1986, \"trackName\": \"Italy\" },\n    \"firstWin\": { \"season\": 1986, \"trackName\": \"Mexico\" },\n    \"lastWin\": { \"season\": 1997, \"trackName\": \"Germany\" },\n    \"record\": \"wins\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 19,\n    \"totalPodiums\": 48,\n    \"totalPointsScored\": 385,\n    \"totalPoles\": 12,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 210,\n    \"totalWins\": 10,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Ronnie Peterson\",\n    \"firstRace\": { \"season\": 1970, \"trackName\": \"Monaco\" },\n    \"firstPodium\": { \"season\": 1971, \"trackName\": \"Italy\" },\n    \"firstWin\": { \"season\": 1973, \"trackName\": \"France\" },\n    \"lastWin\": { \"season\": 1978, \"trackName\": \"Austria\" },\n    \"record\": \"wins\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 9,\n    \"totalPodiums\": 26,\n    \"totalPointsScored\": 206,\n    \"totalPoles\": 14,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 123,\n    \"totalWins\": 10,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Jenson Button\",\n    \"firstRace\": { \"season\": 2000, \"trackName\": \"Australia\" },\n    \"firstPodium\": { \"season\": 2004, \"trackName\": \"Malaysia\" },\n    \"firstWin\": { \"season\": 2006, \"trackName\": \"Hungary\" },\n    \"lastWin\": { \"season\": 2012, \"trackName\": \"Brazil\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 1,\n    \"totalFastestLaps\": 8,\n    \"totalPodiums\": 50,\n    \"totalPointsScored\": 1235,\n    \"totalPoles\": 8,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 306,\n    \"totalWins\": 15,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Alan Jones\",\n    \"firstRace\": { \"season\": 1975, \"trackName\": \"Spain\" },\n    \"firstPodium\": { \"season\": 1977, \"trackName\": \"France\" },\n    \"firstWin\": { \"season\": 1977, \"trackName\": \"Austria\" },\n    \"lastWin\": { \"season\": 1981, \"trackName\": \"United States\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 1,\n    \"totalFastestLaps\": 13,\n    \"totalPodiums\": 24,\n    \"totalPointsScored\": 206,\n    \"totalPoles\": 6,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 116,\n    \"totalWins\": 12,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Mark Webber\",\n    \"firstRace\": { \"season\": 2002, \"trackName\": \"Australia\" },\n    \"firstPodium\": { \"season\": 2005, \"trackName\": \"Monaco\" },\n    \"firstWin\": { \"season\": 2009, \"trackName\": \"Germany\" },\n    \"lastWin\": { \"season\": 2012, \"trackName\": \"United Kingdom\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 19,\n    \"totalPodiums\": 42,\n    \"totalPointsScored\": 1047.5,\n    \"totalPoles\": 13,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 215,\n    \"totalWins\": 9,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Denny Hulme\",\n    \"firstRace\": { \"season\": 1965, \"trackName\": \"Monaco\" },\n    \"firstPodium\": { \"season\": 1965, \"trackName\": \"France\" },\n    \"firstWin\": { \"season\": 1967, \"trackName\": \"Monaco\" },\n    \"lastWin\": { \"season\": 1974, \"trackName\": \"Argentina\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 1,\n    \"totalFastestLaps\": 9,\n    \"totalPodiums\": 33,\n    \"totalPointsScored\": 248,\n    \"totalPoles\": 1,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 112,\n    \"totalWins\": 8,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Jacky Ickx\",\n    \"firstRace\": { \"season\": 1966, \"trackName\": \"Germany\" },\n    \"firstPodium\": { \"season\": 1968, \"trackName\": \"France\" },\n    \"firstWin\": { \"season\": 1968, \"trackName\": \"France\" },\n    \"lastWin\": { \"season\": 1972, \"trackName\": \"Germany\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 14,\n    \"totalPodiums\": 25,\n    \"totalPointsScored\": 181,\n    \"totalPoles\": 13,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 116,\n    \"totalWins\": 8,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"René Arnoux\",\n    \"firstRace\": { \"season\": 1978, \"trackName\": \"South Africa\" },\n    \"firstPodium\": { \"season\": 1979, \"trackName\": \"United Kingdom\" },\n    \"firstWin\": { \"season\": 1980, \"trackName\": \"Brazil\" },\n    \"lastWin\": { \"season\": 1983, \"trackName\": \"Netherlands\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 12,\n    \"totalPodiums\": 22,\n    \"totalPointsScored\": 181,\n    \"totalPoles\": 18,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 149,\n    \"totalWins\": 7,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Juan Pablo Montoya\",\n    \"firstRace\": { \"season\": 2001, \"trackName\": \"Australia\" },\n    \"firstPodium\": { \"season\": 2001, \"trackName\": \"Spain\" },\n    \"firstWin\": { \"season\": 2001, \"trackName\": \"Italy\" },\n    \"lastWin\": { \"season\": 2005, \"trackName\": \"Brazil\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 12,\n    \"totalPodiums\": 30,\n    \"totalPointsScored\": 307,\n    \"totalPoles\": 13,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 94,\n    \"totalWins\": 7,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Gilles Villeneuve\",\n    \"firstRace\": { \"season\": 1977, \"trackName\": \"United Kingdom\" },\n    \"firstPodium\": { \"season\": 1978, \"trackName\": \"United States\" },\n    \"firstWin\": { \"season\": 1978, \"trackName\": \"Canada\" },\n    \"lastWin\": { \"season\": 1981, \"trackName\": \"Spain\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 8,\n    \"totalPodiums\": 13,\n    \"totalPointsScored\": 107,\n    \"totalPoles\": 2,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 67,\n    \"totalWins\": 6,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Jochen Rindt\",\n    \"firstRace\": { \"season\": 1964, \"trackName\": \"Austria\" },\n    \"firstPodium\": { \"season\": 1968, \"trackName\": \"Germany\" },\n    \"firstWin\": { \"season\": 1969, \"trackName\": \"United States\" },\n    \"lastWin\": { \"season\": 1970, \"trackName\": \"Germany\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 1,\n    \"totalFastestLaps\": 3,\n    \"totalPodiums\": 13,\n    \"totalPointsScored\": 109,\n    \"totalPoles\": 10,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 60,\n    \"totalWins\": 6,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Ralf Schumacher\",\n    \"firstRace\": { \"season\": 1997, \"trackName\": \"Australia\" },\n    \"firstPodium\": { \"season\": 1997, \"trackName\": \"Argentina\" },\n    \"firstWin\": { \"season\": 2001, \"trackName\": \"San Marino\" },\n    \"lastWin\": { \"season\": 2003, \"trackName\": \"France\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 8,\n    \"totalPodiums\": 27,\n    \"totalPointsScored\": 329,\n    \"totalPoles\": 6,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 180,\n    \"totalWins\": 6,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"James Hunt\",\n    \"firstRace\": { \"season\": 1973, \"trackName\": \"Monaco\" },\n    \"firstPodium\": { \"season\": 1973, \"trackName\": \"Netherlands\" },\n    \"firstWin\": { \"season\": 1975, \"trackName\": \"Netherlands\" },\n    \"lastWin\": { \"season\": 1977, \"trackName\": \"Japan\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 1,\n    \"totalFastestLaps\": 8,\n    \"totalPodiums\": 23,\n    \"totalPointsScored\": 179,\n    \"totalPoles\": 14,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 92,\n    \"totalWins\": 10,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Jody Scheckter\",\n    \"firstRace\": { \"season\": 1972, \"trackName\": \"United States\" },\n    \"firstPodium\": { \"season\": 1973, \"trackName\": \"France\" },\n    \"firstWin\": { \"season\": 1974, \"trackName\": \"Sweden\" },\n    \"lastWin\": { \"season\": 1979, \"trackName\": \"Italy\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 1,\n    \"totalFastestLaps\": 5,\n    \"totalPodiums\": 33,\n    \"totalPointsScored\": 255,\n    \"totalPoles\": 3,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 112,\n    \"totalWins\": 10,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Felipe Massa\",\n    \"firstRace\": { \"season\": 2002, \"trackName\": \"Australia\" },\n    \"firstPodium\": { \"season\": 2006, \"trackName\": \"Europe\" },\n    \"firstWin\": { \"season\": 2006, \"trackName\": \"Turkey\" },\n    \"lastWin\": { \"season\": 2008, \"trackName\": \"Brazil\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 15,\n    \"totalPodiums\": 41,\n    \"totalPointsScored\": 1167,\n    \"totalPoles\": 16,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 269,\n    \"totalWins\": 11,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"John Surtees\",\n    \"firstRace\": { \"season\": 1960, \"trackName\": \"Monaco\" },\n    \"firstPodium\": { \"season\": 1960, \"trackName\": \"United Kingdom\" },\n    \"firstWin\": { \"season\": 1963, \"trackName\": \"Germany\" },\n    \"lastWin\": { \"season\": 1967, \"trackName\": \"Italy\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 1,\n    \"totalFastestLaps\": 10,\n    \"totalPodiums\": 24,\n    \"totalPointsScored\": 180,\n    \"totalPoles\": 8,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 111,\n    \"totalWins\": 6,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Tony Brooks\",\n    \"firstRace\": { \"season\": 1956, \"trackName\": \"Monaco\" },\n    \"firstPodium\": { \"season\": 1957, \"trackName\": \"Monaco\" },\n    \"firstWin\": { \"season\": 1957, \"trackName\": \"United Kingdom\" },\n    \"lastWin\": { \"season\": 1959, \"trackName\": \"Germany\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 3,\n    \"totalPodiums\": 10,\n    \"totalPointsScored\": 75,\n    \"totalPoles\": 3,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 38,\n    \"totalWins\": 6,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Jacques Laffite\",\n    \"firstRace\": { \"season\": 1974, \"trackName\": \"Germany\" },\n    \"firstPodium\": { \"season\": 1975, \"trackName\": \"Germany\" },\n    \"firstWin\": { \"season\": 1977, \"trackName\": \"Sweden\" },\n    \"lastWin\": { \"season\": 1981, \"trackName\": \"Canada\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 7,\n    \"totalPodiums\": 32,\n    \"totalPointsScored\": 228,\n    \"totalPoles\": 7,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 176,\n    \"totalWins\": 6,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Keke Rosberg\",\n    \"firstRace\": { \"season\": 1978, \"trackName\": \"South Africa\" },\n    \"firstPodium\": { \"season\": 1980, \"trackName\": \"Argentina\" },\n    \"firstWin\": { \"season\": 1982, \"trackName\": \"Switzerland\" },\n    \"lastWin\": { \"season\": 1985, \"trackName\": \"Australia\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 1,\n    \"totalFastestLaps\": 3,\n    \"totalPodiums\": 17,\n    \"totalPointsScored\": 159.5,\n    \"totalPoles\": 5,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 114,\n    \"totalWins\": 5,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Michele Alboreto\",\n    \"firstRace\": { \"season\": 1981, \"trackName\": \"Italy\" },\n    \"firstPodium\": { \"season\": 1982, \"trackName\": \"Italy\" },\n    \"firstWin\": { \"season\": 1982, \"trackName\": \"United States\" },\n    \"lastWin\": { \"season\": 1985, \"trackName\": \"Germany\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 5,\n    \"totalPodiums\": 23,\n    \"totalPointsScored\": 186.5,\n    \"totalPoles\": 2,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 194,\n    \"totalWins\": 5,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Clay Regazzoni\",\n    \"firstRace\": { \"season\": 1970, \"trackName\": \"Netherlands\" },\n    \"firstPodium\": { \"season\": 1970, \"trackName\": \"Netherlands\" },\n    \"firstWin\": { \"season\": 1970, \"trackName\": \"Italy\" },\n    \"lastWin\": { \"season\": 1979, \"trackName\": \"United Kingdom\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 15,\n    \"totalPodiums\": 28,\n    \"totalPointsScored\": 209,\n    \"totalPoles\": 5,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 132,\n    \"totalWins\": 5,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"John Watson\",\n    \"firstRace\": { \"season\": 1973, \"trackName\": \"United Kingdom\" },\n    \"firstPodium\": { \"season\": 1976, \"trackName\": \"France\" },\n    \"firstWin\": { \"season\": 1976, \"trackName\": \"Austria\" },\n    \"lastWin\": { \"season\": 1983, \"trackName\": \"United States\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 5,\n    \"totalPodiums\": 20,\n    \"totalPointsScored\": 169,\n    \"totalPoles\": 2,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 152,\n    \"totalWins\": 5,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Giuseppe Farina\",\n    \"firstRace\": { \"season\": 1950, \"trackName\": \"United Kingdom\" },\n    \"firstPodium\": { \"season\": 1950, \"trackName\": \"United Kingdom\" },\n    \"firstWin\": { \"season\": 1950, \"trackName\": \"United Kingdom\" },\n    \"lastWin\": { \"season\": 1953, \"trackName\": \"Germany\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 1,\n    \"totalFastestLaps\": 5,\n    \"totalPodiums\": 20,\n    \"totalPointsScored\": 115,\n    \"totalPoles\": 5,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 33,\n    \"totalWins\": 5,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Thierry Boutsen\",\n    \"firstRace\": { \"season\": 1983, \"trackName\": \"Belgium\" },\n    \"firstPodium\": { \"season\": 1988, \"trackName\": \"Canada\" },\n    \"firstWin\": { \"season\": 1989, \"trackName\": \"Canada\" },\n    \"lastWin\": { \"season\": 1990, \"trackName\": \"Hungary\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 1,\n    \"totalPodiums\": 15,\n    \"totalPointsScored\": 132,\n    \"totalPoles\": 1,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 163,\n    \"totalWins\": 3,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Patrick Tambay\",\n    \"firstRace\": { \"season\": 1977, \"trackName\": \"France\" },\n    \"firstPodium\": { \"season\": 1982, \"trackName\": \"United Kingdom\" },\n    \"firstWin\": { \"season\": 1982, \"trackName\": \"Germany\" },\n    \"lastWin\": { \"season\": 1983, \"trackName\": \"Italy\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 2,\n    \"totalPodiums\": 11,\n    \"totalPointsScored\": 103,\n    \"totalPoles\": 5,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 114,\n    \"totalWins\": 2,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Peter Revson\",\n    \"firstRace\": { \"season\": 1964, \"trackName\": \"Monaco\" },\n    \"firstPodium\": { \"season\": 1972, \"trackName\": \"Canada\" },\n    \"firstWin\": { \"season\": 1973, \"trackName\": \"United Kingdom\" },\n    \"lastWin\": { \"season\": 1973, \"trackName\": \"Canada\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 0,\n    \"totalPodiums\": 8,\n    \"totalPointsScored\": 61,\n    \"totalPoles\": 1,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 30,\n    \"totalWins\": 2,\n    \"value\": 0\n  },\n  {\n    \"id\": -1,\n    \"name\": \"Jean-Pierre Beltoise\",\n    \"firstRace\": { \"season\": 1966, \"trackName\": \"Germany\" },\n    \"firstPodium\": { \"season\": 1968, \"trackName\": \"Netherlands\" },\n    \"firstWin\": { \"season\": 1972, \"trackName\": \"Monaco\" },\n    \"lastWin\": { \"season\": 1972, \"trackName\": \"Monaco\" },\n    \"record\": \"\",\n    \"retired\": 1,\n    \"teamId\": -1,\n    \"totalChampionshipWins\": 0,\n    \"totalFastestLaps\": 4,\n    \"totalPodiums\": 8,\n    \"totalPointsScored\": 77,\n    \"totalPoles\": 0,\n    \"totalSprintWins\": 0,\n    \"totalStarts\": 86,\n    \"totalWins\": 1,\n    \"value\": 0\n  }\n]"
  },
  {
    "path": "src/data/tables_2026.json",
    "content": "{\n  \"Staff_BasicData\": [\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 31054,\n      \"DOB_ISO\": \"1985-01-07\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Lewis]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Hamilton]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 1\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 111,\n      \"DOB\": 35719,\n      \"DOB_ISO\": \"1997-10-16\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Charles]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Leclerc]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 2\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 171,\n      \"DOB\": 35147,\n      \"DOB_ISO\": \"1996-03-23\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Alexander]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Albon]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 3\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 27489,\n      \"DOB_ISO\": \"1975-04-05\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Enrico]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Cardile]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 4\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 23012,\n      \"DOB_ISO\": \"1963-01-01\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Bruno]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Famin]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 5\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 160,\n      \"DOB\": 29061,\n      \"DOB_ISO\": \"1979-07-25\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Xavier]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_MarcosPadros]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 6\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 26995,\n      \"DOB_ISO\": \"1973-11-27\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Riccardo]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Adami]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 7\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 56,\n      \"DOB\": 32748,\n      \"DOB_ISO\": \"1989-08-28\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Valtteri]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Bottas]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 8\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 60,\n      \"DOB\": 31961,\n      \"DOB_ISO\": \"1987-07-03\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Sebastian]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Vettel]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 9\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 120,\n      \"DOB\": 35703,\n      \"DOB_ISO\": \"1997-09-30\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Max]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Verstappen]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 10\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 160,\n      \"DOB\": 34578,\n      \"DOB_ISO\": \"1994-09-01\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Carlos]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Sainz]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 11\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 36477,\n      \"DOB_ISO\": \"1999-11-13\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Lando]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Norris]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 12\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 9,\n      \"DOB\": 32690,\n      \"DOB_ISO\": \"1989-07-01\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Daniel]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Ricciardo]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 13\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 35325,\n      \"DOB_ISO\": \"1996-09-17\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Esteban]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Ocon]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 14\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 35102,\n      \"DOB_ISO\": \"1996-02-07\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Pierre]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Gasly]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 15\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 108,\n      \"DOB\": 32899,\n      \"DOB_ISO\": \"1990-01-26\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Sergio]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Perez1]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 17\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 30,\n      \"DOB\": 36097,\n      \"DOB_ISO\": \"1998-10-29\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Lance]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Stroll]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 18\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 34317,\n      \"DOB_ISO\": \"1993-12-14\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Antonio]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Giovinazzi]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 20\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 16,\n      \"DOB\": 33689,\n      \"DOB_ISO\": \"1992-03-26\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Stoffel]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Vandoorne]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 22\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 35841,\n      \"DOB_ISO\": \"1998-02-15\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_George]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Russell]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 23\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 30003,\n      \"DOB_ISO\": \"1982-02-21\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Diego]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Tondi]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 26\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 26939,\n      \"DOB_ISO\": \"1973-10-02\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Pierre]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Wache1]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 28\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 28328,\n      \"DOB_ISO\": \"1977-07-22\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Matt]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Harman]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 30\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 27057,\n      \"DOB_ISO\": \"1974-01-28\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Jody]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Egginton]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 33\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 28879,\n      \"DOB_ISO\": \"1979-01-24\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Enrico]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Balbo]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 37\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 27184,\n      \"DOB_ISO\": \"1974-06-04\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Jarrod]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Murphy]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 38\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 157,\n      \"DOB\": 23140,\n      \"DOB_ISO\": \"1963-05-09\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Dirk]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_deBeer]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 39\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 28214,\n      \"DOB_ISO\": \"1977-03-30\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_David]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Wheater]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 40\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 27513,\n      \"DOB_ISO\": \"1975-04-29\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Alessandro]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Cinelli]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 43\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 28592,\n      \"DOB_ISO\": \"1978-04-12\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Ian]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Greig]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 44\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 28571,\n      \"DOB_ISO\": \"1978-03-22\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Tom]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Stallard]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 47\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 30484,\n      \"DOB_ISO\": \"1983-06-17\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_William]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Joseph]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 48\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 32458,\n      \"DOB_ISO\": \"1988-11-11\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Hugh]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Bird]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 49\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 29132,\n      \"DOB_ISO\": \"1979-10-04\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Gianpiero]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Lambiase]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 50\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 27630,\n      \"DOB_ISO\": \"1975-08-24\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Peter]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Bonnington]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 51\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 32724,\n      \"DOB_ISO\": \"1989-08-04\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Josh]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Peckett]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 54\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 29261,\n      \"DOB_ISO\": \"1980-02-10\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_James]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Urwin]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 55\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 29911,\n      \"DOB_ISO\": \"1981-11-21\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Gaetan]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Jego]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 56\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 28093,\n      \"DOB_ISO\": \"1976-11-29\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Gary]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Gannon]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 58\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 31313,\n      \"DOB_ISO\": \"1985-09-23\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Pierre]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Hamelin]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 59\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 31978,\n      \"DOB_ISO\": \"1987-07-20\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Mattia]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Spini]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 60\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 33005,\n      \"DOB_ISO\": \"1990-05-12\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Alex]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Chan]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 61\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 30588,\n      \"DOB_ISO\": \"1983-09-29\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Chris]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Cronin]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 63\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 26371,\n      \"DOB_ISO\": \"1972-03-13\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Ben]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Michell]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 64\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 60,\n      \"DOB\": 36241,\n      \"DOB_ISO\": \"1999-03-22\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Mick]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Schumacher]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 74\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 120,\n      \"DOB\": 34736,\n      \"DOB_ISO\": \"1995-02-06\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Nyck]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_deVries]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 76\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 160,\n      \"DOB\": 29796,\n      \"DOB_ISO\": \"1981-07-29\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Fernando]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Alonso]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 77\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 78,\n      \"DOB\": 34668,\n      \"DOB_ISO\": \"1994-11-30\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Roy]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Nissany]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 78\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 23,\n      \"DOB\": 35241,\n      \"DOB_ISO\": \"1996-06-25\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Pietro]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Fittipaldi]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 80\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 82,\n      \"DOB\": 36657,\n      \"DOB_ISO\": \"2000-05-11\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Yuki]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Tsunoda]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 81\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 135,\n      \"DOB\": 31023,\n      \"DOB_ISO\": \"1984-12-07\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Robert]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Kubica]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 82\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 60,\n      \"DOB\": 32008,\n      \"DOB_ISO\": \"1987-08-19\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Nico]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Hulkenberg1]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 83\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 37853,\n      \"DOB_ISO\": \"2003-08-20\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Theo1]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Pourchaire]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 87\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 167,\n      \"DOB\": 35696,\n      \"DOB_ISO\": \"1997-09-23\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Ralph]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Boschung]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 88\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 73,\n      \"DOB\": 36069,\n      \"DOB_ISO\": \"1998-10-01\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Jehan]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Daruvala]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 91\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 121,\n      \"DOB\": 37298,\n      \"DOB_ISO\": \"2002-02-11\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Liam]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Lawson]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 95\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 120,\n      \"DOB\": 36876,\n      \"DOB_ISO\": \"2000-12-16\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Richard]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Verschoor]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 99\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 9,\n      \"DOB\": 36987,\n      \"DOB_ISO\": \"2001-04-06\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Oscar]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Piastri]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 102\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 35,\n      \"DOB\": 36341,\n      \"DOB_ISO\": \"1999-06-30\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Guanyu]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Zhou]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 105\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 23,\n      \"DOB\": 36669,\n      \"DOB_ISO\": \"2000-05-23\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Felipe]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Drugovich]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 106\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 43,\n      \"DOB\": 37269,\n      \"DOB_ISO\": \"2002-01-13\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Frederik]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Vesti]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 107\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 187,\n      \"DOB\": 36381,\n      \"DOB_ISO\": \"1999-08-09\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_JuanManuel]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Correa]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 109\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 16,\n      \"DOB\": 37446,\n      \"DOB_ISO\": \"2002-07-09\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Amaury]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Cordeel]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 110\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 78,\n      \"DOB\": 37119,\n      \"DOB_ISO\": \"2001-08-16\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Ido]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Cohen]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 114\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 187,\n      \"DOB\": 37411,\n      \"DOB_ISO\": \"2002-06-04\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Kaylen]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Frederick]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 115\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 187,\n      \"DOB\": 36891,\n      \"DOB_ISO\": \"2000-12-31\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Logan]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Sargeant]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 116\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 23,\n      \"DOB\": 37090,\n      \"DOB_ISO\": \"2001-07-18\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Enzo]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Fittipaldi]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 117\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 42,\n      \"DOB\": 38042,\n      \"DOB_ISO\": \"2004-02-25\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Roman]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Stanek1]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 119\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 82,\n      \"DOB\": 37156,\n      \"DOB_ISO\": \"2001-09-22\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Ayumu]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Iwasa]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 120\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 187,\n      \"DOB\": 38474,\n      \"DOB_ISO\": \"2005-05-02\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Jak]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Crawford]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 121\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 108,\n      \"DOB\": 37205,\n      \"DOB_ISO\": \"2001-11-10\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Rafael]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Villagomez1]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 123\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 37058,\n      \"DOB_ISO\": \"2001-06-16\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Victor]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Martins]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 127\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 23,\n      \"DOB\": 37349,\n      \"DOB_ISO\": \"2002-04-03\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Caio]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Collet]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 128\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 126,\n      \"DOB\": 37697,\n      \"DOB_ISO\": \"2003-03-17\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Dennis]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Hauger]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 130\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 111,\n      \"DOB\": 36813,\n      \"DOB_ISO\": \"2000-10-14\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Arthur]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Leclerc]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 132\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 36883,\n      \"DOB_ISO\": \"2000-12-23\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Clement1]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Novalak]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 133\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 9,\n      \"DOB\": 37641,\n      \"DOB_ISO\": \"2003-01-20\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Jack]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Doohan]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 135\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 34484,\n      \"DOB_ISO\": \"1994-05-30\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Jake]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Hughes]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 140\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 38480,\n      \"DOB_ISO\": \"2005-05-08\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Oliver]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Bearman]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 142\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 167,\n      \"DOB\": 36520,\n      \"DOB_ISO\": \"1999-12-26\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Gregoire1]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Saucy]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 143\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 38258,\n      \"DOB_ISO\": \"2004-09-28\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Isack]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Hadjar]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 144\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 33370,\n      \"DOB_ISO\": \"1991-05-12\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Clement1]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Sudre]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 145\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 33389,\n      \"DOB_ISO\": \"1991-05-31\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Amaury]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Lardon]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 146\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 28171,\n      \"DOB_ISO\": \"1977-02-15\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Stuart]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_King]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 148\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 29964,\n      \"DOB_ISO\": \"1982-01-13\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Mathew]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Ogle]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 149\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 32856,\n      \"DOB_ISO\": \"1989-12-14\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Romain]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Goasguen]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 151\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 26163,\n      \"DOB_ISO\": \"1971-08-18\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Paolo]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Angilella]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 152\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 29416,\n      \"DOB_ISO\": \"1980-07-14\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Mattia]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Oselladore]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 153\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 136,\n      \"DOB\": 33804,\n      \"DOB_ISO\": \"1992-07-19\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Pedro]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Matos]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 155\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 30646,\n      \"DOB_ISO\": \"1983-11-26\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Mario]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Garigulo]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 156\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 28872,\n      \"DOB_ISO\": \"1979-01-17\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Geoff]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Spear]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 158\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 160,\n      \"DOB\": 31149,\n      \"DOB_ISO\": \"1985-04-12\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Female_Pau]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Rivera]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 159\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 31326,\n      \"DOB_ISO\": \"1985-10-06\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Alan]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Queille]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 160\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 60,\n      \"DOB\": 32118,\n      \"DOB_ISO\": \"1987-12-07\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Jan]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Sumann]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 161\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 160,\n      \"DOB\": 31369,\n      \"DOB_ISO\": \"1985-11-18\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Pol]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Andreu]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 162\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 160,\n      \"DOB\": 33088,\n      \"DOB_ISO\": \"1990-08-03\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Adrian1]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Rodriguez1]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 163\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 34688,\n      \"DOB_ISO\": \"1994-12-20\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Thomas]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Leroy]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 165\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 33984,\n      \"DOB_ISO\": \"1993-01-15\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Thomas]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Tessore]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 166\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 120,\n      \"DOB\": 30371,\n      \"DOB_ISO\": \"1983-02-24\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Peter]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_vanLeeuwen]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 168\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 32367,\n      \"DOB_ISO\": \"1988-08-12\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Carlo]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Cristofori]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 169\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 23736,\n      \"DOB_ISO\": \"1964-12-25\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Andrea]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_TesiMancini]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 172\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 23398,\n      \"DOB_ISO\": \"1964-01-22\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Umberto]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Visintini]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 173\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 160,\n      \"DOB\": 27722,\n      \"DOB_ISO\": \"1975-11-24\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Jose]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Fontestad]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 174\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 29053,\n      \"DOB_ISO\": \"1979-07-17\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Marc]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Giannone]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 175\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 28629,\n      \"DOB_ISO\": \"1978-05-19\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Alessandro]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Brambilla]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 178\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 33238,\n      \"DOB_ISO\": \"1990-12-31\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Morgan]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Trolle]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 179\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 31370,\n      \"DOB_ISO\": \"1985-11-19\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Joffrey]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Guillemat]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 181\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 30232,\n      \"DOB_ISO\": \"1982-10-08\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Christophe]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Perrin]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 183\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 35138,\n      \"DOB_ISO\": \"1996-03-14\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Finn]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_MacPherson]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 184\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 120,\n      \"DOB\": 31626,\n      \"DOB_ISO\": \"1986-08-02\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Remco]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Advocaat]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 187\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 138,\n      \"DOB\": 32533,\n      \"DOB_ISO\": \"1989-01-25\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Mihai]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Marinescu]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 191\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 167,\n      \"DOB\": 22164,\n      \"DOB_ISO\": \"1960-09-05\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Peter]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Fluckiger1]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 193\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 23155,\n      \"DOB_ISO\": \"1963-05-24\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Matt]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Callaghan]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 195\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 14,\n      \"DOB\": 37901,\n      \"DOB_ISO\": \"2003-10-07\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Zane]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Maloney]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 242\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 187,\n      \"DOB\": 38483,\n      \"DOB_ISO\": \"2005-05-11\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Hunter]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Yeany]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 244\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 160,\n      \"DOB\": 38516,\n      \"DOB_ISO\": \"2005-06-13\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Pepe]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Marti1]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 245\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 38389,\n      \"DOB_ISO\": \"2005-02-06\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Zak]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_OSullivan]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 247\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 7,\n      \"DOB\": 37768,\n      \"DOB_ISO\": \"2003-05-27\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Franco]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Colapinto]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 248\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 73,\n      \"DOB\": 36791,\n      \"DOB_ISO\": \"2000-09-22\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Kush]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Maini]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 252\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 187,\n      \"DOB\": 37092,\n      \"DOB_ISO\": \"2001-07-20\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Brad]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Benavides]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 253\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 43,\n      \"DOB\": 33882,\n      \"DOB_ISO\": \"1992-10-05\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Kevin]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Magnussen]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 255\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 60,\n      \"DOB\": 25206,\n      \"DOB_ISO\": \"1969-01-03\",\n      \"FaceIndex\": 13,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Male_Michael]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Schumacher]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 258\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 160,\n      \"DOB\": 25988,\n      \"DOB_ISO\": \"1971-02-24\",\n      \"FaceIndex\": 9,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Male_Pedro]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_DeLaRosa]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 259\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 23,\n      \"DOB\": 26442,\n      \"DOB_ISO\": \"1972-05-23\",\n      \"FaceIndex\": 15,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Male_Rubens]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Barichello]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 260\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 34965,\n      \"DOB_ISO\": \"1995-09-23\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Jack]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Aitken]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 263\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 167,\n      \"DOB\": 32447,\n      \"DOB_ISO\": \"1988-10-31\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Sebastien1]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Buemi]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 264\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 38030,\n      \"DOB_ISO\": \"2004-02-13\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Jonny]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Edgar]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 272\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 23,\n      \"DOB\": 38274,\n      \"DOB_ISO\": \"2004-10-14\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Gabriel]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Bortoleto]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 279\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 38431,\n      \"DOB_ISO\": \"2005-03-20\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Gabriele]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Mini1]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 280\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 53,\n      \"DOB\": 38079,\n      \"DOB_ISO\": \"2004-04-02\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Paul]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Aron]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 281\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 166,\n      \"DOB\": 38005,\n      \"DOB_ISO\": \"2004-01-19\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Dino]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Beganovic]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 282\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 160,\n      \"DOB\": 38090,\n      \"DOB_ISO\": \"2004-04-13\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Mari]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Boya]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 283\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 9,\n      \"DOB\": 38392,\n      \"DOB_ISO\": \"2005-02-09\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Christian]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Mansell]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 284\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 108,\n      \"DOB\": 36286,\n      \"DOB_ISO\": \"1999-05-06\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Pato]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_OWard]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 285\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 25,\n      \"DOB\": 39072,\n      \"DOB_ISO\": \"2006-12-21\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Nikola]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Tsolov]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 286\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 9,\n      \"DOB\": 37413,\n      \"DOB_ISO\": \"2002-06-06\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Tommy]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Smith]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 287\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 60,\n      \"DOB\": 38274,\n      \"DOB_ISO\": \"2004-10-14\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Oliver]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Goethe]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 288\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 38324,\n      \"DOB_ISO\": \"2004-12-03\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Leonardo]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Fornaroli]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 289\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 31969,\n      \"DOB_ISO\": \"1987-07-11\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Laurent]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Mekies]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 290\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 24097,\n      \"DOB_ISO\": \"1965-12-21\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Jonathan]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Wheatley]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 291\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 23572,\n      \"DOB_ISO\": \"1964-07-14\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Ron]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Meadows]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 292\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 30624,\n      \"DOB_ISO\": \"1983-11-04\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Marco]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Perrone]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 293\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 23980,\n      \"DOB_ISO\": \"1965-08-26\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Alan]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Permane]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 295\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 167,\n      \"DOB\": 24116,\n      \"DOB_ISO\": \"1966-01-09\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Beat]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Zehnder]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 299\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 38470,\n      \"DOB_ISO\": \"2005-04-28\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Oliver]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Gray]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 300\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 36,\n      \"DOB\": 38453,\n      \"DOB_ISO\": \"2005-04-11\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Sebastian1]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Montoya]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 301\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 9,\n      \"DOB\": 38610,\n      \"DOB_ISO\": \"2005-09-15\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Hugh]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Barter]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 302\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 108,\n      \"DOB\": 37819,\n      \"DOB_ISO\": \"2003-07-17\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Alejandro]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Garcia1]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 303\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 38723,\n      \"DOB_ISO\": \"2006-01-06\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Nikita]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Bedrin]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 304\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 38139,\n      \"DOB_ISO\": \"2004-06-01\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Taylor]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Barnard]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 305\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 60,\n      \"DOB\": 36861,\n      \"DOB_ISO\": \"2000-12-01\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Female_Sophia]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Florsch1]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 306\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 23,\n      \"DOB\": 38001,\n      \"DOB_ISO\": \"2004-01-15\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Roberto]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Faria]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 307\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 135,\n      \"DOB\": 37853,\n      \"DOB_ISO\": \"2003-08-20\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Piotr]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Wisnicki1]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 308\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 28906,\n      \"DOB_ISO\": \"1979-02-20\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Matthew]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Gaze]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 309\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 30952,\n      \"DOB_ISO\": \"1984-09-27\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Aurelien1]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Pallier]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 310\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 28619,\n      \"DOB_ISO\": \"1978-05-09\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Raphael1]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Landreau]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 311\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 160,\n      \"DOB\": 31749,\n      \"DOB_ISO\": \"1986-12-03\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Cristian]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_SolsonaTena]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 312\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 120,\n      \"DOB\": 28930,\n      \"DOB_ISO\": \"1979-03-16\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Johan]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_VanderVen]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 313\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 160,\n      \"DOB\": 28774,\n      \"DOB_ISO\": \"1978-10-11\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Enrique]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Colomina]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 314\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 33778,\n      \"DOB_ISO\": \"1992-06-23\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Clive]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Hatton]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 315\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 24483,\n      \"DOB_ISO\": \"1967-01-11\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Jeremy]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Cotterill]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 316\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 30149,\n      \"DOB_ISO\": \"1982-07-17\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Guillaume]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Capietto]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 317\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 31158,\n      \"DOB_ISO\": \"1985-04-21\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Giacomo]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Ricci]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 318\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 29839,\n      \"DOB_ISO\": \"1981-09-10\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Paul]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Devlin]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 319\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 30368,\n      \"DOB_ISO\": \"1983-02-21\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Marcus]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Dudley]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 320\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 24613,\n      \"DOB_ISO\": \"1967-05-21\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Mark]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Slade]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 321\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 37287,\n      \"DOB_ISO\": \"2002-01-31\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Luke]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Browning]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 322\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 24986,\n      \"DOB_ISO\": \"1968-05-28\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Frederic]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Vasseur]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 323\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 25986,\n      \"DOB_ISO\": \"1971-02-22\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Andrea]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Stella]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 324\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 26984,\n      \"DOB_ISO\": \"1973-11-16\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Christian]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Horner]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 325\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 10,\n      \"DOB\": 26310,\n      \"DOB_ISO\": \"1972-01-12\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Toto]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Wolff]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 326\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 138,\n      \"DOB\": 23602,\n      \"DOB_ISO\": \"1964-08-13\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Otmar]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Szafnauer]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 327\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 29026,\n      \"DOB_ISO\": \"1979-06-20\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_James]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Vowles]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 328\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 23839,\n      \"DOB_ISO\": \"1965-04-07\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Guenther]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Steiner]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 329\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 27356,\n      \"DOB_ISO\": \"1974-11-23\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Alessandro]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_AlunniBravi]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 331\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 97,\n      \"DOB\": 26376,\n      \"DOB_ISO\": \"1972-03-18\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Mike]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Krack]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 332\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 25029,\n      \"DOB_ISO\": \"1968-07-10\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_James]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Allison]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 333\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 26312,\n      \"DOB_ISO\": \"1972-01-14\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_James]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Key]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 334\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 27009,\n      \"DOB_ISO\": \"1973-12-11\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Dan]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Fallows]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 335\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 25294,\n      \"DOB_ISO\": \"1969-04-01\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Peter]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Prodromou]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 337\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 26165,\n      \"DOB_ISO\": \"1971-08-20\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Daniele]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Rossi]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 338\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 23116,\n      \"DOB_ISO\": \"1963-04-15\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Bruno]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Corbe]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 341\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 27640,\n      \"DOB_ISO\": \"1975-09-03\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Jean-Francois1]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Levere]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 343\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 33918,\n      \"DOB_ISO\": \"1992-11-10\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Neil]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Hoddinott]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 344\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 160,\n      \"DOB\": 33089,\n      \"DOB_ISO\": \"1990-08-04\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Jose1]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Perez1]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 345\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 31131,\n      \"DOB_ISO\": \"1985-03-25\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Daniel]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Chindamo]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 361\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 35697,\n      \"DOB_ISO\": \"1997-09-24\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Mickael1]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Costa]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 364\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 28289,\n      \"DOB_ISO\": \"1977-06-13\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Neil]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Houldey]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 365\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 31752,\n      \"DOB_ISO\": \"1986-12-06\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Randeep]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Singh]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 366\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 24572,\n      \"DOB_ISO\": \"1967-04-10\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Andy]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Stevenson]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 367\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 25361,\n      \"DOB_ISO\": \"1969-06-07\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Toby]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Brown]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 368\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 29689,\n      \"DOB_ISO\": \"1981-04-13\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Adam]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Kenyon]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 369\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 16,\n      \"DOB\": 26431,\n      \"DOB_ISO\": \"1972-05-12\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Sven]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Smeets]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 370\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 186,\n      \"DOB\": 42691,\n      \"DOB_ISO\": \"2016-11-17\",\n      \"FaceIndex\": 26,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Custom|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Team|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 372\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 39302,\n      \"DOB_ISO\": \"2007-08-08\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Arvid]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Lindblad]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 373\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 38131,\n      \"DOB_ISO\": \"2004-05-24\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Sami]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Meguetounif]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 374\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 126,\n      \"DOB\": 38750,\n      \"DOB_ISO\": \"2006-02-02\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Martinius]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Stenshorne]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 375\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 38954,\n      \"DOB_ISO\": \"2006-08-25\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_AndreaKimi]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Antonelli]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 376\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 82,\n      \"DOB\": 36382,\n      \"DOB_ISO\": \"1999-08-10\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Ritomo]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Miyata]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 377\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 132,\n      \"DOB\": 37921,\n      \"DOB_ISO\": \"2003-10-27\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Joshua]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Durksen]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 378\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 60,\n      \"DOB\": 38307,\n      \"DOB_ISO\": \"2004-11-16\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Tim]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Tramnitz]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 379\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 108,\n      \"DOB\": 38342,\n      \"DOB_ISO\": \"2004-12-21\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Noel]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Leon]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 380\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 120,\n      \"DOB\": 38601,\n      \"DOB_ISO\": \"2005-09-06\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Laurens]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_vanHoepen]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 381\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 10,\n      \"DOB\": 38688,\n      \"DOB_ISO\": \"2005-12-02\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Charlie]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Wurz]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 382\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 108,\n      \"DOB\": 38012,\n      \"DOB_ISO\": \"2004-01-26\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Santiago]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Ramos]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 383\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 38782,\n      \"DOB_ISO\": \"2006-03-06\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Callum]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Voisin]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 384\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 38418,\n      \"DOB_ISO\": \"2005-03-07\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Cian]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Shields]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 385\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 167,\n      \"DOB\": 38334,\n      \"DOB_ISO\": \"2004-12-13\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Joshua]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Dufek]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 386\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 135,\n      \"DOB\": 38746,\n      \"DOB_ISO\": \"2006-01-29\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Kacper]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Sztuka]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 387\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 133,\n      \"DOB\": 37872,\n      \"DOB_ISO\": \"2003-09-08\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Matias1]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Zagazeta]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 388\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 38459,\n      \"DOB_ISO\": \"2005-04-17\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Joseph]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Loake]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 389\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 187,\n      \"DOB\": 37538,\n      \"DOB_ISO\": \"2002-10-09\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Maxwell]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Esterson]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 390\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 23535,\n      \"DOB_ISO\": \"1964-06-07\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Pat]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Fry]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 391\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 27545,\n      \"DOB_ISO\": \"1975-05-31\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Diego]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Ioverno]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 392\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 30102,\n      \"DOB_ISO\": \"1982-05-31\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Andrea]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Benisi]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 393\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 171,\n      \"DOB\": 38670,\n      \"DOB_ISO\": \"2005-11-14\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Tasanapol]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Inthraphuvasak]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 394\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 33052,\n      \"DOB_ISO\": \"1990-06-28\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Andrew]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Vizard]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 395\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 29715,\n      \"DOB_ISO\": \"1981-05-09\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Julian]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Rouse]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 397\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 82,\n      \"DOB\": 34400,\n      \"DOB_ISO\": \"1994-03-07\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Ryo]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Hirakawa]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 398\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 77,\n      \"DOB\": 38667,\n      \"DOB_ISO\": \"2005-11-11\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Alexander]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Dunne]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 399\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 167,\n      \"DOB\": 35620,\n      \"DOB_ISO\": \"1997-07-09\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Female_Lena1]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Buhler]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 400\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 60,\n      \"DOB\": 36052,\n      \"DOB_ISO\": \"1998-09-14\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Female_Carrie]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Schreiner]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 401\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 187,\n      \"DOB\": 38115,\n      \"DOB_ISO\": \"2004-05-08\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Female_Chloe]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Chambers]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 402\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 27266,\n      \"DOB_ISO\": \"1974-08-25\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Andrea]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_DeZordo]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 403\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 28919,\n      \"DOB_ISO\": \"1979-03-05\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Davide]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Paganelli]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 404\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 37701,\n      \"DOB_ISO\": \"2003-03-21\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Female_Abbi]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Pulling]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 405\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 39234,\n      \"DOB_ISO\": \"2007-06-01\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Nicola]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Lacorte]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 406\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 82,\n      \"DOB\": 39397,\n      \"DOB_ISO\": \"2007-11-11\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Kean]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_NakamuraBerta]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 407\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 34852,\n      \"DOB_ISO\": \"1995-06-02\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Female_Jessica]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Hawkins]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 408\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 167,\n      \"DOB\": 38939,\n      \"DOB_ISO\": \"2006-08-10\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Female_Tina]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Hausmann]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 409\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 134,\n      \"DOB\": 38596,\n      \"DOB_ISO\": \"2005-09-01\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Female_Bianca]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Bustamante]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 410\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 187,\n      \"DOB\": 39145,\n      \"DOB_ISO\": \"2007-03-04\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Ugo]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Ugochukwu]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 411\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 82,\n      \"DOB\": 27787,\n      \"DOB_ISO\": \"1976-01-28\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Ayao]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Komatsu]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 412\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 78,\n      \"DOB\": 36419,\n      \"DOB_ISO\": \"1999-09-16\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Robert]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Shwartzman]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 413\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 29124,\n      \"DOB_ISO\": \"1979-09-26\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Guru]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Johl]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 414\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 31252,\n      \"DOB_ISO\": \"1985-07-24\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_John]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Howard]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 415\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 37865,\n      \"DOB_ISO\": \"2003-09-01\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_James]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Hedley]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 416\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 152,\n      \"DOB\": 39423,\n      \"DOB_ISO\": \"2007-12-07\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Kabir]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Anurag]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 417\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 120,\n      \"DOB\": 38139,\n      \"DOB_ISO\": \"2004-06-01\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Female_Maya]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Weug]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 418\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 23,\n      \"DOB\": 39089,\n      \"DOB_ISO\": \"2007-01-07\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Female_Aurelia]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Nobels]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 419\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 35363,\n      \"DOB_ISO\": \"1996-10-25\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Clement1]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Dufau]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 420\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 35033,\n      \"DOB_ISO\": \"1995-11-30\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Mathieu]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Meyronne]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 421\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 160,\n      \"DOB\": 33806,\n      \"DOB_ISO\": \"1992-07-21\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Carles]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Martinez1]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 422\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 33930,\n      \"DOB_ISO\": \"1992-11-22\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Carlo]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Ruffo]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 423\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 33623,\n      \"DOB_ISO\": \"1992-01-20\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Nicola]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Corrias]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 424\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 34938,\n      \"DOB_ISO\": \"1995-08-27\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Arthur]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Rencker]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 425\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 34073,\n      \"DOB_ISO\": \"1993-04-14\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Alexis]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Cigrand]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 426\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 34491,\n      \"DOB_ISO\": \"1994-06-06\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Benjamin]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Constans]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 427\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 34753,\n      \"DOB_ISO\": \"1995-02-23\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Antoine]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Broquin]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 428\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 160,\n      \"DOB\": 33613,\n      \"DOB_ISO\": \"1992-01-10\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Oier]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_BanuelosArteagoitia1]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 429\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 120,\n      \"DOB\": 33709,\n      \"DOB_ISO\": \"1992-04-15\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Leo]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_vanderEijk]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 430\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 57,\n      \"DOB\": 35783,\n      \"DOB_ISO\": \"1997-12-19\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Benjamin]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Renard]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 431\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 160,\n      \"DOB\": 31899,\n      \"DOB_ISO\": \"1987-05-02\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Jaume]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Jimenez]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 432\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 160,\n      \"DOB\": 26035,\n      \"DOB_ISO\": \"1971-04-12\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Eduardo]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Gimenez]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 433\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 60,\n      \"DOB\": 34424,\n      \"DOB_ISO\": \"1994-03-31\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Matthias]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Gruener]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 434\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 35132,\n      \"DOB_ISO\": \"1996-03-08\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Matthew]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Stratton]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 435\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 185,\n      \"DOB\": 36613,\n      \"DOB_ISO\": \"2000-03-28\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Female_Amna]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_AlQubaisi]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 436\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 185,\n      \"DOB\": 37476,\n      \"DOB_ISO\": \"2002-08-08\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Female_Hamda]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_AlQubaisi]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 437\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 120,\n      \"DOB\": 37662,\n      \"DOB_ISO\": \"2003-02-10\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Female_Emely]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_deHeus]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 438\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 56,\n      \"DOB\": 39016,\n      \"DOB_ISO\": \"2006-10-26\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[StaffName_Forename_Male_Tuukka]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[StaffName_Surname_Taponen]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 439\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 120,\n      \"DOB\": 28847,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 11,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Male_Kurt]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Gunther1]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 536\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 30,\n      \"DOB\": 31132,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 6,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Female_Elizabeth]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Daisley]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 537\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 167,\n      \"DOB\": 29858,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 13,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Male_Yves]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Blanchard]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 538\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 60,\n      \"DOB\": 30218,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 14,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Male_Holger]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Horn]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 539\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 56,\n      \"DOB\": 31319,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 0,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Female_Minna]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Skoglund]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 540\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 9,\n      \"DOB\": 30271,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 16,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Male_Joshua]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Hubbard]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 541\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 120,\n      \"DOB\": 29545,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 17,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Male_Wilfried]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Keller]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 542\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 73,\n      \"DOB\": 31674,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 3,\n      \"FaceType\": 3,\n      \"FirstName\": \"[StaffName_Forename_Female_Oporajita]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Ki]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 543\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 157,\n      \"DOB\": 29977,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 19,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Male_Brandon]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Hume]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 544\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 16,\n      \"DOB\": 31621,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 5,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Female_Isabelle]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Arnaud]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 545\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 97,\n      \"DOB\": 31979,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 7,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Female_Gisela]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Vogt]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 546\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 126,\n      \"DOB\": 38128,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 22,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Male_Jonas]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Eklund]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 547\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 187,\n      \"DOB\": 38163,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 23,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Male_Varden]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Robin]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 548\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 14,\n      \"DOB\": 37895,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 24,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Male_Justin]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Beech]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 549\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 120,\n      \"DOB\": 37859,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 25,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Male_Stefan]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Graf]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 550\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 180,\n      \"DOB\": 38658,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 1,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Female_Aadilah]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Masih]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 551\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 57,\n      \"DOB\": 38532,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 4,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Female_Isabelle]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Carpentier]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 554\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 160,\n      \"DOB\": 32859,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 5,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Male_Mario]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Calvo]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 555\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 82,\n      \"DOB\": 32435,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 6,\n      \"FaceType\": 4,\n      \"FirstName\": \"[StaffName_Forename_Male_Toshio]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Kimura]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 556\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 167,\n      \"DOB\": 32508,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 8,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Female_Jeanne]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Dupont]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 557\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 77,\n      \"DOB\": 30987,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 33,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Male_Mick]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Irvine]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 558\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 186,\n      \"DOB\": 34618,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 9,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Female_Gladys]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Waghorn]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 559\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 23,\n      \"DOB\": 33806,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 0,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Female_Micaela]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Almeida]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 560\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 7,\n      \"DOB\": 31081,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 10,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Male_Agustin1]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Sanhueza]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 561\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 167,\n      \"DOB\": 32986,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 11,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Male_Marc]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Lucas]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 562\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 82,\n      \"DOB\": 34192,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 3,\n      \"FaceType\": 4,\n      \"FirstName\": \"[StaffName_Forename_Female_Sachiko]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Ito]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 563\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 186,\n      \"DOB\": 30877,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 14,\n      \"FaceType\": 4,\n      \"FirstName\": \"[StaffName_Forename_Male_Kimi]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Griffiths]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 564\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 57,\n      \"DOB\": 34735,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 5,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Female_Karine]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Mercier]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 565\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 120,\n      \"DOB\": 33512,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 7,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Female_Elisabeth]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Neumann]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 566\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 56,\n      \"DOB\": 30663,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 8,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Female_Ulla]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Salo]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 567\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 57,\n      \"DOB\": 29232,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 9,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Male_William]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Marchand]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 568\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 186,\n      \"DOB\": 38553,\n      \"DOB_ISO\": \"2005-07-20\",\n      \"FaceIndex\": 4,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Ella|]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Lloyd|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 600\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 186,\n      \"DOB\": 37879,\n      \"DOB_ISO\": \"2003-09-15\",\n      \"FaceIndex\": 1,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|John|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Bennett|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 601\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 79,\n      \"DOB\": 38975,\n      \"DOB_ISO\": \"2006-09-15\",\n      \"FaceIndex\": 2,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Brando|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Badoer|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 602\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 79,\n      \"DOB\": 35205,\n      \"DOB_ISO\": \"1996-05-20\",\n      \"FaceIndex\": 0,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Antonio|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Fuoco|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 603\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 23,\n      \"DOB\": 38477,\n      \"DOB_ISO\": \"2005-05-05\",\n      \"FaceIndex\": 1,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Rafael|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Câmara|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 604\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 57,\n      \"DOB\": 37992,\n      \"DOB_ISO\": \"2004-01-06\",\n      \"FaceIndex\": 0,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Doriane|]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Pin|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 605\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 120,\n      \"DOB\": 37894,\n      \"DOB_ISO\": \"2003-09-30\",\n      \"FaceIndex\": 1,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Nina|]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Gademan|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 606\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 187,\n      \"DOB\": 36957,\n      \"DOB_ISO\": \"2001-03-07\",\n      \"FaceIndex\": 2,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Courtney|]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Crone|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 607\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 186,\n      \"DOB\": 35935,\n      \"DOB_ISO\": \"1998-05-20\",\n      \"FaceIndex\": 3,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Jamie|]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Chadwick|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 608\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 187,\n      \"DOB\": 38991,\n      \"DOB_ISO\": \"2006-10-01\",\n      \"FaceIndex\": 4,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Lia|]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Block|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 609\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 43,\n      \"DOB\": 39292,\n      \"DOB_ISO\": \"2007-07-29\",\n      \"FaceIndex\": 2,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Noah|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Strømsted|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 610\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 9,\n      \"DOB\": 38906,\n      \"DOB_ISO\": \"2006-07-08\",\n      \"FaceIndex\": 3,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|James|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Wharton|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 611\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 35,\n      \"DOB\": 38984,\n      \"DOB_ISO\": \"2006-09-24\",\n      \"FaceIndex\": 4,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Gerrard|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Xie|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 612\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 160,\n      \"DOB\": 38888,\n      \"DOB_ISO\": \"2006-06-20\",\n      \"FaceIndex\": 5,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Bruno|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|del Pino|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 613\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 57,\n      \"DOB\": 38970,\n      \"DOB_ISO\": \"2006-09-10\",\n      \"FaceIndex\": 6,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Alessandro|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Giusti|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 614\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 57,\n      \"DOB\": 39255,\n      \"DOB_ISO\": \"2007-06-22\",\n      \"FaceIndex\": 7,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Théophile|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Naël|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 615\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 136,\n      \"DOB\": 38842,\n      \"DOB_ISO\": \"2006-05-05\",\n      \"FaceIndex\": 8,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Ivan|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Domingues|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 616\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 121,\n      \"DOB\": 39213,\n      \"DOB_ISO\": \"2007-05-11\",\n      \"FaceIndex\": 9,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Louis|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Sharp|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 617\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 135,\n      \"DOB\": 38050,\n      \"DOB_ISO\": \"2004-03-04\",\n      \"FaceIndex\": 10,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Roman|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Bilinski|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 618\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 160,\n      \"DOB\": 37998,\n      \"DOB_ISO\": \"2004-01-12\",\n      \"FaceIndex\": 11,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Javier|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Sagrera|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 619\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 79,\n      \"DOB\": 37755,\n      \"DOB_ISO\": \"2003-05-14\",\n      \"FaceIndex\": 12,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Nicola|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Marinangeli|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 620\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 152,\n      \"DOB\": 39021,\n      \"DOB_ISO\": \"2006-10-31\",\n      \"FaceIndex\": 13,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Christian|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Ho|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 621\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 79,\n      \"DOB\": 29221,\n      \"DOB_ISO\": \"1980-01-01\",\n      \"FaceIndex\": 14,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Bryan|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Bozzi|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 622\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 186,\n      \"DOB\": 33055,\n      \"DOB_ISO\": \"1990-07-01\",\n      \"FaceIndex\": 13,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Richard|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Wood|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 623\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 60,\n      \"DOB\": 33420,\n      \"DOB_ISO\": \"1991-07-01\",\n      \"FaceIndex\": 4,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Laura|]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Mueller|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 624\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 186,\n      \"DOB\": 32325,\n      \"DOB_ISO\": \"1988-07-01\",\n      \"FaceIndex\": 12,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Ronan|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|O'Hare|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 625\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 79,\n      \"DOB\": 31594,\n      \"DOB_ISO\": \"1986-07-01\",\n      \"FaceIndex\": 11,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Ernesto|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Desiderio|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 626\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 186,\n      \"DOB\": 24942,\n      \"DOB_ISO\": \"1968-04-14\",\n      \"FaceIndex\": 19,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Rob|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Marshall|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 628\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 57,\n      \"DOB\": 29251,\n      \"DOB_ISO\": \"1980-01-31\",\n      \"FaceIndex\": 4,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|David|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Sanchez|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 630\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 186,\n      \"DOB\": 28518,\n      \"DOB_ISO\": \"1978-01-28\",\n      \"FaceIndex\": 5,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Selin|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Tur|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 633\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 186,\n      \"DOB\": 23025,\n      \"DOB_ISO\": \"1963-01-14\",\n      \"FaceIndex\": 22,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Sean|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Whitehead|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 635\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 186,\n      \"DOB\": 30864,\n      \"DOB_ISO\": \"1984-07-01\",\n      \"FaceIndex\": 24,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Mark|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Robinson|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 636\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 186,\n      \"DOB\": 27942,\n      \"DOB_ISO\": \"1976-07-01\",\n      \"FaceIndex\": 23,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Peter|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Machin|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 637\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 186,\n      \"DOB\": 29037,\n      \"DOB_ISO\": \"1979-07-01\",\n      \"FaceIndex\": 18,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Will|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Courtenay|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 638\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 186,\n      \"DOB\": 29037,\n      \"DOB_ISO\": \"1979-07-01\",\n      \"FaceIndex\": 25,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Richard|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Wolverson|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 639\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 187,\n      \"DOB\": 30498,\n      \"DOB_ISO\": \"1983-07-01\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Mark|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Lowe|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 640\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 160,\n      \"DOB\": 28708,\n      \"DOB_ISO\": \"1978-08-06\",\n      \"FaceIndex\": 17,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Ignacio|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Rueda|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 641\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 57,\n      \"DOB\": 26388,\n      \"DOB_ISO\": \"1972-03-30\",\n      \"FaceIndex\": 3,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Loïc|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Serra|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 642\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 187,\n      \"DOB\": 33420,\n      \"DOB_ISO\": \"1991-07-01\",\n      \"FaceIndex\": 10,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Steven|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Petrik|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 643\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 160,\n      \"DOB\": 33055,\n      \"DOB_ISO\": \"1990-07-01\",\n      \"FaceIndex\": 9,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Jose Manuel|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Lopez|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 644\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 187,\n      \"DOB\": 36615,\n      \"DOB_ISO\": \"2000-03-30\",\n      \"FaceIndex\": 14,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Colton|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Herta|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 645\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 23,\n      \"DOB\": 39148,\n      \"DOB_ISO\": \"2007-03-07\",\n      \"FaceIndex\": 15,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Emerson|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Fittipaldi Jr.|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 646\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 7,\n      \"DOB\": 36866,\n      \"DOB_ISO\": \"2000-12-11\",\n      \"FaceIndex\": 16,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Nicolás|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Varrone|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 647\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 108,\n      \"DOB\": 39783,\n      \"DOB_ISO\": \"2008-12-01\",\n      \"FaceIndex\": 17,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Ernesto|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Rivera|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 648\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 186,\n      \"DOB\": 39669,\n      \"DOB_ISO\": \"2008-08-09\",\n      \"FaceIndex\": 18,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Freddie|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Slater|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 649\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 79,\n      \"DOB\": 39394,\n      \"DOB_ISO\": \"2007-11-07\",\n      \"FaceIndex\": 19,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Matteo|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|De Palo|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 650\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 79,\n      \"DOB\": 39655,\n      \"DOB_ISO\": \"2008-07-26\",\n      \"FaceIndex\": 20,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Mattia|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Colnaghi|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 651\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 82,\n      \"DOB\": 39411,\n      \"DOB_ISO\": \"2007-11-24\",\n      \"FaceIndex\": 21,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Taito|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Kato|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 652\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 135,\n      \"DOB\": 39566,\n      \"DOB_ISO\": \"2008-05-28\",\n      \"FaceIndex\": 22,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Maciej|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Gładysz|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 653\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 82,\n      \"DOB\": 39267,\n      \"DOB_ISO\": \"2007-07-03\",\n      \"FaceIndex\": 23,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Kanato|]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Le|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 654\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 82,\n      \"DOB\": 39003,\n      \"DOB_ISO\": \"2006-10-12\",\n      \"FaceIndex\": 24,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Hiyu|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Yamakoshi|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 655\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 57,\n      \"DOB\": 39555,\n      \"DOB_ISO\": \"2008-05-17\",\n      \"FaceIndex\": 25,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Enzo|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Deligny|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 656\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 23,\n      \"DOB\": 39104,\n      \"DOB_ISO\": \"2007-01-22\",\n      \"FaceIndex\": 26,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Pedro|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Clerot|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 657\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 108,\n      \"DOB\": 38285,\n      \"DOB_ISO\": \"2004-10-30\",\n      \"FaceIndex\": 27,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|José|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Garfias|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 658\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 158,\n      \"DOB\": 38222,\n      \"DOB_ISO\": \"2004-08-28\",\n      \"FaceIndex\": 28,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Michael|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Shin|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 659\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 77,\n      \"DOB\": 39384,\n      \"DOB_ISO\": \"2007-10-28\",\n      \"FaceIndex\": 29,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Fionn|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|McLaughlin|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 660\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 82,\n      \"DOB\": 38749,\n      \"DOB_ISO\": \"2006-01-01\",\n      \"FaceIndex\": 30,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Jin|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Nakamura|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 661\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 161,\n      \"DOB\": 39274,\n      \"DOB_ISO\": \"2007-07-10\",\n      \"FaceIndex\": 31,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Yevan|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|David|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 662\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 23,\n      \"DOB\": 38607,\n      \"DOB_ISO\": \"2005-09-12\",\n      \"FaceIndex\": 32,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Fernando|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Barrichello|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 663\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 171,\n      \"DOB\": 38875,\n      \"DOB_ISO\": \"2006-06-06\",\n      \"FaceIndex\": 33,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Nandhavud|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Bhirombhakdi|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 664\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 60,\n      \"DOB\": 39661,\n      \"DOB_ISO\": \"2008-08-01\",\n      \"FaceIndex\": 3,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Mathilda|]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Paatz|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 665\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 187,\n      \"DOB\": 40181,\n      \"DOB_ISO\": \"2009-01-03\",\n      \"FaceIndex\": 5,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Kaylee|]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Countryman|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 666\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 56,\n      \"DOB\": 36800,\n      \"DOB_ISO\": \"2000-10-06\",\n      \"FaceIndex\": 0,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Kalle|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Rovanperä|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 667\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 186,\n      \"DOB\": 38970,\n      \"DOB_ISO\": \"2006-08-10\",\n      \"FaceIndex\": 6,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Ella|]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Stevens|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 668\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 57,\n      \"DOB\": 40148,\n      \"DOB_ISO\": \"2008-12-01\",\n      \"FaceIndex\": 7,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Jade|]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Jacquet|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 669\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 187,\n      \"DOB\": 39892,\n      \"DOB_ISO\": \"2009-03-20\",\n      \"FaceIndex\": 8,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Payton|]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Westcott|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 670\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 43,\n      \"DOB\": 39794,\n      \"DOB_ISO\": \"2008-12-12\",\n      \"FaceIndex\": 9,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Alba|]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Hurup Larsen|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 671\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 10,\n      \"DOB\": 39109,\n      \"DOB_ISO\": \"2007-01-27\",\n      \"FaceIndex\": 0,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Emma|]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Felbermayr|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 672\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 23,\n      \"DOB\": 38460,\n      \"DOB_ISO\": \"2005-03-19\",\n      \"FaceIndex\": 1,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Rafaela|]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Ferreira|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 673\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 186,\n      \"DOB\": 38981,\n      \"DOB_ISO\": \"2006-08-21\",\n      \"FaceIndex\": 2,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Alisha|]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[STRING_LITERAL:Value=|Palmowski|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 674\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 186,\n      \"DOB\": 21545,\n      \"DOB_ISO\": \"1958-12-26\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Adrian|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Newey|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 675\n    },\n    {\n      \"AgeType\": null,\n      \"CountryID\": 79,\n      \"DOB\": 18365,\n      \"DOB_ISO\": \"1950-04-12\",\n      \"FaceIndex\": null,\n      \"FaceType\": null,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Flavio|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Briatore|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 676\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 186,\n      \"DOB\": 26673,\n      \"DOB_ISO\": \"1973-01-09\",\n      \"FaceIndex\": 5,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Jon|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Tomlinson|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 677\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 186,\n      \"DOB\": 33055,\n      \"DOB_ISO\": \"1990-07-01\",\n      \"FaceIndex\": 16,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Stephen|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Knowles|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 678\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 186,\n      \"DOB\": 28547,\n      \"DOB_ISO\": \"1978-02-26\",\n      \"FaceIndex\": 15,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Marc|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Hynes|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 679\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 57,\n      \"DOB\": 34516,\n      \"DOB_ISO\": \"1994-07-01\",\n      \"FaceIndex\": 8,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Cédric|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Michel-Grosjean|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 680\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 186,\n      \"DOB\": 25284,\n      \"DOB_ISO\": \"1969-03-22\",\n      \"FaceIndex\": 20,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Nick|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Chester|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 681\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 79,\n      \"DOB\": 32690,\n      \"DOB_ISO\": \"1989-07-01\",\n      \"FaceIndex\": 7,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Carlo|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Pasetti|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 682\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 186,\n      \"DOB\": 23070,\n      \"DOB_ISO\": \"1963-02-28\",\n      \"FaceIndex\": 21,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Tim|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Goss|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 683\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 186,\n      \"DOB\": 31959,\n      \"DOB_ISO\": \"1987-07-01\",\n      \"FaceIndex\": 6,\n      \"FaceType\": 0,\n      \"FirstName\": \"[STRING_LITERAL:Value=|Stuart|]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 0,\n      \"LastName\": \"[STRING_LITERAL:Value=|Barlow|]\",\n      \"PhotoDay\": 45340,\n      \"StaffID\": 684\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 160,\n      \"DOB\": 38407,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 10,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Male_Mario]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Ruiz]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 685\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 186,\n      \"DOB\": 39301,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 5,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Female_Felicity]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Rivers]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 686\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 79,\n      \"DOB\": 39080,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 7,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Female_Antonietta]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Tani]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 687\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 9,\n      \"DOB\": 39330,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 7,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Female_Megan]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Thomas]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 688\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 187,\n      \"DOB\": 38830,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 31,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Male_Tyson]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Stott]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 689\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 10,\n      \"DOB\": 32758,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 25,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Male_Ludwig]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Hartmann]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 690\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 7,\n      \"DOB\": 32318,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 17,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Male_Ramon]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Farias]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 691\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 121,\n      \"DOB\": 31634,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 17,\n      \"FaceType\": 1,\n      \"FirstName\": \"[StaffName_Forename_Male_Brandon]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_ODeasunaigh1]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 692\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 60,\n      \"DOB\": 33329,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 28,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Male_Stephan]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Wenzel]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 693\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 186,\n      \"DOB\": 35758,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 5,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Female_Livia]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Feeney]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 694\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 82,\n      \"DOB\": 36609,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 5,\n      \"FaceType\": 4,\n      \"FirstName\": \"[StaffName_Forename_Female_Mieko]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Imai]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 695\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 137,\n      \"DOB\": 32719,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 6,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Female_Rahima]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Baz]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 696\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 30,\n      \"DOB\": 28950,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 32,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Male_Charles]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Biddiscombe]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 697\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 77,\n      \"DOB\": 31596,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 1,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Female_Barbara]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Beltran]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 698\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 187,\n      \"DOB\": 29133,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 34,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Male_Benaim]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Prior]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 699\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 186,\n      \"DOB\": 32972,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 2,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Female_Felicity]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Beltran]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 700\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 23,\n      \"DOB\": 35347,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 2,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Female_Estefania1]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Gomes]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 701\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 167,\n      \"DOB\": 35160,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 1,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Female_Karine]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Bertin]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 702\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 82,\n      \"DOB\": 32955,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 4,\n      \"FaceType\": 4,\n      \"FirstName\": \"[StaffName_Forename_Female_Hiroko]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Sakurai]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 703\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 23,\n      \"DOB\": 32621,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 4,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Female_Florencia1]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Neves]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 704\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 30,\n      \"DOB\": 29178,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 24,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Male_Lando]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Randall]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 705\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 180,\n      \"DOB\": 34751,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 7,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Female_Nawaal]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Asker]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 706\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 23,\n      \"DOB\": 31393,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 8,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Female_Beatriz]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Henriques]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 707\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 7,\n      \"DOB\": 32290,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 8,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Male_Claudio1]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Zuniga]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 708\n    },\n    {\n      \"AgeType\": 1,\n      \"CountryID\": 167,\n      \"DOB\": 33228,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 3,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Female_Madeleine]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Dumas]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 709\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 136,\n      \"DOB\": 35938,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 0,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Female_Florencia1]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Guerreiro]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 710\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 23,\n      \"DOB\": 38942,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 6,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Female_Antonia1]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Lopes]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 711\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 9,\n      \"DOB\": 38521,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 14,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Male_Emmanuel]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Mulford]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 712\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 60,\n      \"DOB\": 38575,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 17,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Male_Friedrich]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Fischer]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 713\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 57,\n      \"DOB\": 38431,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 14,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Male_Rui]\",\n      \"Gender\": 0,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Olivier]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 714\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 167,\n      \"DOB\": 39366,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 8,\n      \"FaceType\": 2,\n      \"FirstName\": \"[StaffName_Forename_Female_Nathalie]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Francois]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 715\n    },\n    {\n      \"AgeType\": 0,\n      \"CountryID\": 60,\n      \"DOB\": 39122,\n      \"DOB_ISO\": \"1970-01-01\",\n      \"FaceIndex\": 5,\n      \"FaceType\": 0,\n      \"FirstName\": \"[StaffName_Forename_Female_Ute]\",\n      \"Gender\": 1,\n      \"IsGeneratedForCustomTeam\": 0,\n      \"IsGeneratedStaff\": 1,\n      \"LastName\": \"[StaffName_Surname_Hubner1]\",\n      \"PhotoDay\": 46023,\n      \"StaffID\": 716\n    }\n  ],\n  \"Staff_Contracts\": [\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 70000000,\n      \"StaffID\": 1,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 1\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 34000000,\n      \"StaffID\": 2,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 1\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 8000000,\n      \"StaffID\": 3,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 6\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 3600000,\n      \"StaffID\": 4,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 10\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 5000000,\n      \"StaffID\": 8,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 32\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 65000000,\n      \"StaffID\": 10,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 3\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 10000000,\n      \"StaffID\": 11,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 6\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 20000000,\n      \"StaffID\": 12,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 2\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 7000000,\n      \"StaffID\": 14,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 7\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 12000000,\n      \"StaffID\": 15,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 5\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 8000000,\n      \"StaffID\": 17,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 32\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 12000000,\n      \"StaffID\": 18,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 10\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1800000,\n      \"StaffID\": 20,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 1\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 4,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1500000,\n      \"StaffID\": 22,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 10\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 15000000,\n      \"StaffID\": 23,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 4\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 4410000,\n      \"StaffID\": 26,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 1\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 4400000,\n      \"StaffID\": 28,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 3\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 4650000,\n      \"StaffID\": 37,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 3\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 3480000,\n      \"StaffID\": 38,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 4\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1650000,\n      \"StaffID\": 40,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 5\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 2860000,\n      \"StaffID\": 43,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 9\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 2810000,\n      \"StaffID\": 44,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 10\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1130000,\n      \"StaffID\": 47,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 2\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1230000,\n      \"StaffID\": 48,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 2\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1560000,\n      \"StaffID\": 50,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 3\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1530000,\n      \"StaffID\": 51,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 4\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 920000,\n      \"StaffID\": 54,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 5\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 830000,\n      \"StaffID\": 55,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 6\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 750000,\n      \"StaffID\": 56,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 6\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 730000,\n      \"StaffID\": 58,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 10\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 850000,\n      \"StaffID\": 59,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 8\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 20000000,\n      \"StaffID\": 77,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 10\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 5,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 900000,\n      \"StaffID\": 80,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 32\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 2000000,\n      \"StaffID\": 81,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 3\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 7000000,\n      \"StaffID\": 83,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 9\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 650000,\n      \"StaffID\": 88,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 9\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1000000,\n      \"StaffID\": 95,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 8\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 6,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 500000,\n      \"StaffID\": 99,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 2\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 13000000,\n      \"StaffID\": 102,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 2\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1600000,\n      \"StaffID\": 105,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 32\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1400000,\n      \"StaffID\": 107,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 4\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 900000,\n      \"StaffID\": 120,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 8\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 850000,\n      \"StaffID\": 121,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 10\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 123,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 20\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 4,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 550000,\n      \"StaffID\": 127,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 6\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 6,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 500000,\n      \"StaffID\": 132,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 1\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 800000,\n      \"StaffID\": 135,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 7\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 5,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 600000,\n      \"StaffID\": 140,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 2\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1000000,\n      \"StaffID\": 142,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 7\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 5000000,\n      \"StaffID\": 144,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 3\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 2000000,\n      \"StaffID\": 248,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 5\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 6,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 350000,\n      \"StaffID\": 252,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 5\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 252,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 15\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 253,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 31\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 4,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1600000,\n      \"StaffID\": 264,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 3\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 2000000,\n      \"StaffID\": 279,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 9\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 5,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 500000,\n      \"StaffID\": 280,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 5\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 280,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 16\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 750000,\n      \"StaffID\": 281,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 5\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 5,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 500000,\n      \"StaffID\": 282,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 1\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 282,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 18\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 5,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 450000,\n      \"StaffID\": 283,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 10\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 283,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 11\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1900000,\n      \"StaffID\": 285,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 2\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 5,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 500000,\n      \"StaffID\": 286,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 3\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 286,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 19\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 288,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 16\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 4,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 600000,\n      \"StaffID\": 289,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 2\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1450000,\n      \"StaffID\": 292,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 4\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 900000,\n      \"StaffID\": 293,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 8\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 301,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 11\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 440000,\n      \"StaffID\": 309,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 13\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 470000,\n      \"StaffID\": 310,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 15\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 490000,\n      \"StaffID\": 311,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 18\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 300000,\n      \"StaffID\": 312,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 17\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 410000,\n      \"StaffID\": 313,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 20\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 500000,\n      \"StaffID\": 314,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 19\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 500000,\n      \"StaffID\": 315,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 14\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 465000,\n      \"StaffID\": 316,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 16\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 450000,\n      \"StaffID\": 317,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 11\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 380000,\n      \"StaffID\": 318,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 21\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 500000,\n      \"StaffID\": 319,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 12\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1360000,\n      \"StaffID\": 320,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 4\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 700000,\n      \"StaffID\": 322,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 6\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 3600000,\n      \"StaffID\": 333,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 4\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 2550000,\n      \"StaffID\": 334,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 9\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 4070000,\n      \"StaffID\": 337,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 2\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 3000000,\n      \"StaffID\": 365,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 2\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1100000,\n      \"StaffID\": 367,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 10\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 2250000,\n      \"StaffID\": 369,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 6\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 950000,\n      \"StaffID\": 370,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 6\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 750000,\n      \"StaffID\": 373,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 8\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 375,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 13\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 2000000,\n      \"StaffID\": 376,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 4\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 5,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 450000,\n      \"StaffID\": 377,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 7\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 377,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 14\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 378,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 12\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 380,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 19\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 381,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 21\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 385,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 17\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 2650000,\n      \"StaffID\": 391,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 6\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1550000,\n      \"StaffID\": 392,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 1\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 394,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 15\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 950000,\n      \"StaffID\": 395,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 10\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1050000,\n      \"StaffID\": 397,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 5\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 4,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 650000,\n      \"StaffID\": 398,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 7\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 4,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 700000,\n      \"StaffID\": 399,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 5\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 399,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 13\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 2300000,\n      \"StaffID\": 403,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 7\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 2350000,\n      \"StaffID\": 404,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 7\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 406,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 30\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 411,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 28\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 2660000,\n      \"StaffID\": 414,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 8\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1000000,\n      \"StaffID\": 415,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 32\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 8,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 300000,\n      \"StaffID\": 439,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 1\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 439,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 27\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 8,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 150000,\n      \"StaffID\": 600,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 2\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 601,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 21\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 602,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 29\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 4,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1000000,\n      \"StaffID\": 603,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 1\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 7,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 500000,\n      \"StaffID\": 604,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 1\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 604,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 12\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 7,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 606,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 5\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 610,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 23\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 611,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 22\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 612,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 30\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 613,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 26\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 5,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 250000,\n      \"StaffID\": 614,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 6\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 614,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 27\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 615,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 28\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 617,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 22\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 618,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 18\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 621,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 29\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1450000,\n      \"StaffID\": 622,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 1\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1100000,\n      \"StaffID\": 623,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 3\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 900000,\n      \"StaffID\": 624,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 7\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 800000,\n      \"StaffID\": 625,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 7\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 850000,\n      \"StaffID\": 626,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 8\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1700000,\n      \"StaffID\": 630,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 5\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1500000,\n      \"StaffID\": 638,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 2\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 800000,\n      \"StaffID\": 640,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 7\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 950000,\n      \"StaffID\": 641,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 9\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 4100000,\n      \"StaffID\": 642,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 1\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 820000,\n      \"StaffID\": 643,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 9\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 800000,\n      \"StaffID\": 644,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 9\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 4,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1700000,\n      \"StaffID\": 645,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 32\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 645,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 14\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 646,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 17\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 647,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 20\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 7,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 250000,\n      \"StaffID\": 648,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 3\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 648,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 28\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 4,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 400000,\n      \"StaffID\": 649,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 9\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 649,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 23\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 7,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 250000,\n      \"StaffID\": 650,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 2\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 650,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 23\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 6,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 250000,\n      \"StaffID\": 651,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 3\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 651,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 27\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 6,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 300000,\n      \"StaffID\": 652,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 10\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 652,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 24\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 653,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 24\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 654,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 24\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 655,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 26\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 656,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 26\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 657,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 29\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 658,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 22\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 659,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 25\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 8,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 250000,\n      \"StaffID\": 660,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 3\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 660,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 25\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 6,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 661,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 7\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 661,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 25\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 662,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 31\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 663,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 31\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 664,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 30\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 7,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 665,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 10\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 8,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 150000,\n      \"StaffID\": 666,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 7\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 7,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 750000,\n      \"StaffID\": 667,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 7\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 9,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 668,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 2\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 6,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 669,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 6\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 9,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 671,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 1\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 5,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 672,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 9\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 4,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 150000,\n      \"StaffID\": 673,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 8\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 9,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 674,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 3\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 2150000,\n      \"StaffID\": 677,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 32\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2028,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1850000,\n      \"StaffID\": 678,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 3\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1200000,\n      \"StaffID\": 679,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 32\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1150000,\n      \"StaffID\": 680,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 1\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 2050000,\n      \"StaffID\": 681,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 32\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 1050000,\n      \"StaffID\": 682,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 32\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 2250000,\n      \"StaffID\": 683,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 8\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 900000,\n      \"StaffID\": 684,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 5\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 4,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 750000,\n      \"StaffID\": 87,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 4\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 5,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 450000,\n      \"StaffID\": 378,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 4\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2026,\n      \"PosInTeam\": 6,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 150000,\n      \"StaffID\": 605,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 4\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2027,\n      \"PosInTeam\": 7,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 670,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 4\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 450000,\n      \"StaffID\": 169,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 11\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 395000,\n      \"StaffID\": 156,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 11\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 500000,\n      \"StaffID\": 159,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 12\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 460000,\n      \"StaffID\": 158,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 12\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 440000,\n      \"StaffID\": 148,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 13\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 385000,\n      \"StaffID\": 435,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 13\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 500000,\n      \"StaffID\": 161,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 14\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 460000,\n      \"StaffID\": 160,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 14\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 470000,\n      \"StaffID\": 179,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 15\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 420000,\n      \"StaffID\": 426,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 15\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 415000,\n      \"StaffID\": 153,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 16\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 470000,\n      \"StaffID\": 152,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 16\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 330000,\n      \"StaffID\": 149,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 17\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 250000,\n      \"StaffID\": 341,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 17\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 495000,\n      \"StaffID\": 151,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 18\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 440000,\n      \"StaffID\": 429,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 18\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 445000,\n      \"StaffID\": 174,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 19\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 495000,\n      \"StaffID\": 422,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 19\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 360000,\n      \"StaffID\": 421,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 20\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 415000,\n      \"StaffID\": 175,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 20\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 395000,\n      \"StaffID\": 146,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 21\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 340000,\n      \"StaffID\": 424,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 21\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 285000,\n      \"StaffID\": 427,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 22\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 285000,\n      \"StaffID\": 343,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 22\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 235000,\n      \"StaffID\": 361,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 22\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 260000,\n      \"StaffID\": 172,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 23\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 275000,\n      \"StaffID\": 173,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 23\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 300000,\n      \"StaffID\": 178,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 23\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 265000,\n      \"StaffID\": 181,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 24\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 230000,\n      \"StaffID\": 431,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 24\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 215000,\n      \"StaffID\": 433,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 24\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 220000,\n      \"StaffID\": 184,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 25\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 364,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 25\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 255000,\n      \"StaffID\": 183,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 25\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 205000,\n      \"StaffID\": 423,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 26\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 180000,\n      \"StaffID\": 187,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 26\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 150000,\n      \"StaffID\": 165,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 26\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 166,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 27\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 245000,\n      \"StaffID\": 428,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 27\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 190000,\n      \"StaffID\": 338,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 27\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 275000,\n      \"StaffID\": 163,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 28\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 235000,\n      \"StaffID\": 162,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 28\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 225000,\n      \"StaffID\": 345,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 28\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 220000,\n      \"StaffID\": 344,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 29\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 200000,\n      \"StaffID\": 195,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 29\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 160000,\n      \"StaffID\": 555,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 29\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 185000,\n      \"StaffID\": 145,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 30\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 135000,\n      \"StaffID\": 420,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 30\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 160000,\n      \"StaffID\": 193,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 30\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 1,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 100000,\n      \"StaffID\": 432,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 31\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 2,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 130000,\n      \"StaffID\": 191,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 31\n    },\n    {\n      \"AffiliateDualRoleClause\": 0,\n      \"BreakoutClause\": 0.5,\n      \"ContractType\": 0,\n      \"EndSeason\": 2030,\n      \"PosInTeam\": 3,\n      \"RaceBonus\": 0,\n      \"RaceBonusTargetPos\": 1,\n      \"Salary\": 160000,\n      \"StaffID\": 425,\n      \"StartDay\": 46022,\n      \"StartingBonus\": 0,\n      \"TeamID\": 31\n    }\n  ],\n  \"Staff_DriverData\": [\n    {\n      \"Aggression\": 59,\n      \"AssignedCarNumber\": 2,\n      \"DriverCode\": \"[DriverCode_Ham]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 2,\n      \"LastKnownDriverNumber\": 44,\n      \"Marketability\": 100,\n      \"MarketabilityProgress\": 20,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 1,\n      \"TargetMarketability\": 100,\n      \"WantsChampionDriverNumber\": 0\n    },\n    {\n      \"Aggression\": 69,\n      \"AssignedCarNumber\": 1,\n      \"DriverCode\": \"[DriverCode_Lec]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": 1,\n      \"HasWonF3\": null,\n      \"Improvability\": 26,\n      \"LastKnownDriverNumber\": 16,\n      \"Marketability\": 92,\n      \"MarketabilityProgress\": 26,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 2,\n      \"TargetMarketability\": 98,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 60,\n      \"AssignedCarNumber\": 2,\n      \"DriverCode\": \"[DriverCode_Alb]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 20,\n      \"LastKnownDriverNumber\": 23,\n      \"Marketability\": 68,\n      \"MarketabilityProgress\": 44,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 3,\n      \"TargetMarketability\": 75,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 52,\n      \"AssignedCarNumber\": 2,\n      \"DriverCode\": \"[DriverCode_Bot]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 5,\n      \"LastKnownDriverNumber\": 77,\n      \"Marketability\": 75,\n      \"MarketabilityProgress\": 20,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 8,\n      \"TargetMarketability\": 75,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 59,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Vet]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 5,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 9,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 86,\n      \"AssignedCarNumber\": 1,\n      \"DriverCode\": \"[DriverCode_Ver]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 22,\n      \"LastKnownDriverNumber\": 3,\n      \"Marketability\": 95,\n      \"MarketabilityProgress\": 20,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 10,\n      \"TargetMarketability\": 95,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 64,\n      \"AssignedCarNumber\": 1,\n      \"DriverCode\": \"[DriverCode_Sai]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 12,\n      \"LastKnownDriverNumber\": 55,\n      \"Marketability\": 85,\n      \"MarketabilityProgress\": 20,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 11,\n      \"TargetMarketability\": 85,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 59,\n      \"AssignedCarNumber\": 1,\n      \"DriverCode\": \"[DriverCode_Nor]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 30,\n      \"LastKnownDriverNumber\": 4,\n      \"Marketability\": 88,\n      \"MarketabilityProgress\": 34,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 12,\n      \"TargetMarketability\": 95,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 59,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Ric]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 84,\n      \"MarketabilityProgress\": 20,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 13,\n      \"TargetMarketability\": 65,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"StaffID\": 14,\n      \"Improvability\": 18,\n      \"Aggression\": 75,\n      \"DriverCode\": \"[DriverCode_Oco]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": 31,\n      \"AssignedCarNumber\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 60,\n      \"TargetMarketability\": 65,\n      \"MarketabilityProgress\": 22,\n      \"FeederSeriesAssignedCarNumber\": null\n    },\n    {\n      \"Aggression\": 66,\n      \"AssignedCarNumber\": 1,\n      \"DriverCode\": \"[DriverCode_Gas]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 18,\n      \"LastKnownDriverNumber\": 10,\n      \"Marketability\": 70,\n      \"MarketabilityProgress\": 24,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 15,\n      \"TargetMarketability\": 75,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 58,\n      \"AssignedCarNumber\": 1,\n      \"DriverCode\": \"[DriverCode_Per]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 6,\n      \"LastKnownDriverNumber\": 11,\n      \"Marketability\": 80,\n      \"MarketabilityProgress\": 20,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 17,\n      \"TargetMarketability\": 80,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 57,\n      \"AssignedCarNumber\": 2,\n      \"DriverCode\": \"[DriverCode_Str]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 22,\n      \"LastKnownDriverNumber\": 18,\n      \"Marketability\": 55,\n      \"MarketabilityProgress\": 20,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 18,\n      \"TargetMarketability\": 60,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 55,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Gio]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 16,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 65,\n      \"MarketabilityProgress\": 44,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 20,\n      \"TargetMarketability\": 65,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 48,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Van]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": 1,\n      \"HasWonF3\": null,\n      \"Improvability\": 12,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 62,\n      \"MarketabilityProgress\": -8,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 22,\n      \"TargetMarketability\": 62,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 68,\n      \"AssignedCarNumber\": 1,\n      \"DriverCode\": \"[DriverCode_Rus]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": 1,\n      \"HasWonF3\": null,\n      \"Improvability\": 28,\n      \"LastKnownDriverNumber\": 63,\n      \"Marketability\": 80,\n      \"MarketabilityProgress\": 34,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 23,\n      \"TargetMarketability\": 90,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 58,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Msc]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": 1,\n      \"HasWonF3\": null,\n      \"Improvability\": 40,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 68,\n      \"MarketabilityProgress\": 52,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 74,\n      \"TargetMarketability\": 70,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 62,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Dev]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": 1,\n      \"HasWonF3\": null,\n      \"Improvability\": 18,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 60,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 76,\n      \"TargetMarketability\": 60,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 71,\n      \"AssignedCarNumber\": 1,\n      \"DriverCode\": \"[DriverCode_Alo]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 1,\n      \"LastKnownDriverNumber\": 14,\n      \"Marketability\": 85,\n      \"MarketabilityProgress\": 20,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 77,\n      \"TargetMarketability\": 85,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 93,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Nis]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 5,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 78,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 65,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Pfi]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 22,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 55,\n      \"MarketabilityProgress\": 68,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 80,\n      \"TargetMarketability\": 60,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 73,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Tsu]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 50,\n      \"LastKnownDriverNumber\": 22,\n      \"Marketability\": 70,\n      \"MarketabilityProgress\": 52,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 81,\n      \"TargetMarketability\": 70,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 43,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Kub]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 5,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 70,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 82,\n      \"TargetMarketability\": 70,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 54,\n      \"AssignedCarNumber\": 1,\n      \"DriverCode\": \"[DriverCode_Hul]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 5,\n      \"LastKnownDriverNumber\": 27,\n      \"Marketability\": 70,\n      \"MarketabilityProgress\": 20,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 83,\n      \"TargetMarketability\": 70,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 54,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Pou]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": 1,\n      \"HasWonF3\": null,\n      \"Improvability\": 70,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 62,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 87,\n      \"TargetMarketability\": 75,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 52,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Bos]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 20,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 45,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 88,\n      \"TargetMarketability\": 45,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 61,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Dar]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 5,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 91,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"StaffID\": 95,\n      \"Improvability\": 70,\n      \"Aggression\": 72,\n      \"DriverCode\": \"[DriverCode_Law]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": 30,\n      \"AssignedCarNumber\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 60,\n      \"TargetMarketability\": 75,\n      \"MarketabilityProgress\": 70,\n      \"FeederSeriesAssignedCarNumber\": null\n    },\n    {\n      \"Aggression\": 66,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Rve]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": 1,\n      \"HasWonF3\": null,\n      \"Improvability\": 55,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 50,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 99,\n      \"TargetMarketability\": 60,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 63,\n      \"AssignedCarNumber\": 2,\n      \"DriverCode\": \"[DriverCode_Pia]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": 1,\n      \"HasWonF3\": 1,\n      \"Improvability\": 60,\n      \"LastKnownDriverNumber\": 81,\n      \"Marketability\": 75,\n      \"MarketabilityProgress\": 60,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 102,\n      \"TargetMarketability\": 85,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 53,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Zho]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 30,\n      \"LastKnownDriverNumber\": 24,\n      \"Marketability\": 65,\n      \"MarketabilityProgress\": 60,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 105,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 56,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Dru]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": 1,\n      \"HasWonF3\": null,\n      \"Improvability\": 50,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 63,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 106,\n      \"TargetMarketability\": 75,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 58,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Ves]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 60,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 60,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 107,\n      \"TargetMarketability\": 60,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 82,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Jco]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 40,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 109,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 82,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Aco]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 37,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 110,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 82,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Coh]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 5,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 114,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 53,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Fre]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 5,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 115,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 85,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Sar]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 45,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 116,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 66,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Efi]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 55,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 55,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 117,\n      \"TargetMarketability\": 65,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 88,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Sta]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 52,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 119,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 61,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Iwa]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 60,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 66,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 120,\n      \"TargetMarketability\": 75,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 64,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Cra]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 82,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 60,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 121,\n      \"TargetMarketability\": 80,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 67,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Vil]\",\n      \"FeederSeriesAssignedCarNumber\": 2,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 55,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 55,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 123,\n      \"TargetMarketability\": 60,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 59,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Vma]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": 1,\n      \"Improvability\": 60,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 62,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 127,\n      \"TargetMarketability\": 78,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 37,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Cco]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 5,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 128,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 62,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Hau]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": 1,\n      \"Improvability\": 70,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 52,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 130,\n      \"TargetMarketability\": 70,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 55,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Ale]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 38,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 55,\n      \"MarketabilityProgress\": -1,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 132,\n      \"TargetMarketability\": 55,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 83,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Nov]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 5,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 133,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 66,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Doo]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 65,\n      \"LastKnownDriverNumber\": 7,\n      \"Marketability\": 58,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 135,\n      \"TargetMarketability\": 65,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 64,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Hug]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 18,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 58,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 140,\n      \"TargetMarketability\": 60,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"StaffID\": 142,\n      \"Improvability\": 90,\n      \"Aggression\": 68,\n      \"DriverCode\": \"[DriverCode_Bea]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": 87,\n      \"AssignedCarNumber\": 2,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 72,\n      \"TargetMarketability\": 95,\n      \"MarketabilityProgress\": 70,\n      \"FeederSeriesAssignedCarNumber\": null\n    },\n    {\n      \"Aggression\": 74,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Sau]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 5,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 143,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"StaffID\": 144,\n      \"Improvability\": 87,\n      \"Aggression\": 72,\n      \"DriverCode\": \"[DriverCode_Had]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": 6,\n      \"AssignedCarNumber\": 2,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 62,\n      \"TargetMarketability\": 85,\n      \"MarketabilityProgress\": 70,\n      \"FeederSeriesAssignedCarNumber\": null\n    },\n    {\n      \"Aggression\": 67,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Mal]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 68,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 55,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 242,\n      \"TargetMarketability\": 70,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 77,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Yea]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 5,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 244,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 70,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Jma]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 82,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 55,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 245,\n      \"TargetMarketability\": 75,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 61,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Osu]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 48,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 247,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 69,\n      \"AssignedCarNumber\": 2,\n      \"DriverCode\": \"[DriverCode_Col]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 78,\n      \"LastKnownDriverNumber\": 43,\n      \"Marketability\": 70,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 248,\n      \"TargetMarketability\": 65,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 68,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Mai]\",\n      \"FeederSeriesAssignedCarNumber\": 1,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 48,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 55,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 252,\n      \"TargetMarketability\": 60,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 72,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Ben]\",\n      \"FeederSeriesAssignedCarNumber\": 1,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 60,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 48,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 253,\n      \"TargetMarketability\": 60,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 90,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Mag]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 14,\n      \"LastKnownDriverNumber\": 20,\n      \"Marketability\": 68,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 255,\n      \"TargetMarketability\": 70,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 50,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Placeholder]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 59,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 258,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 50,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Placeholder]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 5,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 259,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 50,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Placeholder]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 5,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 260,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 62,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Ait]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 16,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 60,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 263,\n      \"TargetMarketability\": 60,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 58,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Bue]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 6,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 65,\n      \"MarketabilityProgress\": 23,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 264,\n      \"TargetMarketability\": 65,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 36,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Edg]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 5,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 272,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"StaffID\": 279,\n      \"Improvability\": 90,\n      \"Aggression\": 62,\n      \"DriverCode\": \"[DriverCode_Bor]\",\n      \"WantsChampionDriverNumber\": null,\n      \"LastKnownDriverNumber\": 5,\n      \"AssignedCarNumber\": 2,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": 1,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 65,\n      \"TargetMarketability\": 90,\n      \"MarketabilityProgress\": 70,\n      \"FeederSeriesAssignedCarNumber\": null\n    },\n    {\n      \"Aggression\": 68,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Min]\",\n      \"FeederSeriesAssignedCarNumber\": 1,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 85,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 65,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 280,\n      \"TargetMarketability\": 85,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 63,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Aro]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 78,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 52,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 281,\n      \"TargetMarketability\": 55,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 54,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Beg]\",\n      \"FeederSeriesAssignedCarNumber\": 1,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 86,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 55,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 282,\n      \"TargetMarketability\": 70,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 66,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Boy]\",\n      \"FeederSeriesAssignedCarNumber\": 2,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": 1,\n      \"Improvability\": 84,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 52,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 283,\n      \"TargetMarketability\": 62,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 69,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Man]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 78,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 52,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 284,\n      \"TargetMarketability\": 70,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 72,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Owa]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 45,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 70,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 285,\n      \"TargetMarketability\": 75,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 72,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Tso]\",\n      \"FeederSeriesAssignedCarNumber\": 2,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 90,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 62,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 286,\n      \"TargetMarketability\": 90,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 87,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Smi]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 41,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 287,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 67,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Goe]\",\n      \"FeederSeriesAssignedCarNumber\": 2,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 80,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 58,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 288,\n      \"TargetMarketability\": 68,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 50,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_For]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 84,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 50,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 289,\n      \"TargetMarketability\": 75,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 73,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Gra]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 5,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 300,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 65,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Mon]\",\n      \"FeederSeriesAssignedCarNumber\": 1,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 84,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 60,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 301,\n      \"TargetMarketability\": 75,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 22,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Hba]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 5,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 302,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 58,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Gar]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 5,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 303,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 70,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Bed]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 81,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 45,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 304,\n      \"TargetMarketability\": 65,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 68,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Bar]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 78,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 60,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 305,\n      \"TargetMarketability\": 75,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 69,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Flo]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 52,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 306,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 76,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Far]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 5,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 307,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 55,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Wis]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 40,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 308,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 62,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Bro]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 70,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 60,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 322,\n      \"TargetMarketability\": 70,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 70,\n      \"AssignedCarNumber\": 2,\n      \"DriverCode\": \"[DriverCode_Lin]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 92,\n      \"LastKnownDriverNumber\": 41,\n      \"Marketability\": 58,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 373,\n      \"TargetMarketability\": 90,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 69,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Meg]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 38,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 374,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 67,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Ste]\",\n      \"FeederSeriesAssignedCarNumber\": 1,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 88,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 50,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 375,\n      \"TargetMarketability\": 70,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"StaffID\": 376,\n      \"Improvability\": 90,\n      \"Aggression\": 64,\n      \"DriverCode\": \"[DriverCode_Ant]\",\n      \"WantsChampionDriverNumber\": null,\n      \"LastKnownDriverNumber\": 12,\n      \"AssignedCarNumber\": 2,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 75,\n      \"TargetMarketability\": 95,\n      \"MarketabilityProgress\": 70,\n      \"FeederSeriesAssignedCarNumber\": null\n    },\n    {\n      \"Aggression\": 56,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Miy]\",\n      \"FeederSeriesAssignedCarNumber\": 1,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 40,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 60,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 377,\n      \"TargetMarketability\": 65,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 69,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Dur]\",\n      \"FeederSeriesAssignedCarNumber\": 2,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 76,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 65,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 378,\n      \"TargetMarketability\": 75,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 68,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Tra]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 85,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 52,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 379,\n      \"TargetMarketability\": 70,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 66,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Leo]\",\n      \"FeederSeriesAssignedCarNumber\": 1,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 82,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 55,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 380,\n      \"TargetMarketability\": 60,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 65,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Vho]\",\n      \"FeederSeriesAssignedCarNumber\": 1,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 82,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 55,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 381,\n      \"TargetMarketability\": 65,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 58,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Wur]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 82,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 48,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 382,\n      \"TargetMarketability\": 70,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 59,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Ram]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 70,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 48,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 383,\n      \"TargetMarketability\": 70,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 66,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Voi]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 80,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 50,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 384,\n      \"TargetMarketability\": 75,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 58,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Shi]\",\n      \"FeederSeriesAssignedCarNumber\": 2,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 74,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 45,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 385,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 70,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Duf]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 41,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 386,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 58,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Szt]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 81,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 45,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 387,\n      \"TargetMarketability\": 60,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 72,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Zag]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 47,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 388,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 71,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Loa]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 80,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 48,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 389,\n      \"TargetMarketability\": 70,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 61,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Est]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 40,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 390,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 67,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Int]\",\n      \"FeederSeriesAssignedCarNumber\": 2,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 82,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 50,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 394,\n      \"TargetMarketability\": 60,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 44,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Hir]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 12,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 55,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 398,\n      \"TargetMarketability\": 55,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"StaffID\": 399,\n      \"Improvability\": 90,\n      \"Aggression\": 84,\n      \"DriverCode\": \"[DriverCode_Dun]\",\n      \"WantsChampionDriverNumber\": null,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 65,\n      \"TargetMarketability\": 85,\n      \"MarketabilityProgress\": -2,\n      \"FeederSeriesAssignedCarNumber\": 2\n    },\n    {\n      \"Aggression\": 45,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Buh]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 50,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 400,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 37,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Sch]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 48,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 401,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 67,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Cha]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 78,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 65,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 402,\n      \"TargetMarketability\": 74,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 59,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Pul]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 70,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 67,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 405,\n      \"TargetMarketability\": 76,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"StaffID\": 406,\n      \"Improvability\": 80,\n      \"Aggression\": 80,\n      \"DriverCode\": \"[DriverCode_Lac]\",\n      \"WantsChampionDriverNumber\": null,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 50,\n      \"TargetMarketability\": 60,\n      \"MarketabilityProgress\": 70,\n      \"FeederSeriesAssignedCarNumber\": 1\n    },\n    {\n      \"Aggression\": 57,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Nak]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 86,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 50,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 407,\n      \"TargetMarketability\": 80,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 61,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Haw]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 57,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 408,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 58,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Has]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 74,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 58,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 409,\n      \"TargetMarketability\": 66,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 68,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Bus]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 74,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 64,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 410,\n      \"TargetMarketability\": 74,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 67,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Ugo]\",\n      \"FeederSeriesAssignedCarNumber\": 2,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 92,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 60,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 411,\n      \"TargetMarketability\": 80,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 75,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Shw]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 1,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 62,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 413,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 56,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Hed]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 41,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 416,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"StaffID\": 417,\n      \"Improvability\": 85,\n      \"Aggression\": 55,\n      \"DriverCode\": \"[DriverCode_Anu]\",\n      \"WantsChampionDriverNumber\": null,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 44,\n      \"TargetMarketability\": 60,\n      \"MarketabilityProgress\": 70,\n      \"FeederSeriesAssignedCarNumber\": null\n    },\n    {\n      \"Aggression\": 66,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Weu]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 80,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 66,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 418,\n      \"TargetMarketability\": 76,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 65,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Nob]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 78,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 59,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 419,\n      \"TargetMarketability\": 69,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 24,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Aal]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 60,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 436,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 74,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Hal]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 58,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 437,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 56,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Deh]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 50,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 438,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 70,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Tap]\",\n      \"FeederSeriesAssignedCarNumber\": 2,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 90,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 62,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 439,\n      \"TargetMarketability\": 90,\n      \"WantsChampionDriverNumber\": null\n    },\n    {\n      \"Aggression\": 81,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Ekl]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 41,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 547,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 63,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Rob]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 46,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 548,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 67,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Bee]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 56,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 549,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 76,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Gra]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 46,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 550,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 54,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Mas]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 53,\n      \"MarketabilityProgress\": -2,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 551,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 29,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Car]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 42,\n      \"MarketabilityProgress\": 70,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 554,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 63,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|LLO|]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 80,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 62,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 600,\n      \"TargetMarketability\": 71,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 58,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|BEN|]\",\n      \"FeederSeriesAssignedCarNumber\": 2,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 72,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 45,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 601,\n      \"TargetMarketability\": 55,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 62,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|BAD|]\",\n      \"FeederSeriesAssignedCarNumber\": 3,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 80,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 55,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 602,\n      \"TargetMarketability\": 75,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 63,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|FUO|]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 1,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 22,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 65,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 603,\n      \"TargetMarketability\": 65,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 62,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|CAM|]\",\n      \"FeederSeriesAssignedCarNumber\": 1,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 95,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 65,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 604,\n      \"TargetMarketability\": 95,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 65,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|PIN|]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 82,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 68,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 605,\n      \"TargetMarketability\": 80,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 60,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|GAD|]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 68,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 60,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 606,\n      \"TargetMarketability\": 69,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 56,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|CRO|]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 55,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 58,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 607,\n      \"TargetMarketability\": 62,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 52,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|CHA|]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 65,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 608,\n      \"TargetMarketability\": 40,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 60,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|BLO|]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 76,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 63,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 609,\n      \"TargetMarketability\": 73,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 65,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|STR|]\",\n      \"FeederSeriesAssignedCarNumber\": 1,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 90,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 60,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 610,\n      \"TargetMarketability\": 80,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"StaffID\": 611,\n      \"Improvability\": 89,\n      \"Aggression\": 69,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|WHA|]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 55,\n      \"TargetMarketability\": 75,\n      \"MarketabilityProgress\": 0,\n      \"FeederSeriesAssignedCarNumber\": 2\n    },\n    {\n      \"StaffID\": 612,\n      \"Improvability\": 82,\n      \"Aggression\": 68,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|XIE|]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 48,\n      \"TargetMarketability\": 60,\n      \"MarketabilityProgress\": 0,\n      \"FeederSeriesAssignedCarNumber\": 3\n    },\n    {\n      \"StaffID\": 613,\n      \"Improvability\": 80,\n      \"Aggression\": 70,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|DEL|]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 50,\n      \"TargetMarketability\": 70,\n      \"MarketabilityProgress\": 0,\n      \"FeederSeriesAssignedCarNumber\": 3\n    },\n    {\n      \"Aggression\": 62,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|GIU|]\",\n      \"FeederSeriesAssignedCarNumber\": 3,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 88,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 60,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 614,\n      \"TargetMarketability\": 85,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 71,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|NAE|]\",\n      \"FeederSeriesAssignedCarNumber\": 1,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 86,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 52,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 615,\n      \"TargetMarketability\": 70,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 64,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|DOM|]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 75,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 45,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 616,\n      \"TargetMarketability\": 65,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 60,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|SHA|]\",\n      \"FeederSeriesAssignedCarNumber\": 1,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 86,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 52,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 617,\n      \"TargetMarketability\": 70,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 63,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|BIL|]\",\n      \"FeederSeriesAssignedCarNumber\": 2,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 82,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 55,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 618,\n      \"TargetMarketability\": 65,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 60,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|SAG|]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 62,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 45,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 619,\n      \"TargetMarketability\": 60,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 56,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|MAR|]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 60,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 44,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 620,\n      \"TargetMarketability\": 55,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"StaffID\": 621,\n      \"Improvability\": 82,\n      \"Aggression\": 58,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|HO|]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 52,\n      \"TargetMarketability\": 70,\n      \"MarketabilityProgress\": 0,\n      \"FeederSeriesAssignedCarNumber\": 2\n    },\n    {\n      \"StaffID\": 645,\n      \"Improvability\": 82,\n      \"Aggression\": 71,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|HER|]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 75,\n      \"TargetMarketability\": 85,\n      \"MarketabilityProgress\": 0,\n      \"FeederSeriesAssignedCarNumber\": 2\n    },\n    {\n      \"StaffID\": 646,\n      \"Improvability\": 84,\n      \"Aggression\": 63,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|FIT|]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 55,\n      \"TargetMarketability\": 70,\n      \"MarketabilityProgress\": 0,\n      \"FeederSeriesAssignedCarNumber\": 1\n    },\n    {\n      \"StaffID\": 647,\n      \"Improvability\": 80,\n      \"Aggression\": 55,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|VAR|]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 55,\n      \"TargetMarketability\": 55,\n      \"MarketabilityProgress\": 0,\n      \"FeederSeriesAssignedCarNumber\": 1\n    },\n    {\n      \"StaffID\": 648,\n      \"Improvability\": 90,\n      \"Aggression\": 57,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|RIV|]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 55,\n      \"TargetMarketability\": 70,\n      \"MarketabilityProgress\": 0,\n      \"FeederSeriesAssignedCarNumber\": 3\n    },\n    {\n      \"StaffID\": 649,\n      \"Improvability\": 102,\n      \"Aggression\": 74,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|SLA|]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 65,\n      \"TargetMarketability\": 95,\n      \"MarketabilityProgress\": 0,\n      \"FeederSeriesAssignedCarNumber\": 2\n    },\n    {\n      \"Aggression\": 55,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|DPA|]\",\n      \"FeederSeriesAssignedCarNumber\": 3,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 93,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 58,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 650,\n      \"TargetMarketability\": 80,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 52,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|CLN|]\",\n      \"FeederSeriesAssignedCarNumber\": 1,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 95,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 60,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 651,\n      \"TargetMarketability\": 85,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"StaffID\": 652,\n      \"Improvability\": 85,\n      \"Aggression\": 62,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|KAT|]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 55,\n      \"TargetMarketability\": 70,\n      \"MarketabilityProgress\": 0,\n      \"FeederSeriesAssignedCarNumber\": 1\n    },\n    {\n      \"Aggression\": 53,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|GLA|]\",\n      \"FeederSeriesAssignedCarNumber\": 2,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 90,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 43,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 653,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 66,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|LEK|]\",\n      \"FeederSeriesAssignedCarNumber\": 3,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 86,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 52,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 654,\n      \"TargetMarketability\": 70,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 67,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|YAM|]\",\n      \"FeederSeriesAssignedCarNumber\": 1,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 82,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 52,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 655,\n      \"TargetMarketability\": 70,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 73,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|DEL|]\",\n      \"FeederSeriesAssignedCarNumber\": 2,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 94,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 55,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 656,\n      \"TargetMarketability\": 80,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"StaffID\": 657,\n      \"Improvability\": 91,\n      \"Aggression\": 63,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|CLE|]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 52,\n      \"TargetMarketability\": 70,\n      \"MarketabilityProgress\": 0,\n      \"FeederSeriesAssignedCarNumber\": 1\n    },\n    {\n      \"Aggression\": 56,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|GAR|]\",\n      \"FeederSeriesAssignedCarNumber\": 3,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 65,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 43,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 658,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 63,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|SHI|]\",\n      \"FeederSeriesAssignedCarNumber\": 1,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 74,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 45,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 659,\n      \"TargetMarketability\": 55,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 64,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|MCL|]\",\n      \"FeederSeriesAssignedCarNumber\": 2,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 84,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 55,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 660,\n      \"TargetMarketability\": 75,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 65,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|NAK|]\",\n      \"FeederSeriesAssignedCarNumber\": 3,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 79,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 55,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 661,\n      \"TargetMarketability\": 70,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"StaffID\": 662,\n      \"Improvability\": 84,\n      \"Aggression\": 70,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|DAV|]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 45,\n      \"TargetMarketability\": 55,\n      \"MarketabilityProgress\": 0,\n      \"FeederSeriesAssignedCarNumber\": 2\n    },\n    {\n      \"Aggression\": 66,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|BAR|]\",\n      \"FeederSeriesAssignedCarNumber\": 3,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 82,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 52,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 663,\n      \"TargetMarketability\": 70,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"StaffID\": 664,\n      \"Improvability\": 81,\n      \"Aggression\": 60,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|BHI|]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 43,\n      \"TargetMarketability\": 50,\n      \"MarketabilityProgress\": 0,\n      \"FeederSeriesAssignedCarNumber\": 2\n    },\n    {\n      \"StaffID\": 665,\n      \"Improvability\": 82,\n      \"Aggression\": 50,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|PAA|]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 57,\n      \"TargetMarketability\": 62,\n      \"MarketabilityProgress\": 0,\n      \"FeederSeriesAssignedCarNumber\": null\n    },\n    {\n      \"StaffID\": 666,\n      \"Improvability\": 80,\n      \"Aggression\": 57,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|COU|]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 55,\n      \"TargetMarketability\": 66,\n      \"MarketabilityProgress\": 0,\n      \"FeederSeriesAssignedCarNumber\": null\n    },\n    {\n      \"StaffID\": 667,\n      \"Improvability\": 84,\n      \"Aggression\": 70,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|ROV|]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 75,\n      \"TargetMarketability\": 80,\n      \"MarketabilityProgress\": 0,\n      \"FeederSeriesAssignedCarNumber\": null\n    },\n    {\n      \"Aggression\": 56,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|STE|]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 78,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 56,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 668,\n      \"TargetMarketability\": 60,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"StaffID\": 669,\n      \"Improvability\": 80,\n      \"Aggression\": 54,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|JAC|]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 56,\n      \"TargetMarketability\": 60,\n      \"MarketabilityProgress\": 0,\n      \"FeederSeriesAssignedCarNumber\": null\n    },\n    {\n      \"StaffID\": 670,\n      \"Improvability\": 90,\n      \"Aggression\": 60,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|WES|]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 55,\n      \"TargetMarketability\": 66,\n      \"MarketabilityProgress\": 0,\n      \"FeederSeriesAssignedCarNumber\": null\n    },\n    {\n      \"StaffID\": 671,\n      \"Improvability\": 90,\n      \"Aggression\": 55,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|LAR|]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 59,\n      \"TargetMarketability\": 71,\n      \"MarketabilityProgress\": 0,\n      \"FeederSeriesAssignedCarNumber\": null\n    },\n    {\n      \"StaffID\": 672,\n      \"Improvability\": 84,\n      \"Aggression\": 64,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|FEL|]\",\n      \"WantsChampionDriverNumber\": 1,\n      \"LastKnownDriverNumber\": null,\n      \"AssignedCarNumber\": null,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"Marketability\": 58,\n      \"TargetMarketability\": 69,\n      \"MarketabilityProgress\": 0,\n      \"FeederSeriesAssignedCarNumber\": null\n    },\n    {\n      \"Aggression\": 67,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|FER|]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 70,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 60,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 673,\n      \"TargetMarketability\": 71,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 67,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[STRING_LITERAL:Value=|PAL|]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 82,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 61,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 674,\n      \"TargetMarketability\": 73,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 24,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Rui]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 55,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 685,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 18,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Riv]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 40,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 686,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 71,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Tan]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 51,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 687,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 41,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Tho]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 55,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 688,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 81,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Sto]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 45,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 689,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 71,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Lop]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 55,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 711,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 43,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Mul]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 58,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 712,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 68,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Fis]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 52,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 713,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 69,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Oli]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 42,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 714,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 24,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Fra]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 51,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 715,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    },\n    {\n      \"Aggression\": 63,\n      \"AssignedCarNumber\": null,\n      \"DriverCode\": \"[DriverCode_Hub]\",\n      \"FeederSeriesAssignedCarNumber\": null,\n      \"HasRacedEnoughToJoinF1\": 0,\n      \"HasSuperLicense\": 0,\n      \"HasWonF2\": null,\n      \"HasWonF3\": null,\n      \"Improvability\": 0,\n      \"LastKnownDriverNumber\": null,\n      \"Marketability\": 58,\n      \"MarketabilityProgress\": 0,\n      \"PerformanceEvaluationDay\": null,\n      \"StaffID\": 716,\n      \"TargetMarketability\": 50,\n      \"WantsChampionDriverNumber\": 1\n    }\n  ],\n  \"Staff_DriverNumbers\": [\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 0\n    },\n    {\n      \"CurrentHolder\": 12,\n      \"Number\": 1\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 2\n    },\n    {\n      \"CurrentHolder\": 10,\n      \"Number\": 3\n    },\n    {\n      \"CurrentHolder\": 12,\n      \"Number\": 4\n    },\n    {\n      \"CurrentHolder\": 279,\n      \"Number\": 5\n    },\n    {\n      \"CurrentHolder\": 144,\n      \"Number\": 6\n    },\n    {\n      \"CurrentHolder\": 135,\n      \"Number\": 7\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 8\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 9\n    },\n    {\n      \"CurrentHolder\": 15,\n      \"Number\": 10\n    },\n    {\n      \"CurrentHolder\": 17,\n      \"Number\": 11\n    },\n    {\n      \"CurrentHolder\": 376,\n      \"Number\": 12\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 13\n    },\n    {\n      \"CurrentHolder\": 77,\n      \"Number\": 14\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 15\n    },\n    {\n      \"CurrentHolder\": 2,\n      \"Number\": 16\n    },\n    {\n      \"CurrentHolder\": 18,\n      \"Number\": 18\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 19\n    },\n    {\n      \"CurrentHolder\": 255,\n      \"Number\": 20\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 21\n    },\n    {\n      \"CurrentHolder\": 81,\n      \"Number\": 22\n    },\n    {\n      \"CurrentHolder\": 3,\n      \"Number\": 23\n    },\n    {\n      \"CurrentHolder\": 105,\n      \"Number\": 24\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 25\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 26\n    },\n    {\n      \"CurrentHolder\": 83,\n      \"Number\": 27\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 28\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 29\n    },\n    {\n      \"CurrentHolder\": 95,\n      \"Number\": 30\n    },\n    {\n      \"CurrentHolder\": 14,\n      \"Number\": 31\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 32\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 33\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 34\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 35\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 36\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 37\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 38\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 39\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 40\n    },\n    {\n      \"CurrentHolder\": 373,\n      \"Number\": 41\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 42\n    },\n    {\n      \"CurrentHolder\": 248,\n      \"Number\": 43\n    },\n    {\n      \"CurrentHolder\": 1,\n      \"Number\": 44\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 45\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 46\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 47\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 48\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 49\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 50\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 51\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 52\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 53\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 54\n    },\n    {\n      \"CurrentHolder\": 11,\n      \"Number\": 55\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 56\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 57\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 58\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 59\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 60\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 61\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 62\n    },\n    {\n      \"CurrentHolder\": 23,\n      \"Number\": 63\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 64\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 65\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 66\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 67\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 68\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 69\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 70\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 71\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 72\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 73\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 74\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 75\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 76\n    },\n    {\n      \"CurrentHolder\": 8,\n      \"Number\": 77\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 78\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 79\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 80\n    },\n    {\n      \"CurrentHolder\": 102,\n      \"Number\": 81\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 82\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 83\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 84\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 85\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 86\n    },\n    {\n      \"CurrentHolder\": 142,\n      \"Number\": 87\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 88\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 89\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 90\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 91\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 92\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 93\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 94\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 95\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 96\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 97\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 98\n    },\n    {\n      \"CurrentHolder\": null,\n      \"Number\": 99\n    }\n  ],\n  \"Staff_GameData\": [\n    {\n      \"AchievementScore\": 1180,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 2089,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 42,\n      \"StaffID\": 1,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 100,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 135,\n      \"ExpectedRankForTeam\": 2,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 2,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 13,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -1,\n      \"ExpectedRankForTeam\": 6,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 3,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 332,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 539,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 67,\n      \"StaffID\": 4,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 178,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 171,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 57,\n      \"StaffID\": 6,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 246,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 112,\n      \"ExpectedRankForTeam\": 2,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 7,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 194,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 222,\n      \"ExpectedRankForTeam\": 8,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 8,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 9,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 550,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 978,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 10,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 42,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -40,\n      \"ExpectedRankForTeam\": 2,\n      \"ExpectedTimeScore\": 1,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 11,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 29,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 14,\n      \"ExpectedRankForTeam\": 4,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 12,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 112,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 24,\n      \"ExpectedRankForTeam\": 6,\n      \"ExpectedTimeScore\": 1,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 39,\n      \"StaffID\": 13,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 12,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -53,\n      \"ExpectedRankForTeam\": 6,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 14,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 36,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -2,\n      \"ExpectedRankForTeam\": 6,\n      \"ExpectedTimeScore\": 1,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 15,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 92,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -15,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 3,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 17,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 6,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -78,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 18,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 3,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -34,\n      \"ExpectedRankForTeam\": 2,\n      \"ExpectedTimeScore\": 20,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 20,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 3,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -13,\n      \"ExpectedRankForTeam\": 4,\n      \"ExpectedTimeScore\": 10,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 22,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 50,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 55,\n      \"ExpectedRankForTeam\": 2,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 23,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 160,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 257,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 26,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 624,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 1165,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 28,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 4,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -8,\n      \"ExpectedRankForTeam\": 10,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 66,\n      \"StaffID\": 30,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 16,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -114,\n      \"ExpectedRankForTeam\": 6,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 67,\n      \"StaffID\": 33,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 472,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 929,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 63,\n      \"StaffID\": 37,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 1330,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 2473,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 38,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 190,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 96,\n      \"ExpectedRankForTeam\": 6,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 69,\n      \"StaffID\": 39,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 68,\n      \"StaffID\": 40,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -63,\n      \"ExpectedRankForTeam\": 10,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 64,\n      \"StaffID\": 43,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 18,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 4,\n      \"ExpectedRankForTeam\": 4,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 68,\n      \"StaffID\": 44,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 18,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -134,\n      \"ExpectedRankForTeam\": 4,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 56,\n      \"StaffID\": 47,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 414,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 530,\n      \"ExpectedRankForTeam\": 2,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 56,\n      \"StaffID\": 48,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 128,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 226,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 55,\n      \"StaffID\": 49,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 576,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 823,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 56,\n      \"StaffID\": 50,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 1060,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 1895,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 51,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 10,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -15,\n      \"ExpectedRankForTeam\": 6,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 57,\n      \"StaffID\": 54,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 4,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -111,\n      \"ExpectedRankForTeam\": 8,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 55,\n      \"StaffID\": 55,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -80,\n      \"ExpectedRankForTeam\": 8,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 63,\n      \"StaffID\": 56,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 27,\n      \"ExpectedRankForTeam\": 8,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 58,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 82,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -86,\n      \"ExpectedRankForTeam\": 6,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 55,\n      \"StaffID\": 59,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 28,\n      \"ExpectedRankForTeam\": 6,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 55,\n      \"StaffID\": 60,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -17,\n      \"ExpectedRankForTeam\": 9,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 58,\n      \"StaffID\": 61,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 28,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 7,\n      \"ExpectedRankForTeam\": 4,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 60,\n      \"StaffID\": 63,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 34,\n      \"ExpectedRankForTeam\": 3,\n      \"ExpectedTimeScore\": 60,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 55,\n      \"StaffID\": 64,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 16,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 16,\n      \"ExpectedRankForTeam\": 2,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 74,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 76,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 452,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 589,\n      \"ExpectedRankForTeam\": 2,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 45,\n      \"StaffID\": 77,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 44,\n      \"StaffID\": 78,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 3,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 20,\n      \"ExpectedRankForTeam\": 8,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 80,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -9,\n      \"ExpectedRankForTeam\": 6,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 81,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 3,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 41,\n      \"StaffID\": 82,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -148,\n      \"ExpectedRankForTeam\": 8,\n      \"ExpectedTimeScore\": 70,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 83,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 25,\n      \"BestF1PosInTeamSinceGameStart\": 3,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 79,\n      \"ExpectedRankForTeam\": 9,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 87,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 41,\n      \"StaffID\": 88,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 91,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 31,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 95,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 23,\n      \"ExpectedRankForTeam\": 11,\n      \"ExpectedTimeScore\": 70,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 99,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 26,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 64,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 102,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 8,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 105,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 25,\n      \"BestF1PosInTeamSinceGameStart\": 3,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 76,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 106,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 27,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 107,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 18,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 80,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 109,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 15,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 80,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 35,\n      \"StaffID\": 110,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 39,\n      \"StaffID\": 114,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 37,\n      \"StaffID\": 115,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 28,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 116,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 23,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 60,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 117,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 22,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 119,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 27,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 120,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 22,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 20,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 121,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 18,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 70,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 123,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 24,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 60,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 127,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 128,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 3,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 31,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 130,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 132,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 39,\n      \"StaffID\": 133,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 3,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 25,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 135,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 43,\n      \"StaffID\": 140,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 27,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 142,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 143,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 25,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 40,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 144,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 63,\n      \"StaffID\": 145,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 24,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 59,\n      \"StaffID\": 146,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 26,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 10,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 56,\n      \"StaffID\": 148,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 26,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 149,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 18,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 57,\n      \"StaffID\": 151,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 27,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 57,\n      \"StaffID\": 152,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 22,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 59,\n      \"StaffID\": 153,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 25,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 60,\n      \"StaffID\": 155,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 57,\n      \"StaffID\": 156,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 23,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 58,\n      \"StaffID\": 158,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 28,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 60,\n      \"StaffID\": 159,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 23,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 59,\n      \"StaffID\": 160,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 22,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 64,\n      \"StaffID\": 161,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 56,\n      \"StaffID\": 162,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 163,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 4,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 57,\n      \"StaffID\": 165,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 3,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 64,\n      \"StaffID\": 166,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 10,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 56,\n      \"StaffID\": 168,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 25,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 61,\n      \"StaffID\": 169,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 17,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 90,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 60,\n      \"StaffID\": 172,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 19,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 173,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 23,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 58,\n      \"StaffID\": 174,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 2,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 175,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 12,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 57,\n      \"StaffID\": 178,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 14,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 179,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 5,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 61,\n      \"StaffID\": 181,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 7,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 56,\n      \"StaffID\": 183,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 1,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 59,\n      \"StaffID\": 184,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 57,\n      \"StaffID\": 187,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 64,\n      \"StaffID\": 191,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 8,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 80,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 193,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 6,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 195,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 25,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 242,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 36,\n      \"StaffID\": 244,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 22,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 245,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 20,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 247,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 26,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 248,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 22,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 70,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 252,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 253,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 2,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -106,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 49,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 255,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 258,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 259,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 260,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 3,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 263,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 3,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 264,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 36,\n      \"StaffID\": 272,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 26,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 279,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 17,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 280,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 23,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 60,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 281,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 16,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 40,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 282,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 13,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 40,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 283,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 15,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 40,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 284,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 27,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 285,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 12,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 20,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 286,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 7,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 287,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 14,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 288,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 16,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 289,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 1450,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 2624,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 292,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 22,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -242,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 293,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 58,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -376,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 72,\n      \"StaffID\": 299,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 38,\n      \"StaffID\": 300,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 13,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 301,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 302,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 41,\n      \"StaffID\": 303,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 11,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 40,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 304,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 16,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 305,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 8,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 43,\n      \"StaffID\": 306,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 307,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 2,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 41,\n      \"StaffID\": 308,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 28,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 68,\n      \"StaffID\": 309,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 32,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 310,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 27,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 311,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 8,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 69,\n      \"StaffID\": 312,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 14,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 72,\n      \"StaffID\": 313,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 29,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 314,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 25,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 68,\n      \"StaffID\": 315,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 31,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 20,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 316,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 30,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 67,\n      \"StaffID\": 317,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 21,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 66,\n      \"StaffID\": 318,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 21,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 71,\n      \"StaffID\": 319,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 4,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 25,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 320,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 708,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 892,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 321,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 15,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 80,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 322,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 1784,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 3097,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 333,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 26,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -247,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 67,\n      \"StaffID\": 334,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 298,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 447,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 64,\n      \"StaffID\": 335,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 1454,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 2344,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 337,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 338,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 14,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 341,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 4,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 64,\n      \"StaffID\": 343,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 63,\n      \"StaffID\": 344,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 4,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 61,\n      \"StaffID\": 345,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 12,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 61,\n      \"StaffID\": 361,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 3,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 59,\n      \"StaffID\": 364,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 448,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 580,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 60,\n      \"StaffID\": 365,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 40,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 33,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 64,\n      \"StaffID\": 366,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 46,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -221,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 4,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 63,\n      \"StaffID\": 367,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 25,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 368,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -11,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 369,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -21,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 64,\n      \"StaffID\": 370,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 9,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.10000000149011612,\n      \"Retired\": 0,\n      \"RetirementAge\": 41,\n      \"StaffID\": 373,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 12,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 20,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 41,\n      \"StaffID\": 374,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 11,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 375,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 23,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 376,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 20,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 60,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 43,\n      \"StaffID\": 377,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 15,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 378,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 13,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 40,\n      \"PermaTraitSpawnBoost\": 0.10000000149011612,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 379,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 8,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 20,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 41,\n      \"StaffID\": 380,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 12,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 381,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 11,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 40,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 382,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 10,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 383,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 6,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 41,\n      \"StaffID\": 384,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 5,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 385,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 4,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 386,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 9,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 387,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 7,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 1,\n      \"RetirementAge\": 38,\n      \"StaffID\": 388,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 8,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 20,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 389,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 10,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 40,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 41,\n      \"StaffID\": 390,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 710,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 1040,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 64,\n      \"StaffID\": 391,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 20,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 71,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 61,\n      \"StaffID\": 392,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 24,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 61,\n      \"StaffID\": 393,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 3,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 394,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 60,\n      \"StaffID\": 395,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 4,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 20,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 59,\n      \"StaffID\": 397,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 4,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 27,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 10,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 398,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 9,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 399,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 8,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 43,\n      \"StaffID\": 400,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 1,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 60,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 44,\n      \"StaffID\": 401,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 4,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 20,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 42,\n      \"StaffID\": 402,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 696,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 985,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 58,\n      \"StaffID\": 403,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -135,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 63,\n      \"StaffID\": 404,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 9,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 20,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 43,\n      \"StaffID\": 405,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 406,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 10,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 407,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 3,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 90,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 45,\n      \"StaffID\": 408,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 2,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 41,\n      \"StaffID\": 409,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 5,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 10,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 42,\n      \"StaffID\": 410,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.10000000149011612,\n      \"Retired\": 0,\n      \"RetirementAge\": 41,\n      \"StaffID\": 411,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 26,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 413,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 32,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 414,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 33,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 58,\n      \"StaffID\": 415,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 2,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 39,\n      \"StaffID\": 416,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 10,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 417,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 7,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 10,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 43,\n      \"StaffID\": 418,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 1,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 42,\n      \"StaffID\": 419,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 12,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 61,\n      \"StaffID\": 420,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 9,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 59,\n      \"StaffID\": 421,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 15,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 60,\n      \"StaffID\": 422,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 13,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 58,\n      \"StaffID\": 423,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 12,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 424,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 5,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 60,\n      \"StaffID\": 425,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 9,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 57,\n      \"StaffID\": 426,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 12,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 59,\n      \"StaffID\": 427,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 2,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 60,\n      \"StaffID\": 428,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 61,\n      \"StaffID\": 429,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 58,\n      \"StaffID\": 430,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 4,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 58,\n      \"StaffID\": 431,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 3,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 432,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 63,\n      \"StaffID\": 433,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 1,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 1,\n      \"RetirementAge\": 59,\n      \"StaffID\": 434,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 61,\n      \"StaffID\": 435,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 70,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 436,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 1,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 437,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 60,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 1,\n      \"RetirementAge\": 39,\n      \"StaffID\": 438,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 5,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 20,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 439,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 20,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 68,\n      \"StaffID\": 536,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 20,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 64,\n      \"StaffID\": 537,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 17,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 65,\n      \"StaffID\": 538,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 21,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 66,\n      \"StaffID\": 539,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 17,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 67,\n      \"StaffID\": 540,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 22,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 67,\n      \"StaffID\": 541,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 26,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 66,\n      \"StaffID\": 542,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 12,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 63,\n      \"StaffID\": 543,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 25,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 61,\n      \"StaffID\": 544,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 15,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 70,\n      \"StaffID\": 545,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 26,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 67,\n      \"StaffID\": 546,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 10,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 60,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 36,\n      \"StaffID\": 547,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 5,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 548,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 6,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 38,\n      \"StaffID\": 549,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 9,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 38,\n      \"StaffID\": 550,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 9,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 38,\n      \"StaffID\": 551,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 7,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 39,\n      \"StaffID\": 554,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 1,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 63,\n      \"StaffID\": 555,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 57,\n      \"StaffID\": 556,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 16,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 67,\n      \"StaffID\": 557,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 70,\n      \"StaffID\": 567,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 63,\n      \"StaffID\": 568,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 600,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 601,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 602,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 603,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 604,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 605,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 606,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 607,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 35,\n      \"StaffID\": 608,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 609,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 610,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 611,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 612,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 613,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 614,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 615,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 616,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 617,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 618,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 619,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 620,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 621,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 622,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 623,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 624,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 625,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 626,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 628,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 630,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 633,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 635,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 636,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 637,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 638,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 639,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 640,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 641,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 642,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 63,\n      \"StaffID\": 643,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 61,\n      \"StaffID\": 644,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 645,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 646,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 647,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 648,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 649,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 650,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 651,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 652,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 653,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 654,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 655,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 656,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 657,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 658,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 659,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 660,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 661,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 662,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 663,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 664,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 665,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 666,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 667,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 668,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 669,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 670,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 671,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 672,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 673,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 674,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 677,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 678,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 679,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 680,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 681,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 682,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 683,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 684,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 39,\n      \"StaffID\": 685,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 39,\n      \"StaffID\": 686,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 38,\n      \"StaffID\": 687,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 39,\n      \"StaffID\": 688,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 37,\n      \"StaffID\": 689,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 57,\n      \"StaffID\": 690,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 60,\n      \"StaffID\": 691,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 61,\n      \"StaffID\": 692,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 63,\n      \"StaffID\": 693,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 61,\n      \"StaffID\": 694,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 57,\n      \"StaffID\": 695,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 63,\n      \"StaffID\": 696,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 61,\n      \"StaffID\": 697,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 62,\n      \"StaffID\": 698,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 65,\n      \"StaffID\": 699,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 62,\n      \"StaffID\": 700,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 61,\n      \"StaffID\": 701,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 65,\n      \"StaffID\": 702,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 70,\n      \"StaffID\": 703,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 60,\n      \"StaffID\": 704,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 67,\n      \"StaffID\": 705,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 59,\n      \"StaffID\": 706,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 70,\n      \"StaffID\": 707,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 63,\n      \"StaffID\": 708,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 64,\n      \"StaffID\": 709,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 60,\n      \"StaffID\": 710,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 38,\n      \"StaffID\": 711,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 39,\n      \"StaffID\": 712,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 36,\n      \"StaffID\": 713,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 37,\n      \"StaffID\": 714,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 38,\n      \"StaffID\": 715,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 37,\n      \"StaffID\": 716,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 1180,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 2089,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 42,\n      \"StaffID\": 1,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 100,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 135,\n      \"ExpectedRankForTeam\": 2,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 2,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 13,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -1,\n      \"ExpectedRankForTeam\": 6,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 3,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 332,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 539,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 67,\n      \"StaffID\": 4,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 178,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 171,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 57,\n      \"StaffID\": 6,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 246,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 112,\n      \"ExpectedRankForTeam\": 2,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 7,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 194,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 222,\n      \"ExpectedRankForTeam\": 8,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 8,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 9,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 550,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 978,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 10,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 42,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -40,\n      \"ExpectedRankForTeam\": 2,\n      \"ExpectedTimeScore\": 1,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 11,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 29,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 14,\n      \"ExpectedRankForTeam\": 4,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 12,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 112,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 24,\n      \"ExpectedRankForTeam\": 6,\n      \"ExpectedTimeScore\": 1,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 39,\n      \"StaffID\": 13,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 12,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -53,\n      \"ExpectedRankForTeam\": 6,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 14,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 36,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -2,\n      \"ExpectedRankForTeam\": 6,\n      \"ExpectedTimeScore\": 1,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 15,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 92,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -15,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 3,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 17,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 6,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -78,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 18,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 3,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -34,\n      \"ExpectedRankForTeam\": 2,\n      \"ExpectedTimeScore\": 20,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 20,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 3,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -13,\n      \"ExpectedRankForTeam\": 4,\n      \"ExpectedTimeScore\": 10,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 22,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 50,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 55,\n      \"ExpectedRankForTeam\": 2,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 23,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 160,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 257,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 26,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 624,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 1165,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 28,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 4,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -8,\n      \"ExpectedRankForTeam\": 10,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 66,\n      \"StaffID\": 30,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 16,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -114,\n      \"ExpectedRankForTeam\": 6,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 67,\n      \"StaffID\": 33,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 472,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 929,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 63,\n      \"StaffID\": 37,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 1330,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 2473,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 38,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 190,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 96,\n      \"ExpectedRankForTeam\": 6,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 69,\n      \"StaffID\": 39,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 68,\n      \"StaffID\": 40,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -63,\n      \"ExpectedRankForTeam\": 10,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 64,\n      \"StaffID\": 43,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 18,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 4,\n      \"ExpectedRankForTeam\": 4,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 68,\n      \"StaffID\": 44,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 18,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -134,\n      \"ExpectedRankForTeam\": 4,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 56,\n      \"StaffID\": 47,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 414,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 530,\n      \"ExpectedRankForTeam\": 2,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 56,\n      \"StaffID\": 48,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 128,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 226,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 55,\n      \"StaffID\": 49,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 576,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 823,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 56,\n      \"StaffID\": 50,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 1060,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 1895,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 51,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 10,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -15,\n      \"ExpectedRankForTeam\": 6,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 57,\n      \"StaffID\": 54,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 4,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -111,\n      \"ExpectedRankForTeam\": 8,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 55,\n      \"StaffID\": 55,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -80,\n      \"ExpectedRankForTeam\": 8,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 63,\n      \"StaffID\": 56,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 27,\n      \"ExpectedRankForTeam\": 8,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 58,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 82,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -86,\n      \"ExpectedRankForTeam\": 6,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 55,\n      \"StaffID\": 59,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 28,\n      \"ExpectedRankForTeam\": 6,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 55,\n      \"StaffID\": 60,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -17,\n      \"ExpectedRankForTeam\": 9,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 58,\n      \"StaffID\": 61,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 28,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 7,\n      \"ExpectedRankForTeam\": 4,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 60,\n      \"StaffID\": 63,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 34,\n      \"ExpectedRankForTeam\": 3,\n      \"ExpectedTimeScore\": 60,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 55,\n      \"StaffID\": 64,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 16,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 16,\n      \"ExpectedRankForTeam\": 2,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 74,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 76,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 452,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 589,\n      \"ExpectedRankForTeam\": 2,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 45,\n      \"StaffID\": 77,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 44,\n      \"StaffID\": 78,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 3,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 20,\n      \"ExpectedRankForTeam\": 8,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 80,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -9,\n      \"ExpectedRankForTeam\": 6,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 81,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 3,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 41,\n      \"StaffID\": 82,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -148,\n      \"ExpectedRankForTeam\": 8,\n      \"ExpectedTimeScore\": 70,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 83,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 25,\n      \"BestF1PosInTeamSinceGameStart\": 3,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 79,\n      \"ExpectedRankForTeam\": 9,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 87,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 41,\n      \"StaffID\": 88,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 91,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 31,\n      \"ExpectedRankForTeam\": 1,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 95,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 23,\n      \"ExpectedRankForTeam\": 11,\n      \"ExpectedTimeScore\": 70,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 99,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 26,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 64,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 102,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 8,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 105,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 25,\n      \"BestF1PosInTeamSinceGameStart\": 3,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 76,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 106,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 27,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 107,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 18,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 80,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 109,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 15,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 80,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 35,\n      \"StaffID\": 110,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 39,\n      \"StaffID\": 114,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 37,\n      \"StaffID\": 115,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 28,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 116,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 23,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 60,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 117,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 22,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 119,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 27,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 120,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 22,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 20,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 121,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 18,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 70,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 123,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 24,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 60,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 127,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 128,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 3,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 31,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 130,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 132,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 39,\n      \"StaffID\": 133,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 3,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 25,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 135,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 43,\n      \"StaffID\": 140,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 27,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 142,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 143,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 25,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 40,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 144,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 63,\n      \"StaffID\": 145,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 24,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 59,\n      \"StaffID\": 146,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 26,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 10,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 56,\n      \"StaffID\": 148,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 26,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 149,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 18,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 57,\n      \"StaffID\": 151,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 27,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 57,\n      \"StaffID\": 152,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 22,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 59,\n      \"StaffID\": 153,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 25,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 60,\n      \"StaffID\": 155,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 57,\n      \"StaffID\": 156,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 23,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 58,\n      \"StaffID\": 158,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 28,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 60,\n      \"StaffID\": 159,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 23,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 59,\n      \"StaffID\": 160,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 22,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 64,\n      \"StaffID\": 161,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 56,\n      \"StaffID\": 162,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 163,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 4,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 57,\n      \"StaffID\": 165,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 3,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 64,\n      \"StaffID\": 166,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 10,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 56,\n      \"StaffID\": 168,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 25,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 61,\n      \"StaffID\": 169,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 17,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 90,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 60,\n      \"StaffID\": 172,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 19,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 173,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 23,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 58,\n      \"StaffID\": 174,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 2,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 175,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 12,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 57,\n      \"StaffID\": 178,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 14,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 179,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 5,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 61,\n      \"StaffID\": 181,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 7,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 56,\n      \"StaffID\": 183,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 1,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 59,\n      \"StaffID\": 184,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 57,\n      \"StaffID\": 187,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 64,\n      \"StaffID\": 191,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 8,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 80,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 193,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 6,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 195,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 25,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 242,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 36,\n      \"StaffID\": 244,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 22,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 245,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 20,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 247,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 26,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 248,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 22,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 70,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 252,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 253,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 2,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -106,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 49,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 255,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 258,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 259,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 260,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 3,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 263,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 3,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 264,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 36,\n      \"StaffID\": 272,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 26,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 279,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 17,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 280,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 23,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 60,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 281,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 16,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 40,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 282,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 13,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 40,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 283,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 15,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 40,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 284,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 27,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 285,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 12,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 20,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 286,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 7,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 287,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 14,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 288,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 16,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 289,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 1450,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 2624,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 292,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 22,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -242,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 293,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 58,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -376,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 72,\n      \"StaffID\": 299,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 38,\n      \"StaffID\": 300,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 13,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 301,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 302,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 41,\n      \"StaffID\": 303,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 11,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 40,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 304,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 16,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 305,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 8,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 43,\n      \"StaffID\": 306,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 307,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 2,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 41,\n      \"StaffID\": 308,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 28,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 68,\n      \"StaffID\": 309,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 32,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 310,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 27,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 311,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 8,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 69,\n      \"StaffID\": 312,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 14,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 72,\n      \"StaffID\": 313,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 29,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 314,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 25,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 68,\n      \"StaffID\": 315,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 31,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 20,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 316,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 30,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 67,\n      \"StaffID\": 317,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 21,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 66,\n      \"StaffID\": 318,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 21,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 71,\n      \"StaffID\": 319,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 4,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 25,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 320,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 708,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 892,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 321,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 15,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 80,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 322,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 1784,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 3097,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 333,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 26,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -247,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 67,\n      \"StaffID\": 334,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 298,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 447,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 64,\n      \"StaffID\": 335,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 1454,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 2344,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 337,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 338,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 14,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 341,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 4,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 64,\n      \"StaffID\": 343,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 63,\n      \"StaffID\": 344,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 4,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 61,\n      \"StaffID\": 345,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 12,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 61,\n      \"StaffID\": 361,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 3,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 59,\n      \"StaffID\": 364,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 448,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 580,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 60,\n      \"StaffID\": 365,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 40,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 33,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 64,\n      \"StaffID\": 366,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 46,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -221,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 4,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 63,\n      \"StaffID\": 367,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 25,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 65,\n      \"StaffID\": 368,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -11,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 369,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -21,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 64,\n      \"StaffID\": 370,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 9,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.10000000149011612,\n      \"Retired\": 0,\n      \"RetirementAge\": 41,\n      \"StaffID\": 373,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 12,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 20,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 41,\n      \"StaffID\": 374,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 11,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 375,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 23,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 376,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 20,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 60,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 43,\n      \"StaffID\": 377,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 15,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 378,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 13,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 40,\n      \"PermaTraitSpawnBoost\": 0.10000000149011612,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 379,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 8,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 20,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 41,\n      \"StaffID\": 380,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 12,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 381,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 11,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 40,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 37,\n      \"StaffID\": 382,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 10,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 383,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 6,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 41,\n      \"StaffID\": 384,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 5,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 385,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 4,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 386,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 9,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 387,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 7,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 1,\n      \"RetirementAge\": 38,\n      \"StaffID\": 388,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 8,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 20,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 389,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 10,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 40,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 41,\n      \"StaffID\": 390,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 710,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 1040,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 64,\n      \"StaffID\": 391,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 20,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 71,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 61,\n      \"StaffID\": 392,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 24,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 61,\n      \"StaffID\": 393,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 3,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 394,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 60,\n      \"StaffID\": 395,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 4,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 20,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 59,\n      \"StaffID\": 397,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 4,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 27,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 10,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 398,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 9,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 399,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 8,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 43,\n      \"StaffID\": 400,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 1,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 60,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 44,\n      \"StaffID\": 401,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 4,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 20,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 42,\n      \"StaffID\": 402,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 696,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 985,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 58,\n      \"StaffID\": 403,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": -135,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 63,\n      \"StaffID\": 404,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 9,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 20,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 43,\n      \"StaffID\": 405,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 36,\n      \"StaffID\": 406,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 10,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 407,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 3,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 90,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 45,\n      \"StaffID\": 408,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 2,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 41,\n      \"StaffID\": 409,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 5,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 10,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 42,\n      \"StaffID\": 410,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.10000000149011612,\n      \"Retired\": 0,\n      \"RetirementAge\": 41,\n      \"StaffID\": 411,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 26,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 413,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 32,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 414,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 33,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 58,\n      \"StaffID\": 415,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 2,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 39,\n      \"StaffID\": 416,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 10,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 39,\n      \"StaffID\": 417,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 7,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 10,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 43,\n      \"StaffID\": 418,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 1,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 42,\n      \"StaffID\": 419,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 12,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 61,\n      \"StaffID\": 420,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 9,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 59,\n      \"StaffID\": 421,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 15,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 60,\n      \"StaffID\": 422,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 13,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 58,\n      \"StaffID\": 423,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 12,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 424,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 5,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 60,\n      \"StaffID\": 425,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 9,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 57,\n      \"StaffID\": 426,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 12,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 59,\n      \"StaffID\": 427,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 2,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 60,\n      \"StaffID\": 428,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 61,\n      \"StaffID\": 429,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 58,\n      \"StaffID\": 430,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 4,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 58,\n      \"StaffID\": 431,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 3,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 62,\n      \"StaffID\": 432,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 63,\n      \"StaffID\": 433,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 1,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 1,\n      \"RetirementAge\": 59,\n      \"StaffID\": 434,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 61,\n      \"StaffID\": 435,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 70,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 436,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 1,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 437,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 60,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 1,\n      \"RetirementAge\": 39,\n      \"StaffID\": 438,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 5,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 20,\n      \"PermaTraitSpawnBoost\": 0.05000000074505806,\n      \"Retired\": 0,\n      \"RetirementAge\": 38,\n      \"StaffID\": 439,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 20,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 68,\n      \"StaffID\": 536,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 20,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 64,\n      \"StaffID\": 537,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 17,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 65,\n      \"StaffID\": 538,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 21,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 66,\n      \"StaffID\": 539,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 17,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 67,\n      \"StaffID\": 540,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 22,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 67,\n      \"StaffID\": 541,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 26,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 66,\n      \"StaffID\": 542,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 12,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 63,\n      \"StaffID\": 543,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 25,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 61,\n      \"StaffID\": 544,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 15,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 70,\n      \"StaffID\": 545,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 26,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 67,\n      \"StaffID\": 546,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 10,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 60,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 36,\n      \"StaffID\": 547,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 5,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 40,\n      \"StaffID\": 548,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 6,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 38,\n      \"StaffID\": 549,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 9,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 50,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 38,\n      \"StaffID\": 550,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 9,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 38,\n      \"StaffID\": 551,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 7,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 30,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 39,\n      \"StaffID\": 554,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 1,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 63,\n      \"StaffID\": 555,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 57,\n      \"StaffID\": 556,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 16,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 67,\n      \"StaffID\": 557,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 70,\n      \"StaffID\": 567,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 63,\n      \"StaffID\": 568,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 600,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 601,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 602,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 603,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 604,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 605,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 606,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 607,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 35,\n      \"StaffID\": 608,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 609,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 610,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 611,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 612,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 613,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 614,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 615,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 616,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 617,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 618,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 619,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 620,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 35,\n      \"StaffID\": 621,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 622,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 623,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 624,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 625,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 626,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 628,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 630,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 633,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 635,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 636,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 637,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 638,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 639,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 640,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 641,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 642,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 63,\n      \"StaffID\": 643,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 61,\n      \"StaffID\": 644,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 645,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 646,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 2,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 647,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 648,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 649,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 650,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 651,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 652,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 653,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 654,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 655,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 656,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 657,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 658,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 659,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 660,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 661,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 662,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 663,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": 3,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 664,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 665,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 666,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 667,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 668,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 669,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 670,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 671,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 672,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 673,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 40,\n      \"StaffID\": 674,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 677,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 678,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 679,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 680,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 681,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 682,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 1,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 683,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": 2,\n      \"BestTeamFormula\": 1,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 0,\n      \"RetirementAge\": 70,\n      \"StaffID\": 684,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 39,\n      \"StaffID\": 685,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 39,\n      \"StaffID\": 686,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 38,\n      \"StaffID\": 687,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 39,\n      \"StaffID\": 688,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 37,\n      \"StaffID\": 689,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 57,\n      \"StaffID\": 690,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 60,\n      \"StaffID\": 691,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 61,\n      \"StaffID\": 692,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 63,\n      \"StaffID\": 693,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 61,\n      \"StaffID\": 694,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 57,\n      \"StaffID\": 695,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 63,\n      \"StaffID\": 696,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 61,\n      \"StaffID\": 697,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 62,\n      \"StaffID\": 698,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 65,\n      \"StaffID\": 699,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 62,\n      \"StaffID\": 700,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 61,\n      \"StaffID\": 701,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 65,\n      \"StaffID\": 702,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 70,\n      \"StaffID\": 703,\n      \"StaffType\": 3\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 60,\n      \"StaffID\": 704,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 67,\n      \"StaffID\": 705,\n      \"StaffType\": 4\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 59,\n      \"StaffID\": 706,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 70,\n      \"StaffID\": 707,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 63,\n      \"StaffID\": 708,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 64,\n      \"StaffID\": 709,\n      \"StaffType\": 1\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 60,\n      \"StaffID\": 710,\n      \"StaffType\": 2\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 38,\n      \"StaffID\": 711,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 39,\n      \"StaffID\": 712,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 36,\n      \"StaffID\": 713,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 37,\n      \"StaffID\": 714,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 38,\n      \"StaffID\": 715,\n      \"StaffType\": 0\n    },\n    {\n      \"AchievementScore\": 0,\n      \"BestF1PosInTeamSinceGameStart\": null,\n      \"BestTeamFormula\": null,\n      \"DevelopmentPlan\": null,\n      \"ExpectedQualityScore\": 0,\n      \"ExpectedRankForTeam\": 5,\n      \"ExpectedTimeScore\": 0,\n      \"PermaTraitSpawnBoost\": 0,\n      \"Retired\": 1,\n      \"RetirementAge\": 37,\n      \"StaffID\": 716,\n      \"StaffType\": 0\n    }\n  ],\n  \"Staff_PerformanceStats\": [\n    {\n      \"Max\": 100,\n      \"StaffID\": 4,\n      \"StatID\": 0,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 4,\n      \"StatID\": 1,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 4,\n      \"StatID\": 14,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 4,\n      \"StatID\": 15,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 4,\n      \"StatID\": 16,\n      \"Val\": 91\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 4,\n      \"StatID\": 17,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 6,\n      \"StatID\": 13,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 6,\n      \"StatID\": 25,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 7,\n      \"StatID\": 13,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 7,\n      \"StatID\": 25,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 13,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 13,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 13,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 13,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 13,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 13,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 13,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 13,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 13,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 26,\n      \"StatID\": 19,\n      \"Val\": 92\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 26,\n      \"StatID\": 20,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 26,\n      \"StatID\": 26,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 26,\n      \"StatID\": 27,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 26,\n      \"StatID\": 28,\n      \"Val\": 91\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 26,\n      \"StatID\": 29,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 26,\n      \"StatID\": 30,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 26,\n      \"StatID\": 31,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 28,\n      \"StatID\": 0,\n      \"Val\": 92\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 28,\n      \"StatID\": 1,\n      \"Val\": 95\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 28,\n      \"StatID\": 14,\n      \"Val\": 94\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 28,\n      \"StatID\": 15,\n      \"Val\": 92\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 28,\n      \"StatID\": 16,\n      \"Val\": 95\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 28,\n      \"StatID\": 17,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 30,\n      \"StatID\": 0,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 30,\n      \"StatID\": 1,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 30,\n      \"StatID\": 14,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 30,\n      \"StatID\": 15,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 30,\n      \"StatID\": 16,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 30,\n      \"StatID\": 17,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 33,\n      \"StatID\": 1,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 33,\n      \"StatID\": 14,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 33,\n      \"StatID\": 15,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 33,\n      \"StatID\": 16,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 33,\n      \"StatID\": 17,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 37,\n      \"StatID\": 19,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 37,\n      \"StatID\": 20,\n      \"Val\": 95\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 37,\n      \"StatID\": 26,\n      \"Val\": 95\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 37,\n      \"StatID\": 27,\n      \"Val\": 94\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 37,\n      \"StatID\": 28,\n      \"Val\": 92\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 37,\n      \"StatID\": 29,\n      \"Val\": 95\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 37,\n      \"StatID\": 30,\n      \"Val\": 93\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 37,\n      \"StatID\": 31,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 38,\n      \"StatID\": 19,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 38,\n      \"StatID\": 20,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 38,\n      \"StatID\": 26,\n      \"Val\": 93\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 38,\n      \"StatID\": 27,\n      \"Val\": 92\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 38,\n      \"StatID\": 28,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 38,\n      \"StatID\": 29,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 38,\n      \"StatID\": 30,\n      \"Val\": 94\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 38,\n      \"StatID\": 31,\n      \"Val\": 93\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 39,\n      \"StatID\": 19,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 39,\n      \"StatID\": 20,\n      \"Val\": 81\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 39,\n      \"StatID\": 26,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 39,\n      \"StatID\": 27,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 39,\n      \"StatID\": 28,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 39,\n      \"StatID\": 29,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 39,\n      \"StatID\": 30,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 39,\n      \"StatID\": 31,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 40,\n      \"StatID\": 20,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 40,\n      \"StatID\": 26,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 40,\n      \"StatID\": 27,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 40,\n      \"StatID\": 28,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 40,\n      \"StatID\": 29,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 40,\n      \"StatID\": 30,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 40,\n      \"StatID\": 31,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 43,\n      \"StatID\": 19,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 43,\n      \"StatID\": 20,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 43,\n      \"StatID\": 27,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 43,\n      \"StatID\": 28,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 43,\n      \"StatID\": 29,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 43,\n      \"StatID\": 30,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 43,\n      \"StatID\": 31,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 44,\n      \"StatID\": 19,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 44,\n      \"StatID\": 20,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 44,\n      \"StatID\": 26,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 44,\n      \"StatID\": 27,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 44,\n      \"StatID\": 28,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 44,\n      \"StatID\": 29,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 44,\n      \"StatID\": 30,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 44,\n      \"StatID\": 31,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 47,\n      \"StatID\": 13,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 47,\n      \"StatID\": 25,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 48,\n      \"StatID\": 13,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 48,\n      \"StatID\": 25,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 49,\n      \"StatID\": 13,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 49,\n      \"StatID\": 25,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 50,\n      \"StatID\": 13,\n      \"Val\": 96\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 50,\n      \"StatID\": 25,\n      \"Val\": 92\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 51,\n      \"StatID\": 13,\n      \"Val\": 97\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 51,\n      \"StatID\": 25,\n      \"Val\": 91\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 54,\n      \"StatID\": 13,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 54,\n      \"StatID\": 25,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 55,\n      \"StatID\": 13,\n      \"Val\": 81\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 55,\n      \"StatID\": 25,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 56,\n      \"StatID\": 13,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 56,\n      \"StatID\": 25,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 58,\n      \"StatID\": 25,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 59,\n      \"StatID\": 13,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 59,\n      \"StatID\": 25,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 60,\n      \"StatID\": 13,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 60,\n      \"StatID\": 25,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 61,\n      \"StatID\": 13,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 61,\n      \"StatID\": 25,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 63,\n      \"StatID\": 13,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 63,\n      \"StatID\": 25,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 64,\n      \"StatID\": 13,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 64,\n      \"StatID\": 25,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 109,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 109,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 109,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 109,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 109,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 109,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 109,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 109,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 109,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 110,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 110,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 110,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 110,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 110,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 110,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 110,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 110,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 110,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 116,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 116,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 116,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 116,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 116,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 116,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 116,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 116,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 116,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 119,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 119,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 119,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 119,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 119,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 119,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 119,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 119,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 146,\n      \"StatID\": 25,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 148,\n      \"StatID\": 13,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 148,\n      \"StatID\": 25,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 149,\n      \"StatID\": 13,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 149,\n      \"StatID\": 25,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 151,\n      \"StatID\": 13,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 151,\n      \"StatID\": 25,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 152,\n      \"StatID\": 13,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 152,\n      \"StatID\": 25,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 153,\n      \"StatID\": 13,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 155,\n      \"StatID\": 13,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 155,\n      \"StatID\": 25,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 158,\n      \"StatID\": 13,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 158,\n      \"StatID\": 25,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 159,\n      \"StatID\": 25,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 160,\n      \"StatID\": 13,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 160,\n      \"StatID\": 25,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 161,\n      \"StatID\": 13,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 161,\n      \"StatID\": 25,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 162,\n      \"StatID\": 13,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 162,\n      \"StatID\": 25,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 163,\n      \"StatID\": 13,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 163,\n      \"StatID\": 25,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 165,\n      \"StatID\": 13,\n      \"Val\": 70\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 165,\n      \"StatID\": 25,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 166,\n      \"StatID\": 13,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 166,\n      \"StatID\": 25,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 168,\n      \"StatID\": 13,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 168,\n      \"StatID\": 25,\n      \"Val\": 81\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 169,\n      \"StatID\": 13,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 169,\n      \"StatID\": 25,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 172,\n      \"StatID\": 13,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 172,\n      \"StatID\": 25,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 173,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 173,\n      \"StatID\": 25,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 174,\n      \"StatID\": 13,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 174,\n      \"StatID\": 25,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 175,\n      \"StatID\": 13,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 175,\n      \"StatID\": 25,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 178,\n      \"StatID\": 25,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 179,\n      \"StatID\": 13,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 179,\n      \"StatID\": 25,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 181,\n      \"StatID\": 25,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 183,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 183,\n      \"StatID\": 25,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 184,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 184,\n      \"StatID\": 25,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 187,\n      \"StatID\": 13,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 187,\n      \"StatID\": 25,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 191,\n      \"StatID\": 13,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 191,\n      \"StatID\": 25,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 193,\n      \"StatID\": 25,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 195,\n      \"StatID\": 13,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 195,\n      \"StatID\": 25,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 247,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 247,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 247,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 247,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 247,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 247,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 247,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 247,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 247,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 287,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 287,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 287,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 287,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 287,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 287,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 287,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 287,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 287,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 292,\n      \"StatID\": 11,\n      \"Val\": 95\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 292,\n      \"StatID\": 22,\n      \"Val\": 94\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 292,\n      \"StatID\": 23,\n      \"Val\": 95\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 292,\n      \"StatID\": 24,\n      \"Val\": 93\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 293,\n      \"StatID\": 11,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 293,\n      \"StatID\": 22,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 293,\n      \"StatID\": 23,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 293,\n      \"StatID\": 24,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 299,\n      \"StatID\": 11,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 299,\n      \"StatID\": 22,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 299,\n      \"StatID\": 23,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 299,\n      \"StatID\": 24,\n      \"Val\": 95\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 306,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 306,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 306,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 306,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 306,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 306,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 306,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 306,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 306,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 308,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 308,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 308,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 308,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 308,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 308,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 308,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 308,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 308,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 309,\n      \"StatID\": 11,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 309,\n      \"StatID\": 22,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 309,\n      \"StatID\": 23,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 309,\n      \"StatID\": 24,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 310,\n      \"StatID\": 11,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 310,\n      \"StatID\": 22,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 310,\n      \"StatID\": 23,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 310,\n      \"StatID\": 24,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 311,\n      \"StatID\": 11,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 311,\n      \"StatID\": 22,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 311,\n      \"StatID\": 23,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 311,\n      \"StatID\": 24,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 312,\n      \"StatID\": 11,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 312,\n      \"StatID\": 22,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 312,\n      \"StatID\": 24,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 313,\n      \"StatID\": 11,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 313,\n      \"StatID\": 22,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 313,\n      \"StatID\": 23,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 314,\n      \"StatID\": 11,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 314,\n      \"StatID\": 22,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 314,\n      \"StatID\": 23,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 314,\n      \"StatID\": 24,\n      \"Val\": 81\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 315,\n      \"StatID\": 11,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 315,\n      \"StatID\": 22,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 315,\n      \"StatID\": 23,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 315,\n      \"StatID\": 24,\n      \"Val\": 81\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 316,\n      \"StatID\": 11,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 316,\n      \"StatID\": 22,\n      \"Val\": 81\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 316,\n      \"StatID\": 23,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 316,\n      \"StatID\": 24,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 317,\n      \"StatID\": 11,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 317,\n      \"StatID\": 22,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 317,\n      \"StatID\": 23,\n      \"Val\": 81\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 317,\n      \"StatID\": 24,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 318,\n      \"StatID\": 11,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 318,\n      \"StatID\": 22,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 318,\n      \"StatID\": 23,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 318,\n      \"StatID\": 24,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 319,\n      \"StatID\": 11,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 319,\n      \"StatID\": 22,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 319,\n      \"StatID\": 23,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 319,\n      \"StatID\": 24,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 320,\n      \"StatID\": 13,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 320,\n      \"StatID\": 25,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 321,\n      \"StatID\": 13,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 321,\n      \"StatID\": 25,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 6,\n      \"StatID\": 43,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 7,\n      \"StatID\": 43,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 47,\n      \"StatID\": 43,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 48,\n      \"StatID\": 43,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 49,\n      \"StatID\": 43,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 50,\n      \"StatID\": 43,\n      \"Val\": 91\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 51,\n      \"StatID\": 43,\n      \"Val\": 92\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 54,\n      \"StatID\": 43,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 55,\n      \"StatID\": 43,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 56,\n      \"StatID\": 43,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 58,\n      \"StatID\": 43,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 59,\n      \"StatID\": 43,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 60,\n      \"StatID\": 43,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 61,\n      \"StatID\": 43,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 63,\n      \"StatID\": 43,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 64,\n      \"StatID\": 43,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 146,\n      \"StatID\": 43,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 148,\n      \"StatID\": 43,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 149,\n      \"StatID\": 43,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 151,\n      \"StatID\": 43,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 152,\n      \"StatID\": 43,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 153,\n      \"StatID\": 43,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 155,\n      \"StatID\": 43,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 159,\n      \"StatID\": 43,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 160,\n      \"StatID\": 43,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 161,\n      \"StatID\": 43,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 162,\n      \"StatID\": 43,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 163,\n      \"StatID\": 43,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 165,\n      \"StatID\": 43,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 166,\n      \"StatID\": 43,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 168,\n      \"StatID\": 43,\n      \"Val\": 81\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 169,\n      \"StatID\": 43,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 172,\n      \"StatID\": 43,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 174,\n      \"StatID\": 43,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 175,\n      \"StatID\": 43,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 178,\n      \"StatID\": 43,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 179,\n      \"StatID\": 43,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 181,\n      \"StatID\": 43,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 183,\n      \"StatID\": 43,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 184,\n      \"StatID\": 43,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 187,\n      \"StatID\": 43,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 191,\n      \"StatID\": 43,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 193,\n      \"StatID\": 43,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 195,\n      \"StatID\": 43,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 320,\n      \"StatID\": 43,\n      \"Val\": 95\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 321,\n      \"StatID\": 43,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 333,\n      \"StatID\": 0,\n      \"Val\": 95\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 333,\n      \"StatID\": 1,\n      \"Val\": 93\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 333,\n      \"StatID\": 14,\n      \"Val\": 92\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 333,\n      \"StatID\": 15,\n      \"Val\": 95\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 333,\n      \"StatID\": 16,\n      \"Val\": 94\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 333,\n      \"StatID\": 17,\n      \"Val\": 93\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 334,\n      \"StatID\": 0,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 334,\n      \"StatID\": 1,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 334,\n      \"StatID\": 14,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 334,\n      \"StatID\": 15,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 334,\n      \"StatID\": 16,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 334,\n      \"StatID\": 17,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 335,\n      \"StatID\": 0,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 335,\n      \"StatID\": 1,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 335,\n      \"StatID\": 14,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 335,\n      \"StatID\": 15,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 335,\n      \"StatID\": 16,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 335,\n      \"StatID\": 17,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 337,\n      \"StatID\": 19,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 337,\n      \"StatID\": 20,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 337,\n      \"StatID\": 26,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 337,\n      \"StatID\": 27,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 337,\n      \"StatID\": 28,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 337,\n      \"StatID\": 29,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 337,\n      \"StatID\": 30,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 337,\n      \"StatID\": 31,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 341,\n      \"StatID\": 25,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 341,\n      \"StatID\": 43,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 343,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 343,\n      \"StatID\": 25,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 343,\n      \"StatID\": 43,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 344,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 344,\n      \"StatID\": 25,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 344,\n      \"StatID\": 43,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 345,\n      \"StatID\": 13,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 345,\n      \"StatID\": 25,\n      \"Val\": 70\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 345,\n      \"StatID\": 43,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 361,\n      \"StatID\": 13,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 361,\n      \"StatID\": 43,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 364,\n      \"StatID\": 13,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 364,\n      \"StatID\": 25,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 364,\n      \"StatID\": 43,\n      \"Val\": 70\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 365,\n      \"StatID\": 0,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 365,\n      \"StatID\": 1,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 365,\n      \"StatID\": 14,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 365,\n      \"StatID\": 15,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 365,\n      \"StatID\": 16,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 365,\n      \"StatID\": 17,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 366,\n      \"StatID\": 11,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 366,\n      \"StatID\": 22,\n      \"Val\": 92\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 366,\n      \"StatID\": 23,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 366,\n      \"StatID\": 24,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 367,\n      \"StatID\": 11,\n      \"Val\": 92\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 367,\n      \"StatID\": 22,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 367,\n      \"StatID\": 23,\n      \"Val\": 94\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 367,\n      \"StatID\": 24,\n      \"Val\": 92\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 368,\n      \"StatID\": 11,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 368,\n      \"StatID\": 22,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 368,\n      \"StatID\": 23,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 368,\n      \"StatID\": 24,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 369,\n      \"StatID\": 19,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 369,\n      \"StatID\": 20,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 369,\n      \"StatID\": 26,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 369,\n      \"StatID\": 27,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 369,\n      \"StatID\": 28,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 369,\n      \"StatID\": 29,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 369,\n      \"StatID\": 30,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 369,\n      \"StatID\": 31,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 370,\n      \"StatID\": 11,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 370,\n      \"StatID\": 22,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 370,\n      \"StatID\": 23,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 370,\n      \"StatID\": 24,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 374,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 374,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 374,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 374,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 374,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 374,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 374,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 374,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 374,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 386,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 386,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 386,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 386,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 386,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 386,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 386,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 386,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 388,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 388,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 388,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 388,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 388,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 388,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 388,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 388,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 390,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 390,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 390,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 390,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 390,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 390,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 390,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 390,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 390,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 391,\n      \"StatID\": 0,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 391,\n      \"StatID\": 1,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 391,\n      \"StatID\": 14,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 391,\n      \"StatID\": 15,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 391,\n      \"StatID\": 16,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 391,\n      \"StatID\": 17,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 392,\n      \"StatID\": 11,\n      \"Val\": 91\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 392,\n      \"StatID\": 22,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 392,\n      \"StatID\": 23,\n      \"Val\": 92\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 392,\n      \"StatID\": 24,\n      \"Val\": 91\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 393,\n      \"StatID\": 13,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 393,\n      \"StatID\": 25,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 393,\n      \"StatID\": 43,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 397,\n      \"StatID\": 11,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 397,\n      \"StatID\": 22,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 397,\n      \"StatID\": 23,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 397,\n      \"StatID\": 24,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 400,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 400,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 400,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 400,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 400,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 400,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 400,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 400,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 400,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 401,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 401,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 401,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 401,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 401,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 401,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 401,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 401,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 401,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 403,\n      \"StatID\": 0,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 403,\n      \"StatID\": 1,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 403,\n      \"StatID\": 14,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 403,\n      \"StatID\": 15,\n      \"Val\": 81\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 403,\n      \"StatID\": 16,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 403,\n      \"StatID\": 17,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 404,\n      \"StatID\": 19,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 404,\n      \"StatID\": 20,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 404,\n      \"StatID\": 26,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 404,\n      \"StatID\": 27,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 404,\n      \"StatID\": 28,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 404,\n      \"StatID\": 29,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 404,\n      \"StatID\": 30,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 404,\n      \"StatID\": 31,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 408,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 408,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 408,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 408,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 408,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 408,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 408,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 408,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 408,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 413,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 413,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 413,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 413,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 413,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 413,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 413,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 413,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 413,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 414,\n      \"StatID\": 19,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 414,\n      \"StatID\": 20,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 414,\n      \"StatID\": 26,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 414,\n      \"StatID\": 27,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 414,\n      \"StatID\": 28,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 414,\n      \"StatID\": 29,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 414,\n      \"StatID\": 30,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 414,\n      \"StatID\": 31,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 415,\n      \"StatID\": 13,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 415,\n      \"StatID\": 25,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 415,\n      \"StatID\": 43,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 416,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 416,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 416,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 416,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 416,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 416,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 416,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 416,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 416,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 420,\n      \"StatID\": 13,\n      \"Val\": 70\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 420,\n      \"StatID\": 25,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 420,\n      \"StatID\": 43,\n      \"Val\": 70\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 421,\n      \"StatID\": 25,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 421,\n      \"StatID\": 43,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 422,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 422,\n      \"StatID\": 25,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 422,\n      \"StatID\": 43,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 423,\n      \"StatID\": 13,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 423,\n      \"StatID\": 25,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 423,\n      \"StatID\": 43,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 424,\n      \"StatID\": 13,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 424,\n      \"StatID\": 25,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 424,\n      \"StatID\": 43,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 425,\n      \"StatID\": 13,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 425,\n      \"StatID\": 25,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 425,\n      \"StatID\": 43,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 426,\n      \"StatID\": 13,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 426,\n      \"StatID\": 25,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 426,\n      \"StatID\": 43,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 427,\n      \"StatID\": 25,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 427,\n      \"StatID\": 43,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 428,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 428,\n      \"StatID\": 25,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 428,\n      \"StatID\": 43,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 429,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 429,\n      \"StatID\": 25,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 429,\n      \"StatID\": 43,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 430,\n      \"StatID\": 13,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 430,\n      \"StatID\": 25,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 430,\n      \"StatID\": 43,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 431,\n      \"StatID\": 25,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 431,\n      \"StatID\": 43,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 432,\n      \"StatID\": 13,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 432,\n      \"StatID\": 25,\n      \"Val\": 70\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 432,\n      \"StatID\": 43,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 433,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 433,\n      \"StatID\": 25,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 433,\n      \"StatID\": 43,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 434,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 434,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 435,\n      \"StatID\": 13,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 435,\n      \"StatID\": 25,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 435,\n      \"StatID\": 43,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 436,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 436,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 437,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 437,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 438,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 438,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 438,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 436,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 436,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 436,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 436,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 436,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 436,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 437,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 437,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 437,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 437,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 437,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 437,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 438,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 438,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 438,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 438,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 438,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 536,\n      \"StatID\": 19,\n      \"Val\": 79,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 536,\n      \"StatID\": 20,\n      \"Val\": 71,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 536,\n      \"StatID\": 26,\n      \"Val\": 77,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 536,\n      \"StatID\": 27,\n      \"Val\": 59,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 536,\n      \"StatID\": 28,\n      \"Val\": 59,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 536,\n      \"StatID\": 29,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 536,\n      \"StatID\": 30,\n      \"Val\": 70,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 536,\n      \"StatID\": 31,\n      \"Val\": 74,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 537,\n      \"StatID\": 19,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 537,\n      \"StatID\": 20,\n      \"Val\": 77,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 537,\n      \"StatID\": 26,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 537,\n      \"StatID\": 27,\n      \"Val\": 79,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 537,\n      \"StatID\": 28,\n      \"Val\": 79,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 537,\n      \"StatID\": 29,\n      \"Val\": 73,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 537,\n      \"StatID\": 30,\n      \"Val\": 65,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 537,\n      \"StatID\": 31,\n      \"Val\": 57,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 538,\n      \"StatID\": 19,\n      \"Val\": 63,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 538,\n      \"StatID\": 20,\n      \"Val\": 60,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 538,\n      \"StatID\": 26,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 538,\n      \"StatID\": 27,\n      \"Val\": 59,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 538,\n      \"StatID\": 28,\n      \"Val\": 85,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 538,\n      \"StatID\": 29,\n      \"Val\": 84,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 538,\n      \"StatID\": 30,\n      \"Val\": 84,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 538,\n      \"StatID\": 31,\n      \"Val\": 73,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 539,\n      \"StatID\": 0,\n      \"Val\": 78,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 539,\n      \"StatID\": 1,\n      \"Val\": 85,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 539,\n      \"StatID\": 14,\n      \"Val\": 76,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 539,\n      \"StatID\": 15,\n      \"Val\": 61,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 539,\n      \"StatID\": 16,\n      \"Val\": 56,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 539,\n      \"StatID\": 17,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 540,\n      \"StatID\": 0,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 540,\n      \"StatID\": 1,\n      \"Val\": 61,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 540,\n      \"StatID\": 14,\n      \"Val\": 83,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 540,\n      \"StatID\": 15,\n      \"Val\": 56,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 540,\n      \"StatID\": 16,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 540,\n      \"StatID\": 17,\n      \"Val\": 61,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 541,\n      \"StatID\": 0,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 541,\n      \"StatID\": 1,\n      \"Val\": 75,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 541,\n      \"StatID\": 14,\n      \"Val\": 56,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 541,\n      \"StatID\": 15,\n      \"Val\": 81,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 541,\n      \"StatID\": 16,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 541,\n      \"StatID\": 17,\n      \"Val\": 69,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 542,\n      \"StatID\": 11,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 542,\n      \"StatID\": 22,\n      \"Val\": 80,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 542,\n      \"StatID\": 23,\n      \"Val\": 83,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 542,\n      \"StatID\": 24,\n      \"Val\": 69,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 543,\n      \"StatID\": 11,\n      \"Val\": 70,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 543,\n      \"StatID\": 22,\n      \"Val\": 73,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 543,\n      \"StatID\": 23,\n      \"Val\": 55,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 543,\n      \"StatID\": 24,\n      \"Val\": 83,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 544,\n      \"StatID\": 11,\n      \"Val\": 71,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 544,\n      \"StatID\": 22,\n      \"Val\": 62,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 544,\n      \"StatID\": 23,\n      \"Val\": 76,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 544,\n      \"StatID\": 24,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 545,\n      \"StatID\": 11,\n      \"Val\": 83,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 545,\n      \"StatID\": 22,\n      \"Val\": 60,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 545,\n      \"StatID\": 23,\n      \"Val\": 85,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 545,\n      \"StatID\": 24,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 546,\n      \"StatID\": 11,\n      \"Val\": 57,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 546,\n      \"StatID\": 22,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 546,\n      \"StatID\": 23,\n      \"Val\": 60,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 546,\n      \"StatID\": 24,\n      \"Val\": 73,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 547,\n      \"StatID\": 2,\n      \"Val\": 51,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 547,\n      \"StatID\": 3,\n      \"Val\": 50,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 547,\n      \"StatID\": 4,\n      \"Val\": 49,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 547,\n      \"StatID\": 5,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 547,\n      \"StatID\": 6,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 547,\n      \"StatID\": 7,\n      \"Val\": 67,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 547,\n      \"StatID\": 8,\n      \"Val\": 59,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 547,\n      \"StatID\": 9,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 547,\n      \"StatID\": 10,\n      \"Val\": 58,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 548,\n      \"StatID\": 2,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 548,\n      \"StatID\": 3,\n      \"Val\": 48,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 548,\n      \"StatID\": 4,\n      \"Val\": 67,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 548,\n      \"StatID\": 5,\n      \"Val\": 62,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 548,\n      \"StatID\": 6,\n      \"Val\": 47,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 548,\n      \"StatID\": 7,\n      \"Val\": 53,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 548,\n      \"StatID\": 8,\n      \"Val\": 50,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 548,\n      \"StatID\": 9,\n      \"Val\": 65,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 548,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 549,\n      \"StatID\": 2,\n      \"Val\": 62,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 549,\n      \"StatID\": 3,\n      \"Val\": 57,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 549,\n      \"StatID\": 4,\n      \"Val\": 51,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 549,\n      \"StatID\": 5,\n      \"Val\": 55,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 549,\n      \"StatID\": 6,\n      \"Val\": 58,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 549,\n      \"StatID\": 7,\n      \"Val\": 62,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 549,\n      \"StatID\": 8,\n      \"Val\": 60,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 549,\n      \"StatID\": 9,\n      \"Val\": 67,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 549,\n      \"StatID\": 10,\n      \"Val\": 65,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 550,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 550,\n      \"StatID\": 3,\n      \"Val\": 69,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 550,\n      \"StatID\": 4,\n      \"Val\": 57,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 550,\n      \"StatID\": 5,\n      \"Val\": 64,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 550,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 550,\n      \"StatID\": 7,\n      \"Val\": 48,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 550,\n      \"StatID\": 8,\n      \"Val\": 53,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 550,\n      \"StatID\": 9,\n      \"Val\": 51,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 550,\n      \"StatID\": 10,\n      \"Val\": 54,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 551,\n      \"StatID\": 2,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 551,\n      \"StatID\": 3,\n      \"Val\": 54,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 551,\n      \"StatID\": 4,\n      \"Val\": 51,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 551,\n      \"StatID\": 5,\n      \"Val\": 55,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 551,\n      \"StatID\": 6,\n      \"Val\": 69,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 551,\n      \"StatID\": 7,\n      \"Val\": 56,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 551,\n      \"StatID\": 8,\n      \"Val\": 63,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 551,\n      \"StatID\": 9,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 551,\n      \"StatID\": 10,\n      \"Val\": 70,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 554,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 554,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 554,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 554,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 554,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 554,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 554,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 554,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 554,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 555,\n      \"StatID\": 13,\n      \"Val\": 67\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 555,\n      \"StatID\": 25,\n      \"Val\": 67\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 555,\n      \"StatID\": 43,\n      \"Val\": 67\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 556,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 556,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 556,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 557,\n      \"StatID\": 11,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 557,\n      \"StatID\": 22,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 557,\n      \"StatID\": 23,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 557,\n      \"StatID\": 24,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 567,\n      \"StatID\": 0,\n      \"Val\": 56,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 567,\n      \"StatID\": 1,\n      \"Val\": 73,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 567,\n      \"StatID\": 14,\n      \"Val\": 64,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 567,\n      \"StatID\": 15,\n      \"Val\": 82,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 567,\n      \"StatID\": 16,\n      \"Val\": 77,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 567,\n      \"StatID\": 17,\n      \"Val\": 82,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 568,\n      \"StatID\": 19,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 568,\n      \"StatID\": 20,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 568,\n      \"StatID\": 26,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 568,\n      \"StatID\": 27,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 568,\n      \"StatID\": 28,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 568,\n      \"StatID\": 29,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 568,\n      \"StatID\": 30,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 568,\n      \"StatID\": 31,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 146,\n      \"StatID\": 13,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 153,\n      \"StatID\": 25,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 173,\n      \"StatID\": 43,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 178,\n      \"StatID\": 13,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 181,\n      \"StatID\": 13,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 312,\n      \"StatID\": 23,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 436,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 437,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 438,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 608,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 608,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 608,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 608,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 608,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 608,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 608,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 608,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 608,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 622,\n      \"StatID\": 13,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 622,\n      \"StatID\": 25,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 622,\n      \"StatID\": 43,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 623,\n      \"StatID\": 13,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 623,\n      \"StatID\": 25,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 623,\n      \"StatID\": 43,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 624,\n      \"StatID\": 13,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 624,\n      \"StatID\": 25,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 624,\n      \"StatID\": 43,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 625,\n      \"StatID\": 13,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 625,\n      \"StatID\": 25,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 625,\n      \"StatID\": 43,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 626,\n      \"StatID\": 13,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 626,\n      \"StatID\": 25,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 626,\n      \"StatID\": 43,\n      \"Val\": 81\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 628,\n      \"StatID\": 0,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 628,\n      \"StatID\": 1,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 628,\n      \"StatID\": 14,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 628,\n      \"StatID\": 15,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 628,\n      \"StatID\": 16,\n      \"Val\": 91\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 628,\n      \"StatID\": 17,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 630,\n      \"StatID\": 0,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 630,\n      \"StatID\": 1,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 630,\n      \"StatID\": 14,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 630,\n      \"StatID\": 15,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 630,\n      \"StatID\": 16,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 630,\n      \"StatID\": 17,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 633,\n      \"StatID\": 0,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 633,\n      \"StatID\": 1,\n      \"Val\": 81\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 633,\n      \"StatID\": 14,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 633,\n      \"StatID\": 15,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 633,\n      \"StatID\": 16,\n      \"Val\": 81\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 633,\n      \"StatID\": 17,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 635,\n      \"StatID\": 19,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 635,\n      \"StatID\": 20,\n      \"Val\": 92\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 635,\n      \"StatID\": 26,\n      \"Val\": 92\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 635,\n      \"StatID\": 27,\n      \"Val\": 91\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 635,\n      \"StatID\": 28,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 635,\n      \"StatID\": 29,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 635,\n      \"StatID\": 30,\n      \"Val\": 91\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 635,\n      \"StatID\": 31,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 636,\n      \"StatID\": 19,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 636,\n      \"StatID\": 20,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 636,\n      \"StatID\": 26,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 636,\n      \"StatID\": 27,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 636,\n      \"StatID\": 28,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 636,\n      \"StatID\": 29,\n      \"Val\": 81\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 636,\n      \"StatID\": 30,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 636,\n      \"StatID\": 31,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 637,\n      \"StatID\": 19,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 637,\n      \"StatID\": 20,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 637,\n      \"StatID\": 26,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 637,\n      \"StatID\": 27,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 637,\n      \"StatID\": 28,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 637,\n      \"StatID\": 29,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 637,\n      \"StatID\": 30,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 637,\n      \"StatID\": 31,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 638,\n      \"StatID\": 11,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 638,\n      \"StatID\": 22,\n      \"Val\": 92\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 638,\n      \"StatID\": 23,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 638,\n      \"StatID\": 24,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 639,\n      \"StatID\": 11,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 639,\n      \"StatID\": 22,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 639,\n      \"StatID\": 23,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 639,\n      \"StatID\": 24,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 640,\n      \"StatID\": 11,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 640,\n      \"StatID\": 22,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 640,\n      \"StatID\": 23,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 640,\n      \"StatID\": 24,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 641,\n      \"StatID\": 11,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 641,\n      \"StatID\": 22,\n      \"Val\": 93\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 641,\n      \"StatID\": 23,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 641,\n      \"StatID\": 24,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 642,\n      \"StatID\": 0,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 642,\n      \"StatID\": 1,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 642,\n      \"StatID\": 14,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 642,\n      \"StatID\": 15,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 642,\n      \"StatID\": 16,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 642,\n      \"StatID\": 17,\n      \"Val\": 91\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 643,\n      \"StatID\": 13,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 643,\n      \"StatID\": 25,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 643,\n      \"StatID\": 43,\n      \"Val\": 81\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 644,\n      \"StatID\": 13,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 644,\n      \"StatID\": 25,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 644,\n      \"StatID\": 43,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 40,\n      \"StatID\": 19,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 33,\n      \"StatID\": 0,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 58,\n      \"StatID\": 13,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 119,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 158,\n      \"StatID\": 43,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 159,\n      \"StatID\": 13,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 193,\n      \"StatID\": 13,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 313,\n      \"StatID\": 24,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 341,\n      \"StatID\": 13,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 361,\n      \"StatID\": 25,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 386,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 388,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 421,\n      \"StatID\": 13,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 427,\n      \"StatID\": 13,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 431,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 434,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 677,\n      \"StatID\": 19,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 677,\n      \"StatID\": 20,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 677,\n      \"StatID\": 26,\n      \"Val\": 92\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 677,\n      \"StatID\": 27,\n      \"Val\": 91\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 677,\n      \"StatID\": 28,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 677,\n      \"StatID\": 29,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 677,\n      \"StatID\": 30,\n      \"Val\": 91\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 677,\n      \"StatID\": 31,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 678,\n      \"StatID\": 11,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 678,\n      \"StatID\": 22,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 678,\n      \"StatID\": 23,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 678,\n      \"StatID\": 24,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 679,\n      \"StatID\": 11,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 679,\n      \"StatID\": 22,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 679,\n      \"StatID\": 23,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 679,\n      \"StatID\": 24,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 680,\n      \"StatID\": 13,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 680,\n      \"StatID\": 25,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 680,\n      \"StatID\": 43,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 681,\n      \"StatID\": 0,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 681,\n      \"StatID\": 1,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 681,\n      \"StatID\": 14,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 681,\n      \"StatID\": 15,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 681,\n      \"StatID\": 16,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 681,\n      \"StatID\": 17,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 682,\n      \"StatID\": 13,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 682,\n      \"StatID\": 25,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 682,\n      \"StatID\": 43,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 683,\n      \"StatID\": 0,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 683,\n      \"StatID\": 1,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 683,\n      \"StatID\": 14,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 683,\n      \"StatID\": 15,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 683,\n      \"StatID\": 16,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 683,\n      \"StatID\": 17,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 684,\n      \"StatID\": 13,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 684,\n      \"StatID\": 25,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 684,\n      \"StatID\": 43,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 395,\n      \"StatID\": 13,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 395,\n      \"StatID\": 25,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 395,\n      \"StatID\": 43,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 338,\n      \"StatID\": 13,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 338,\n      \"StatID\": 25,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 338,\n      \"StatID\": 43,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 156,\n      \"StatID\": 13,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 156,\n      \"StatID\": 25,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 156,\n      \"StatID\": 43,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 145,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 145,\n      \"StatID\": 25,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 145,\n      \"StatID\": 43,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 685,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 685,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 685,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 685,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 685,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 685,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 685,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 685,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 685,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 686,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 686,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 686,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 686,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 686,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 686,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 686,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 686,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 686,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 687,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 687,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 687,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 687,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 687,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 687,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 687,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 687,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 687,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 688,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 688,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 688,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 688,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 688,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 688,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 688,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 688,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 688,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 689,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 689,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 689,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 689,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 689,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 689,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 689,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 689,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 689,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 690,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 690,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 690,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 691,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 691,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 691,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 692,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 692,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 692,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 693,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 693,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 693,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 694,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 694,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 694,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 695,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 695,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 695,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 696,\n      \"StatID\": 0,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 696,\n      \"StatID\": 1,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 696,\n      \"StatID\": 14,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 696,\n      \"StatID\": 15,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 696,\n      \"StatID\": 16,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 696,\n      \"StatID\": 17,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 697,\n      \"StatID\": 11,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 697,\n      \"StatID\": 22,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 697,\n      \"StatID\": 23,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 697,\n      \"StatID\": 24,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 698,\n      \"StatID\": 11,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 698,\n      \"StatID\": 22,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 698,\n      \"StatID\": 23,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 698,\n      \"StatID\": 24,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 699,\n      \"StatID\": 11,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 699,\n      \"StatID\": 22,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 699,\n      \"StatID\": 23,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 699,\n      \"StatID\": 24,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 700,\n      \"StatID\": 0,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 700,\n      \"StatID\": 1,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 700,\n      \"StatID\": 14,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 700,\n      \"StatID\": 15,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 700,\n      \"StatID\": 16,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 700,\n      \"StatID\": 17,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 701,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 701,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 701,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 702,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 702,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 702,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 703,\n      \"StatID\": 19,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 703,\n      \"StatID\": 20,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 703,\n      \"StatID\": 26,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 703,\n      \"StatID\": 27,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 703,\n      \"StatID\": 28,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 703,\n      \"StatID\": 29,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 703,\n      \"StatID\": 30,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 703,\n      \"StatID\": 31,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 704,\n      \"StatID\": 11,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 704,\n      \"StatID\": 22,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 704,\n      \"StatID\": 23,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 704,\n      \"StatID\": 24,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 705,\n      \"StatID\": 11,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 705,\n      \"StatID\": 22,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 705,\n      \"StatID\": 23,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 705,\n      \"StatID\": 24,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 706,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 706,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 706,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 707,\n      \"StatID\": 0,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 707,\n      \"StatID\": 1,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 707,\n      \"StatID\": 14,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 707,\n      \"StatID\": 15,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 707,\n      \"StatID\": 16,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 707,\n      \"StatID\": 17,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 708,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 708,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 708,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 709,\n      \"StatID\": 0,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 709,\n      \"StatID\": 1,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 709,\n      \"StatID\": 14,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 709,\n      \"StatID\": 15,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 709,\n      \"StatID\": 16,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 709,\n      \"StatID\": 17,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 710,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 710,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 710,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 711,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 711,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 711,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 711,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 711,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 711,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 711,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 711,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 711,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 712,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 712,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 712,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 712,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 712,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 712,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 712,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 712,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 712,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 713,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 713,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 713,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 713,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 713,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 713,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 713,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 713,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 713,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 714,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 714,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 714,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 714,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 714,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 714,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 714,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 714,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 714,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 715,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 715,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 715,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 715,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 715,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 715,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 715,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 715,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 715,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 716,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 716,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 716,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 716,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 716,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 716,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 716,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 716,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 716,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 43,\n      \"StatID\": 26,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 10,\n      \"StatID\": 2,\n      \"Val\": 96\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 10,\n      \"StatID\": 3,\n      \"Val\": 94\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 10,\n      \"StatID\": 4,\n      \"Val\": 95\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 10,\n      \"StatID\": 5,\n      \"Val\": 93\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 10,\n      \"StatID\": 6,\n      \"Val\": 92\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 10,\n      \"StatID\": 7,\n      \"Val\": 92\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 10,\n      \"StatID\": 8,\n      \"Val\": 93\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 10,\n      \"StatID\": 9,\n      \"Val\": 95\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 10,\n      \"StatID\": 10,\n      \"Val\": 92\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 2,\n      \"StatID\": 2,\n      \"Val\": 93\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 2,\n      \"StatID\": 3,\n      \"Val\": 95\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 2,\n      \"StatID\": 4,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 2,\n      \"StatID\": 5,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 2,\n      \"StatID\": 6,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 2,\n      \"StatID\": 7,\n      \"Val\": 92\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 2,\n      \"StatID\": 8,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 2,\n      \"StatID\": 9,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 2,\n      \"StatID\": 10,\n      \"Val\": 88,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 23,\n      \"StatID\": 2,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 23,\n      \"StatID\": 3,\n      \"Val\": 94\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 23,\n      \"StatID\": 4,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 23,\n      \"StatID\": 5,\n      \"Val\": 86,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 23,\n      \"StatID\": 6,\n      \"Val\": 91\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 23,\n      \"StatID\": 7,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 23,\n      \"StatID\": 8,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 23,\n      \"StatID\": 9,\n      \"Val\": 93,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 23,\n      \"StatID\": 10,\n      \"Val\": 94,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 12,\n      \"StatID\": 2,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 12,\n      \"StatID\": 3,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 12,\n      \"StatID\": 4,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 12,\n      \"StatID\": 5,\n      \"Val\": 93\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 12,\n      \"StatID\": 6,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 12,\n      \"StatID\": 7,\n      \"Val\": 93\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 12,\n      \"StatID\": 8,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 12,\n      \"StatID\": 9,\n      \"Val\": 91\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 12,\n      \"StatID\": 10,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 77,\n      \"StatID\": 2,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 77,\n      \"StatID\": 3,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 77,\n      \"StatID\": 4,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 77,\n      \"StatID\": 5,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 77,\n      \"StatID\": 6,\n      \"Val\": 91\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 77,\n      \"StatID\": 7,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 77,\n      \"StatID\": 8,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 77,\n      \"StatID\": 9,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 77,\n      \"StatID\": 10,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 102,\n      \"StatID\": 2,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 102,\n      \"StatID\": 3,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 102,\n      \"StatID\": 4,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 102,\n      \"StatID\": 5,\n      \"Val\": 91\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 102,\n      \"StatID\": 6,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 102,\n      \"StatID\": 7,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 102,\n      \"StatID\": 8,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 102,\n      \"StatID\": 9,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 102,\n      \"StatID\": 10,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 1,\n      \"StatID\": 2,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 1,\n      \"StatID\": 3,\n      \"Val\": 87,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 1,\n      \"StatID\": 4,\n      \"Val\": 89\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 1,\n      \"StatID\": 5,\n      \"Val\": 94\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 1,\n      \"StatID\": 6,\n      \"Val\": 93\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 1,\n      \"StatID\": 7,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 1,\n      \"StatID\": 8,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 1,\n      \"StatID\": 9,\n      \"Val\": 88,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 1,\n      \"StatID\": 10,\n      \"Val\": 89,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 11,\n      \"StatID\": 2,\n      \"Val\": 84,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 11,\n      \"StatID\": 3,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 11,\n      \"StatID\": 4,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 11,\n      \"StatID\": 5,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 11,\n      \"StatID\": 6,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 11,\n      \"StatID\": 7,\n      \"Val\": 83,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 11,\n      \"StatID\": 8,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 11,\n      \"StatID\": 9,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 11,\n      \"StatID\": 10,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 15,\n      \"StatID\": 2,\n      \"Val\": 89,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 15,\n      \"StatID\": 3,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 15,\n      \"StatID\": 4,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 15,\n      \"StatID\": 5,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 15,\n      \"StatID\": 6,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 15,\n      \"StatID\": 7,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 15,\n      \"StatID\": 8,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 15,\n      \"StatID\": 9,\n      \"Val\": 84,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 15,\n      \"StatID\": 10,\n      \"Val\": 84,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 3,\n      \"StatID\": 2,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 3,\n      \"StatID\": 3,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 3,\n      \"StatID\": 4,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 3,\n      \"StatID\": 5,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 3,\n      \"StatID\": 6,\n      \"Val\": 90\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 3,\n      \"StatID\": 7,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 3,\n      \"StatID\": 8,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 3,\n      \"StatID\": 9,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 3,\n      \"StatID\": 10,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 83,\n      \"StatID\": 2,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 83,\n      \"StatID\": 3,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 83,\n      \"StatID\": 4,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 83,\n      \"StatID\": 5,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 83,\n      \"StatID\": 6,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 83,\n      \"StatID\": 7,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 83,\n      \"StatID\": 8,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 83,\n      \"StatID\": 9,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 83,\n      \"StatID\": 10,\n      \"Val\": 87,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 376,\n      \"StatID\": 2,\n      \"Val\": 90,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 376,\n      \"StatID\": 3,\n      \"Val\": 88,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 376,\n      \"StatID\": 4,\n      \"Val\": 84,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 376,\n      \"StatID\": 5,\n      \"Val\": 80,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 376,\n      \"StatID\": 6,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 376,\n      \"StatID\": 7,\n      \"Val\": 85,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 376,\n      \"StatID\": 8,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 376,\n      \"StatID\": 9,\n      \"Val\": 91,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 376,\n      \"StatID\": 10,\n      \"Val\": 84,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 17,\n      \"StatID\": 2,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 17,\n      \"StatID\": 3,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 17,\n      \"StatID\": 4,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 17,\n      \"StatID\": 5,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 17,\n      \"StatID\": 6,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 17,\n      \"StatID\": 7,\n      \"Val\": 81\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 17,\n      \"StatID\": 8,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 17,\n      \"StatID\": 9,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 17,\n      \"StatID\": 10,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 144,\n      \"StatID\": 2,\n      \"Val\": 88,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 144,\n      \"StatID\": 3,\n      \"Val\": 85,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 144,\n      \"StatID\": 4,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 144,\n      \"StatID\": 5,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 144,\n      \"StatID\": 6,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 144,\n      \"StatID\": 7,\n      \"Val\": 89,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 144,\n      \"StatID\": 8,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 144,\n      \"StatID\": 9,\n      \"Val\": 90,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 144,\n      \"StatID\": 10,\n      \"Val\": 81,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 8,\n      \"StatID\": 2,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 8,\n      \"StatID\": 3,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 8,\n      \"StatID\": 4,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 8,\n      \"StatID\": 5,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 8,\n      \"StatID\": 6,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 8,\n      \"StatID\": 7,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 8,\n      \"StatID\": 8,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 8,\n      \"StatID\": 9,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 8,\n      \"StatID\": 10,\n      \"Val\": 87\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 81,\n      \"StatID\": 2,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 81,\n      \"StatID\": 3,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 81,\n      \"StatID\": 4,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 81,\n      \"StatID\": 5,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 81,\n      \"StatID\": 6,\n      \"Val\": 84\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 81,\n      \"StatID\": 7,\n      \"Val\": 86\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 81,\n      \"StatID\": 8,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 81,\n      \"StatID\": 9,\n      \"Val\": 85\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 81,\n      \"StatID\": 10,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 14,\n      \"StatID\": 2,\n      \"Val\": 82,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 14,\n      \"StatID\": 3,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 14,\n      \"StatID\": 4,\n      \"Val\": 82,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 14,\n      \"StatID\": 5,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 14,\n      \"StatID\": 6,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 14,\n      \"StatID\": 7,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 14,\n      \"StatID\": 8,\n      \"Val\": 88\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 14,\n      \"StatID\": 9,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 14,\n      \"StatID\": 10,\n      \"Val\": 81,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 142,\n      \"StatID\": 2,\n      \"Val\": 86,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 142,\n      \"StatID\": 3,\n      \"Val\": 84,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 142,\n      \"StatID\": 4,\n      \"Val\": 84,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 142,\n      \"StatID\": 5,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 142,\n      \"StatID\": 6,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 142,\n      \"StatID\": 7,\n      \"Val\": 88,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 142,\n      \"StatID\": 8,\n      \"Val\": 81,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 142,\n      \"StatID\": 9,\n      \"Val\": 85,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 142,\n      \"StatID\": 10,\n      \"Val\": 83,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 279,\n      \"StatID\": 2,\n      \"Val\": 83,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 279,\n      \"StatID\": 3,\n      \"Val\": 83,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 279,\n      \"StatID\": 4,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 279,\n      \"StatID\": 5,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 279,\n      \"StatID\": 6,\n      \"Val\": 79,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 279,\n      \"StatID\": 7,\n      \"Val\": 79,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 279,\n      \"StatID\": 8,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 279,\n      \"StatID\": 9,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 279,\n      \"StatID\": 10,\n      \"Val\": 85,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 95,\n      \"StatID\": 2,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 95,\n      \"StatID\": 3,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 95,\n      \"StatID\": 4,\n      \"Val\": 81,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 95,\n      \"StatID\": 5,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 95,\n      \"StatID\": 6,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 95,\n      \"StatID\": 7,\n      \"Val\": 87,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 95,\n      \"StatID\": 8,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 95,\n      \"StatID\": 9,\n      \"Val\": 84,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 95,\n      \"StatID\": 10,\n      \"Val\": 81,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 18,\n      \"StatID\": 2,\n      \"Val\": 81\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 18,\n      \"StatID\": 3,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 18,\n      \"StatID\": 4,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 18,\n      \"StatID\": 5,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 18,\n      \"StatID\": 6,\n      \"Val\": 83\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 18,\n      \"StatID\": 7,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 18,\n      \"StatID\": 8,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 18,\n      \"StatID\": 9,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 18,\n      \"StatID\": 10,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 248,\n      \"StatID\": 2,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 248,\n      \"StatID\": 3,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 248,\n      \"StatID\": 4,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 248,\n      \"StatID\": 5,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 248,\n      \"StatID\": 6,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 248,\n      \"StatID\": 7,\n      \"Val\": 85,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 248,\n      \"StatID\": 8,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 248,\n      \"StatID\": 9,\n      \"Val\": 84,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 248,\n      \"StatID\": 10,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 255,\n      \"StatID\": 2,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 255,\n      \"StatID\": 3,\n      \"Val\": 81\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 255,\n      \"StatID\": 4,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 255,\n      \"StatID\": 5,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 255,\n      \"StatID\": 6,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 255,\n      \"StatID\": 7,\n      \"Val\": 83,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 255,\n      \"StatID\": 8,\n      \"Val\": 82,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 255,\n      \"StatID\": 9,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 255,\n      \"StatID\": 10,\n      \"Val\": 77,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 20,\n      \"StatID\": 2,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 20,\n      \"StatID\": 3,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 20,\n      \"StatID\": 4,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 20,\n      \"StatID\": 5,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 20,\n      \"StatID\": 6,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 20,\n      \"StatID\": 7,\n      \"Val\": 76,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 20,\n      \"StatID\": 8,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 20,\n      \"StatID\": 9,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 20,\n      \"StatID\": 10,\n      \"Val\": 80,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 285,\n      \"StatID\": 2,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 285,\n      \"StatID\": 3,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 285,\n      \"StatID\": 4,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 285,\n      \"StatID\": 5,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 285,\n      \"StatID\": 6,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 285,\n      \"StatID\": 7,\n      \"Val\": 84,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 285,\n      \"StatID\": 8,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 285,\n      \"StatID\": 9,\n      \"Val\": 81\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 285,\n      \"StatID\": 10,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 87,\n      \"StatID\": 2,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 87,\n      \"StatID\": 3,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 87,\n      \"StatID\": 4,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 87,\n      \"StatID\": 5,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 87,\n      \"StatID\": 6,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 87,\n      \"StatID\": 7,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 87,\n      \"StatID\": 8,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 87,\n      \"StatID\": 9,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 87,\n      \"StatID\": 10,\n      \"Val\": 79,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 106,\n      \"StatID\": 2,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 106,\n      \"StatID\": 3,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 106,\n      \"StatID\": 4,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 106,\n      \"StatID\": 5,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 106,\n      \"StatID\": 6,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 106,\n      \"StatID\": 7,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 106,\n      \"StatID\": 8,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 106,\n      \"StatID\": 9,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 106,\n      \"StatID\": 10,\n      \"Val\": 79,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 105,\n      \"StatID\": 2,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 105,\n      \"StatID\": 3,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 105,\n      \"StatID\": 4,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 105,\n      \"StatID\": 5,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 105,\n      \"StatID\": 6,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 105,\n      \"StatID\": 7,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 105,\n      \"StatID\": 8,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 105,\n      \"StatID\": 9,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 105,\n      \"StatID\": 10,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 281,\n      \"StatID\": 2,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 281,\n      \"StatID\": 3,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 281,\n      \"StatID\": 4,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 281,\n      \"StatID\": 5,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 281,\n      \"StatID\": 6,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 281,\n      \"StatID\": 7,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 281,\n      \"StatID\": 8,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 281,\n      \"StatID\": 9,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 281,\n      \"StatID\": 10,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 120,\n      \"StatID\": 2,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 120,\n      \"StatID\": 3,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 120,\n      \"StatID\": 4,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 120,\n      \"StatID\": 5,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 120,\n      \"StatID\": 6,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 120,\n      \"StatID\": 7,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 120,\n      \"StatID\": 8,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 120,\n      \"StatID\": 9,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 120,\n      \"StatID\": 10,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 645,\n      \"StatID\": 2,\n      \"Val\": 74,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 645,\n      \"StatID\": 3,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 645,\n      \"StatID\": 4,\n      \"Val\": 69,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 645,\n      \"StatID\": 5,\n      \"Val\": 69,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 645,\n      \"StatID\": 6,\n      \"Val\": 73,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 645,\n      \"StatID\": 7,\n      \"Val\": 80,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 645,\n      \"StatID\": 8,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 645,\n      \"StatID\": 9,\n      \"Val\": 76,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 645,\n      \"StatID\": 10,\n      \"Val\": 69,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 76,\n      \"StatID\": 2,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 76,\n      \"StatID\": 3,\n      \"Val\": 79,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 76,\n      \"StatID\": 4,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 76,\n      \"StatID\": 5,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 76,\n      \"StatID\": 6,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 76,\n      \"StatID\": 7,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 76,\n      \"StatID\": 8,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 76,\n      \"StatID\": 9,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 76,\n      \"StatID\": 10,\n      \"Val\": 78,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 373,\n      \"StatID\": 2,\n      \"Val\": 80,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 373,\n      \"StatID\": 3,\n      \"Val\": 79,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 373,\n      \"StatID\": 4,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 373,\n      \"StatID\": 5,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 373,\n      \"StatID\": 6,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 373,\n      \"StatID\": 7,\n      \"Val\": 80,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 373,\n      \"StatID\": 8,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 373,\n      \"StatID\": 9,\n      \"Val\": 83,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 373,\n      \"StatID\": 10,\n      \"Val\": 74,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 107,\n      \"StatID\": 2,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 107,\n      \"StatID\": 3,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 107,\n      \"StatID\": 4,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 107,\n      \"StatID\": 5,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 107,\n      \"StatID\": 6,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 107,\n      \"StatID\": 7,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 107,\n      \"StatID\": 8,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 107,\n      \"StatID\": 9,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 107,\n      \"StatID\": 10,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 135,\n      \"StatID\": 2,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 135,\n      \"StatID\": 3,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 135,\n      \"StatID\": 4,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 135,\n      \"StatID\": 5,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 135,\n      \"StatID\": 6,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 135,\n      \"StatID\": 7,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 135,\n      \"StatID\": 8,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 135,\n      \"StatID\": 9,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 135,\n      \"StatID\": 10,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 22,\n      \"StatID\": 2,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 22,\n      \"StatID\": 3,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 22,\n      \"StatID\": 4,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 22,\n      \"StatID\": 5,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 22,\n      \"StatID\": 6,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 22,\n      \"StatID\": 7,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 22,\n      \"StatID\": 8,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 22,\n      \"StatID\": 9,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 22,\n      \"StatID\": 10,\n      \"Val\": 80,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 398,\n      \"StatID\": 2,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 398,\n      \"StatID\": 3,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 398,\n      \"StatID\": 4,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 398,\n      \"StatID\": 5,\n      \"Val\": 81\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 398,\n      \"StatID\": 6,\n      \"Val\": 81\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 398,\n      \"StatID\": 7,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 398,\n      \"StatID\": 8,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 398,\n      \"StatID\": 9,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 398,\n      \"StatID\": 10,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 74,\n      \"StatID\": 2,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 74,\n      \"StatID\": 3,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 74,\n      \"StatID\": 4,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 74,\n      \"StatID\": 5,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 74,\n      \"StatID\": 6,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 74,\n      \"StatID\": 7,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 74,\n      \"StatID\": 8,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 74,\n      \"StatID\": 9,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 74,\n      \"StatID\": 10,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 121,\n      \"StatID\": 2,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 121,\n      \"StatID\": 3,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 121,\n      \"StatID\": 4,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 121,\n      \"StatID\": 5,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 121,\n      \"StatID\": 6,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 121,\n      \"StatID\": 7,\n      \"Val\": 82\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 121,\n      \"StatID\": 8,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 121,\n      \"StatID\": 9,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 121,\n      \"StatID\": 10,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 289,\n      \"StatID\": 2,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 289,\n      \"StatID\": 3,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 289,\n      \"StatID\": 4,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 289,\n      \"StatID\": 5,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 289,\n      \"StatID\": 6,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 289,\n      \"StatID\": 7,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 289,\n      \"StatID\": 8,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 289,\n      \"StatID\": 9,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 289,\n      \"StatID\": 10,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 82,\n      \"StatID\": 2,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 82,\n      \"StatID\": 3,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 82,\n      \"StatID\": 4,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 82,\n      \"StatID\": 5,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 82,\n      \"StatID\": 6,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 82,\n      \"StatID\": 7,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 82,\n      \"StatID\": 8,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 82,\n      \"StatID\": 9,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 82,\n      \"StatID\": 10,\n      \"Val\": 78,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 604,\n      \"StatID\": 2,\n      \"Val\": 79,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 604,\n      \"StatID\": 3,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 604,\n      \"StatID\": 4,\n      \"Val\": 69,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 604,\n      \"StatID\": 5,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 604,\n      \"StatID\": 6,\n      \"Val\": 73,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 604,\n      \"StatID\": 7,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 604,\n      \"StatID\": 8,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 604,\n      \"StatID\": 9,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 604,\n      \"StatID\": 10,\n      \"Val\": 69,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 127,\n      \"StatID\": 2,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 127,\n      \"StatID\": 3,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 127,\n      \"StatID\": 4,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 127,\n      \"StatID\": 5,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 127,\n      \"StatID\": 6,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 127,\n      \"StatID\": 7,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 127,\n      \"StatID\": 8,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 127,\n      \"StatID\": 9,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 127,\n      \"StatID\": 10,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 130,\n      \"StatID\": 2,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 130,\n      \"StatID\": 3,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 130,\n      \"StatID\": 4,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 130,\n      \"StatID\": 5,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 130,\n      \"StatID\": 6,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 130,\n      \"StatID\": 7,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 130,\n      \"StatID\": 8,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 130,\n      \"StatID\": 9,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 130,\n      \"StatID\": 10,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 264,\n      \"StatID\": 2,\n      \"Val\": 70\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 264,\n      \"StatID\": 3,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 264,\n      \"StatID\": 4,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 264,\n      \"StatID\": 5,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 264,\n      \"StatID\": 6,\n      \"Val\": 81\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 264,\n      \"StatID\": 7,\n      \"Val\": 67\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 264,\n      \"StatID\": 8,\n      \"Val\": 69\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 264,\n      \"StatID\": 9,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 264,\n      \"StatID\": 10,\n      \"Val\": 78,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 399,\n      \"StatID\": 2,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 399,\n      \"StatID\": 3,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 399,\n      \"StatID\": 4,\n      \"Val\": 67,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 399,\n      \"StatID\": 5,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 399,\n      \"StatID\": 6,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 399,\n      \"StatID\": 7,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 399,\n      \"StatID\": 8,\n      \"Val\": 70\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 399,\n      \"StatID\": 9,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 399,\n      \"StatID\": 10,\n      \"Val\": 67,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 140,\n      \"StatID\": 2,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 140,\n      \"StatID\": 3,\n      \"Val\": 80,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 140,\n      \"StatID\": 4,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 140,\n      \"StatID\": 5,\n      \"Val\": 69\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 140,\n      \"StatID\": 6,\n      \"Val\": 70\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 140,\n      \"StatID\": 7,\n      \"Val\": 69\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 140,\n      \"StatID\": 8,\n      \"Val\": 69\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 140,\n      \"StatID\": 9,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 140,\n      \"StatID\": 10,\n      \"Val\": 78,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 242,\n      \"StatID\": 2,\n      \"Val\": 76,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 242,\n      \"StatID\": 3,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 242,\n      \"StatID\": 4,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 242,\n      \"StatID\": 5,\n      \"Val\": 69\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 242,\n      \"StatID\": 6,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 242,\n      \"StatID\": 7,\n      \"Val\": 80,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 242,\n      \"StatID\": 8,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 242,\n      \"StatID\": 9,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 242,\n      \"StatID\": 10,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 99,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 99,\n      \"StatID\": 3,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 99,\n      \"StatID\": 4,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 99,\n      \"StatID\": 5,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 99,\n      \"StatID\": 6,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 99,\n      \"StatID\": 7,\n      \"Val\": 69\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 99,\n      \"StatID\": 8,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 99,\n      \"StatID\": 9,\n      \"Val\": 70\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 99,\n      \"StatID\": 10,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 322,\n      \"StatID\": 2,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 322,\n      \"StatID\": 3,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 322,\n      \"StatID\": 4,\n      \"Val\": 70\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 322,\n      \"StatID\": 5,\n      \"Val\": 67\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 322,\n      \"StatID\": 6,\n      \"Val\": 70\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 322,\n      \"StatID\": 7,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 322,\n      \"StatID\": 8,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 322,\n      \"StatID\": 9,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 322,\n      \"StatID\": 10,\n      \"Val\": 69\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 117,\n      \"StatID\": 2,\n      \"Val\": 70\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 117,\n      \"StatID\": 3,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 117,\n      \"StatID\": 4,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 117,\n      \"StatID\": 5,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 117,\n      \"StatID\": 6,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 117,\n      \"StatID\": 7,\n      \"Val\": 69\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 117,\n      \"StatID\": 8,\n      \"Val\": 70\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 117,\n      \"StatID\": 9,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 117,\n      \"StatID\": 10,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 245,\n      \"StatID\": 2,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 245,\n      \"StatID\": 3,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 245,\n      \"StatID\": 4,\n      \"Val\": 70,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 245,\n      \"StatID\": 5,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 245,\n      \"StatID\": 6,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 245,\n      \"StatID\": 7,\n      \"Val\": 82,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 245,\n      \"StatID\": 8,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 245,\n      \"StatID\": 9,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 245,\n      \"StatID\": 10,\n      \"Val\": 69,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 282,\n      \"StatID\": 2,\n      \"Val\": 76,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 282,\n      \"StatID\": 3,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 282,\n      \"StatID\": 4,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 282,\n      \"StatID\": 5,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 282,\n      \"StatID\": 6,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 282,\n      \"StatID\": 7,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 282,\n      \"StatID\": 8,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 282,\n      \"StatID\": 9,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 282,\n      \"StatID\": 10,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 88,\n      \"StatID\": 2,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 88,\n      \"StatID\": 3,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 88,\n      \"StatID\": 4,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 88,\n      \"StatID\": 5,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 88,\n      \"StatID\": 6,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 88,\n      \"StatID\": 7,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 88,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 88,\n      \"StatID\": 9,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 88,\n      \"StatID\": 10,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 263,\n      \"StatID\": 2,\n      \"Val\": 70\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 263,\n      \"StatID\": 3,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 263,\n      \"StatID\": 4,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 263,\n      \"StatID\": 5,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 263,\n      \"StatID\": 6,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 263,\n      \"StatID\": 7,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 263,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 263,\n      \"StatID\": 9,\n      \"Val\": 69\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 263,\n      \"StatID\": 10,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 286,\n      \"StatID\": 2,\n      \"Val\": 80,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 286,\n      \"StatID\": 3,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 286,\n      \"StatID\": 4,\n      \"Val\": 67,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 286,\n      \"StatID\": 5,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 286,\n      \"StatID\": 6,\n      \"Val\": 70,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 286,\n      \"StatID\": 7,\n      \"Val\": 82,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 286,\n      \"StatID\": 8,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 286,\n      \"StatID\": 9,\n      \"Val\": 76,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 286,\n      \"StatID\": 10,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 80,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 80,\n      \"StatID\": 3,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 80,\n      \"StatID\": 4,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 80,\n      \"StatID\": 5,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 80,\n      \"StatID\": 6,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 80,\n      \"StatID\": 7,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 80,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 80,\n      \"StatID\": 9,\n      \"Val\": 69\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 80,\n      \"StatID\": 10,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 603,\n      \"StatID\": 2,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 603,\n      \"StatID\": 3,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 603,\n      \"StatID\": 4,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 603,\n      \"StatID\": 5,\n      \"Val\": 78\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 603,\n      \"StatID\": 6,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 603,\n      \"StatID\": 7,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 603,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 603,\n      \"StatID\": 9,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 603,\n      \"StatID\": 10,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 280,\n      \"StatID\": 2,\n      \"Val\": 79\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 280,\n      \"StatID\": 3,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 280,\n      \"StatID\": 4,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 280,\n      \"StatID\": 5,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 280,\n      \"StatID\": 6,\n      \"Val\": 69\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 280,\n      \"StatID\": 7,\n      \"Val\": 80\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 280,\n      \"StatID\": 8,\n      \"Val\": 69\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 280,\n      \"StatID\": 9,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 280,\n      \"StatID\": 10,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 378,\n      \"StatID\": 2,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 378,\n      \"StatID\": 3,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 378,\n      \"StatID\": 4,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 378,\n      \"StatID\": 5,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 378,\n      \"StatID\": 6,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 378,\n      \"StatID\": 7,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 378,\n      \"StatID\": 8,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 378,\n      \"StatID\": 9,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 378,\n      \"StatID\": 10,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 649,\n      \"StatID\": 2,\n      \"Val\": 78,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 649,\n      \"StatID\": 3,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 649,\n      \"StatID\": 4,\n      \"Val\": 64,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 649,\n      \"StatID\": 5,\n      \"Val\": 63,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 649,\n      \"StatID\": 6,\n      \"Val\": 67,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 649,\n      \"StatID\": 7,\n      \"Val\": 75,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 649,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 649,\n      \"StatID\": 9,\n      \"Val\": 75,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 649,\n      \"StatID\": 10,\n      \"Val\": 64,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 132,\n      \"StatID\": 2,\n      \"Val\": 67\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 132,\n      \"StatID\": 3,\n      \"Val\": 72\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 132,\n      \"StatID\": 4,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 132,\n      \"StatID\": 5,\n      \"Val\": 77\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 132,\n      \"StatID\": 6,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 132,\n      \"StatID\": 7,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 132,\n      \"StatID\": 8,\n      \"Val\": 67\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 132,\n      \"StatID\": 9,\n      \"Val\": 67\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 132,\n      \"StatID\": 10,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 379,\n      \"StatID\": 2,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 379,\n      \"StatID\": 3,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 379,\n      \"StatID\": 4,\n      \"Val\": 67,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 379,\n      \"StatID\": 5,\n      \"Val\": 67\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 379,\n      \"StatID\": 6,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 379,\n      \"StatID\": 7,\n      \"Val\": 75,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 379,\n      \"StatID\": 8,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 379,\n      \"StatID\": 9,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 379,\n      \"StatID\": 10,\n      \"Val\": 67,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 301,\n      \"StatID\": 2,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 301,\n      \"StatID\": 3,\n      \"Val\": 69\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 301,\n      \"StatID\": 4,\n      \"Val\": 70\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 301,\n      \"StatID\": 5,\n      \"Val\": 75\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 301,\n      \"StatID\": 6,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 301,\n      \"StatID\": 7,\n      \"Val\": 69\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 301,\n      \"StatID\": 8,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 301,\n      \"StatID\": 9,\n      \"Val\": 69\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 301,\n      \"StatID\": 10,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 283,\n      \"StatID\": 2,\n      \"Val\": 71,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 283,\n      \"StatID\": 3,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 283,\n      \"StatID\": 4,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 283,\n      \"StatID\": 5,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 283,\n      \"StatID\": 6,\n      \"Val\": 69,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 283,\n      \"StatID\": 7,\n      \"Val\": 75,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 283,\n      \"StatID\": 8,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 283,\n      \"StatID\": 9,\n      \"Val\": 71,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 283,\n      \"StatID\": 10,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 411,\n      \"StatID\": 2,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 411,\n      \"StatID\": 3,\n      \"Val\": 70,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 411,\n      \"StatID\": 4,\n      \"Val\": 62,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 411,\n      \"StatID\": 5,\n      \"Val\": 62,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 411,\n      \"StatID\": 6,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 411,\n      \"StatID\": 7,\n      \"Val\": 76,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 411,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 411,\n      \"StatID\": 9,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 411,\n      \"StatID\": 10,\n      \"Val\": 63,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 610,\n      \"StatID\": 2,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 610,\n      \"StatID\": 3,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 610,\n      \"StatID\": 4,\n      \"Val\": 64,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 610,\n      \"StatID\": 5,\n      \"Val\": 63,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 610,\n      \"StatID\": 6,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 610,\n      \"StatID\": 7,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 610,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 610,\n      \"StatID\": 9,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 610,\n      \"StatID\": 10,\n      \"Val\": 64,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 377,\n      \"StatID\": 2,\n      \"Val\": 65,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 377,\n      \"StatID\": 3,\n      \"Val\": 69,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 377,\n      \"StatID\": 4,\n      \"Val\": 71,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 377,\n      \"StatID\": 5,\n      \"Val\": 75,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 377,\n      \"StatID\": 6,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 377,\n      \"StatID\": 7,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 377,\n      \"StatID\": 8,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 377,\n      \"StatID\": 9,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 377,\n      \"StatID\": 10,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 284,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 284,\n      \"StatID\": 3,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 284,\n      \"StatID\": 4,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 284,\n      \"StatID\": 5,\n      \"Val\": 67\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 284,\n      \"StatID\": 6,\n      \"Val\": 70\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 284,\n      \"StatID\": 7,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 284,\n      \"StatID\": 8,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 284,\n      \"StatID\": 9,\n      \"Val\": 70\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 284,\n      \"StatID\": 10,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 375,\n      \"StatID\": 2,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 375,\n      \"StatID\": 3,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 375,\n      \"StatID\": 4,\n      \"Val\": 65,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 375,\n      \"StatID\": 5,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 375,\n      \"StatID\": 6,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 375,\n      \"StatID\": 7,\n      \"Val\": 74\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 375,\n      \"StatID\": 8,\n      \"Val\": 67\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 375,\n      \"StatID\": 9,\n      \"Val\": 73\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 375,\n      \"StatID\": 10,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 252,\n      \"StatID\": 2,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 252,\n      \"StatID\": 3,\n      \"Val\": 69\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 252,\n      \"StatID\": 4,\n      \"Val\": 69\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 252,\n      \"StatID\": 5,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 252,\n      \"StatID\": 6,\n      \"Val\": 71,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 252,\n      \"StatID\": 7,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 252,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 252,\n      \"StatID\": 9,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 252,\n      \"StatID\": 10,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 288,\n      \"StatID\": 2,\n      \"Val\": 71,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 288,\n      \"StatID\": 3,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 288,\n      \"StatID\": 4,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 288,\n      \"StatID\": 5,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 288,\n      \"StatID\": 6,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 288,\n      \"StatID\": 7,\n      \"Val\": 75,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 288,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 288,\n      \"StatID\": 9,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 288,\n      \"StatID\": 10,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 439,\n      \"StatID\": 2,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 439,\n      \"StatID\": 3,\n      \"Val\": 69,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 439,\n      \"StatID\": 4,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 439,\n      \"StatID\": 5,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 439,\n      \"StatID\": 6,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 439,\n      \"StatID\": 7,\n      \"Val\": 74,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 439,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 439,\n      \"StatID\": 9,\n      \"Val\": 71,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 439,\n      \"StatID\": 10,\n      \"Val\": 62,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 650,\n      \"StatID\": 2,\n      \"Val\": 71,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 650,\n      \"StatID\": 3,\n      \"Val\": 69\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 650,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 650,\n      \"StatID\": 5,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 650,\n      \"StatID\": 6,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 650,\n      \"StatID\": 7,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 650,\n      \"StatID\": 8,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 650,\n      \"StatID\": 9,\n      \"Val\": 70,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 650,\n      \"StatID\": 10,\n      \"Val\": 63,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 647,\n      \"StatID\": 2,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 647,\n      \"StatID\": 3,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 647,\n      \"StatID\": 4,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 647,\n      \"StatID\": 5,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 647,\n      \"StatID\": 6,\n      \"Val\": 74,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 647,\n      \"StatID\": 7,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 647,\n      \"StatID\": 8,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 647,\n      \"StatID\": 9,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 647,\n      \"StatID\": 10,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 380,\n      \"StatID\": 2,\n      \"Val\": 70,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 380,\n      \"StatID\": 3,\n      \"Val\": 69\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 380,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 380,\n      \"StatID\": 5,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 380,\n      \"StatID\": 6,\n      \"Val\": 67,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 380,\n      \"StatID\": 7,\n      \"Val\": 74,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 380,\n      \"StatID\": 8,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 380,\n      \"StatID\": 9,\n      \"Val\": 69,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 380,\n      \"StatID\": 10,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 614,\n      \"StatID\": 2,\n      \"Val\": 70,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 614,\n      \"StatID\": 3,\n      \"Val\": 67\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 614,\n      \"StatID\": 4,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 614,\n      \"StatID\": 5,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 614,\n      \"StatID\": 6,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 614,\n      \"StatID\": 7,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 614,\n      \"StatID\": 8,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 614,\n      \"StatID\": 9,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 614,\n      \"StatID\": 10,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 384,\n      \"StatID\": 2,\n      \"Val\": 69\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 384,\n      \"StatID\": 3,\n      \"Val\": 67\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 384,\n      \"StatID\": 4,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 384,\n      \"StatID\": 5,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 384,\n      \"StatID\": 6,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 384,\n      \"StatID\": 7,\n      \"Val\": 70,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 384,\n      \"StatID\": 8,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 384,\n      \"StatID\": 9,\n      \"Val\": 67,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 384,\n      \"StatID\": 10,\n      \"Val\": 64,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 651,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 651,\n      \"StatID\": 3,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 651,\n      \"StatID\": 4,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 651,\n      \"StatID\": 5,\n      \"Val\": 65,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 651,\n      \"StatID\": 6,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 651,\n      \"StatID\": 7,\n      \"Val\": 71,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 651,\n      \"StatID\": 8,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 651,\n      \"StatID\": 9,\n      \"Val\": 69,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 651,\n      \"StatID\": 10,\n      \"Val\": 65,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 615,\n      \"StatID\": 2,\n      \"Val\": 69,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 615,\n      \"StatID\": 3,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 615,\n      \"StatID\": 4,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 615,\n      \"StatID\": 5,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 615,\n      \"StatID\": 6,\n      \"Val\": 67\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 615,\n      \"StatID\": 7,\n      \"Val\": 70\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 615,\n      \"StatID\": 8,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 615,\n      \"StatID\": 9,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 615,\n      \"StatID\": 10,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 656,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 656,\n      \"StatID\": 3,\n      \"Val\": 67\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 656,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 656,\n      \"StatID\": 5,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 656,\n      \"StatID\": 6,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 656,\n      \"StatID\": 7,\n      \"Val\": 70,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 656,\n      \"StatID\": 8,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 656,\n      \"StatID\": 9,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 656,\n      \"StatID\": 10,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 383,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 383,\n      \"StatID\": 3,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 383,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 383,\n      \"StatID\": 5,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 383,\n      \"StatID\": 6,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 383,\n      \"StatID\": 7,\n      \"Val\": 71\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 383,\n      \"StatID\": 8,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 383,\n      \"StatID\": 9,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 383,\n      \"StatID\": 10,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 394,\n      \"StatID\": 2,\n      \"Val\": 67,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 394,\n      \"StatID\": 3,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 394,\n      \"StatID\": 4,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 394,\n      \"StatID\": 5,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 394,\n      \"StatID\": 6,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 394,\n      \"StatID\": 7,\n      \"Val\": 71,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 394,\n      \"StatID\": 8,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 394,\n      \"StatID\": 9,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 394,\n      \"StatID\": 10,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 667,\n      \"StatID\": 2,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 667,\n      \"StatID\": 3,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 667,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 667,\n      \"StatID\": 5,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 667,\n      \"StatID\": 6,\n      \"Val\": 76\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 667,\n      \"StatID\": 7,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 667,\n      \"StatID\": 8,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 667,\n      \"StatID\": 9,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 667,\n      \"StatID\": 10,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 618,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 618,\n      \"StatID\": 3,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 618,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 618,\n      \"StatID\": 5,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 618,\n      \"StatID\": 6,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 618,\n      \"StatID\": 7,\n      \"Val\": 70\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 618,\n      \"StatID\": 8,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 618,\n      \"StatID\": 9,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 618,\n      \"StatID\": 10,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 382,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 382,\n      \"StatID\": 3,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 382,\n      \"StatID\": 4,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 382,\n      \"StatID\": 5,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 382,\n      \"StatID\": 6,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 382,\n      \"StatID\": 7,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 382,\n      \"StatID\": 8,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 382,\n      \"StatID\": 9,\n      \"Val\": 65,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 382,\n      \"StatID\": 10,\n      \"Val\": 64,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 653,\n      \"StatID\": 2,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 653,\n      \"StatID\": 3,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 653,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 653,\n      \"StatID\": 5,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 653,\n      \"StatID\": 6,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 653,\n      \"StatID\": 7,\n      \"Val\": 65,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 653,\n      \"StatID\": 8,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 653,\n      \"StatID\": 9,\n      \"Val\": 64,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 653,\n      \"StatID\": 10,\n      \"Val\": 63,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 654,\n      \"StatID\": 2,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 654,\n      \"StatID\": 3,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 654,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 654,\n      \"StatID\": 5,\n      \"Val\": 62,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 654,\n      \"StatID\": 6,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 654,\n      \"StatID\": 7,\n      \"Val\": 64,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 654,\n      \"StatID\": 8,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 654,\n      \"StatID\": 9,\n      \"Val\": 65,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 654,\n      \"StatID\": 10,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 381,\n      \"StatID\": 2,\n      \"Val\": 69,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 381,\n      \"StatID\": 3,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 381,\n      \"StatID\": 4,\n      \"Val\": 64,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 381,\n      \"StatID\": 5,\n      \"Val\": 62,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 381,\n      \"StatID\": 6,\n      \"Val\": 63,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 381,\n      \"StatID\": 7,\n      \"Val\": 69,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 381,\n      \"StatID\": 8,\n      \"Val\": 63,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 381,\n      \"StatID\": 9,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 381,\n      \"StatID\": 10,\n      \"Val\": 63,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 617,\n      \"StatID\": 2,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 617,\n      \"StatID\": 3,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 617,\n      \"StatID\": 4,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 617,\n      \"StatID\": 5,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 617,\n      \"StatID\": 6,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 617,\n      \"StatID\": 7,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 617,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 617,\n      \"StatID\": 9,\n      \"Val\": 64,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 617,\n      \"StatID\": 10,\n      \"Val\": 62,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 657,\n      \"StatID\": 2,\n      \"Val\": 70\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 657,\n      \"StatID\": 3,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 657,\n      \"StatID\": 4,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 657,\n      \"StatID\": 5,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 657,\n      \"StatID\": 6,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 657,\n      \"StatID\": 7,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 657,\n      \"StatID\": 8,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 657,\n      \"StatID\": 9,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 657,\n      \"StatID\": 10,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 123,\n      \"StatID\": 2,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 123,\n      \"StatID\": 3,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 123,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 123,\n      \"StatID\": 5,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 123,\n      \"StatID\": 6,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 123,\n      \"StatID\": 7,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 123,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 123,\n      \"StatID\": 9,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 123,\n      \"StatID\": 10,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 253,\n      \"StatID\": 2,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 253,\n      \"StatID\": 3,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 253,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 253,\n      \"StatID\": 5,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 253,\n      \"StatID\": 6,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 253,\n      \"StatID\": 7,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 253,\n      \"StatID\": 8,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 253,\n      \"StatID\": 9,\n      \"Val\": 62,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 253,\n      \"StatID\": 10,\n      \"Val\": 62,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 611,\n      \"StatID\": 2,\n      \"Val\": 67\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 611,\n      \"StatID\": 3,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 611,\n      \"StatID\": 4,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 611,\n      \"StatID\": 5,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 611,\n      \"StatID\": 6,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 611,\n      \"StatID\": 7,\n      \"Val\": 67,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 611,\n      \"StatID\": 8,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 611,\n      \"StatID\": 9,\n      \"Val\": 64,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 611,\n      \"StatID\": 10,\n      \"Val\": 61,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 648,\n      \"StatID\": 2,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 648,\n      \"StatID\": 3,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 648,\n      \"StatID\": 4,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 648,\n      \"StatID\": 5,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 648,\n      \"StatID\": 6,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 648,\n      \"StatID\": 7,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 648,\n      \"StatID\": 8,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 648,\n      \"StatID\": 9,\n      \"Val\": 62,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 648,\n      \"StatID\": 10,\n      \"Val\": 63,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 652,\n      \"StatID\": 2,\n      \"Val\": 67,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 652,\n      \"StatID\": 3,\n      \"Val\": 67,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 652,\n      \"StatID\": 4,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 652,\n      \"StatID\": 5,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 652,\n      \"StatID\": 6,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 652,\n      \"StatID\": 7,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 652,\n      \"StatID\": 8,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 652,\n      \"StatID\": 9,\n      \"Val\": 64,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 652,\n      \"StatID\": 10,\n      \"Val\": 64,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 602,\n      \"StatID\": 2,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 602,\n      \"StatID\": 3,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 602,\n      \"StatID\": 4,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 602,\n      \"StatID\": 5,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 602,\n      \"StatID\": 6,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 602,\n      \"StatID\": 7,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 602,\n      \"StatID\": 8,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 602,\n      \"StatID\": 9,\n      \"Val\": 62,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 602,\n      \"StatID\": 10,\n      \"Val\": 62,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 655,\n      \"StatID\": 2,\n      \"Val\": 67,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 655,\n      \"StatID\": 3,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 655,\n      \"StatID\": 4,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 655,\n      \"StatID\": 5,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 655,\n      \"StatID\": 6,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 655,\n      \"StatID\": 7,\n      \"Val\": 64,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 655,\n      \"StatID\": 8,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 655,\n      \"StatID\": 9,\n      \"Val\": 63,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 655,\n      \"StatID\": 10,\n      \"Val\": 60,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 387,\n      \"StatID\": 2,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 387,\n      \"StatID\": 3,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 387,\n      \"StatID\": 4,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 387,\n      \"StatID\": 5,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 387,\n      \"StatID\": 6,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 387,\n      \"StatID\": 7,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 387,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 387,\n      \"StatID\": 9,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 387,\n      \"StatID\": 10,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 407,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 407,\n      \"StatID\": 3,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 407,\n      \"StatID\": 4,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 407,\n      \"StatID\": 5,\n      \"Val\": 57\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 407,\n      \"StatID\": 6,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 407,\n      \"StatID\": 7,\n      \"Val\": 69\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 407,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 407,\n      \"StatID\": 9,\n      \"Val\": 68\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 407,\n      \"StatID\": 10,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 660,\n      \"StatID\": 2,\n      \"Val\": 67,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 660,\n      \"StatID\": 3,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 660,\n      \"StatID\": 4,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 660,\n      \"StatID\": 5,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 660,\n      \"StatID\": 6,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 660,\n      \"StatID\": 7,\n      \"Val\": 63,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 660,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 660,\n      \"StatID\": 9,\n      \"Val\": 63,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 660,\n      \"StatID\": 10,\n      \"Val\": 60,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 661,\n      \"StatID\": 2,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 661,\n      \"StatID\": 3,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 661,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 661,\n      \"StatID\": 5,\n      \"Val\": 63,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 661,\n      \"StatID\": 6,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 661,\n      \"StatID\": 7,\n      \"Val\": 62,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 661,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 661,\n      \"StatID\": 9,\n      \"Val\": 63,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 661,\n      \"StatID\": 10,\n      \"Val\": 64,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 389,\n      \"StatID\": 2,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 389,\n      \"StatID\": 3,\n      \"Val\": 65\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 389,\n      \"StatID\": 4,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 389,\n      \"StatID\": 5,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 389,\n      \"StatID\": 6,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 389,\n      \"StatID\": 7,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 389,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 389,\n      \"StatID\": 9,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 389,\n      \"StatID\": 10,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 621,\n      \"StatID\": 2,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 621,\n      \"StatID\": 3,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 621,\n      \"StatID\": 4,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 621,\n      \"StatID\": 5,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 621,\n      \"StatID\": 6,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 621,\n      \"StatID\": 7,\n      \"Val\": 62,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 621,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 621,\n      \"StatID\": 9,\n      \"Val\": 62,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 621,\n      \"StatID\": 10,\n      \"Val\": 60,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 659,\n      \"StatID\": 2,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 659,\n      \"StatID\": 3,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 659,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 659,\n      \"StatID\": 5,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 659,\n      \"StatID\": 6,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 659,\n      \"StatID\": 7,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 659,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 659,\n      \"StatID\": 9,\n      \"Val\": 62,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 659,\n      \"StatID\": 10,\n      \"Val\": 64,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 616,\n      \"StatID\": 2,\n      \"Val\": 65,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 616,\n      \"StatID\": 3,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 616,\n      \"StatID\": 4,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 616,\n      \"StatID\": 5,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 616,\n      \"StatID\": 6,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 616,\n      \"StatID\": 7,\n      \"Val\": 60,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 616,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 616,\n      \"StatID\": 9,\n      \"Val\": 61,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 616,\n      \"StatID\": 10,\n      \"Val\": 60,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 613,\n      \"StatID\": 2,\n      \"Val\": 65,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 613,\n      \"StatID\": 3,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 613,\n      \"StatID\": 4,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 613,\n      \"StatID\": 5,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 613,\n      \"StatID\": 6,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 613,\n      \"StatID\": 7,\n      \"Val\": 62,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 613,\n      \"StatID\": 8,\n      \"Val\": 61,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 613,\n      \"StatID\": 9,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 613,\n      \"StatID\": 10,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 646,\n      \"StatID\": 2,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 646,\n      \"StatID\": 3,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 646,\n      \"StatID\": 4,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 646,\n      \"StatID\": 5,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 646,\n      \"StatID\": 6,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 646,\n      \"StatID\": 7,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 646,\n      \"StatID\": 8,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 646,\n      \"StatID\": 9,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 646,\n      \"StatID\": 10,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 662,\n      \"StatID\": 2,\n      \"Val\": 64,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 662,\n      \"StatID\": 3,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 662,\n      \"StatID\": 4,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 662,\n      \"StatID\": 5,\n      \"Val\": 59\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 662,\n      \"StatID\": 6,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 662,\n      \"StatID\": 7,\n      \"Val\": 59,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 662,\n      \"StatID\": 8,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 662,\n      \"StatID\": 9,\n      \"Val\": 61,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 662,\n      \"StatID\": 10,\n      \"Val\": 59,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 619,\n      \"StatID\": 2,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 619,\n      \"StatID\": 3,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 619,\n      \"StatID\": 4,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 619,\n      \"StatID\": 5,\n      \"Val\": 59\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 619,\n      \"StatID\": 6,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 619,\n      \"StatID\": 7,\n      \"Val\": 59\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 619,\n      \"StatID\": 8,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 619,\n      \"StatID\": 9,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 619,\n      \"StatID\": 10,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 405,\n      \"StatID\": 2,\n      \"Val\": 64\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 405,\n      \"StatID\": 3,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 405,\n      \"StatID\": 4,\n      \"Val\": 54\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 405,\n      \"StatID\": 5,\n      \"Val\": 54\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 405,\n      \"StatID\": 6,\n      \"Val\": 54\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 405,\n      \"StatID\": 7,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 405,\n      \"StatID\": 8,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 405,\n      \"StatID\": 9,\n      \"Val\": 60,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 405,\n      \"StatID\": 10,\n      \"Val\": 54\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 620,\n      \"StatID\": 2,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 620,\n      \"StatID\": 3,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 620,\n      \"StatID\": 4,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 620,\n      \"StatID\": 5,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 620,\n      \"StatID\": 6,\n      \"Val\": 55\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 620,\n      \"StatID\": 7,\n      \"Val\": 58\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 620,\n      \"StatID\": 8,\n      \"Val\": 55\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 620,\n      \"StatID\": 9,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 620,\n      \"StatID\": 10,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 605,\n      \"StatID\": 2,\n      \"Val\": 54\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 605,\n      \"StatID\": 3,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 605,\n      \"StatID\": 4,\n      \"Val\": 61,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 605,\n      \"StatID\": 5,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 605,\n      \"StatID\": 6,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 605,\n      \"StatID\": 7,\n      \"Val\": 54\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 605,\n      \"StatID\": 8,\n      \"Val\": 54\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 605,\n      \"StatID\": 9,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 605,\n      \"StatID\": 10,\n      \"Val\": 63,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 612,\n      \"StatID\": 2,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 612,\n      \"StatID\": 3,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 612,\n      \"StatID\": 4,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 612,\n      \"StatID\": 5,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 612,\n      \"StatID\": 6,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 612,\n      \"StatID\": 7,\n      \"Val\": 61,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 612,\n      \"StatID\": 8,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 612,\n      \"StatID\": 9,\n      \"Val\": 61,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 612,\n      \"StatID\": 10,\n      \"Val\": 59,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 601,\n      \"StatID\": 2,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 601,\n      \"StatID\": 3,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 601,\n      \"StatID\": 4,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 601,\n      \"StatID\": 5,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 601,\n      \"StatID\": 6,\n      \"Val\": 54\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 601,\n      \"StatID\": 7,\n      \"Val\": 57\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 601,\n      \"StatID\": 8,\n      \"Val\": 54\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 601,\n      \"StatID\": 9,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 601,\n      \"StatID\": 10,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 385,\n      \"StatID\": 2,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 385,\n      \"StatID\": 3,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 385,\n      \"StatID\": 4,\n      \"Val\": 59\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 385,\n      \"StatID\": 5,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 385,\n      \"StatID\": 6,\n      \"Val\": 54\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 385,\n      \"StatID\": 7,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 385,\n      \"StatID\": 8,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 385,\n      \"StatID\": 9,\n      \"Val\": 60,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 385,\n      \"StatID\": 10,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 658,\n      \"StatID\": 2,\n      \"Val\": 59,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 658,\n      \"StatID\": 3,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 658,\n      \"StatID\": 4,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 658,\n      \"StatID\": 5,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 658,\n      \"StatID\": 6,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 658,\n      \"StatID\": 7,\n      \"Val\": 58,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 658,\n      \"StatID\": 8,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 658,\n      \"StatID\": 9,\n      \"Val\": 58,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 658,\n      \"StatID\": 10,\n      \"Val\": 59,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 418,\n      \"StatID\": 2,\n      \"Val\": 54\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 418,\n      \"StatID\": 3,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 418,\n      \"StatID\": 4,\n      \"Val\": 60,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 418,\n      \"StatID\": 5,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 418,\n      \"StatID\": 6,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 418,\n      \"StatID\": 7,\n      \"Val\": 54\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 418,\n      \"StatID\": 8,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 418,\n      \"StatID\": 9,\n      \"Val\": 58,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 418,\n      \"StatID\": 10,\n      \"Val\": 61,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 402,\n      \"StatID\": 2,\n      \"Val\": 63,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 402,\n      \"StatID\": 3,\n      \"Val\": 61,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 402,\n      \"StatID\": 4,\n      \"Val\": 54\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 402,\n      \"StatID\": 5,\n      \"Val\": 54\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 402,\n      \"StatID\": 6,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 402,\n      \"StatID\": 7,\n      \"Val\": 61,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 402,\n      \"StatID\": 8,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 402,\n      \"StatID\": 9,\n      \"Val\": 57,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 402,\n      \"StatID\": 10,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 406,\n      \"StatID\": 2,\n      \"Val\": 58,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 406,\n      \"StatID\": 3,\n      \"Val\": 62,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 406,\n      \"StatID\": 4,\n      \"Val\": 58\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 406,\n      \"StatID\": 5,\n      \"Val\": 59\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 406,\n      \"StatID\": 6,\n      \"Val\": 56\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 406,\n      \"StatID\": 7,\n      \"Val\": 58\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 406,\n      \"StatID\": 8,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 406,\n      \"StatID\": 9,\n      \"Val\": 56,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 406,\n      \"StatID\": 10,\n      \"Val\": 57,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 664,\n      \"StatID\": 2,\n      \"Val\": 59,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 664,\n      \"StatID\": 3,\n      \"Val\": 57,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 664,\n      \"StatID\": 4,\n      \"Val\": 58\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 664,\n      \"StatID\": 5,\n      \"Val\": 58\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 664,\n      \"StatID\": 6,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 664,\n      \"StatID\": 7,\n      \"Val\": 57,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 664,\n      \"StatID\": 8,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 664,\n      \"StatID\": 9,\n      \"Val\": 56,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 664,\n      \"StatID\": 10,\n      \"Val\": 55,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 663,\n      \"StatID\": 2,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 663,\n      \"StatID\": 3,\n      \"Val\": 59\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 663,\n      \"StatID\": 4,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 663,\n      \"StatID\": 5,\n      \"Val\": 51,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 663,\n      \"StatID\": 6,\n      \"Val\": 52\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 663,\n      \"StatID\": 7,\n      \"Val\": 52\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 663,\n      \"StatID\": 8,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 663,\n      \"StatID\": 9,\n      \"Val\": 58,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 663,\n      \"StatID\": 10,\n      \"Val\": 59,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 600,\n      \"StatID\": 2,\n      \"Val\": 52\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 600,\n      \"StatID\": 3,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 600,\n      \"StatID\": 4,\n      \"Val\": 58,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 600,\n      \"StatID\": 5,\n      \"Val\": 61,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 600,\n      \"StatID\": 6,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 600,\n      \"StatID\": 7,\n      \"Val\": 52\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 600,\n      \"StatID\": 8,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 600,\n      \"StatID\": 9,\n      \"Val\": 56,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 600,\n      \"StatID\": 10,\n      \"Val\": 57,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 674,\n      \"StatID\": 2,\n      \"Val\": 58,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 674,\n      \"StatID\": 3,\n      \"Val\": 57,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 674,\n      \"StatID\": 4,\n      \"Val\": 52\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 674,\n      \"StatID\": 5,\n      \"Val\": 52\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 674,\n      \"StatID\": 6,\n      \"Val\": 57\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 674,\n      \"StatID\": 7,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 674,\n      \"StatID\": 8,\n      \"Val\": 58\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 674,\n      \"StatID\": 9,\n      \"Val\": 58\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 674,\n      \"StatID\": 10,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 606,\n      \"StatID\": 2,\n      \"Val\": 56,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 606,\n      \"StatID\": 3,\n      \"Val\": 56,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 606,\n      \"StatID\": 4,\n      \"Val\": 56\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 606,\n      \"StatID\": 5,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 606,\n      \"StatID\": 6,\n      \"Val\": 50,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 606,\n      \"StatID\": 7,\n      \"Val\": 52,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 606,\n      \"StatID\": 8,\n      \"Val\": 50,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 606,\n      \"StatID\": 9,\n      \"Val\": 56,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 606,\n      \"StatID\": 10,\n      \"Val\": 55,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 671,\n      \"StatID\": 2,\n      \"Val\": 58,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 671,\n      \"StatID\": 3,\n      \"Val\": 56,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 671,\n      \"StatID\": 4,\n      \"Val\": 52,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 671,\n      \"StatID\": 5,\n      \"Val\": 53,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 671,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 671,\n      \"StatID\": 7,\n      \"Val\": 57,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 671,\n      \"StatID\": 8,\n      \"Val\": 49\n    },\n    {\n      \"StaffID\": 671,\n      \"StatID\": 9,\n      \"Val\": 58,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 671,\n      \"StatID\": 10,\n      \"Val\": 51,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 409,\n      \"StatID\": 2,\n      \"Val\": 53,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 409,\n      \"StatID\": 3,\n      \"Val\": 53,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 409,\n      \"StatID\": 4,\n      \"Val\": 52,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 409,\n      \"StatID\": 5,\n      \"Val\": 52,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 409,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 409,\n      \"StatID\": 7,\n      \"Val\": 48\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 409,\n      \"StatID\": 8,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 409,\n      \"StatID\": 9,\n      \"Val\": 52,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 409,\n      \"StatID\": 10,\n      \"Val\": 52,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 609,\n      \"StatID\": 2,\n      \"Val\": 52\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 609,\n      \"StatID\": 3,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 609,\n      \"StatID\": 4,\n      \"Val\": 53,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 609,\n      \"StatID\": 5,\n      \"Val\": 54\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 609,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 609,\n      \"StatID\": 7,\n      \"Val\": 53\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 609,\n      \"StatID\": 8,\n      \"Val\": 48\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 609,\n      \"StatID\": 9,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 609,\n      \"StatID\": 10,\n      \"Val\": 53,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 672,\n      \"StatID\": 2,\n      \"Val\": 57,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 672,\n      \"StatID\": 3,\n      \"Val\": 55,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 672,\n      \"StatID\": 4,\n      \"Val\": 55,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 672,\n      \"StatID\": 5,\n      \"Val\": 54,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 672,\n      \"StatID\": 6,\n      \"Val\": 49,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 672,\n      \"StatID\": 7,\n      \"Val\": 54,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 672,\n      \"StatID\": 8,\n      \"Val\": 49,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 672,\n      \"StatID\": 9,\n      \"Val\": 55,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 672,\n      \"StatID\": 10,\n      \"Val\": 54,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 410,\n      \"StatID\": 2,\n      \"Val\": 54\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 410,\n      \"StatID\": 3,\n      \"Val\": 52\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 410,\n      \"StatID\": 4,\n      \"Val\": 51\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 410,\n      \"StatID\": 5,\n      \"Val\": 52\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 410,\n      \"StatID\": 6,\n      \"Val\": 52\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 410,\n      \"StatID\": 7,\n      \"Val\": 54\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 410,\n      \"StatID\": 8,\n      \"Val\": 52\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 410,\n      \"StatID\": 9,\n      \"Val\": 53\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 410,\n      \"StatID\": 10,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 673,\n      \"StatID\": 2,\n      \"Val\": 53,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 673,\n      \"StatID\": 3,\n      \"Val\": 53,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 673,\n      \"StatID\": 4,\n      \"Val\": 54,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 673,\n      \"StatID\": 5,\n      \"Val\": 54,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 673,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 673,\n      \"StatID\": 7,\n      \"Val\": 53,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 673,\n      \"StatID\": 8,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 673,\n      \"StatID\": 9,\n      \"Val\": 53,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 673,\n      \"StatID\": 10,\n      \"Val\": 54,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 419,\n      \"StatID\": 2,\n      \"Val\": 52\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 419,\n      \"StatID\": 3,\n      \"Val\": 52\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 419,\n      \"StatID\": 4,\n      \"Val\": 53\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 419,\n      \"StatID\": 5,\n      \"Val\": 52\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 419,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 419,\n      \"StatID\": 7,\n      \"Val\": 49,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 419,\n      \"StatID\": 8,\n      \"Val\": 48\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 419,\n      \"StatID\": 9,\n      \"Val\": 52\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 419,\n      \"StatID\": 10,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 665,\n      \"StatID\": 2,\n      \"Val\": 51,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 665,\n      \"StatID\": 3,\n      \"Val\": 53,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 665,\n      \"StatID\": 4,\n      \"Val\": 52\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 665,\n      \"StatID\": 5,\n      \"Val\": 52\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 665,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 665,\n      \"StatID\": 7,\n      \"Val\": 48\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 665,\n      \"StatID\": 8,\n      \"Val\": 48\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 665,\n      \"StatID\": 9,\n      \"Val\": 52\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 665,\n      \"StatID\": 10,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 668,\n      \"StatID\": 2,\n      \"Val\": 53,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 668,\n      \"StatID\": 3,\n      \"Val\": 51,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 668,\n      \"StatID\": 4,\n      \"Val\": 50\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 668,\n      \"StatID\": 5,\n      \"Val\": 51\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 668,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 668,\n      \"StatID\": 7,\n      \"Val\": 50\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 668,\n      \"StatID\": 8,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 668,\n      \"StatID\": 9,\n      \"Val\": 51,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 668,\n      \"StatID\": 10,\n      \"Val\": 50\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 669,\n      \"StatID\": 2,\n      \"Val\": 52\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 669,\n      \"StatID\": 3,\n      \"Val\": 49\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 669,\n      \"StatID\": 4,\n      \"Val\": 49\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 669,\n      \"StatID\": 5,\n      \"Val\": 51\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 669,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 669,\n      \"StatID\": 7,\n      \"Val\": 50\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 669,\n      \"StatID\": 8,\n      \"Val\": 50\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 669,\n      \"StatID\": 9,\n      \"Val\": 50\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 669,\n      \"StatID\": 10,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 607,\n      \"StatID\": 2,\n      \"Val\": 50,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 607,\n      \"StatID\": 3,\n      \"Val\": 52\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 607,\n      \"StatID\": 4,\n      \"Val\": 50\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 607,\n      \"StatID\": 5,\n      \"Val\": 51\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 607,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 607,\n      \"StatID\": 7,\n      \"Val\": 50\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 607,\n      \"StatID\": 8,\n      \"Val\": 48\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 607,\n      \"StatID\": 9,\n      \"Val\": 49\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 607,\n      \"StatID\": 10,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 670,\n      \"StatID\": 2,\n      \"Val\": 54,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 670,\n      \"StatID\": 3,\n      \"Val\": 52,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 670,\n      \"StatID\": 4,\n      \"Val\": 50\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 670,\n      \"StatID\": 5,\n      \"Val\": 49\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 670,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 670,\n      \"StatID\": 7,\n      \"Val\": 50,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 670,\n      \"StatID\": 8,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 670,\n      \"StatID\": 9,\n      \"Val\": 52,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 670,\n      \"StatID\": 10,\n      \"Val\": 49,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 666,\n      \"StatID\": 2,\n      \"Val\": 52,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 666,\n      \"StatID\": 3,\n      \"Val\": 50,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 666,\n      \"StatID\": 4,\n      \"Val\": 49\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 666,\n      \"StatID\": 5,\n      \"Val\": 50\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 666,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 666,\n      \"StatID\": 7,\n      \"Val\": 49\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 666,\n      \"StatID\": 8,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 666,\n      \"StatID\": 9,\n      \"Val\": 50,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 666,\n      \"StatID\": 10,\n      \"Val\": 49\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 304,\n      \"StatID\": 2,\n      \"Val\": 67\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 304,\n      \"StatID\": 3,\n      \"Val\": 67\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 304,\n      \"StatID\": 4,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 304,\n      \"StatID\": 5,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 304,\n      \"StatID\": 6,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 304,\n      \"StatID\": 7,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 304,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 304,\n      \"StatID\": 9,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 304,\n      \"StatID\": 10,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 305,\n      \"StatID\": 2,\n      \"Val\": 77,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 305,\n      \"StatID\": 3,\n      \"Val\": 76,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 305,\n      \"StatID\": 4,\n      \"Val\": 70,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 305,\n      \"StatID\": 5,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 305,\n      \"StatID\": 6,\n      \"Val\": 69,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 305,\n      \"StatID\": 7,\n      \"Val\": 76,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 305,\n      \"StatID\": 8,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 305,\n      \"StatID\": 9,\n      \"Val\": 77,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 305,\n      \"StatID\": 10,\n      \"Val\": 72,\n      \"Max\": 100\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 417,\n      \"StatID\": 2,\n      \"Val\": 66\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 417,\n      \"StatID\": 3,\n      \"Val\": 63\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 417,\n      \"StatID\": 4,\n      \"Val\": 58\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 417,\n      \"StatID\": 5,\n      \"Val\": 57\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 417,\n      \"StatID\": 6,\n      \"Val\": 60\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 417,\n      \"StatID\": 7,\n      \"Val\": 61\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 417,\n      \"StatID\": 8,\n      \"Val\": 56\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 417,\n      \"StatID\": 9,\n      \"Val\": 62\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 417,\n      \"StatID\": 10,\n      \"Val\": 58\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 9,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 9,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 9,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 9,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 9,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 9,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 9,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 9,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 9,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 78,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 78,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 78,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 78,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 78,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 78,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 78,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 78,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 78,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 91,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 91,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 91,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 91,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 91,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 91,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 91,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 91,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 91,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 114,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 114,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 114,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 114,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 114,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 114,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 114,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 114,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 114,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 115,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 115,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 115,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 115,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 115,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 115,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 115,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 115,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 115,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 128,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 128,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 128,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 128,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 128,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 128,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 128,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 128,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 128,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 133,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 133,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 133,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 133,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 133,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 133,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 133,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 133,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 133,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 143,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 143,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 143,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 143,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 143,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 143,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 143,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 143,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 143,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 244,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 244,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 244,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 244,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 244,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 244,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 244,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 244,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 244,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 258,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 258,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 258,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 258,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 258,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 258,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 258,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 258,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 258,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 259,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 259,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 259,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 259,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 259,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 259,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 259,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 259,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 259,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 260,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 260,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 260,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 260,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 260,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 260,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 260,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 260,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 260,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 272,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 272,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 272,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 272,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 272,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 272,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 272,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 272,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 272,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 300,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 300,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 300,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 300,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 300,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 300,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 300,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 300,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 300,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 302,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 302,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 302,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 302,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 302,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 302,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 302,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 302,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 302,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 303,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 303,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 303,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 303,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 303,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 303,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 303,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 303,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 303,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 307,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 307,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 307,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 307,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 307,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 307,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 307,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 307,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"Max\": 100,\n      \"StaffID\": 307,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 563,\n      \"StatID\": 13,\n      \"Val\": 41,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 563,\n      \"StatID\": 25,\n      \"Val\": 56,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 564,\n      \"StatID\": 19,\n      \"Val\": 73,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 564,\n      \"StatID\": 20,\n      \"Val\": 60,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 564,\n      \"StatID\": 26,\n      \"Val\": 66,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 564,\n      \"StatID\": 27,\n      \"Val\": 80,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 564,\n      \"StatID\": 28,\n      \"Val\": 81,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 564,\n      \"StatID\": 29,\n      \"Val\": 55,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 564,\n      \"StatID\": 30,\n      \"Val\": 84,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 564,\n      \"StatID\": 31,\n      \"Val\": 71,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 565,\n      \"StatID\": 13,\n      \"Val\": 64,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 565,\n      \"StatID\": 25,\n      \"Val\": 57,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 565,\n      \"StatID\": 43,\n      \"Val\": 35,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 566,\n      \"StatID\": 11,\n      \"Val\": 74,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 566,\n      \"StatID\": 22,\n      \"Val\": 68,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 566,\n      \"StatID\": 23,\n      \"Val\": 74,\n      \"Max\": 100\n    },\n    {\n      \"StaffID\": 566,\n      \"StatID\": 24,\n      \"Val\": 56,\n      \"Max\": 100\n    }\n  ],\n  \"Staff_Performancestats_StartOfMonth\": [\n    {\n      \"StaffID\": 4,\n      \"StatID\": 0,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 4,\n      \"StatID\": 1,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 4,\n      \"StatID\": 14,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 4,\n      \"StatID\": 15,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 4,\n      \"StatID\": 16,\n      \"Val\": 91\n    },\n    {\n      \"StaffID\": 4,\n      \"StatID\": 17,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 6,\n      \"StatID\": 13,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 6,\n      \"StatID\": 25,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 7,\n      \"StatID\": 13,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 7,\n      \"StatID\": 25,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 13,\n      \"StatID\": 2,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 13,\n      \"StatID\": 3,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 13,\n      \"StatID\": 4,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 13,\n      \"StatID\": 5,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 13,\n      \"StatID\": 6,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 13,\n      \"StatID\": 7,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 13,\n      \"StatID\": 8,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 13,\n      \"StatID\": 9,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 13,\n      \"StatID\": 10,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 26,\n      \"StatID\": 19,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 26,\n      \"StatID\": 20,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 26,\n      \"StatID\": 26,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 26,\n      \"StatID\": 27,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 26,\n      \"StatID\": 28,\n      \"Val\": 91\n    },\n    {\n      \"StaffID\": 26,\n      \"StatID\": 29,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 26,\n      \"StatID\": 30,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 26,\n      \"StatID\": 31,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 28,\n      \"StatID\": 0,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 28,\n      \"StatID\": 1,\n      \"Val\": 95\n    },\n    {\n      \"StaffID\": 28,\n      \"StatID\": 14,\n      \"Val\": 94\n    },\n    {\n      \"StaffID\": 28,\n      \"StatID\": 15,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 28,\n      \"StatID\": 16,\n      \"Val\": 95\n    },\n    {\n      \"StaffID\": 28,\n      \"StatID\": 17,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 30,\n      \"StatID\": 0,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 30,\n      \"StatID\": 1,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 30,\n      \"StatID\": 14,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 30,\n      \"StatID\": 15,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 30,\n      \"StatID\": 16,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 30,\n      \"StatID\": 17,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 33,\n      \"StatID\": 1,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 33,\n      \"StatID\": 14,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 33,\n      \"StatID\": 15,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 33,\n      \"StatID\": 16,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 33,\n      \"StatID\": 17,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 37,\n      \"StatID\": 19,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 37,\n      \"StatID\": 20,\n      \"Val\": 95\n    },\n    {\n      \"StaffID\": 37,\n      \"StatID\": 26,\n      \"Val\": 95\n    },\n    {\n      \"StaffID\": 37,\n      \"StatID\": 27,\n      \"Val\": 94\n    },\n    {\n      \"StaffID\": 37,\n      \"StatID\": 28,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 37,\n      \"StatID\": 29,\n      \"Val\": 95\n    },\n    {\n      \"StaffID\": 37,\n      \"StatID\": 30,\n      \"Val\": 93\n    },\n    {\n      \"StaffID\": 37,\n      \"StatID\": 31,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 38,\n      \"StatID\": 19,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 38,\n      \"StatID\": 20,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 38,\n      \"StatID\": 26,\n      \"Val\": 93\n    },\n    {\n      \"StaffID\": 38,\n      \"StatID\": 27,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 38,\n      \"StatID\": 28,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 38,\n      \"StatID\": 29,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 38,\n      \"StatID\": 30,\n      \"Val\": 94\n    },\n    {\n      \"StaffID\": 38,\n      \"StatID\": 31,\n      \"Val\": 93\n    },\n    {\n      \"StaffID\": 39,\n      \"StatID\": 19,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 39,\n      \"StatID\": 20,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 39,\n      \"StatID\": 26,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 39,\n      \"StatID\": 27,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 39,\n      \"StatID\": 28,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 39,\n      \"StatID\": 29,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 39,\n      \"StatID\": 30,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 39,\n      \"StatID\": 31,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 40,\n      \"StatID\": 20,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 40,\n      \"StatID\": 26,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 40,\n      \"StatID\": 27,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 40,\n      \"StatID\": 28,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 40,\n      \"StatID\": 29,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 40,\n      \"StatID\": 30,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 40,\n      \"StatID\": 31,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 43,\n      \"StatID\": 19,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 43,\n      \"StatID\": 20,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 43,\n      \"StatID\": 27,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 43,\n      \"StatID\": 28,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 43,\n      \"StatID\": 29,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 43,\n      \"StatID\": 30,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 43,\n      \"StatID\": 31,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 44,\n      \"StatID\": 19,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 44,\n      \"StatID\": 20,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 44,\n      \"StatID\": 26,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 44,\n      \"StatID\": 27,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 44,\n      \"StatID\": 28,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 44,\n      \"StatID\": 29,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 44,\n      \"StatID\": 30,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 44,\n      \"StatID\": 31,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 47,\n      \"StatID\": 13,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 47,\n      \"StatID\": 25,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 48,\n      \"StatID\": 13,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 48,\n      \"StatID\": 25,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 49,\n      \"StatID\": 13,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 49,\n      \"StatID\": 25,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 50,\n      \"StatID\": 13,\n      \"Val\": 96\n    },\n    {\n      \"StaffID\": 50,\n      \"StatID\": 25,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 51,\n      \"StatID\": 13,\n      \"Val\": 97\n    },\n    {\n      \"StaffID\": 51,\n      \"StatID\": 25,\n      \"Val\": 91\n    },\n    {\n      \"StaffID\": 54,\n      \"StatID\": 13,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 54,\n      \"StatID\": 25,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 55,\n      \"StatID\": 13,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 55,\n      \"StatID\": 25,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 56,\n      \"StatID\": 13,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 56,\n      \"StatID\": 25,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 58,\n      \"StatID\": 25,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 59,\n      \"StatID\": 13,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 59,\n      \"StatID\": 25,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 60,\n      \"StatID\": 13,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 60,\n      \"StatID\": 25,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 61,\n      \"StatID\": 13,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 61,\n      \"StatID\": 25,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 63,\n      \"StatID\": 13,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 63,\n      \"StatID\": 25,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 64,\n      \"StatID\": 13,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 64,\n      \"StatID\": 25,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 109,\n      \"StatID\": 2,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 109,\n      \"StatID\": 3,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 109,\n      \"StatID\": 4,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 109,\n      \"StatID\": 5,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 109,\n      \"StatID\": 6,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 109,\n      \"StatID\": 7,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 109,\n      \"StatID\": 8,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 109,\n      \"StatID\": 9,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 109,\n      \"StatID\": 10,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 110,\n      \"StatID\": 2,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 110,\n      \"StatID\": 3,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 110,\n      \"StatID\": 4,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 110,\n      \"StatID\": 5,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 110,\n      \"StatID\": 6,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 110,\n      \"StatID\": 7,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 110,\n      \"StatID\": 8,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 110,\n      \"StatID\": 9,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 110,\n      \"StatID\": 10,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 116,\n      \"StatID\": 2,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 116,\n      \"StatID\": 3,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 116,\n      \"StatID\": 4,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 116,\n      \"StatID\": 5,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 116,\n      \"StatID\": 6,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 116,\n      \"StatID\": 7,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 116,\n      \"StatID\": 8,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 116,\n      \"StatID\": 9,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 116,\n      \"StatID\": 10,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 119,\n      \"StatID\": 3,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 119,\n      \"StatID\": 4,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 119,\n      \"StatID\": 5,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 119,\n      \"StatID\": 6,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 119,\n      \"StatID\": 7,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 119,\n      \"StatID\": 8,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 119,\n      \"StatID\": 9,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 119,\n      \"StatID\": 10,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 146,\n      \"StatID\": 25,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 148,\n      \"StatID\": 13,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 148,\n      \"StatID\": 25,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 149,\n      \"StatID\": 13,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 149,\n      \"StatID\": 25,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 151,\n      \"StatID\": 13,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 151,\n      \"StatID\": 25,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 152,\n      \"StatID\": 13,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 152,\n      \"StatID\": 25,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 153,\n      \"StatID\": 13,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 155,\n      \"StatID\": 13,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 155,\n      \"StatID\": 25,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 158,\n      \"StatID\": 13,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 158,\n      \"StatID\": 25,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 159,\n      \"StatID\": 25,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 160,\n      \"StatID\": 13,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 160,\n      \"StatID\": 25,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 161,\n      \"StatID\": 13,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 161,\n      \"StatID\": 25,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 162,\n      \"StatID\": 13,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 162,\n      \"StatID\": 25,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 163,\n      \"StatID\": 13,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 163,\n      \"StatID\": 25,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 165,\n      \"StatID\": 13,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 165,\n      \"StatID\": 25,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 166,\n      \"StatID\": 13,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 166,\n      \"StatID\": 25,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 168,\n      \"StatID\": 13,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 168,\n      \"StatID\": 25,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 169,\n      \"StatID\": 13,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 169,\n      \"StatID\": 25,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 172,\n      \"StatID\": 13,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 172,\n      \"StatID\": 25,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 173,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 173,\n      \"StatID\": 25,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 174,\n      \"StatID\": 13,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 174,\n      \"StatID\": 25,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 175,\n      \"StatID\": 13,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 175,\n      \"StatID\": 25,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 178,\n      \"StatID\": 25,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 179,\n      \"StatID\": 13,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 179,\n      \"StatID\": 25,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 181,\n      \"StatID\": 25,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 183,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 183,\n      \"StatID\": 25,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 184,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 184,\n      \"StatID\": 25,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 187,\n      \"StatID\": 13,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 187,\n      \"StatID\": 25,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 191,\n      \"StatID\": 13,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 191,\n      \"StatID\": 25,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 193,\n      \"StatID\": 25,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 195,\n      \"StatID\": 13,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 195,\n      \"StatID\": 25,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 247,\n      \"StatID\": 2,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 247,\n      \"StatID\": 3,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 247,\n      \"StatID\": 4,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 247,\n      \"StatID\": 5,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 247,\n      \"StatID\": 6,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 247,\n      \"StatID\": 7,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 247,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 247,\n      \"StatID\": 9,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 247,\n      \"StatID\": 10,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 287,\n      \"StatID\": 2,\n      \"Val\": 47\n    },\n    {\n      \"StaffID\": 287,\n      \"StatID\": 3,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 287,\n      \"StatID\": 4,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 287,\n      \"StatID\": 5,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 287,\n      \"StatID\": 6,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 287,\n      \"StatID\": 7,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 287,\n      \"StatID\": 8,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 287,\n      \"StatID\": 9,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 287,\n      \"StatID\": 10,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 292,\n      \"StatID\": 11,\n      \"Val\": 95\n    },\n    {\n      \"StaffID\": 292,\n      \"StatID\": 22,\n      \"Val\": 94\n    },\n    {\n      \"StaffID\": 292,\n      \"StatID\": 23,\n      \"Val\": 95\n    },\n    {\n      \"StaffID\": 292,\n      \"StatID\": 24,\n      \"Val\": 93\n    },\n    {\n      \"StaffID\": 293,\n      \"StatID\": 11,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 293,\n      \"StatID\": 22,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 293,\n      \"StatID\": 23,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 293,\n      \"StatID\": 24,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 299,\n      \"StatID\": 11,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 299,\n      \"StatID\": 22,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 299,\n      \"StatID\": 23,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 299,\n      \"StatID\": 24,\n      \"Val\": 95\n    },\n    {\n      \"StaffID\": 306,\n      \"StatID\": 2,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 306,\n      \"StatID\": 3,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 306,\n      \"StatID\": 4,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 306,\n      \"StatID\": 5,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 306,\n      \"StatID\": 6,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 306,\n      \"StatID\": 7,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 306,\n      \"StatID\": 8,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 306,\n      \"StatID\": 9,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 306,\n      \"StatID\": 10,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 308,\n      \"StatID\": 2,\n      \"Val\": 45\n    },\n    {\n      \"StaffID\": 308,\n      \"StatID\": 3,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 308,\n      \"StatID\": 4,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 308,\n      \"StatID\": 5,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 308,\n      \"StatID\": 6,\n      \"Val\": 44\n    },\n    {\n      \"StaffID\": 308,\n      \"StatID\": 7,\n      \"Val\": 46\n    },\n    {\n      \"StaffID\": 308,\n      \"StatID\": 8,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 308,\n      \"StatID\": 9,\n      \"Val\": 47\n    },\n    {\n      \"StaffID\": 308,\n      \"StatID\": 10,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 309,\n      \"StatID\": 11,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 309,\n      \"StatID\": 22,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 309,\n      \"StatID\": 23,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 309,\n      \"StatID\": 24,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 310,\n      \"StatID\": 11,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 310,\n      \"StatID\": 22,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 310,\n      \"StatID\": 23,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 310,\n      \"StatID\": 24,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 311,\n      \"StatID\": 11,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 311,\n      \"StatID\": 22,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 311,\n      \"StatID\": 23,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 311,\n      \"StatID\": 24,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 312,\n      \"StatID\": 11,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 312,\n      \"StatID\": 22,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 312,\n      \"StatID\": 24,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 313,\n      \"StatID\": 11,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 313,\n      \"StatID\": 22,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 313,\n      \"StatID\": 23,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 314,\n      \"StatID\": 11,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 314,\n      \"StatID\": 22,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 314,\n      \"StatID\": 23,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 314,\n      \"StatID\": 24,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 315,\n      \"StatID\": 11,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 315,\n      \"StatID\": 22,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 315,\n      \"StatID\": 23,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 315,\n      \"StatID\": 24,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 316,\n      \"StatID\": 11,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 316,\n      \"StatID\": 22,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 316,\n      \"StatID\": 23,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 316,\n      \"StatID\": 24,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 317,\n      \"StatID\": 11,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 317,\n      \"StatID\": 22,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 317,\n      \"StatID\": 23,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 317,\n      \"StatID\": 24,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 318,\n      \"StatID\": 11,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 318,\n      \"StatID\": 22,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 318,\n      \"StatID\": 23,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 318,\n      \"StatID\": 24,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 319,\n      \"StatID\": 11,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 319,\n      \"StatID\": 22,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 319,\n      \"StatID\": 23,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 319,\n      \"StatID\": 24,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 320,\n      \"StatID\": 13,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 320,\n      \"StatID\": 25,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 321,\n      \"StatID\": 13,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 321,\n      \"StatID\": 25,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 6,\n      \"StatID\": 43,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 7,\n      \"StatID\": 43,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 47,\n      \"StatID\": 43,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 48,\n      \"StatID\": 43,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 49,\n      \"StatID\": 43,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 50,\n      \"StatID\": 43,\n      \"Val\": 91\n    },\n    {\n      \"StaffID\": 51,\n      \"StatID\": 43,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 54,\n      \"StatID\": 43,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 55,\n      \"StatID\": 43,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 56,\n      \"StatID\": 43,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 58,\n      \"StatID\": 43,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 59,\n      \"StatID\": 43,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 60,\n      \"StatID\": 43,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 61,\n      \"StatID\": 43,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 63,\n      \"StatID\": 43,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 64,\n      \"StatID\": 43,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 146,\n      \"StatID\": 43,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 148,\n      \"StatID\": 43,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 149,\n      \"StatID\": 43,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 151,\n      \"StatID\": 43,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 152,\n      \"StatID\": 43,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 153,\n      \"StatID\": 43,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 155,\n      \"StatID\": 43,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 159,\n      \"StatID\": 43,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 160,\n      \"StatID\": 43,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 161,\n      \"StatID\": 43,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 162,\n      \"StatID\": 43,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 163,\n      \"StatID\": 43,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 165,\n      \"StatID\": 43,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 166,\n      \"StatID\": 43,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 168,\n      \"StatID\": 43,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 169,\n      \"StatID\": 43,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 172,\n      \"StatID\": 43,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 174,\n      \"StatID\": 43,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 175,\n      \"StatID\": 43,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 178,\n      \"StatID\": 43,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 179,\n      \"StatID\": 43,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 181,\n      \"StatID\": 43,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 183,\n      \"StatID\": 43,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 184,\n      \"StatID\": 43,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 187,\n      \"StatID\": 43,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 191,\n      \"StatID\": 43,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 193,\n      \"StatID\": 43,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 195,\n      \"StatID\": 43,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 320,\n      \"StatID\": 43,\n      \"Val\": 95\n    },\n    {\n      \"StaffID\": 321,\n      \"StatID\": 43,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 333,\n      \"StatID\": 0,\n      \"Val\": 95\n    },\n    {\n      \"StaffID\": 333,\n      \"StatID\": 1,\n      \"Val\": 93\n    },\n    {\n      \"StaffID\": 333,\n      \"StatID\": 14,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 333,\n      \"StatID\": 15,\n      \"Val\": 95\n    },\n    {\n      \"StaffID\": 333,\n      \"StatID\": 16,\n      \"Val\": 94\n    },\n    {\n      \"StaffID\": 333,\n      \"StatID\": 17,\n      \"Val\": 93\n    },\n    {\n      \"StaffID\": 334,\n      \"StatID\": 0,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 334,\n      \"StatID\": 1,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 334,\n      \"StatID\": 14,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 334,\n      \"StatID\": 15,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 334,\n      \"StatID\": 16,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 334,\n      \"StatID\": 17,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 335,\n      \"StatID\": 0,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 335,\n      \"StatID\": 1,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 335,\n      \"StatID\": 14,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 335,\n      \"StatID\": 15,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 335,\n      \"StatID\": 16,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 335,\n      \"StatID\": 17,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 337,\n      \"StatID\": 19,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 337,\n      \"StatID\": 20,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 337,\n      \"StatID\": 26,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 337,\n      \"StatID\": 27,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 337,\n      \"StatID\": 28,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 337,\n      \"StatID\": 29,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 337,\n      \"StatID\": 30,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 337,\n      \"StatID\": 31,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 341,\n      \"StatID\": 25,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 341,\n      \"StatID\": 43,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 343,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 343,\n      \"StatID\": 25,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 343,\n      \"StatID\": 43,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 344,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 344,\n      \"StatID\": 25,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 344,\n      \"StatID\": 43,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 345,\n      \"StatID\": 13,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 345,\n      \"StatID\": 25,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 345,\n      \"StatID\": 43,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 361,\n      \"StatID\": 13,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 361,\n      \"StatID\": 43,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 364,\n      \"StatID\": 13,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 364,\n      \"StatID\": 25,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 364,\n      \"StatID\": 43,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 365,\n      \"StatID\": 0,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 365,\n      \"StatID\": 1,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 365,\n      \"StatID\": 14,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 365,\n      \"StatID\": 15,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 365,\n      \"StatID\": 16,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 365,\n      \"StatID\": 17,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 366,\n      \"StatID\": 11,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 366,\n      \"StatID\": 22,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 366,\n      \"StatID\": 23,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 366,\n      \"StatID\": 24,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 367,\n      \"StatID\": 11,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 367,\n      \"StatID\": 22,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 367,\n      \"StatID\": 23,\n      \"Val\": 94\n    },\n    {\n      \"StaffID\": 367,\n      \"StatID\": 24,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 368,\n      \"StatID\": 11,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 368,\n      \"StatID\": 22,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 368,\n      \"StatID\": 23,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 368,\n      \"StatID\": 24,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 369,\n      \"StatID\": 19,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 369,\n      \"StatID\": 20,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 369,\n      \"StatID\": 26,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 369,\n      \"StatID\": 27,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 369,\n      \"StatID\": 28,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 369,\n      \"StatID\": 29,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 369,\n      \"StatID\": 30,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 369,\n      \"StatID\": 31,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 370,\n      \"StatID\": 11,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 370,\n      \"StatID\": 22,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 370,\n      \"StatID\": 23,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 370,\n      \"StatID\": 24,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 374,\n      \"StatID\": 2,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 374,\n      \"StatID\": 3,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 374,\n      \"StatID\": 4,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 374,\n      \"StatID\": 5,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 374,\n      \"StatID\": 6,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 374,\n      \"StatID\": 7,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 374,\n      \"StatID\": 8,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 374,\n      \"StatID\": 9,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 374,\n      \"StatID\": 10,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 386,\n      \"StatID\": 2,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 386,\n      \"StatID\": 3,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 386,\n      \"StatID\": 4,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 386,\n      \"StatID\": 5,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 386,\n      \"StatID\": 6,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 386,\n      \"StatID\": 8,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 386,\n      \"StatID\": 9,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 386,\n      \"StatID\": 10,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 388,\n      \"StatID\": 2,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 388,\n      \"StatID\": 3,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 388,\n      \"StatID\": 5,\n      \"Val\": 47\n    },\n    {\n      \"StaffID\": 388,\n      \"StatID\": 6,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 388,\n      \"StatID\": 7,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 388,\n      \"StatID\": 8,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 388,\n      \"StatID\": 9,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 388,\n      \"StatID\": 10,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 390,\n      \"StatID\": 2,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 390,\n      \"StatID\": 3,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 390,\n      \"StatID\": 4,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 390,\n      \"StatID\": 5,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 390,\n      \"StatID\": 6,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 390,\n      \"StatID\": 7,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 390,\n      \"StatID\": 8,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 390,\n      \"StatID\": 9,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 390,\n      \"StatID\": 10,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 391,\n      \"StatID\": 0,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 391,\n      \"StatID\": 1,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 391,\n      \"StatID\": 14,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 391,\n      \"StatID\": 15,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 391,\n      \"StatID\": 16,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 391,\n      \"StatID\": 17,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 392,\n      \"StatID\": 11,\n      \"Val\": 91\n    },\n    {\n      \"StaffID\": 392,\n      \"StatID\": 22,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 392,\n      \"StatID\": 23,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 392,\n      \"StatID\": 24,\n      \"Val\": 91\n    },\n    {\n      \"StaffID\": 393,\n      \"StatID\": 13,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 393,\n      \"StatID\": 25,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 393,\n      \"StatID\": 43,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 397,\n      \"StatID\": 11,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 397,\n      \"StatID\": 22,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 397,\n      \"StatID\": 23,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 397,\n      \"StatID\": 24,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 400,\n      \"StatID\": 2,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 400,\n      \"StatID\": 3,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 400,\n      \"StatID\": 4,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 400,\n      \"StatID\": 5,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 400,\n      \"StatID\": 6,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 400,\n      \"StatID\": 7,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 400,\n      \"StatID\": 8,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 400,\n      \"StatID\": 9,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 400,\n      \"StatID\": 10,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 401,\n      \"StatID\": 2,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 401,\n      \"StatID\": 3,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 401,\n      \"StatID\": 4,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 401,\n      \"StatID\": 5,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 401,\n      \"StatID\": 6,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 401,\n      \"StatID\": 7,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 401,\n      \"StatID\": 8,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 401,\n      \"StatID\": 9,\n      \"Val\": 49\n    },\n    {\n      \"StaffID\": 401,\n      \"StatID\": 10,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 403,\n      \"StatID\": 0,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 403,\n      \"StatID\": 1,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 403,\n      \"StatID\": 14,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 403,\n      \"StatID\": 15,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 403,\n      \"StatID\": 16,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 403,\n      \"StatID\": 17,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 404,\n      \"StatID\": 19,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 404,\n      \"StatID\": 20,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 404,\n      \"StatID\": 26,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 404,\n      \"StatID\": 27,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 404,\n      \"StatID\": 28,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 404,\n      \"StatID\": 29,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 404,\n      \"StatID\": 30,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 404,\n      \"StatID\": 31,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 408,\n      \"StatID\": 2,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 408,\n      \"StatID\": 3,\n      \"Val\": 49\n    },\n    {\n      \"StaffID\": 408,\n      \"StatID\": 4,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 408,\n      \"StatID\": 5,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 408,\n      \"StatID\": 6,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 408,\n      \"StatID\": 7,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 408,\n      \"StatID\": 8,\n      \"Val\": 47\n    },\n    {\n      \"StaffID\": 408,\n      \"StatID\": 9,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 408,\n      \"StatID\": 10,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 413,\n      \"StatID\": 2,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 413,\n      \"StatID\": 3,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 413,\n      \"StatID\": 4,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 413,\n      \"StatID\": 5,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 413,\n      \"StatID\": 6,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 413,\n      \"StatID\": 7,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 413,\n      \"StatID\": 8,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 413,\n      \"StatID\": 9,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 413,\n      \"StatID\": 10,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 414,\n      \"StatID\": 19,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 414,\n      \"StatID\": 20,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 414,\n      \"StatID\": 26,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 414,\n      \"StatID\": 27,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 414,\n      \"StatID\": 28,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 414,\n      \"StatID\": 29,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 414,\n      \"StatID\": 30,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 414,\n      \"StatID\": 31,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 415,\n      \"StatID\": 13,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 415,\n      \"StatID\": 25,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 415,\n      \"StatID\": 43,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 416,\n      \"StatID\": 2,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 416,\n      \"StatID\": 3,\n      \"Val\": 44\n    },\n    {\n      \"StaffID\": 416,\n      \"StatID\": 4,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 416,\n      \"StatID\": 5,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 416,\n      \"StatID\": 6,\n      \"Val\": 46\n    },\n    {\n      \"StaffID\": 416,\n      \"StatID\": 7,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 416,\n      \"StatID\": 8,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 416,\n      \"StatID\": 9,\n      \"Val\": 47\n    },\n    {\n      \"StaffID\": 416,\n      \"StatID\": 10,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 420,\n      \"StatID\": 13,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 420,\n      \"StatID\": 25,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 420,\n      \"StatID\": 43,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 421,\n      \"StatID\": 25,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 421,\n      \"StatID\": 43,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 422,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 422,\n      \"StatID\": 25,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 422,\n      \"StatID\": 43,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 423,\n      \"StatID\": 13,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 423,\n      \"StatID\": 25,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 423,\n      \"StatID\": 43,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 424,\n      \"StatID\": 13,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 424,\n      \"StatID\": 25,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 424,\n      \"StatID\": 43,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 425,\n      \"StatID\": 13,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 425,\n      \"StatID\": 25,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 425,\n      \"StatID\": 43,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 426,\n      \"StatID\": 13,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 426,\n      \"StatID\": 25,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 426,\n      \"StatID\": 43,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 427,\n      \"StatID\": 25,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 427,\n      \"StatID\": 43,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 428,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 428,\n      \"StatID\": 25,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 428,\n      \"StatID\": 43,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 429,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 429,\n      \"StatID\": 25,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 429,\n      \"StatID\": 43,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 430,\n      \"StatID\": 13,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 430,\n      \"StatID\": 25,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 430,\n      \"StatID\": 43,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 431,\n      \"StatID\": 25,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 431,\n      \"StatID\": 43,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 432,\n      \"StatID\": 13,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 432,\n      \"StatID\": 25,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 432,\n      \"StatID\": 43,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 433,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 433,\n      \"StatID\": 25,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 433,\n      \"StatID\": 43,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 434,\n      \"StatID\": 13,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 434,\n      \"StatID\": 43,\n      \"Val\": 43\n    },\n    {\n      \"StaffID\": 435,\n      \"StatID\": 13,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 435,\n      \"StatID\": 25,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 435,\n      \"StatID\": 43,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 436,\n      \"StatID\": 2,\n      \"Val\": 47\n    },\n    {\n      \"StaffID\": 436,\n      \"StatID\": 4,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 437,\n      \"StatID\": 2,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 437,\n      \"StatID\": 4,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 438,\n      \"StatID\": 3,\n      \"Val\": 47\n    },\n    {\n      \"StaffID\": 438,\n      \"StatID\": 4,\n      \"Val\": 49\n    },\n    {\n      \"StaffID\": 438,\n      \"StatID\": 5,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 436,\n      \"StatID\": 5,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 436,\n      \"StatID\": 6,\n      \"Val\": 47\n    },\n    {\n      \"StaffID\": 436,\n      \"StatID\": 7,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 436,\n      \"StatID\": 8,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 436,\n      \"StatID\": 9,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 436,\n      \"StatID\": 10,\n      \"Val\": 43\n    },\n    {\n      \"StaffID\": 437,\n      \"StatID\": 5,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 437,\n      \"StatID\": 6,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 437,\n      \"StatID\": 7,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 437,\n      \"StatID\": 8,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 437,\n      \"StatID\": 9,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 437,\n      \"StatID\": 10,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 438,\n      \"StatID\": 2,\n      \"Val\": 45\n    },\n    {\n      \"StaffID\": 438,\n      \"StatID\": 6,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 438,\n      \"StatID\": 7,\n      \"Val\": 43\n    },\n    {\n      \"StaffID\": 438,\n      \"StatID\": 8,\n      \"Val\": 44\n    },\n    {\n      \"StaffID\": 438,\n      \"StatID\": 9,\n      \"Val\": 45\n    },\n    {\n      \"StaffID\": 536,\n      \"StatID\": 19,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 536,\n      \"StatID\": 20,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 536,\n      \"StatID\": 26,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 536,\n      \"StatID\": 27,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 536,\n      \"StatID\": 28,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 536,\n      \"StatID\": 29,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 536,\n      \"StatID\": 30,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 536,\n      \"StatID\": 31,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 537,\n      \"StatID\": 19,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 537,\n      \"StatID\": 20,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 537,\n      \"StatID\": 26,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 537,\n      \"StatID\": 27,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 537,\n      \"StatID\": 28,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 537,\n      \"StatID\": 29,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 537,\n      \"StatID\": 30,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 537,\n      \"StatID\": 31,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 538,\n      \"StatID\": 19,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 538,\n      \"StatID\": 20,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 538,\n      \"StatID\": 26,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 538,\n      \"StatID\": 27,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 538,\n      \"StatID\": 28,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 538,\n      \"StatID\": 29,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 538,\n      \"StatID\": 30,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 538,\n      \"StatID\": 31,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 539,\n      \"StatID\": 0,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 539,\n      \"StatID\": 1,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 539,\n      \"StatID\": 14,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 539,\n      \"StatID\": 15,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 539,\n      \"StatID\": 16,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 539,\n      \"StatID\": 17,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 540,\n      \"StatID\": 0,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 540,\n      \"StatID\": 1,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 540,\n      \"StatID\": 14,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 540,\n      \"StatID\": 15,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 540,\n      \"StatID\": 16,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 540,\n      \"StatID\": 17,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 541,\n      \"StatID\": 0,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 541,\n      \"StatID\": 1,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 541,\n      \"StatID\": 14,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 541,\n      \"StatID\": 15,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 541,\n      \"StatID\": 16,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 541,\n      \"StatID\": 17,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 542,\n      \"StatID\": 11,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 542,\n      \"StatID\": 22,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 542,\n      \"StatID\": 23,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 542,\n      \"StatID\": 24,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 543,\n      \"StatID\": 11,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 543,\n      \"StatID\": 22,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 543,\n      \"StatID\": 23,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 543,\n      \"StatID\": 24,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 544,\n      \"StatID\": 11,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 544,\n      \"StatID\": 22,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 544,\n      \"StatID\": 23,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 544,\n      \"StatID\": 24,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 545,\n      \"StatID\": 11,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 545,\n      \"StatID\": 22,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 545,\n      \"StatID\": 23,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 545,\n      \"StatID\": 24,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 546,\n      \"StatID\": 11,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 546,\n      \"StatID\": 22,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 546,\n      \"StatID\": 23,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 546,\n      \"StatID\": 24,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 547,\n      \"StatID\": 2,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 547,\n      \"StatID\": 3,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 547,\n      \"StatID\": 4,\n      \"Val\": 49\n    },\n    {\n      \"StaffID\": 547,\n      \"StatID\": 5,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 547,\n      \"StatID\": 6,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 547,\n      \"StatID\": 7,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 547,\n      \"StatID\": 8,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 547,\n      \"StatID\": 9,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 547,\n      \"StatID\": 10,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 548,\n      \"StatID\": 2,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 548,\n      \"StatID\": 3,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 548,\n      \"StatID\": 4,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 548,\n      \"StatID\": 5,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 548,\n      \"StatID\": 6,\n      \"Val\": 47\n    },\n    {\n      \"StaffID\": 548,\n      \"StatID\": 7,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 548,\n      \"StatID\": 8,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 548,\n      \"StatID\": 9,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 548,\n      \"StatID\": 10,\n      \"Val\": 46\n    },\n    {\n      \"StaffID\": 549,\n      \"StatID\": 2,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 549,\n      \"StatID\": 3,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 549,\n      \"StatID\": 4,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 549,\n      \"StatID\": 5,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 549,\n      \"StatID\": 6,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 549,\n      \"StatID\": 7,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 549,\n      \"StatID\": 8,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 549,\n      \"StatID\": 9,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 549,\n      \"StatID\": 10,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 550,\n      \"StatID\": 2,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 550,\n      \"StatID\": 3,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 550,\n      \"StatID\": 4,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 550,\n      \"StatID\": 5,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 550,\n      \"StatID\": 6,\n      \"Val\": 45\n    },\n    {\n      \"StaffID\": 550,\n      \"StatID\": 7,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 550,\n      \"StatID\": 8,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 550,\n      \"StatID\": 9,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 550,\n      \"StatID\": 10,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 551,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 551,\n      \"StatID\": 3,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 551,\n      \"StatID\": 4,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 551,\n      \"StatID\": 5,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 551,\n      \"StatID\": 6,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 551,\n      \"StatID\": 7,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 551,\n      \"StatID\": 8,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 551,\n      \"StatID\": 9,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 551,\n      \"StatID\": 10,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 554,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 554,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 554,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 554,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 554,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 554,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 554,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 554,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 554,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 555,\n      \"StatID\": 13,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 555,\n      \"StatID\": 25,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 555,\n      \"StatID\": 43,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 556,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 556,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 556,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 557,\n      \"StatID\": 11,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 557,\n      \"StatID\": 22,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 557,\n      \"StatID\": 23,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 557,\n      \"StatID\": 24,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 567,\n      \"StatID\": 0,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 567,\n      \"StatID\": 1,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 567,\n      \"StatID\": 14,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 567,\n      \"StatID\": 15,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 567,\n      \"StatID\": 16,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 567,\n      \"StatID\": 17,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 568,\n      \"StatID\": 19,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 568,\n      \"StatID\": 20,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 568,\n      \"StatID\": 26,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 568,\n      \"StatID\": 27,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 568,\n      \"StatID\": 28,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 568,\n      \"StatID\": 29,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 568,\n      \"StatID\": 30,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 568,\n      \"StatID\": 31,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 146,\n      \"StatID\": 13,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 153,\n      \"StatID\": 25,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 173,\n      \"StatID\": 43,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 178,\n      \"StatID\": 13,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 181,\n      \"StatID\": 13,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 312,\n      \"StatID\": 23,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 436,\n      \"StatID\": 3,\n      \"Val\": 46\n    },\n    {\n      \"StaffID\": 437,\n      \"StatID\": 3,\n      \"Val\": 49\n    },\n    {\n      \"StaffID\": 438,\n      \"StatID\": 10,\n      \"Val\": 44\n    },\n    {\n      \"StaffID\": 608,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 608,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 608,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 608,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 608,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 608,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 608,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 608,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 608,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 622,\n      \"StatID\": 13,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 622,\n      \"StatID\": 25,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 622,\n      \"StatID\": 43,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 623,\n      \"StatID\": 13,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 623,\n      \"StatID\": 25,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 623,\n      \"StatID\": 43,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 624,\n      \"StatID\": 13,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 624,\n      \"StatID\": 25,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 624,\n      \"StatID\": 43,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 625,\n      \"StatID\": 13,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 625,\n      \"StatID\": 25,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 625,\n      \"StatID\": 43,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 626,\n      \"StatID\": 13,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 626,\n      \"StatID\": 25,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 626,\n      \"StatID\": 43,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 628,\n      \"StatID\": 0,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 628,\n      \"StatID\": 1,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 628,\n      \"StatID\": 14,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 628,\n      \"StatID\": 15,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 628,\n      \"StatID\": 16,\n      \"Val\": 91\n    },\n    {\n      \"StaffID\": 628,\n      \"StatID\": 17,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 630,\n      \"StatID\": 0,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 630,\n      \"StatID\": 1,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 630,\n      \"StatID\": 14,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 630,\n      \"StatID\": 15,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 630,\n      \"StatID\": 16,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 630,\n      \"StatID\": 17,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 633,\n      \"StatID\": 0,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 633,\n      \"StatID\": 1,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 633,\n      \"StatID\": 14,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 633,\n      \"StatID\": 15,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 633,\n      \"StatID\": 16,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 633,\n      \"StatID\": 17,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 635,\n      \"StatID\": 19,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 635,\n      \"StatID\": 20,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 635,\n      \"StatID\": 26,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 635,\n      \"StatID\": 27,\n      \"Val\": 91\n    },\n    {\n      \"StaffID\": 635,\n      \"StatID\": 28,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 635,\n      \"StatID\": 29,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 635,\n      \"StatID\": 30,\n      \"Val\": 91\n    },\n    {\n      \"StaffID\": 635,\n      \"StatID\": 31,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 636,\n      \"StatID\": 19,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 636,\n      \"StatID\": 20,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 636,\n      \"StatID\": 26,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 636,\n      \"StatID\": 27,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 636,\n      \"StatID\": 28,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 636,\n      \"StatID\": 29,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 636,\n      \"StatID\": 30,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 636,\n      \"StatID\": 31,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 637,\n      \"StatID\": 19,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 637,\n      \"StatID\": 20,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 637,\n      \"StatID\": 26,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 637,\n      \"StatID\": 27,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 637,\n      \"StatID\": 28,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 637,\n      \"StatID\": 29,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 637,\n      \"StatID\": 30,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 637,\n      \"StatID\": 31,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 638,\n      \"StatID\": 11,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 638,\n      \"StatID\": 22,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 638,\n      \"StatID\": 23,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 638,\n      \"StatID\": 24,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 639,\n      \"StatID\": 11,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 639,\n      \"StatID\": 22,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 639,\n      \"StatID\": 23,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 639,\n      \"StatID\": 24,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 640,\n      \"StatID\": 11,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 640,\n      \"StatID\": 22,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 640,\n      \"StatID\": 23,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 640,\n      \"StatID\": 24,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 641,\n      \"StatID\": 11,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 641,\n      \"StatID\": 22,\n      \"Val\": 93\n    },\n    {\n      \"StaffID\": 641,\n      \"StatID\": 23,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 641,\n      \"StatID\": 24,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 642,\n      \"StatID\": 0,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 642,\n      \"StatID\": 1,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 642,\n      \"StatID\": 14,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 642,\n      \"StatID\": 15,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 642,\n      \"StatID\": 16,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 642,\n      \"StatID\": 17,\n      \"Val\": 91\n    },\n    {\n      \"StaffID\": 643,\n      \"StatID\": 13,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 643,\n      \"StatID\": 25,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 643,\n      \"StatID\": 43,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 644,\n      \"StatID\": 13,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 644,\n      \"StatID\": 25,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 644,\n      \"StatID\": 43,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 40,\n      \"StatID\": 19,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 33,\n      \"StatID\": 0,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 58,\n      \"StatID\": 13,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 119,\n      \"StatID\": 2,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 158,\n      \"StatID\": 43,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 159,\n      \"StatID\": 13,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 193,\n      \"StatID\": 13,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 313,\n      \"StatID\": 24,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 341,\n      \"StatID\": 13,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 361,\n      \"StatID\": 25,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 386,\n      \"StatID\": 7,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 388,\n      \"StatID\": 4,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 421,\n      \"StatID\": 13,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 427,\n      \"StatID\": 13,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 431,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 434,\n      \"StatID\": 25,\n      \"Val\": 47\n    },\n    {\n      \"StaffID\": 677,\n      \"StatID\": 19,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 677,\n      \"StatID\": 20,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 677,\n      \"StatID\": 26,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 677,\n      \"StatID\": 27,\n      \"Val\": 91\n    },\n    {\n      \"StaffID\": 677,\n      \"StatID\": 28,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 677,\n      \"StatID\": 29,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 677,\n      \"StatID\": 30,\n      \"Val\": 91\n    },\n    {\n      \"StaffID\": 677,\n      \"StatID\": 31,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 678,\n      \"StatID\": 11,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 678,\n      \"StatID\": 22,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 678,\n      \"StatID\": 23,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 678,\n      \"StatID\": 24,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 679,\n      \"StatID\": 11,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 679,\n      \"StatID\": 22,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 679,\n      \"StatID\": 23,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 679,\n      \"StatID\": 24,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 680,\n      \"StatID\": 13,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 680,\n      \"StatID\": 25,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 680,\n      \"StatID\": 43,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 681,\n      \"StatID\": 0,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 681,\n      \"StatID\": 1,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 681,\n      \"StatID\": 14,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 681,\n      \"StatID\": 15,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 681,\n      \"StatID\": 16,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 681,\n      \"StatID\": 17,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 682,\n      \"StatID\": 13,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 682,\n      \"StatID\": 25,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 682,\n      \"StatID\": 43,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 683,\n      \"StatID\": 0,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 683,\n      \"StatID\": 1,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 683,\n      \"StatID\": 14,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 683,\n      \"StatID\": 15,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 683,\n      \"StatID\": 16,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 683,\n      \"StatID\": 17,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 684,\n      \"StatID\": 13,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 684,\n      \"StatID\": 25,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 684,\n      \"StatID\": 43,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 395,\n      \"StatID\": 13,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 395,\n      \"StatID\": 25,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 395,\n      \"StatID\": 43,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 338,\n      \"StatID\": 13,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 338,\n      \"StatID\": 25,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 338,\n      \"StatID\": 43,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 156,\n      \"StatID\": 13,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 156,\n      \"StatID\": 25,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 156,\n      \"StatID\": 43,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 145,\n      \"StatID\": 13,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 145,\n      \"StatID\": 25,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 145,\n      \"StatID\": 43,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 685,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 685,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 685,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 685,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 685,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 685,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 685,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 685,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 685,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 686,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 686,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 686,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 686,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 686,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 686,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 686,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 686,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 686,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 687,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 687,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 687,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 687,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 687,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 687,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 687,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 687,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 687,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 688,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 688,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 688,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 688,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 688,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 688,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 688,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 688,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 688,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 689,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 689,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 689,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 689,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 689,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 689,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 689,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 689,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 689,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 690,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 690,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 690,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 691,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 691,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 691,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 692,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 692,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 692,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 693,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 693,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 693,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 694,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 694,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 694,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 695,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 695,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 695,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 696,\n      \"StatID\": 0,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 696,\n      \"StatID\": 1,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 696,\n      \"StatID\": 14,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 696,\n      \"StatID\": 15,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 696,\n      \"StatID\": 16,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 696,\n      \"StatID\": 17,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 697,\n      \"StatID\": 11,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 697,\n      \"StatID\": 22,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 697,\n      \"StatID\": 23,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 697,\n      \"StatID\": 24,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 698,\n      \"StatID\": 11,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 698,\n      \"StatID\": 22,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 698,\n      \"StatID\": 23,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 698,\n      \"StatID\": 24,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 699,\n      \"StatID\": 11,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 699,\n      \"StatID\": 22,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 699,\n      \"StatID\": 23,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 699,\n      \"StatID\": 24,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 700,\n      \"StatID\": 0,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 700,\n      \"StatID\": 1,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 700,\n      \"StatID\": 14,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 700,\n      \"StatID\": 15,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 700,\n      \"StatID\": 16,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 700,\n      \"StatID\": 17,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 701,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 701,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 701,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 702,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 702,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 702,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 703,\n      \"StatID\": 19,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 703,\n      \"StatID\": 20,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 703,\n      \"StatID\": 26,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 703,\n      \"StatID\": 27,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 703,\n      \"StatID\": 28,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 703,\n      \"StatID\": 29,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 703,\n      \"StatID\": 30,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 703,\n      \"StatID\": 31,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 704,\n      \"StatID\": 11,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 704,\n      \"StatID\": 22,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 704,\n      \"StatID\": 23,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 704,\n      \"StatID\": 24,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 705,\n      \"StatID\": 11,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 705,\n      \"StatID\": 22,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 705,\n      \"StatID\": 23,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 705,\n      \"StatID\": 24,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 706,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 706,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 706,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 707,\n      \"StatID\": 0,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 707,\n      \"StatID\": 1,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 707,\n      \"StatID\": 14,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 707,\n      \"StatID\": 15,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 707,\n      \"StatID\": 16,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 707,\n      \"StatID\": 17,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 708,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 708,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 708,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 709,\n      \"StatID\": 0,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 709,\n      \"StatID\": 1,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 709,\n      \"StatID\": 14,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 709,\n      \"StatID\": 15,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 709,\n      \"StatID\": 16,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 709,\n      \"StatID\": 17,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 710,\n      \"StatID\": 13,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 710,\n      \"StatID\": 25,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 710,\n      \"StatID\": 43,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 711,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 711,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 711,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 711,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 711,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 711,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 711,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 711,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 711,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 712,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 712,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 712,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 712,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 712,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 712,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 712,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 712,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 712,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 713,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 713,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 713,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 713,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 713,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 713,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 713,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 713,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 713,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 714,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 714,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 714,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 714,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 714,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 714,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 714,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 714,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 714,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 715,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 715,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 715,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 715,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 715,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 715,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 715,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 715,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 715,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 716,\n      \"StatID\": 2,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 716,\n      \"StatID\": 3,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 716,\n      \"StatID\": 4,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 716,\n      \"StatID\": 5,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 716,\n      \"StatID\": 6,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 716,\n      \"StatID\": 7,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 716,\n      \"StatID\": 8,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 716,\n      \"StatID\": 9,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 716,\n      \"StatID\": 10,\n      \"Val\": 0\n    },\n    {\n      \"StaffID\": 43,\n      \"StatID\": 26,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 10,\n      \"StatID\": 2,\n      \"Val\": 96\n    },\n    {\n      \"StaffID\": 10,\n      \"StatID\": 3,\n      \"Val\": 94\n    },\n    {\n      \"StaffID\": 10,\n      \"StatID\": 4,\n      \"Val\": 95\n    },\n    {\n      \"StaffID\": 10,\n      \"StatID\": 5,\n      \"Val\": 93\n    },\n    {\n      \"StaffID\": 10,\n      \"StatID\": 6,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 10,\n      \"StatID\": 7,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 10,\n      \"StatID\": 8,\n      \"Val\": 93\n    },\n    {\n      \"StaffID\": 10,\n      \"StatID\": 9,\n      \"Val\": 95\n    },\n    {\n      \"StaffID\": 10,\n      \"StatID\": 10,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 2,\n      \"StatID\": 2,\n      \"Val\": 93\n    },\n    {\n      \"StaffID\": 2,\n      \"StatID\": 3,\n      \"Val\": 95\n    },\n    {\n      \"StaffID\": 2,\n      \"StatID\": 4,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 2,\n      \"StatID\": 5,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 2,\n      \"StatID\": 6,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 2,\n      \"StatID\": 7,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 2,\n      \"StatID\": 8,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 2,\n      \"StatID\": 9,\n      \"Val\": 92\n    },\n    {\n      \"StaffID\": 2,\n      \"StatID\": 10,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 23,\n      \"StatID\": 2,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 23,\n      \"StatID\": 3,\n      \"Val\": 94\n    },\n    {\n      \"StaffID\": 23,\n      \"StatID\": 4,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 23,\n      \"StatID\": 5,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 23,\n      \"StatID\": 6,\n      \"Val\": 91\n    },\n    {\n      \"StaffID\": 23,\n      \"StatID\": 7,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 23,\n      \"StatID\": 8,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 23,\n      \"StatID\": 9,\n      \"Val\": 93\n    },\n    {\n      \"StaffID\": 23,\n      \"StatID\": 10,\n      \"Val\": 94\n    },\n    {\n      \"StaffID\": 12,\n      \"StatID\": 2,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 12,\n      \"StatID\": 3,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 12,\n      \"StatID\": 4,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 12,\n      \"StatID\": 5,\n      \"Val\": 93\n    },\n    {\n      \"StaffID\": 12,\n      \"StatID\": 6,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 12,\n      \"StatID\": 7,\n      \"Val\": 93\n    },\n    {\n      \"StaffID\": 12,\n      \"StatID\": 8,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 12,\n      \"StatID\": 9,\n      \"Val\": 91\n    },\n    {\n      \"StaffID\": 12,\n      \"StatID\": 10,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 77,\n      \"StatID\": 2,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 77,\n      \"StatID\": 3,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 77,\n      \"StatID\": 4,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 77,\n      \"StatID\": 5,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 77,\n      \"StatID\": 6,\n      \"Val\": 91\n    },\n    {\n      \"StaffID\": 77,\n      \"StatID\": 7,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 77,\n      \"StatID\": 8,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 77,\n      \"StatID\": 9,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 77,\n      \"StatID\": 10,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 102,\n      \"StatID\": 2,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 102,\n      \"StatID\": 3,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 102,\n      \"StatID\": 4,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 102,\n      \"StatID\": 5,\n      \"Val\": 91\n    },\n    {\n      \"StaffID\": 102,\n      \"StatID\": 6,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 102,\n      \"StatID\": 7,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 102,\n      \"StatID\": 8,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 102,\n      \"StatID\": 9,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 102,\n      \"StatID\": 10,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 1,\n      \"StatID\": 2,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 1,\n      \"StatID\": 3,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 1,\n      \"StatID\": 4,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 1,\n      \"StatID\": 5,\n      \"Val\": 94\n    },\n    {\n      \"StaffID\": 1,\n      \"StatID\": 6,\n      \"Val\": 93\n    },\n    {\n      \"StaffID\": 1,\n      \"StatID\": 7,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 1,\n      \"StatID\": 8,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 1,\n      \"StatID\": 9,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 1,\n      \"StatID\": 10,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 11,\n      \"StatID\": 2,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 11,\n      \"StatID\": 3,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 11,\n      \"StatID\": 4,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 11,\n      \"StatID\": 5,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 11,\n      \"StatID\": 6,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 11,\n      \"StatID\": 7,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 11,\n      \"StatID\": 8,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 11,\n      \"StatID\": 9,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 11,\n      \"StatID\": 10,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 15,\n      \"StatID\": 2,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 15,\n      \"StatID\": 3,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 15,\n      \"StatID\": 4,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 15,\n      \"StatID\": 5,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 15,\n      \"StatID\": 6,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 15,\n      \"StatID\": 7,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 15,\n      \"StatID\": 8,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 15,\n      \"StatID\": 9,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 15,\n      \"StatID\": 10,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 3,\n      \"StatID\": 2,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 3,\n      \"StatID\": 3,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 3,\n      \"StatID\": 4,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 3,\n      \"StatID\": 5,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 3,\n      \"StatID\": 6,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 3,\n      \"StatID\": 7,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 3,\n      \"StatID\": 8,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 3,\n      \"StatID\": 9,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 3,\n      \"StatID\": 10,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 83,\n      \"StatID\": 2,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 83,\n      \"StatID\": 3,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 83,\n      \"StatID\": 4,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 83,\n      \"StatID\": 5,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 83,\n      \"StatID\": 6,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 83,\n      \"StatID\": 7,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 83,\n      \"StatID\": 8,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 83,\n      \"StatID\": 9,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 83,\n      \"StatID\": 10,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 376,\n      \"StatID\": 2,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 376,\n      \"StatID\": 3,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 376,\n      \"StatID\": 4,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 376,\n      \"StatID\": 5,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 376,\n      \"StatID\": 6,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 376,\n      \"StatID\": 7,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 376,\n      \"StatID\": 8,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 376,\n      \"StatID\": 9,\n      \"Val\": 91\n    },\n    {\n      \"StaffID\": 376,\n      \"StatID\": 10,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 17,\n      \"StatID\": 2,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 17,\n      \"StatID\": 3,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 17,\n      \"StatID\": 4,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 17,\n      \"StatID\": 5,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 17,\n      \"StatID\": 6,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 17,\n      \"StatID\": 7,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 17,\n      \"StatID\": 8,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 17,\n      \"StatID\": 9,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 17,\n      \"StatID\": 10,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 144,\n      \"StatID\": 2,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 144,\n      \"StatID\": 3,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 144,\n      \"StatID\": 4,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 144,\n      \"StatID\": 5,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 144,\n      \"StatID\": 6,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 144,\n      \"StatID\": 7,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 144,\n      \"StatID\": 8,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 144,\n      \"StatID\": 9,\n      \"Val\": 90\n    },\n    {\n      \"StaffID\": 144,\n      \"StatID\": 10,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 8,\n      \"StatID\": 2,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 8,\n      \"StatID\": 3,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 8,\n      \"StatID\": 4,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 8,\n      \"StatID\": 5,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 8,\n      \"StatID\": 6,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 8,\n      \"StatID\": 7,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 8,\n      \"StatID\": 8,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 8,\n      \"StatID\": 9,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 8,\n      \"StatID\": 10,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 81,\n      \"StatID\": 2,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 81,\n      \"StatID\": 3,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 81,\n      \"StatID\": 4,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 81,\n      \"StatID\": 5,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 81,\n      \"StatID\": 6,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 81,\n      \"StatID\": 7,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 81,\n      \"StatID\": 8,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 81,\n      \"StatID\": 9,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 81,\n      \"StatID\": 10,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 14,\n      \"StatID\": 2,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 14,\n      \"StatID\": 3,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 14,\n      \"StatID\": 4,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 14,\n      \"StatID\": 5,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 14,\n      \"StatID\": 6,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 14,\n      \"StatID\": 7,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 14,\n      \"StatID\": 8,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 14,\n      \"StatID\": 9,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 14,\n      \"StatID\": 10,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 142,\n      \"StatID\": 2,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 142,\n      \"StatID\": 3,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 142,\n      \"StatID\": 4,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 142,\n      \"StatID\": 5,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 142,\n      \"StatID\": 6,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 142,\n      \"StatID\": 7,\n      \"Val\": 88\n    },\n    {\n      \"StaffID\": 142,\n      \"StatID\": 8,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 142,\n      \"StatID\": 9,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 142,\n      \"StatID\": 10,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 279,\n      \"StatID\": 2,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 279,\n      \"StatID\": 3,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 279,\n      \"StatID\": 4,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 279,\n      \"StatID\": 5,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 279,\n      \"StatID\": 6,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 279,\n      \"StatID\": 7,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 279,\n      \"StatID\": 8,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 279,\n      \"StatID\": 9,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 279,\n      \"StatID\": 10,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 95,\n      \"StatID\": 2,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 95,\n      \"StatID\": 3,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 95,\n      \"StatID\": 4,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 95,\n      \"StatID\": 5,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 95,\n      \"StatID\": 6,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 95,\n      \"StatID\": 7,\n      \"Val\": 87\n    },\n    {\n      \"StaffID\": 95,\n      \"StatID\": 8,\n      \"Val\": 86\n    },\n    {\n      \"StaffID\": 95,\n      \"StatID\": 9,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 95,\n      \"StatID\": 10,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 18,\n      \"StatID\": 2,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 18,\n      \"StatID\": 3,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 18,\n      \"StatID\": 4,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 18,\n      \"StatID\": 5,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 18,\n      \"StatID\": 6,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 18,\n      \"StatID\": 7,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 18,\n      \"StatID\": 8,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 18,\n      \"StatID\": 9,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 18,\n      \"StatID\": 10,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 248,\n      \"StatID\": 2,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 248,\n      \"StatID\": 3,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 248,\n      \"StatID\": 4,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 248,\n      \"StatID\": 5,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 248,\n      \"StatID\": 6,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 248,\n      \"StatID\": 7,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 248,\n      \"StatID\": 8,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 248,\n      \"StatID\": 9,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 248,\n      \"StatID\": 10,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 255,\n      \"StatID\": 2,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 255,\n      \"StatID\": 3,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 255,\n      \"StatID\": 4,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 255,\n      \"StatID\": 5,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 255,\n      \"StatID\": 6,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 255,\n      \"StatID\": 7,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 255,\n      \"StatID\": 8,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 255,\n      \"StatID\": 9,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 255,\n      \"StatID\": 10,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 20,\n      \"StatID\": 2,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 20,\n      \"StatID\": 3,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 20,\n      \"StatID\": 4,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 20,\n      \"StatID\": 5,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 20,\n      \"StatID\": 6,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 20,\n      \"StatID\": 7,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 20,\n      \"StatID\": 8,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 20,\n      \"StatID\": 9,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 20,\n      \"StatID\": 10,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 285,\n      \"StatID\": 2,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 285,\n      \"StatID\": 3,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 285,\n      \"StatID\": 4,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 285,\n      \"StatID\": 5,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 285,\n      \"StatID\": 6,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 285,\n      \"StatID\": 7,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 285,\n      \"StatID\": 8,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 285,\n      \"StatID\": 9,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 285,\n      \"StatID\": 10,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 87,\n      \"StatID\": 2,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 87,\n      \"StatID\": 3,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 87,\n      \"StatID\": 4,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 87,\n      \"StatID\": 5,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 87,\n      \"StatID\": 6,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 87,\n      \"StatID\": 7,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 87,\n      \"StatID\": 8,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 87,\n      \"StatID\": 9,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 87,\n      \"StatID\": 10,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 106,\n      \"StatID\": 2,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 106,\n      \"StatID\": 3,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 106,\n      \"StatID\": 4,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 106,\n      \"StatID\": 5,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 106,\n      \"StatID\": 6,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 106,\n      \"StatID\": 7,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 106,\n      \"StatID\": 8,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 106,\n      \"StatID\": 9,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 106,\n      \"StatID\": 10,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 105,\n      \"StatID\": 2,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 105,\n      \"StatID\": 3,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 105,\n      \"StatID\": 4,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 105,\n      \"StatID\": 5,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 105,\n      \"StatID\": 6,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 105,\n      \"StatID\": 7,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 105,\n      \"StatID\": 8,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 105,\n      \"StatID\": 9,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 105,\n      \"StatID\": 10,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 281,\n      \"StatID\": 2,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 281,\n      \"StatID\": 3,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 281,\n      \"StatID\": 4,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 281,\n      \"StatID\": 5,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 281,\n      \"StatID\": 6,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 281,\n      \"StatID\": 7,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 281,\n      \"StatID\": 8,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 281,\n      \"StatID\": 9,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 281,\n      \"StatID\": 10,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 120,\n      \"StatID\": 2,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 120,\n      \"StatID\": 3,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 120,\n      \"StatID\": 4,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 120,\n      \"StatID\": 5,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 120,\n      \"StatID\": 6,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 120,\n      \"StatID\": 7,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 120,\n      \"StatID\": 8,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 120,\n      \"StatID\": 9,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 120,\n      \"StatID\": 10,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 645,\n      \"StatID\": 2,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 645,\n      \"StatID\": 3,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 645,\n      \"StatID\": 4,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 645,\n      \"StatID\": 5,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 645,\n      \"StatID\": 6,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 645,\n      \"StatID\": 7,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 645,\n      \"StatID\": 8,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 645,\n      \"StatID\": 9,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 645,\n      \"StatID\": 10,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 76,\n      \"StatID\": 2,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 76,\n      \"StatID\": 3,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 76,\n      \"StatID\": 4,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 76,\n      \"StatID\": 5,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 76,\n      \"StatID\": 6,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 76,\n      \"StatID\": 7,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 76,\n      \"StatID\": 8,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 76,\n      \"StatID\": 9,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 76,\n      \"StatID\": 10,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 373,\n      \"StatID\": 2,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 373,\n      \"StatID\": 3,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 373,\n      \"StatID\": 4,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 373,\n      \"StatID\": 5,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 373,\n      \"StatID\": 6,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 373,\n      \"StatID\": 7,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 373,\n      \"StatID\": 8,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 373,\n      \"StatID\": 9,\n      \"Val\": 83\n    },\n    {\n      \"StaffID\": 373,\n      \"StatID\": 10,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 107,\n      \"StatID\": 2,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 107,\n      \"StatID\": 3,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 107,\n      \"StatID\": 4,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 107,\n      \"StatID\": 5,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 107,\n      \"StatID\": 6,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 107,\n      \"StatID\": 7,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 107,\n      \"StatID\": 8,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 107,\n      \"StatID\": 9,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 107,\n      \"StatID\": 10,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 135,\n      \"StatID\": 2,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 135,\n      \"StatID\": 3,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 135,\n      \"StatID\": 4,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 135,\n      \"StatID\": 5,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 135,\n      \"StatID\": 6,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 135,\n      \"StatID\": 7,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 135,\n      \"StatID\": 8,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 135,\n      \"StatID\": 9,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 135,\n      \"StatID\": 10,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 22,\n      \"StatID\": 2,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 22,\n      \"StatID\": 3,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 22,\n      \"StatID\": 4,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 22,\n      \"StatID\": 5,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 22,\n      \"StatID\": 6,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 22,\n      \"StatID\": 7,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 22,\n      \"StatID\": 8,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 22,\n      \"StatID\": 9,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 22,\n      \"StatID\": 10,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 398,\n      \"StatID\": 2,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 398,\n      \"StatID\": 3,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 398,\n      \"StatID\": 4,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 398,\n      \"StatID\": 5,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 398,\n      \"StatID\": 6,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 398,\n      \"StatID\": 7,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 398,\n      \"StatID\": 8,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 398,\n      \"StatID\": 9,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 398,\n      \"StatID\": 10,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 74,\n      \"StatID\": 2,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 74,\n      \"StatID\": 3,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 74,\n      \"StatID\": 4,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 74,\n      \"StatID\": 5,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 74,\n      \"StatID\": 6,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 74,\n      \"StatID\": 7,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 74,\n      \"StatID\": 8,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 74,\n      \"StatID\": 9,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 74,\n      \"StatID\": 10,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 121,\n      \"StatID\": 2,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 121,\n      \"StatID\": 3,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 121,\n      \"StatID\": 4,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 121,\n      \"StatID\": 5,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 121,\n      \"StatID\": 6,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 121,\n      \"StatID\": 7,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 121,\n      \"StatID\": 8,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 121,\n      \"StatID\": 9,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 121,\n      \"StatID\": 10,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 289,\n      \"StatID\": 2,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 289,\n      \"StatID\": 3,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 289,\n      \"StatID\": 4,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 289,\n      \"StatID\": 5,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 289,\n      \"StatID\": 6,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 289,\n      \"StatID\": 7,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 289,\n      \"StatID\": 8,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 289,\n      \"StatID\": 9,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 289,\n      \"StatID\": 10,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 82,\n      \"StatID\": 2,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 82,\n      \"StatID\": 3,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 82,\n      \"StatID\": 4,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 82,\n      \"StatID\": 5,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 82,\n      \"StatID\": 6,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 82,\n      \"StatID\": 7,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 82,\n      \"StatID\": 8,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 82,\n      \"StatID\": 9,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 82,\n      \"StatID\": 10,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 604,\n      \"StatID\": 2,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 604,\n      \"StatID\": 3,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 604,\n      \"StatID\": 4,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 604,\n      \"StatID\": 5,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 604,\n      \"StatID\": 6,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 604,\n      \"StatID\": 7,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 604,\n      \"StatID\": 8,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 604,\n      \"StatID\": 9,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 604,\n      \"StatID\": 10,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 127,\n      \"StatID\": 2,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 127,\n      \"StatID\": 3,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 127,\n      \"StatID\": 4,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 127,\n      \"StatID\": 5,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 127,\n      \"StatID\": 6,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 127,\n      \"StatID\": 7,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 127,\n      \"StatID\": 8,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 127,\n      \"StatID\": 9,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 127,\n      \"StatID\": 10,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 130,\n      \"StatID\": 2,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 130,\n      \"StatID\": 3,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 130,\n      \"StatID\": 4,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 130,\n      \"StatID\": 5,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 130,\n      \"StatID\": 6,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 130,\n      \"StatID\": 7,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 130,\n      \"StatID\": 8,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 130,\n      \"StatID\": 9,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 130,\n      \"StatID\": 10,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 264,\n      \"StatID\": 2,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 264,\n      \"StatID\": 3,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 264,\n      \"StatID\": 4,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 264,\n      \"StatID\": 5,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 264,\n      \"StatID\": 6,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 264,\n      \"StatID\": 7,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 264,\n      \"StatID\": 8,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 264,\n      \"StatID\": 9,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 264,\n      \"StatID\": 10,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 399,\n      \"StatID\": 2,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 399,\n      \"StatID\": 3,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 399,\n      \"StatID\": 4,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 399,\n      \"StatID\": 5,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 399,\n      \"StatID\": 6,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 399,\n      \"StatID\": 7,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 399,\n      \"StatID\": 8,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 399,\n      \"StatID\": 9,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 399,\n      \"StatID\": 10,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 140,\n      \"StatID\": 2,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 140,\n      \"StatID\": 3,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 140,\n      \"StatID\": 4,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 140,\n      \"StatID\": 5,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 140,\n      \"StatID\": 6,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 140,\n      \"StatID\": 7,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 140,\n      \"StatID\": 8,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 140,\n      \"StatID\": 9,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 140,\n      \"StatID\": 10,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 242,\n      \"StatID\": 2,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 242,\n      \"StatID\": 3,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 242,\n      \"StatID\": 4,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 242,\n      \"StatID\": 5,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 242,\n      \"StatID\": 6,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 242,\n      \"StatID\": 7,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 242,\n      \"StatID\": 8,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 242,\n      \"StatID\": 9,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 242,\n      \"StatID\": 10,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 99,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 99,\n      \"StatID\": 3,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 99,\n      \"StatID\": 4,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 99,\n      \"StatID\": 5,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 99,\n      \"StatID\": 6,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 99,\n      \"StatID\": 7,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 99,\n      \"StatID\": 8,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 99,\n      \"StatID\": 9,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 99,\n      \"StatID\": 10,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 322,\n      \"StatID\": 2,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 322,\n      \"StatID\": 3,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 322,\n      \"StatID\": 4,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 322,\n      \"StatID\": 5,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 322,\n      \"StatID\": 6,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 322,\n      \"StatID\": 7,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 322,\n      \"StatID\": 8,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 322,\n      \"StatID\": 9,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 322,\n      \"StatID\": 10,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 117,\n      \"StatID\": 2,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 117,\n      \"StatID\": 3,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 117,\n      \"StatID\": 4,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 117,\n      \"StatID\": 5,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 117,\n      \"StatID\": 6,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 117,\n      \"StatID\": 7,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 117,\n      \"StatID\": 8,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 117,\n      \"StatID\": 9,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 117,\n      \"StatID\": 10,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 245,\n      \"StatID\": 2,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 245,\n      \"StatID\": 3,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 245,\n      \"StatID\": 4,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 245,\n      \"StatID\": 5,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 245,\n      \"StatID\": 6,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 245,\n      \"StatID\": 7,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 245,\n      \"StatID\": 8,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 245,\n      \"StatID\": 9,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 245,\n      \"StatID\": 10,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 282,\n      \"StatID\": 2,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 282,\n      \"StatID\": 3,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 282,\n      \"StatID\": 4,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 282,\n      \"StatID\": 5,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 282,\n      \"StatID\": 6,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 282,\n      \"StatID\": 7,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 282,\n      \"StatID\": 8,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 282,\n      \"StatID\": 9,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 282,\n      \"StatID\": 10,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 88,\n      \"StatID\": 2,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 88,\n      \"StatID\": 3,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 88,\n      \"StatID\": 4,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 88,\n      \"StatID\": 5,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 88,\n      \"StatID\": 6,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 88,\n      \"StatID\": 7,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 88,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 88,\n      \"StatID\": 9,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 88,\n      \"StatID\": 10,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 263,\n      \"StatID\": 2,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 263,\n      \"StatID\": 3,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 263,\n      \"StatID\": 4,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 263,\n      \"StatID\": 5,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 263,\n      \"StatID\": 6,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 263,\n      \"StatID\": 7,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 263,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 263,\n      \"StatID\": 9,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 263,\n      \"StatID\": 10,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 286,\n      \"StatID\": 2,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 286,\n      \"StatID\": 3,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 286,\n      \"StatID\": 4,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 286,\n      \"StatID\": 5,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 286,\n      \"StatID\": 6,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 286,\n      \"StatID\": 7,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 286,\n      \"StatID\": 8,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 286,\n      \"StatID\": 9,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 286,\n      \"StatID\": 10,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 80,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 80,\n      \"StatID\": 3,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 80,\n      \"StatID\": 4,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 80,\n      \"StatID\": 5,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 80,\n      \"StatID\": 6,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 80,\n      \"StatID\": 7,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 80,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 80,\n      \"StatID\": 9,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 80,\n      \"StatID\": 10,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 603,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 603,\n      \"StatID\": 3,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 603,\n      \"StatID\": 4,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 603,\n      \"StatID\": 5,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 603,\n      \"StatID\": 6,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 603,\n      \"StatID\": 7,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 603,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 603,\n      \"StatID\": 9,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 603,\n      \"StatID\": 10,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 280,\n      \"StatID\": 2,\n      \"Val\": 79\n    },\n    {\n      \"StaffID\": 280,\n      \"StatID\": 3,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 280,\n      \"StatID\": 4,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 280,\n      \"StatID\": 5,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 280,\n      \"StatID\": 6,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 280,\n      \"StatID\": 7,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 280,\n      \"StatID\": 8,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 280,\n      \"StatID\": 9,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 280,\n      \"StatID\": 10,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 378,\n      \"StatID\": 2,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 378,\n      \"StatID\": 3,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 378,\n      \"StatID\": 4,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 378,\n      \"StatID\": 5,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 378,\n      \"StatID\": 6,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 378,\n      \"StatID\": 7,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 378,\n      \"StatID\": 8,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 378,\n      \"StatID\": 9,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 378,\n      \"StatID\": 10,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 649,\n      \"StatID\": 2,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 649,\n      \"StatID\": 3,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 649,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 649,\n      \"StatID\": 5,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 649,\n      \"StatID\": 6,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 649,\n      \"StatID\": 7,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 649,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 649,\n      \"StatID\": 9,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 649,\n      \"StatID\": 10,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 132,\n      \"StatID\": 2,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 132,\n      \"StatID\": 3,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 132,\n      \"StatID\": 4,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 132,\n      \"StatID\": 5,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 132,\n      \"StatID\": 6,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 132,\n      \"StatID\": 7,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 132,\n      \"StatID\": 8,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 132,\n      \"StatID\": 9,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 132,\n      \"StatID\": 10,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 379,\n      \"StatID\": 2,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 379,\n      \"StatID\": 3,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 379,\n      \"StatID\": 4,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 379,\n      \"StatID\": 5,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 379,\n      \"StatID\": 6,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 379,\n      \"StatID\": 7,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 379,\n      \"StatID\": 8,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 379,\n      \"StatID\": 9,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 379,\n      \"StatID\": 10,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 301,\n      \"StatID\": 2,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 301,\n      \"StatID\": 3,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 301,\n      \"StatID\": 4,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 301,\n      \"StatID\": 5,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 301,\n      \"StatID\": 6,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 301,\n      \"StatID\": 7,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 301,\n      \"StatID\": 8,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 301,\n      \"StatID\": 9,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 301,\n      \"StatID\": 10,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 283,\n      \"StatID\": 2,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 283,\n      \"StatID\": 3,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 283,\n      \"StatID\": 4,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 283,\n      \"StatID\": 5,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 283,\n      \"StatID\": 6,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 283,\n      \"StatID\": 7,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 283,\n      \"StatID\": 8,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 283,\n      \"StatID\": 9,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 283,\n      \"StatID\": 10,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 411,\n      \"StatID\": 2,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 411,\n      \"StatID\": 3,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 411,\n      \"StatID\": 4,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 411,\n      \"StatID\": 5,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 411,\n      \"StatID\": 6,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 411,\n      \"StatID\": 7,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 411,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 411,\n      \"StatID\": 9,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 411,\n      \"StatID\": 10,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 610,\n      \"StatID\": 2,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 610,\n      \"StatID\": 3,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 610,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 610,\n      \"StatID\": 5,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 610,\n      \"StatID\": 6,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 610,\n      \"StatID\": 7,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 610,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 610,\n      \"StatID\": 9,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 610,\n      \"StatID\": 10,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 377,\n      \"StatID\": 2,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 377,\n      \"StatID\": 3,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 377,\n      \"StatID\": 4,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 377,\n      \"StatID\": 5,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 377,\n      \"StatID\": 6,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 377,\n      \"StatID\": 7,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 377,\n      \"StatID\": 8,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 377,\n      \"StatID\": 9,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 377,\n      \"StatID\": 10,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 284,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 284,\n      \"StatID\": 3,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 284,\n      \"StatID\": 4,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 284,\n      \"StatID\": 5,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 284,\n      \"StatID\": 6,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 284,\n      \"StatID\": 7,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 284,\n      \"StatID\": 8,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 284,\n      \"StatID\": 9,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 284,\n      \"StatID\": 10,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 375,\n      \"StatID\": 2,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 375,\n      \"StatID\": 3,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 375,\n      \"StatID\": 4,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 375,\n      \"StatID\": 5,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 375,\n      \"StatID\": 6,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 375,\n      \"StatID\": 7,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 375,\n      \"StatID\": 8,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 375,\n      \"StatID\": 9,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 375,\n      \"StatID\": 10,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 252,\n      \"StatID\": 2,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 252,\n      \"StatID\": 3,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 252,\n      \"StatID\": 4,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 252,\n      \"StatID\": 5,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 252,\n      \"StatID\": 6,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 252,\n      \"StatID\": 7,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 252,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 252,\n      \"StatID\": 9,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 252,\n      \"StatID\": 10,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 288,\n      \"StatID\": 2,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 288,\n      \"StatID\": 3,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 288,\n      \"StatID\": 4,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 288,\n      \"StatID\": 5,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 288,\n      \"StatID\": 6,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 288,\n      \"StatID\": 7,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 288,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 288,\n      \"StatID\": 9,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 288,\n      \"StatID\": 10,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 439,\n      \"StatID\": 2,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 439,\n      \"StatID\": 3,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 439,\n      \"StatID\": 4,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 439,\n      \"StatID\": 5,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 439,\n      \"StatID\": 6,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 439,\n      \"StatID\": 7,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 439,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 439,\n      \"StatID\": 9,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 439,\n      \"StatID\": 10,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 650,\n      \"StatID\": 2,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 650,\n      \"StatID\": 3,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 650,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 650,\n      \"StatID\": 5,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 650,\n      \"StatID\": 6,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 650,\n      \"StatID\": 7,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 650,\n      \"StatID\": 8,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 650,\n      \"StatID\": 9,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 650,\n      \"StatID\": 10,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 647,\n      \"StatID\": 2,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 647,\n      \"StatID\": 3,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 647,\n      \"StatID\": 4,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 647,\n      \"StatID\": 5,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 647,\n      \"StatID\": 6,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 647,\n      \"StatID\": 7,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 647,\n      \"StatID\": 8,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 647,\n      \"StatID\": 9,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 647,\n      \"StatID\": 10,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 380,\n      \"StatID\": 2,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 380,\n      \"StatID\": 3,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 380,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 380,\n      \"StatID\": 5,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 380,\n      \"StatID\": 6,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 380,\n      \"StatID\": 7,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 380,\n      \"StatID\": 8,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 380,\n      \"StatID\": 9,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 380,\n      \"StatID\": 10,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 614,\n      \"StatID\": 2,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 614,\n      \"StatID\": 3,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 614,\n      \"StatID\": 4,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 614,\n      \"StatID\": 5,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 614,\n      \"StatID\": 6,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 614,\n      \"StatID\": 7,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 614,\n      \"StatID\": 8,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 614,\n      \"StatID\": 9,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 614,\n      \"StatID\": 10,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 384,\n      \"StatID\": 2,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 384,\n      \"StatID\": 3,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 384,\n      \"StatID\": 4,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 384,\n      \"StatID\": 5,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 384,\n      \"StatID\": 6,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 384,\n      \"StatID\": 7,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 384,\n      \"StatID\": 8,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 384,\n      \"StatID\": 9,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 384,\n      \"StatID\": 10,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 651,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 651,\n      \"StatID\": 3,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 651,\n      \"StatID\": 4,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 651,\n      \"StatID\": 5,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 651,\n      \"StatID\": 6,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 651,\n      \"StatID\": 7,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 651,\n      \"StatID\": 8,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 651,\n      \"StatID\": 9,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 651,\n      \"StatID\": 10,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 615,\n      \"StatID\": 2,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 615,\n      \"StatID\": 3,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 615,\n      \"StatID\": 4,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 615,\n      \"StatID\": 5,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 615,\n      \"StatID\": 6,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 615,\n      \"StatID\": 7,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 615,\n      \"StatID\": 8,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 615,\n      \"StatID\": 9,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 615,\n      \"StatID\": 10,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 656,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 656,\n      \"StatID\": 3,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 656,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 656,\n      \"StatID\": 5,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 656,\n      \"StatID\": 6,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 656,\n      \"StatID\": 7,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 656,\n      \"StatID\": 8,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 656,\n      \"StatID\": 9,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 656,\n      \"StatID\": 10,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 383,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 383,\n      \"StatID\": 3,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 383,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 383,\n      \"StatID\": 5,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 383,\n      \"StatID\": 6,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 383,\n      \"StatID\": 7,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 383,\n      \"StatID\": 8,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 383,\n      \"StatID\": 9,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 383,\n      \"StatID\": 10,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 394,\n      \"StatID\": 2,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 394,\n      \"StatID\": 3,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 394,\n      \"StatID\": 4,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 394,\n      \"StatID\": 5,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 394,\n      \"StatID\": 6,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 394,\n      \"StatID\": 7,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 394,\n      \"StatID\": 8,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 394,\n      \"StatID\": 9,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 394,\n      \"StatID\": 10,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 667,\n      \"StatID\": 2,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 667,\n      \"StatID\": 3,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 667,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 667,\n      \"StatID\": 5,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 667,\n      \"StatID\": 6,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 667,\n      \"StatID\": 7,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 667,\n      \"StatID\": 8,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 667,\n      \"StatID\": 9,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 667,\n      \"StatID\": 10,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 618,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 618,\n      \"StatID\": 3,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 618,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 618,\n      \"StatID\": 5,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 618,\n      \"StatID\": 6,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 618,\n      \"StatID\": 7,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 618,\n      \"StatID\": 8,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 618,\n      \"StatID\": 9,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 618,\n      \"StatID\": 10,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 382,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 382,\n      \"StatID\": 3,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 382,\n      \"StatID\": 4,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 382,\n      \"StatID\": 5,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 382,\n      \"StatID\": 6,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 382,\n      \"StatID\": 7,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 382,\n      \"StatID\": 8,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 382,\n      \"StatID\": 9,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 382,\n      \"StatID\": 10,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 653,\n      \"StatID\": 2,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 653,\n      \"StatID\": 3,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 653,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 653,\n      \"StatID\": 5,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 653,\n      \"StatID\": 6,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 653,\n      \"StatID\": 7,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 653,\n      \"StatID\": 8,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 653,\n      \"StatID\": 9,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 653,\n      \"StatID\": 10,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 654,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 654,\n      \"StatID\": 3,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 654,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 654,\n      \"StatID\": 5,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 654,\n      \"StatID\": 6,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 654,\n      \"StatID\": 7,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 654,\n      \"StatID\": 8,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 654,\n      \"StatID\": 9,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 654,\n      \"StatID\": 10,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 381,\n      \"StatID\": 2,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 381,\n      \"StatID\": 3,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 381,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 381,\n      \"StatID\": 5,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 381,\n      \"StatID\": 6,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 381,\n      \"StatID\": 7,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 381,\n      \"StatID\": 8,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 381,\n      \"StatID\": 9,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 381,\n      \"StatID\": 10,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 617,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 617,\n      \"StatID\": 3,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 617,\n      \"StatID\": 4,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 617,\n      \"StatID\": 5,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 617,\n      \"StatID\": 6,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 617,\n      \"StatID\": 7,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 617,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 617,\n      \"StatID\": 9,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 617,\n      \"StatID\": 10,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 657,\n      \"StatID\": 2,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 657,\n      \"StatID\": 3,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 657,\n      \"StatID\": 4,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 657,\n      \"StatID\": 5,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 657,\n      \"StatID\": 6,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 657,\n      \"StatID\": 7,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 657,\n      \"StatID\": 8,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 657,\n      \"StatID\": 9,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 657,\n      \"StatID\": 10,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 123,\n      \"StatID\": 2,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 123,\n      \"StatID\": 3,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 123,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 123,\n      \"StatID\": 5,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 123,\n      \"StatID\": 6,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 123,\n      \"StatID\": 7,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 123,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 123,\n      \"StatID\": 9,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 123,\n      \"StatID\": 10,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 253,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 253,\n      \"StatID\": 3,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 253,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 253,\n      \"StatID\": 5,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 253,\n      \"StatID\": 6,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 253,\n      \"StatID\": 7,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 253,\n      \"StatID\": 8,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 253,\n      \"StatID\": 9,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 253,\n      \"StatID\": 10,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 611,\n      \"StatID\": 2,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 611,\n      \"StatID\": 3,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 611,\n      \"StatID\": 4,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 611,\n      \"StatID\": 5,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 611,\n      \"StatID\": 6,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 611,\n      \"StatID\": 7,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 611,\n      \"StatID\": 8,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 611,\n      \"StatID\": 9,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 611,\n      \"StatID\": 10,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 648,\n      \"StatID\": 2,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 648,\n      \"StatID\": 3,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 648,\n      \"StatID\": 4,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 648,\n      \"StatID\": 5,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 648,\n      \"StatID\": 6,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 648,\n      \"StatID\": 7,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 648,\n      \"StatID\": 8,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 648,\n      \"StatID\": 9,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 648,\n      \"StatID\": 10,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 652,\n      \"StatID\": 2,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 652,\n      \"StatID\": 3,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 652,\n      \"StatID\": 4,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 652,\n      \"StatID\": 5,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 652,\n      \"StatID\": 6,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 652,\n      \"StatID\": 7,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 652,\n      \"StatID\": 8,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 652,\n      \"StatID\": 9,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 652,\n      \"StatID\": 10,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 602,\n      \"StatID\": 2,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 602,\n      \"StatID\": 3,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 602,\n      \"StatID\": 4,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 602,\n      \"StatID\": 5,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 602,\n      \"StatID\": 6,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 602,\n      \"StatID\": 7,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 602,\n      \"StatID\": 8,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 602,\n      \"StatID\": 9,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 602,\n      \"StatID\": 10,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 655,\n      \"StatID\": 2,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 655,\n      \"StatID\": 3,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 655,\n      \"StatID\": 4,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 655,\n      \"StatID\": 5,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 655,\n      \"StatID\": 6,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 655,\n      \"StatID\": 7,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 655,\n      \"StatID\": 8,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 655,\n      \"StatID\": 9,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 655,\n      \"StatID\": 10,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 387,\n      \"StatID\": 2,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 387,\n      \"StatID\": 3,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 387,\n      \"StatID\": 4,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 387,\n      \"StatID\": 5,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 387,\n      \"StatID\": 6,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 387,\n      \"StatID\": 7,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 387,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 387,\n      \"StatID\": 9,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 387,\n      \"StatID\": 10,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 407,\n      \"StatID\": 2,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 407,\n      \"StatID\": 3,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 407,\n      \"StatID\": 4,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 407,\n      \"StatID\": 5,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 407,\n      \"StatID\": 6,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 407,\n      \"StatID\": 7,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 407,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 407,\n      \"StatID\": 9,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 407,\n      \"StatID\": 10,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 660,\n      \"StatID\": 2,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 660,\n      \"StatID\": 3,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 660,\n      \"StatID\": 4,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 660,\n      \"StatID\": 5,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 660,\n      \"StatID\": 6,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 660,\n      \"StatID\": 7,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 660,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 660,\n      \"StatID\": 9,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 660,\n      \"StatID\": 10,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 661,\n      \"StatID\": 2,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 661,\n      \"StatID\": 3,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 661,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 661,\n      \"StatID\": 5,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 661,\n      \"StatID\": 6,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 661,\n      \"StatID\": 7,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 661,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 661,\n      \"StatID\": 9,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 661,\n      \"StatID\": 10,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 389,\n      \"StatID\": 2,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 389,\n      \"StatID\": 3,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 389,\n      \"StatID\": 4,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 389,\n      \"StatID\": 5,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 389,\n      \"StatID\": 6,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 389,\n      \"StatID\": 7,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 389,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 389,\n      \"StatID\": 9,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 389,\n      \"StatID\": 10,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 621,\n      \"StatID\": 2,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 621,\n      \"StatID\": 3,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 621,\n      \"StatID\": 4,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 621,\n      \"StatID\": 5,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 621,\n      \"StatID\": 6,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 621,\n      \"StatID\": 7,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 621,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 621,\n      \"StatID\": 9,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 621,\n      \"StatID\": 10,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 659,\n      \"StatID\": 2,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 659,\n      \"StatID\": 3,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 659,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 659,\n      \"StatID\": 5,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 659,\n      \"StatID\": 6,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 659,\n      \"StatID\": 7,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 659,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 659,\n      \"StatID\": 9,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 659,\n      \"StatID\": 10,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 616,\n      \"StatID\": 2,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 616,\n      \"StatID\": 3,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 616,\n      \"StatID\": 4,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 616,\n      \"StatID\": 5,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 616,\n      \"StatID\": 6,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 616,\n      \"StatID\": 7,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 616,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 616,\n      \"StatID\": 9,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 616,\n      \"StatID\": 10,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 613,\n      \"StatID\": 2,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 613,\n      \"StatID\": 3,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 613,\n      \"StatID\": 4,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 613,\n      \"StatID\": 5,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 613,\n      \"StatID\": 6,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 613,\n      \"StatID\": 7,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 613,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 613,\n      \"StatID\": 9,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 613,\n      \"StatID\": 10,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 646,\n      \"StatID\": 2,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 646,\n      \"StatID\": 3,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 646,\n      \"StatID\": 4,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 646,\n      \"StatID\": 5,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 646,\n      \"StatID\": 6,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 646,\n      \"StatID\": 7,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 646,\n      \"StatID\": 8,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 646,\n      \"StatID\": 9,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 646,\n      \"StatID\": 10,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 662,\n      \"StatID\": 2,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 662,\n      \"StatID\": 3,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 662,\n      \"StatID\": 4,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 662,\n      \"StatID\": 5,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 662,\n      \"StatID\": 6,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 662,\n      \"StatID\": 7,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 662,\n      \"StatID\": 8,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 662,\n      \"StatID\": 9,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 662,\n      \"StatID\": 10,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 619,\n      \"StatID\": 2,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 619,\n      \"StatID\": 3,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 619,\n      \"StatID\": 4,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 619,\n      \"StatID\": 5,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 619,\n      \"StatID\": 6,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 619,\n      \"StatID\": 7,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 619,\n      \"StatID\": 8,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 619,\n      \"StatID\": 9,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 619,\n      \"StatID\": 10,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 405,\n      \"StatID\": 2,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 405,\n      \"StatID\": 3,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 405,\n      \"StatID\": 4,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 405,\n      \"StatID\": 5,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 405,\n      \"StatID\": 6,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 405,\n      \"StatID\": 7,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 405,\n      \"StatID\": 8,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 405,\n      \"StatID\": 9,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 405,\n      \"StatID\": 10,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 620,\n      \"StatID\": 2,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 620,\n      \"StatID\": 3,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 620,\n      \"StatID\": 4,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 620,\n      \"StatID\": 5,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 620,\n      \"StatID\": 6,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 620,\n      \"StatID\": 7,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 620,\n      \"StatID\": 8,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 620,\n      \"StatID\": 9,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 620,\n      \"StatID\": 10,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 605,\n      \"StatID\": 2,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 605,\n      \"StatID\": 3,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 605,\n      \"StatID\": 4,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 605,\n      \"StatID\": 5,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 605,\n      \"StatID\": 6,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 605,\n      \"StatID\": 7,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 605,\n      \"StatID\": 8,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 605,\n      \"StatID\": 9,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 605,\n      \"StatID\": 10,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 612,\n      \"StatID\": 2,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 612,\n      \"StatID\": 3,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 612,\n      \"StatID\": 4,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 612,\n      \"StatID\": 5,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 612,\n      \"StatID\": 6,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 612,\n      \"StatID\": 7,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 612,\n      \"StatID\": 8,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 612,\n      \"StatID\": 9,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 612,\n      \"StatID\": 10,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 601,\n      \"StatID\": 2,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 601,\n      \"StatID\": 3,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 601,\n      \"StatID\": 4,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 601,\n      \"StatID\": 5,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 601,\n      \"StatID\": 6,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 601,\n      \"StatID\": 7,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 601,\n      \"StatID\": 8,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 601,\n      \"StatID\": 9,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 601,\n      \"StatID\": 10,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 385,\n      \"StatID\": 2,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 385,\n      \"StatID\": 3,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 385,\n      \"StatID\": 4,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 385,\n      \"StatID\": 5,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 385,\n      \"StatID\": 6,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 385,\n      \"StatID\": 7,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 385,\n      \"StatID\": 8,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 385,\n      \"StatID\": 9,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 385,\n      \"StatID\": 10,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 658,\n      \"StatID\": 2,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 658,\n      \"StatID\": 3,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 658,\n      \"StatID\": 4,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 658,\n      \"StatID\": 5,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 658,\n      \"StatID\": 6,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 658,\n      \"StatID\": 7,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 658,\n      \"StatID\": 8,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 658,\n      \"StatID\": 9,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 658,\n      \"StatID\": 10,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 418,\n      \"StatID\": 2,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 418,\n      \"StatID\": 3,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 418,\n      \"StatID\": 4,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 418,\n      \"StatID\": 5,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 418,\n      \"StatID\": 6,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 418,\n      \"StatID\": 7,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 418,\n      \"StatID\": 8,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 418,\n      \"StatID\": 9,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 418,\n      \"StatID\": 10,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 402,\n      \"StatID\": 2,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 402,\n      \"StatID\": 3,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 402,\n      \"StatID\": 4,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 402,\n      \"StatID\": 5,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 402,\n      \"StatID\": 6,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 402,\n      \"StatID\": 7,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 402,\n      \"StatID\": 8,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 402,\n      \"StatID\": 9,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 402,\n      \"StatID\": 10,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 406,\n      \"StatID\": 2,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 406,\n      \"StatID\": 3,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 406,\n      \"StatID\": 4,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 406,\n      \"StatID\": 5,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 406,\n      \"StatID\": 6,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 406,\n      \"StatID\": 7,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 406,\n      \"StatID\": 8,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 406,\n      \"StatID\": 9,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 406,\n      \"StatID\": 10,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 664,\n      \"StatID\": 2,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 664,\n      \"StatID\": 3,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 664,\n      \"StatID\": 4,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 664,\n      \"StatID\": 5,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 664,\n      \"StatID\": 6,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 664,\n      \"StatID\": 7,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 664,\n      \"StatID\": 8,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 664,\n      \"StatID\": 9,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 664,\n      \"StatID\": 10,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 663,\n      \"StatID\": 2,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 663,\n      \"StatID\": 3,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 663,\n      \"StatID\": 4,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 663,\n      \"StatID\": 5,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 663,\n      \"StatID\": 6,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 663,\n      \"StatID\": 7,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 663,\n      \"StatID\": 8,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 663,\n      \"StatID\": 9,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 663,\n      \"StatID\": 10,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 600,\n      \"StatID\": 2,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 600,\n      \"StatID\": 3,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 600,\n      \"StatID\": 4,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 600,\n      \"StatID\": 5,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 600,\n      \"StatID\": 6,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 600,\n      \"StatID\": 7,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 600,\n      \"StatID\": 8,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 600,\n      \"StatID\": 9,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 600,\n      \"StatID\": 10,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 674,\n      \"StatID\": 2,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 674,\n      \"StatID\": 3,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 674,\n      \"StatID\": 4,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 674,\n      \"StatID\": 5,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 674,\n      \"StatID\": 6,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 674,\n      \"StatID\": 7,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 674,\n      \"StatID\": 8,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 674,\n      \"StatID\": 9,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 674,\n      \"StatID\": 10,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 606,\n      \"StatID\": 2,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 606,\n      \"StatID\": 3,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 606,\n      \"StatID\": 4,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 606,\n      \"StatID\": 5,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 606,\n      \"StatID\": 6,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 606,\n      \"StatID\": 7,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 606,\n      \"StatID\": 8,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 606,\n      \"StatID\": 9,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 606,\n      \"StatID\": 10,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 671,\n      \"StatID\": 2,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 671,\n      \"StatID\": 3,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 671,\n      \"StatID\": 4,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 671,\n      \"StatID\": 5,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 671,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 671,\n      \"StatID\": 7,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 671,\n      \"StatID\": 8,\n      \"Val\": 49\n    },\n    {\n      \"StaffID\": 671,\n      \"StatID\": 9,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 671,\n      \"StatID\": 10,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 409,\n      \"StatID\": 2,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 409,\n      \"StatID\": 3,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 409,\n      \"StatID\": 4,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 409,\n      \"StatID\": 5,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 409,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 409,\n      \"StatID\": 7,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 409,\n      \"StatID\": 8,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 409,\n      \"StatID\": 9,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 409,\n      \"StatID\": 10,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 609,\n      \"StatID\": 2,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 609,\n      \"StatID\": 3,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 609,\n      \"StatID\": 4,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 609,\n      \"StatID\": 5,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 609,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 609,\n      \"StatID\": 7,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 609,\n      \"StatID\": 8,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 609,\n      \"StatID\": 9,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 609,\n      \"StatID\": 10,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 672,\n      \"StatID\": 2,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 672,\n      \"StatID\": 3,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 672,\n      \"StatID\": 4,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 672,\n      \"StatID\": 5,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 672,\n      \"StatID\": 6,\n      \"Val\": 49\n    },\n    {\n      \"StaffID\": 672,\n      \"StatID\": 7,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 672,\n      \"StatID\": 8,\n      \"Val\": 49\n    },\n    {\n      \"StaffID\": 672,\n      \"StatID\": 9,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 672,\n      \"StatID\": 10,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 410,\n      \"StatID\": 2,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 410,\n      \"StatID\": 3,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 410,\n      \"StatID\": 4,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 410,\n      \"StatID\": 5,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 410,\n      \"StatID\": 6,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 410,\n      \"StatID\": 7,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 410,\n      \"StatID\": 8,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 410,\n      \"StatID\": 9,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 410,\n      \"StatID\": 10,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 673,\n      \"StatID\": 2,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 673,\n      \"StatID\": 3,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 673,\n      \"StatID\": 4,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 673,\n      \"StatID\": 5,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 673,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 673,\n      \"StatID\": 7,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 673,\n      \"StatID\": 8,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 673,\n      \"StatID\": 9,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 673,\n      \"StatID\": 10,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 419,\n      \"StatID\": 2,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 419,\n      \"StatID\": 3,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 419,\n      \"StatID\": 4,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 419,\n      \"StatID\": 5,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 419,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 419,\n      \"StatID\": 7,\n      \"Val\": 49\n    },\n    {\n      \"StaffID\": 419,\n      \"StatID\": 8,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 419,\n      \"StatID\": 9,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 419,\n      \"StatID\": 10,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 665,\n      \"StatID\": 2,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 665,\n      \"StatID\": 3,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 665,\n      \"StatID\": 4,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 665,\n      \"StatID\": 5,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 665,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 665,\n      \"StatID\": 7,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 665,\n      \"StatID\": 8,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 665,\n      \"StatID\": 9,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 665,\n      \"StatID\": 10,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 668,\n      \"StatID\": 2,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 668,\n      \"StatID\": 3,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 668,\n      \"StatID\": 4,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 668,\n      \"StatID\": 5,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 668,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 668,\n      \"StatID\": 7,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 668,\n      \"StatID\": 8,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 668,\n      \"StatID\": 9,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 668,\n      \"StatID\": 10,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 669,\n      \"StatID\": 2,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 669,\n      \"StatID\": 3,\n      \"Val\": 49\n    },\n    {\n      \"StaffID\": 669,\n      \"StatID\": 4,\n      \"Val\": 49\n    },\n    {\n      \"StaffID\": 669,\n      \"StatID\": 5,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 669,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 669,\n      \"StatID\": 7,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 669,\n      \"StatID\": 8,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 669,\n      \"StatID\": 9,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 669,\n      \"StatID\": 10,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 607,\n      \"StatID\": 2,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 607,\n      \"StatID\": 3,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 607,\n      \"StatID\": 4,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 607,\n      \"StatID\": 5,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 607,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 607,\n      \"StatID\": 7,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 607,\n      \"StatID\": 8,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 607,\n      \"StatID\": 9,\n      \"Val\": 49\n    },\n    {\n      \"StaffID\": 607,\n      \"StatID\": 10,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 670,\n      \"StatID\": 2,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 670,\n      \"StatID\": 3,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 670,\n      \"StatID\": 4,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 670,\n      \"StatID\": 5,\n      \"Val\": 49\n    },\n    {\n      \"StaffID\": 670,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 670,\n      \"StatID\": 7,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 670,\n      \"StatID\": 8,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 670,\n      \"StatID\": 9,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 670,\n      \"StatID\": 10,\n      \"Val\": 49\n    },\n    {\n      \"StaffID\": 666,\n      \"StatID\": 2,\n      \"Val\": 52\n    },\n    {\n      \"StaffID\": 666,\n      \"StatID\": 3,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 666,\n      \"StatID\": 4,\n      \"Val\": 49\n    },\n    {\n      \"StaffID\": 666,\n      \"StatID\": 5,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 666,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 666,\n      \"StatID\": 7,\n      \"Val\": 49\n    },\n    {\n      \"StaffID\": 666,\n      \"StatID\": 8,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 666,\n      \"StatID\": 9,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 666,\n      \"StatID\": 10,\n      \"Val\": 49\n    },\n    {\n      \"StaffID\": 304,\n      \"StatID\": 2,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 304,\n      \"StatID\": 3,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 304,\n      \"StatID\": 4,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 304,\n      \"StatID\": 5,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 304,\n      \"StatID\": 6,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 304,\n      \"StatID\": 7,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 304,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 304,\n      \"StatID\": 9,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 304,\n      \"StatID\": 10,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 305,\n      \"StatID\": 2,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 305,\n      \"StatID\": 3,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 305,\n      \"StatID\": 4,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 305,\n      \"StatID\": 5,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 305,\n      \"StatID\": 6,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 305,\n      \"StatID\": 7,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 305,\n      \"StatID\": 8,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 305,\n      \"StatID\": 9,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 305,\n      \"StatID\": 10,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 417,\n      \"StatID\": 2,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 417,\n      \"StatID\": 3,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 417,\n      \"StatID\": 4,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 417,\n      \"StatID\": 5,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 417,\n      \"StatID\": 6,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 417,\n      \"StatID\": 7,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 417,\n      \"StatID\": 8,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 417,\n      \"StatID\": 9,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 417,\n      \"StatID\": 10,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 9,\n      \"StatID\": 2,\n      \"Val\": 77\n    },\n    {\n      \"StaffID\": 9,\n      \"StatID\": 3,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 9,\n      \"StatID\": 4,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 9,\n      \"StatID\": 5,\n      \"Val\": 94\n    },\n    {\n      \"StaffID\": 9,\n      \"StatID\": 6,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 9,\n      \"StatID\": 7,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 9,\n      \"StatID\": 8,\n      \"Val\": 85\n    },\n    {\n      \"StaffID\": 9,\n      \"StatID\": 9,\n      \"Val\": 89\n    },\n    {\n      \"StaffID\": 9,\n      \"StatID\": 10,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 78,\n      \"StatID\": 2,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 78,\n      \"StatID\": 3,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 78,\n      \"StatID\": 4,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 78,\n      \"StatID\": 5,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 78,\n      \"StatID\": 6,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 78,\n      \"StatID\": 7,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 78,\n      \"StatID\": 8,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 78,\n      \"StatID\": 9,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 78,\n      \"StatID\": 10,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 91,\n      \"StatID\": 2,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 91,\n      \"StatID\": 3,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 91,\n      \"StatID\": 4,\n      \"Val\": 82\n    },\n    {\n      \"StaffID\": 91,\n      \"StatID\": 5,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 91,\n      \"StatID\": 6,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 91,\n      \"StatID\": 7,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 91,\n      \"StatID\": 8,\n      \"Val\": 76\n    },\n    {\n      \"StaffID\": 91,\n      \"StatID\": 9,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 91,\n      \"StatID\": 10,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 114,\n      \"StatID\": 2,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 114,\n      \"StatID\": 3,\n      \"Val\": 46\n    },\n    {\n      \"StaffID\": 114,\n      \"StatID\": 4,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 114,\n      \"StatID\": 5,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 114,\n      \"StatID\": 6,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 114,\n      \"StatID\": 7,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 114,\n      \"StatID\": 8,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 114,\n      \"StatID\": 9,\n      \"Val\": 44\n    },\n    {\n      \"StaffID\": 114,\n      \"StatID\": 10,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 115,\n      \"StatID\": 2,\n      \"Val\": 49\n    },\n    {\n      \"StaffID\": 115,\n      \"StatID\": 3,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 115,\n      \"StatID\": 4,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 115,\n      \"StatID\": 5,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 115,\n      \"StatID\": 6,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 115,\n      \"StatID\": 7,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 115,\n      \"StatID\": 8,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 115,\n      \"StatID\": 9,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 115,\n      \"StatID\": 10,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 128,\n      \"StatID\": 2,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 128,\n      \"StatID\": 3,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 128,\n      \"StatID\": 4,\n      \"Val\": 70\n    },\n    {\n      \"StaffID\": 128,\n      \"StatID\": 5,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 128,\n      \"StatID\": 6,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 128,\n      \"StatID\": 7,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 128,\n      \"StatID\": 8,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 128,\n      \"StatID\": 9,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 128,\n      \"StatID\": 10,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 133,\n      \"StatID\": 2,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 133,\n      \"StatID\": 3,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 133,\n      \"StatID\": 4,\n      \"Val\": 72\n    },\n    {\n      \"StaffID\": 133,\n      \"StatID\": 5,\n      \"Val\": 75\n    },\n    {\n      \"StaffID\": 133,\n      \"StatID\": 6,\n      \"Val\": 69\n    },\n    {\n      \"StaffID\": 133,\n      \"StatID\": 7,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 133,\n      \"StatID\": 8,\n      \"Val\": 78\n    },\n    {\n      \"StaffID\": 133,\n      \"StatID\": 9,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 133,\n      \"StatID\": 10,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 143,\n      \"StatID\": 2,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 143,\n      \"StatID\": 3,\n      \"Val\": 67\n    },\n    {\n      \"StaffID\": 143,\n      \"StatID\": 4,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 143,\n      \"StatID\": 5,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 143,\n      \"StatID\": 6,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 143,\n      \"StatID\": 7,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 143,\n      \"StatID\": 8,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 143,\n      \"StatID\": 9,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 143,\n      \"StatID\": 10,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 244,\n      \"StatID\": 2,\n      \"Val\": 46\n    },\n    {\n      \"StaffID\": 244,\n      \"StatID\": 3,\n      \"Val\": 45\n    },\n    {\n      \"StaffID\": 244,\n      \"StatID\": 4,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 244,\n      \"StatID\": 5,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 244,\n      \"StatID\": 6,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 244,\n      \"StatID\": 7,\n      \"Val\": 47\n    },\n    {\n      \"StaffID\": 244,\n      \"StatID\": 8,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 244,\n      \"StatID\": 9,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 244,\n      \"StatID\": 10,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 258,\n      \"StatID\": 2,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 258,\n      \"StatID\": 3,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 258,\n      \"StatID\": 4,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 258,\n      \"StatID\": 5,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 258,\n      \"StatID\": 6,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 258,\n      \"StatID\": 7,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 258,\n      \"StatID\": 8,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 258,\n      \"StatID\": 9,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 258,\n      \"StatID\": 10,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 259,\n      \"StatID\": 2,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 259,\n      \"StatID\": 3,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 259,\n      \"StatID\": 4,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 259,\n      \"StatID\": 5,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 259,\n      \"StatID\": 6,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 259,\n      \"StatID\": 7,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 259,\n      \"StatID\": 8,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 259,\n      \"StatID\": 9,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 259,\n      \"StatID\": 10,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 260,\n      \"StatID\": 2,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 260,\n      \"StatID\": 3,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 260,\n      \"StatID\": 4,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 260,\n      \"StatID\": 5,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 260,\n      \"StatID\": 6,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 260,\n      \"StatID\": 7,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 260,\n      \"StatID\": 8,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 260,\n      \"StatID\": 9,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 260,\n      \"StatID\": 10,\n      \"Val\": 50\n    },\n    {\n      \"StaffID\": 272,\n      \"StatID\": 2,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 272,\n      \"StatID\": 3,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 272,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 272,\n      \"StatID\": 5,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 272,\n      \"StatID\": 6,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 272,\n      \"StatID\": 7,\n      \"Val\": 53\n    },\n    {\n      \"StaffID\": 272,\n      \"StatID\": 8,\n      \"Val\": 61\n    },\n    {\n      \"StaffID\": 272,\n      \"StatID\": 9,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 272,\n      \"StatID\": 10,\n      \"Val\": 62\n    },\n    {\n      \"StaffID\": 300,\n      \"StatID\": 2,\n      \"Val\": 49\n    },\n    {\n      \"StaffID\": 300,\n      \"StatID\": 3,\n      \"Val\": 49\n    },\n    {\n      \"StaffID\": 300,\n      \"StatID\": 4,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 300,\n      \"StatID\": 5,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 300,\n      \"StatID\": 6,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 300,\n      \"StatID\": 7,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 300,\n      \"StatID\": 8,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 300,\n      \"StatID\": 9,\n      \"Val\": 47\n    },\n    {\n      \"StaffID\": 300,\n      \"StatID\": 10,\n      \"Val\": 47\n    },\n    {\n      \"StaffID\": 302,\n      \"StatID\": 2,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 302,\n      \"StatID\": 3,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 302,\n      \"StatID\": 4,\n      \"Val\": 65\n    },\n    {\n      \"StaffID\": 302,\n      \"StatID\": 5,\n      \"Val\": 44\n    },\n    {\n      \"StaffID\": 302,\n      \"StatID\": 6,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 302,\n      \"StatID\": 7,\n      \"Val\": 47\n    },\n    {\n      \"StaffID\": 302,\n      \"StatID\": 8,\n      \"Val\": 44\n    },\n    {\n      \"StaffID\": 302,\n      \"StatID\": 9,\n      \"Val\": 54\n    },\n    {\n      \"StaffID\": 302,\n      \"StatID\": 10,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 303,\n      \"StatID\": 2,\n      \"Val\": 40\n    },\n    {\n      \"StaffID\": 303,\n      \"StatID\": 3,\n      \"Val\": 41\n    },\n    {\n      \"StaffID\": 303,\n      \"StatID\": 4,\n      \"Val\": 59\n    },\n    {\n      \"StaffID\": 303,\n      \"StatID\": 5,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 303,\n      \"StatID\": 6,\n      \"Val\": 48\n    },\n    {\n      \"StaffID\": 303,\n      \"StatID\": 7,\n      \"Val\": 47\n    },\n    {\n      \"StaffID\": 303,\n      \"StatID\": 8,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 303,\n      \"StatID\": 9,\n      \"Val\": 46\n    },\n    {\n      \"StaffID\": 303,\n      \"StatID\": 10,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 307,\n      \"StatID\": 2,\n      \"Val\": 44\n    },\n    {\n      \"StaffID\": 307,\n      \"StatID\": 3,\n      \"Val\": 40\n    },\n    {\n      \"StaffID\": 307,\n      \"StatID\": 4,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 307,\n      \"StatID\": 5,\n      \"Val\": 58\n    },\n    {\n      \"StaffID\": 307,\n      \"StatID\": 6,\n      \"Val\": 46\n    },\n    {\n      \"StaffID\": 307,\n      \"StatID\": 7,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 307,\n      \"StatID\": 8,\n      \"Val\": 51\n    },\n    {\n      \"StaffID\": 307,\n      \"StatID\": 9,\n      \"Val\": 40\n    },\n    {\n      \"StaffID\": 307,\n      \"StatID\": 10,\n      \"Val\": 63\n    },\n    {\n      \"StaffID\": 563,\n      \"StatID\": 13,\n      \"Val\": 41\n    },\n    {\n      \"StaffID\": 563,\n      \"StatID\": 25,\n      \"Val\": 56\n    },\n    {\n      \"StaffID\": 563,\n      \"StatID\": 43,\n      \"Val\": 34\n    },\n    {\n      \"StaffID\": 564,\n      \"StatID\": 19,\n      \"Val\": 73\n    },\n    {\n      \"StaffID\": 564,\n      \"StatID\": 20,\n      \"Val\": 60\n    },\n    {\n      \"StaffID\": 564,\n      \"StatID\": 26,\n      \"Val\": 66\n    },\n    {\n      \"StaffID\": 564,\n      \"StatID\": 27,\n      \"Val\": 80\n    },\n    {\n      \"StaffID\": 564,\n      \"StatID\": 28,\n      \"Val\": 81\n    },\n    {\n      \"StaffID\": 564,\n      \"StatID\": 29,\n      \"Val\": 55\n    },\n    {\n      \"StaffID\": 564,\n      \"StatID\": 30,\n      \"Val\": 84\n    },\n    {\n      \"StaffID\": 564,\n      \"StatID\": 31,\n      \"Val\": 71\n    },\n    {\n      \"StaffID\": 565,\n      \"StatID\": 13,\n      \"Val\": 64\n    },\n    {\n      \"StaffID\": 565,\n      \"StatID\": 25,\n      \"Val\": 57\n    },\n    {\n      \"StaffID\": 565,\n      \"StatID\": 43,\n      \"Val\": 35\n    },\n    {\n      \"StaffID\": 566,\n      \"StatID\": 11,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 566,\n      \"StatID\": 22,\n      \"Val\": 68\n    },\n    {\n      \"StaffID\": 566,\n      \"StatID\": 23,\n      \"Val\": 74\n    },\n    {\n      \"StaffID\": 566,\n      \"StatID\": 24,\n      \"Val\": 56\n    }\n  ],\n  \"Staff_RaceEngineerDriverAssignments\": [\n    {\n      \"DaysTogether\": 4021,\n      \"DriverID\": 1,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 51,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 1831,\n      \"DriverID\": 2,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 6,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 786,\n      \"DriverID\": 3,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 55,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 778,\n      \"DriverID\": 8,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 61,\n      \"RelationshipLevel\": 99.76004028320312\n    },\n    {\n      \"DaysTogether\": 419,\n      \"DriverID\": 77,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 63,\n      \"RelationshipLevel\": 57.6485481262207\n    },\n    {\n      \"DaysTogether\": 2934,\n      \"DriverID\": 10,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 50,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 1101,\n      \"DriverID\": 11,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 7,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 2202,\n      \"DriverID\": 12,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 48,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 419,\n      \"DriverID\": 102,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 47,\n      \"RelationshipLevel\": 57.999149322509766\n    },\n    {\n      \"DaysTogether\": 1466,\n      \"DriverID\": 14,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 54,\n      \"RelationshipLevel\": 99.77047729492188\n    },\n    {\n      \"DaysTogether\": 42,\n      \"DriverID\": 76,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 59,\n      \"RelationshipLevel\": 40\n    },\n    {\n      \"DaysTogether\": 1101,\n      \"DriverID\": 17,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 49,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 1831,\n      \"DriverID\": 18,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 64,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 419,\n      \"DriverID\": 23,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 320,\n      \"RelationshipLevel\": 58.10194396972656\n    },\n    {\n      \"DaysTogether\": 413,\n      \"DriverID\": 116,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 56,\n      \"RelationshipLevel\": 56.688568115234375\n    },\n    {\n      \"DaysTogether\": 413,\n      \"DriverID\": 83,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 58,\n      \"RelationshipLevel\": 56.739013671875\n    },\n    {\n      \"DaysTogether\": 1101,\n      \"DriverID\": 81,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 60,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 516,\n      \"DriverID\": 255,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 321,\n      \"RelationshipLevel\": 69.27664184570312\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 117,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 148,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 144,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 160,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 121,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 161,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 42,\n      \"DriverID\": 119,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 424,\n      \"RelationshipLevel\": 6\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 110,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 158,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 407,\n      \"DriverID\": 130,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 153,\n      \"RelationshipLevel\": 56\n    },\n    {\n      \"DaysTogether\": 1106,\n      \"DriverID\": 87,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 146,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 272,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 166,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 54,\n      \"DriverID\": 286,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 343,\n      \"RelationshipLevel\": 6.875999450683594\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 280,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 183,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 242,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 149,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 288,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 173,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 730,\n      \"DriverID\": 120,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 151,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 115,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 181,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 248,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 165,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 252,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 174,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 247,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 169,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 741,\n      \"DriverID\": 135,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 159,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 99,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 175,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 617,\n      \"DriverID\": 109,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 168,\n      \"RelationshipLevel\": 85\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 279,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 172,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 302,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 163,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 419,\n      \"DriverID\": 287,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 187,\n      \"RelationshipLevel\": 56.87602233886719\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 284,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 162,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 419,\n      \"DriverID\": 322,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 184,\n      \"RelationshipLevel\": 56.93864440917969\n    },\n    {\n      \"DaysTogether\": 419,\n      \"DriverID\": 289,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 178,\n      \"RelationshipLevel\": 57.14569091796875\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 305,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 191,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 550,\n      \"DriverID\": 77,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 48,\n      \"RelationshipLevel\": 75\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 77,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 321,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 730,\n      \"DriverID\": 130,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 155,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 1095,\n      \"DriverID\": 107,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 155,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 13,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 7,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 17,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 50,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 17,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 63,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 1095,\n      \"DriverID\": 15,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 59,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 3,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 59,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 730,\n      \"DriverID\": 18,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 55,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 1095,\n      \"DriverID\": 23,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 55,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 730,\n      \"DriverID\": 74,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 58,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 253,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 341,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 301,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 364,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 123,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 343,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 114,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 344,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 245,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 345,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 95,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 148,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 116,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 149,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 133,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 153,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 106,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 158,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 730,\n      \"DriverID\": 91,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 148,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 1095,\n      \"DriverID\": 105,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 159,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 95,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 160,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 730,\n      \"DriverID\": 132,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 169,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 272,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 178,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 119,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 173,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 242,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 172,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 377,\n      \"DriverID\": 127,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 179,\n      \"RelationshipLevel\": 51.168304443359375\n    },\n    {\n      \"DaysTogether\": 730,\n      \"DriverID\": 109,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 181,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 730,\n      \"DriverID\": 128,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 165,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 144,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 183,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 244,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 162,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 114,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 191,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 135,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 178,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 133,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 173,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 127,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 166,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 120,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 183,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 110,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 162,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 12,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 148,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 407,\n      \"DriverID\": 282,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 361,\n      \"RelationshipLevel\": 56\n    },\n    {\n      \"DaysTogether\": 730,\n      \"DriverID\": 255,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 58,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 730,\n      \"DriverID\": 13,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 47,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 730,\n      \"DriverID\": 11,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 47,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 620,\n      \"DriverID\": 15,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 60,\n      \"RelationshipLevel\": 85\n    },\n    {\n      \"DaysTogether\": 1095,\n      \"DriverID\": 83,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 321,\n      \"RelationshipLevel\": 100\n    },\n    {\n      \"DaysTogether\": 7,\n      \"DriverID\": 109,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 175,\n      \"RelationshipLevel\": 1\n    },\n    {\n      \"DaysTogether\": 365,\n      \"DriverID\": 95,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 183,\n      \"RelationshipLevel\": 50\n    },\n    {\n      \"DaysTogether\": 306,\n      \"DriverID\": 244,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 163,\n      \"RelationshipLevel\": 42\n    },\n    {\n      \"DaysTogether\": 7,\n      \"DriverID\": 301,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 163,\n      \"RelationshipLevel\": 1\n    },\n    {\n      \"DaysTogether\": 224,\n      \"DriverID\": 13,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 59,\n      \"RelationshipLevel\": 35.74013900756836\n    },\n    {\n      \"DaysTogether\": 51,\n      \"DriverID\": 121,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 151,\n      \"RelationshipLevel\": 6.678119659423828\n    },\n    {\n      \"DaysTogether\": 57,\n      \"DriverID\": 281,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 161,\n      \"RelationshipLevel\": 7.287095069885254\n    },\n    {\n      \"DaysTogether\": 54,\n      \"DriverID\": 373,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 427,\n      \"RelationshipLevel\": 7.3319830894470215\n    },\n    {\n      \"DaysTogether\": 46,\n      \"DriverID\": 95,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 59,\n      \"RelationshipLevel\": 6.176054954528809\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 247,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 146,\n      \"RelationshipLevel\": 6.780781269073486\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 280,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 361,\n      \"RelationshipLevel\": 6.615480422973633\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 375,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 183,\n      \"RelationshipLevel\": 6.542401313781738\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 279,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 159,\n      \"RelationshipLevel\": 6.83986759185791\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 374,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 172,\n      \"RelationshipLevel\": 6.65723991394043\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 376,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 155,\n      \"RelationshipLevel\": 6.815855026245117\n    },\n    {\n      \"DaysTogether\": 54,\n      \"DriverID\": 377,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 149,\n      \"RelationshipLevel\": 7.418878555297852\n    },\n    {\n      \"DaysTogether\": 42,\n      \"DriverID\": 117,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 168,\n      \"RelationshipLevel\": 6\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 99,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 423,\n      \"RelationshipLevel\": 6.678119659423828\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 378,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 341,\n      \"RelationshipLevel\": 6.5528411865234375\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 144,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 174,\n      \"RelationshipLevel\": 6.815855026245117\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 110,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 160,\n      \"RelationshipLevel\": 6.667679786682129\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 252,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 158,\n      \"RelationshipLevel\": 6.636360168457031\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 248,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 152,\n      \"RelationshipLevel\": 6.730319023132324\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 379,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 165,\n      \"RelationshipLevel\": 6.587742805480957\n    },\n    {\n      \"DaysTogether\": 54,\n      \"DriverID\": 380,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 430,\n      \"RelationshipLevel\": 6.980398178100586\n    },\n    {\n      \"DaysTogether\": 54,\n      \"DriverID\": 381,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 431,\n      \"RelationshipLevel\": 7.0099778175354\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 382,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 191,\n      \"RelationshipLevel\": 6.500638961791992\n    },\n    {\n      \"DaysTogether\": 54,\n      \"DriverID\": 245,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 422,\n      \"RelationshipLevel\": 7.376464366912842\n    },\n    {\n      \"DaysTogether\": 61,\n      \"DriverID\": 288,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 163,\n      \"RelationshipLevel\": 7.941699981689453\n    },\n    {\n      \"DaysTogether\": 50,\n      \"DriverID\": 383,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 173,\n      \"RelationshipLevel\": 6.9041595458984375\n    },\n    {\n      \"DaysTogether\": 54,\n      \"DriverID\": 283,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 345,\n      \"RelationshipLevel\": 7.126562118530273\n    },\n    {\n      \"DaysTogether\": 54,\n      \"DriverID\": 387,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 428,\n      \"RelationshipLevel\": 7.143716812133789\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 284,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 181,\n      \"RelationshipLevel\": 6.498898983001709\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 301,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 162,\n      \"RelationshipLevel\": 6.490199089050293\n    },\n    {\n      \"DaysTogether\": 54,\n      \"DriverID\": 385,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 364,\n      \"RelationshipLevel\": 7.043037414550781\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 306,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 175,\n      \"RelationshipLevel\": 6.531961441040039\n    },\n    {\n      \"DaysTogether\": 54,\n      \"DriverID\": 386,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 434,\n      \"RelationshipLevel\": 7.126562118530273\n    },\n    {\n      \"DaysTogether\": 54,\n      \"DriverID\": 384,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 344,\n      \"RelationshipLevel\": 6.875999450683594\n    },\n    {\n      \"DaysTogether\": 54,\n      \"DriverID\": 109,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 420,\n      \"RelationshipLevel\": 7.2727203369140625\n    },\n    {\n      \"DaysTogether\": 54,\n      \"DriverID\": 123,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 421,\n      \"RelationshipLevel\": 7.2814202308654785\n    },\n    {\n      \"DaysTogether\": 54,\n      \"DriverID\": 388,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 429,\n      \"RelationshipLevel\": 7.126562118530273\n    },\n    {\n      \"DaysTogether\": 54,\n      \"DriverID\": 389,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 435,\n      \"RelationshipLevel\": 6.875999450683594\n    },\n    {\n      \"DaysTogether\": 54,\n      \"DriverID\": 390,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 193,\n      \"RelationshipLevel\": 7.197901248931885\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 105,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 393,\n      \"RelationshipLevel\": 6.26730489730835\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 394,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 432,\n      \"RelationshipLevel\": 6.511078834533691\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 308,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 195,\n      \"RelationshipLevel\": 6.542401313781738\n    },\n    {\n      \"DaysTogether\": 54,\n      \"DriverID\": 305,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 425,\n      \"RelationshipLevel\": 7.063922882080078\n    },\n    {\n      \"DaysTogether\": 54,\n      \"DriverID\": 399,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 166,\n      \"RelationshipLevel\": 7.009037017822266\n    },\n    {\n      \"DaysTogether\": 54,\n      \"DriverID\": 304,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 433,\n      \"RelationshipLevel\": 6.875999450683594\n    },\n    {\n      \"DaysTogether\": 115,\n      \"DriverID\": 15,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 415,\n      \"RelationshipLevel\": 15.236319541931152\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 142,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 169,\n      \"RelationshipLevel\": 6.7678327560424805\n    },\n    {\n      \"DaysTogether\": 48,\n      \"DriverID\": 242,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 148,\n      \"RelationshipLevel\": 6.751198768615723\n    },\n    {\n      \"DaysTogether\": 54,\n      \"DriverID\": 282,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 426,\n      \"RelationshipLevel\": 7.2235107421875\n    },\n    {\n      \"DaysTogether\": 12,\n      \"DriverID\": 413,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 168,\n      \"RelationshipLevel\": 0.9713850021362305\n    },\n    {\n      \"DaysTogether\": 12,\n      \"DriverID\": 130,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 424,\n      \"RelationshipLevel\": 1.1018850803375244\n    },\n    {\n      \"DaysTogether\": 8,\n      \"DriverID\": 11,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 56,\n      \"RelationshipLevel\": 0.9563600420951843\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 23,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 51,\n      \"RelationshipLevel\": 0.3008599877357483\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 376,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 320,\n      \"RelationshipLevel\": 0.3479899764060974\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 15,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 54,\n      \"RelationshipLevel\": 0.23995999991893768\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 135,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 415,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 12,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 47,\n      \"RelationshipLevel\": 0.3564999997615814\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 102,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 48,\n      \"RelationshipLevel\": 0.3239780068397522\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 2,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 7,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 1,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 622,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 95,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 623,\n      \"RelationshipLevel\": 1.0279619693756104\n    },\n    {\n      \"DaysTogether\": 8,\n      \"DriverID\": 18,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 58,\n      \"RelationshipLevel\": 1.2118698358535767\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 142,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 624,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 14,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 625,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 81,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 59,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 144,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 626,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 8,\n      \"DriverID\": 83,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 643,\n      \"RelationshipLevel\": 0.8472749590873718\n    },\n    {\n      \"DaysTogether\": 8,\n      \"DriverID\": 279,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 644,\n      \"RelationshipLevel\": 0.7476800084114075\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 289,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 158,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 119,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 158,\n      \"RelationshipLevel\": 0.6363600492477417\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 245,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 174,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 373,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 174,\n      \"RelationshipLevel\": 0.7094399929046631\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 288,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 152,\n      \"RelationshipLevel\": 0.24344000220298767\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 99,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 152,\n      \"RelationshipLevel\": 0.7303200364112854\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 322,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 160,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 282,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 160,\n      \"RelationshipLevel\": 0.7678319811820984\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 301,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 155,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 280,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 155,\n      \"RelationshipLevel\": 0.7094399929046631\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 252,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 151,\n      \"RelationshipLevel\": 0.6781200170516968\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 127,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 146,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 377,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 146,\n      \"RelationshipLevel\": 0.7825199365615845\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 110,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 148,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 399,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 148,\n      \"RelationshipLevel\": 0.8638800382614136\n    },\n    {\n      \"DaysTogether\": 8,\n      \"DriverID\": 385,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 341,\n      \"RelationshipLevel\": 0.7493000030517578\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 374,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 423,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 390,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 423,\n      \"RelationshipLevel\": 0.6781200170516968\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 601,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 421,\n      \"RelationshipLevel\": 0.6450600028038025\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 602,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 361,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 380,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 361,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 411,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 361,\n      \"RelationshipLevel\": 0.23593400418758392\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 610,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 172,\n      \"RelationshipLevel\": 0.21908000111579895\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 604,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 172,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 382,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 172,\n      \"RelationshipLevel\": 0.6572399735450745\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 381,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 181,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 439,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 181,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 611,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 181,\n      \"RelationshipLevel\": 0.5006399750709534\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 283,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 162,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 394,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 162,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 286,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 162,\n      \"RelationshipLevel\": 0.4901999831199646\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 386,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 183,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 612,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 183,\n      \"RelationshipLevel\": 0.5424000024795532\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 613,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 165,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 614,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 165,\n      \"RelationshipLevel\": 0.5110799670219421\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 615,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 175,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 383,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 175,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 616,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 175,\n      \"RelationshipLevel\": 0.5319600105285645\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 384,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 195,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 617,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 195,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 618,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 195,\n      \"RelationshipLevel\": 0.5424000024795532\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 619,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 432,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 620,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 432,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 304,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 432,\n      \"RelationshipLevel\": 0.5110799670219421\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 406,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 191,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 388,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 191,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 621,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 191,\n      \"RelationshipLevel\": 0.5006399750709534\n    },\n    {\n      \"DaysTogether\": 8,\n      \"DriverID\": 2,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 622,\n      \"RelationshipLevel\": 1.3171639442443848\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 1,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 7,\n      \"RelationshipLevel\": 1.0559760332107544\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 376,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 51,\n      \"RelationshipLevel\": 0.9324960112571716\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 135,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 54,\n      \"RelationshipLevel\": 0.7181400060653687\n    },\n    {\n      \"DaysTogether\": 8,\n      \"DriverID\": 14,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 624,\n      \"RelationshipLevel\": 0.8415799736976624\n    },\n    {\n      \"DaysTogether\": 8,\n      \"DriverID\": 142,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 625,\n      \"RelationshipLevel\": 0.7512000203132629\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 144,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 59,\n      \"RelationshipLevel\": 0.7111799716949463\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 81,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 626,\n      \"RelationshipLevel\": 0.7390199899673462\n    },\n    {\n      \"DaysTogether\": 6,\n      \"DriverID\": 301,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 169,\n      \"RelationshipLevel\": 0.667680025100708\n    },\n    {\n      \"DaysTogether\": 4,\n      \"DriverID\": 374,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 173,\n      \"RelationshipLevel\": 0.45208001136779785\n    },\n    {\n      \"DaysTogether\": 4,\n      \"DriverID\": 602,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 556,\n      \"RelationshipLevel\": 0.2919999957084656\n    },\n    {\n      \"DaysTogether\": 4,\n      \"DriverID\": 610,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 555,\n      \"RelationshipLevel\": 0.3248499929904938\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 77,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 395,\n      \"RelationshipLevel\": 0.25387999415397644\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 8,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 415,\n      \"RelationshipLevel\": 0.1695300042629242\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 144,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 623,\n      \"RelationshipLevel\": 0.3279799818992615\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 373,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 626,\n      \"RelationshipLevel\": 0.21040000021457672\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 1,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 680,\n      \"RelationshipLevel\": 0.1678999960422516\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 17,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 682,\n      \"RelationshipLevel\": 0.10949999839067459\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 248,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 684,\n      \"RelationshipLevel\": 0.1459999978542328\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 283,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 156,\n      \"RelationshipLevel\": 0.24692000448703766\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 604,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 159,\n      \"RelationshipLevel\": 0.24692000448703766\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 378,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 158,\n      \"RelationshipLevel\": 0.24393798410892487\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 375,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 148,\n      \"RelationshipLevel\": 0.25040000677108765\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 399,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 435,\n      \"RelationshipLevel\": 0.1459999978542328\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 377,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 161,\n      \"RelationshipLevel\": 0.21908000111579895\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 645,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 160,\n      \"RelationshipLevel\": 0.22256000339984894\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 252,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 179,\n      \"RelationshipLevel\": 0.19472000002861023\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 394,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 426,\n      \"RelationshipLevel\": 0.17732000350952148\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 280,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 153,\n      \"RelationshipLevel\": 0.22951999306678772\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 646,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 149,\n      \"RelationshipLevel\": 0.2364799976348877\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 282,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 151,\n      \"RelationshipLevel\": 0.22604000568389893\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 618,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 429,\n      \"RelationshipLevel\": 0.18775999546051025\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 380,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 174,\n      \"RelationshipLevel\": 0.2364799976348877\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 286,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 422,\n      \"RelationshipLevel\": 0.2016800045967102\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 647,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 175,\n      \"RelationshipLevel\": 0.17732000350952148\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 123,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 423,\n      \"RelationshipLevel\": 0.22604000568389893\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 381,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 146,\n      \"RelationshipLevel\": 0.2608399987220764\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 601,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 424,\n      \"RelationshipLevel\": 0.21908000111579895\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 617,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 427,\n      \"RelationshipLevel\": 0.208639994263649\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 611,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 343,\n      \"RelationshipLevel\": 0.1459999978542328\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 658,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 364,\n      \"RelationshipLevel\": 0.1738400012254715\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 649,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 173,\n      \"RelationshipLevel\": 0.22604000568389893\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 650,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 178,\n      \"RelationshipLevel\": 0.21992599964141846\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 652,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 181,\n      \"RelationshipLevel\": 0.16687999665737152\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 653,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 431,\n      \"RelationshipLevel\": 0.1703599989414215\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 654,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 425,\n      \"RelationshipLevel\": 0.17732000350952148\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 659,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 187,\n      \"RelationshipLevel\": 0.1459999978542328\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 660,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 184,\n      \"RelationshipLevel\": 0.15644000470638275\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 661,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 165,\n      \"RelationshipLevel\": 0.1703599989414215\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 655,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 430,\n      \"RelationshipLevel\": 0.16339999437332153\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 656,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 162,\n      \"RelationshipLevel\": 0.16339999437332153\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 613,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 421,\n      \"RelationshipLevel\": 0.21559999883174896\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 651,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 166,\n      \"RelationshipLevel\": 0.15644000470638275\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 439,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 428,\n      \"RelationshipLevel\": 0.17732000350952148\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 614,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 338,\n      \"RelationshipLevel\": 0.22604000568389893\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 615,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 163,\n      \"RelationshipLevel\": 0.1459999978542328\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 411,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 555,\n      \"RelationshipLevel\": 0.1459999978542328\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 648,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 433,\n      \"RelationshipLevel\": 0.1459999978542328\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 657,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 344,\n      \"RelationshipLevel\": 0.1459999978542328\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 621,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 195,\n      \"RelationshipLevel\": 0.18080000579357147\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 602,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 193,\n      \"RelationshipLevel\": 0.2016800045967102\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 406,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 145,\n      \"RelationshipLevel\": 0.19820000231266022\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 664,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 420,\n      \"RelationshipLevel\": 0.21211999654769897\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 612,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 361,\n      \"RelationshipLevel\": 0.2051600068807602\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 253,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 432,\n      \"RelationshipLevel\": 0.1703599989414215\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 662,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 191,\n      \"RelationshipLevel\": 0.16687999665737152\n    },\n    {\n      \"DaysTogether\": 2,\n      \"DriverID\": 663,\n      \"IsCurrentAssignment\": 0,\n      \"RaceEngineerID\": 345,\n      \"RelationshipLevel\": 0.18775999546051025\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 647,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 421,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 123,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 175,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 658,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 361,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 654,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 433,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 659,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 184,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 660,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 364,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 661,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 183,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 655,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 423,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 656,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 187,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 411,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 162,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 648,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 345,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 602,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 555,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 612,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 193,\n      \"RelationshipLevel\": 0\n    },\n    {\n      \"DaysTogether\": 0,\n      \"DriverID\": 663,\n      \"IsCurrentAssignment\": 1,\n      \"RaceEngineerID\": 425,\n      \"RelationshipLevel\": 0\n    }\n  ],\n  \"Staff_NarrativeData\": [\n    {\n      \"StaffID\": 323,\n      \"GenSource\": 2,\n      \"JobTitle\": \"[STAFF_TYPE_5]\",\n      \"TeamID\": 1,\n      \"IsActive\": 1\n    },\n    {\n      \"StaffID\": 324,\n      \"GenSource\": 2,\n      \"JobTitle\": \"[STAFF_TYPE_5]\",\n      \"TeamID\": 2,\n      \"IsActive\": 1\n    },\n    {\n      \"StaffID\": 290,\n      \"GenSource\": 2,\n      \"JobTitle\": \"[STAFF_TYPE_5]\",\n      \"TeamID\": 3,\n      \"IsActive\": 1\n    },\n    {\n      \"StaffID\": 326,\n      \"GenSource\": 2,\n      \"JobTitle\": \"[STAFF_TYPE_5]\",\n      \"TeamID\": 4,\n      \"IsActive\": 1\n    },\n    {\n      \"StaffID\": 676,\n      \"GenSource\": 2,\n      \"JobTitle\": \"[STAFF_TYPE_5]\",\n      \"TeamID\": 5,\n      \"IsActive\": 1\n    },\n    {\n      \"StaffID\": 328,\n      \"GenSource\": 2,\n      \"JobTitle\": \"[STAFF_TYPE_5]\",\n      \"TeamID\": 6,\n      \"IsActive\": 1\n    },\n    {\n      \"StaffID\": 412,\n      \"GenSource\": 2,\n      \"JobTitle\": \"[STAFF_TYPE_5]\",\n      \"TeamID\": 7,\n      \"IsActive\": 1\n    },\n    {\n      \"StaffID\": 295,\n      \"GenSource\": 2,\n      \"JobTitle\": \"[STAFF_TYPE_5]\",\n      \"TeamID\": 8,\n      \"IsActive\": 1\n    },\n    {\n      \"StaffID\": 291,\n      \"GenSource\": 2,\n      \"JobTitle\": \"[STAFF_TYPE_5]\",\n      \"TeamID\": 9,\n      \"IsActive\": 1\n    },\n    {\n      \"StaffID\": 675,\n      \"GenSource\": 2,\n      \"JobTitle\": \"[STAFF_TYPE_5]\",\n      \"TeamID\": 10,\n      \"IsActive\": 1\n    }\n  ],\n  \"Staff_State\": [\n    {\n      \"Mentality\": 38,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 1,\n      \"UnspentXP\": 628,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 22\n    },\n    {\n      \"Mentality\": 42,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 2,\n      \"UnspentXP\": 604,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 58\n    },\n    {\n      \"Mentality\": 93,\n      \"MentalityOpinion\": 0,\n      \"StaffID\": 3,\n      \"UnspentXP\": 634,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 51\n    },\n    {\n      \"Mentality\": 6,\n      \"MentalityOpinion\": 4,\n      \"StaffID\": 4,\n      \"UnspentXP\": 450,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 116\n    },\n    {\n      \"Mentality\": 43,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 6,\n      \"UnspentXP\": 767,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 140\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 7,\n      \"UnspentXP\": 1208,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 147\n    },\n    {\n      \"Mentality\": 20,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 8,\n      \"UnspentXP\": 121,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 74\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 9,\n      \"UnspentXP\": 863,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 56,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 10,\n      \"UnspentXP\": 156,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 66\n    },\n    {\n      \"Mentality\": 20,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 11,\n      \"UnspentXP\": 311,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 31\n    },\n    {\n      \"Mentality\": 100,\n      \"MentalityOpinion\": 0,\n      \"StaffID\": 12,\n      \"UnspentXP\": 830,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 147\n    },\n    {\n      \"Mentality\": 42,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 13,\n      \"UnspentXP\": 50,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 21\n    },\n    {\n      \"Mentality\": 56,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 14,\n      \"UnspentXP\": 514,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 31\n    },\n    {\n      \"Mentality\": 41,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 15,\n      \"UnspentXP\": 522,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 47\n    },\n    {\n      \"Mentality\": 3,\n      \"MentalityOpinion\": 4,\n      \"StaffID\": 17,\n      \"UnspentXP\": 626,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 32\n    },\n    {\n      \"Mentality\": 67,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 18,\n      \"UnspentXP\": 544,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 42\n    },\n    {\n      \"Mentality\": 43,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 20,\n      \"UnspentXP\": 226,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 102\n    },\n    {\n      \"Mentality\": 57,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 22,\n      \"UnspentXP\": 764,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 97\n    },\n    {\n      \"Mentality\": 78,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 23,\n      \"UnspentXP\": 694,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 68\n    },\n    {\n      \"Mentality\": 43,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 26,\n      \"UnspentXP\": 1184,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 147\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 28,\n      \"UnspentXP\": 1083,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 140\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 30,\n      \"UnspentXP\": 502,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 120\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 33,\n      \"UnspentXP\": 131,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 180\n    },\n    {\n      \"Mentality\": 28,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 37,\n      \"UnspentXP\": 672,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 147\n    },\n    {\n      \"Mentality\": 49,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 38,\n      \"UnspentXP\": 844,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 140\n    },\n    {\n      \"Mentality\": 37,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 39,\n      \"UnspentXP\": 779,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 119\n    },\n    {\n      \"Mentality\": 29,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 40,\n      \"UnspentXP\": 311,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 100\n    },\n    {\n      \"Mentality\": 79,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 43,\n      \"UnspentXP\": 509,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 120\n    },\n    {\n      \"Mentality\": 67,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 44,\n      \"UnspentXP\": 752,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 160\n    },\n    {\n      \"Mentality\": 97,\n      \"MentalityOpinion\": 0,\n      \"StaffID\": 47,\n      \"UnspentXP\": 482,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 158\n    },\n    {\n      \"Mentality\": 72,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 48,\n      \"UnspentXP\": 397,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 158\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 49,\n      \"UnspentXP\": 948,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 147\n    },\n    {\n      \"Mentality\": 40,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 50,\n      \"UnspentXP\": 1081,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 140\n    },\n    {\n      \"Mentality\": 49,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 51,\n      \"UnspentXP\": 499,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 140\n    },\n    {\n      \"Mentality\": 53,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 54,\n      \"UnspentXP\": 707,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 125\n    },\n    {\n      \"Mentality\": 100,\n      \"MentalityOpinion\": 0,\n      \"StaffID\": 55,\n      \"UnspentXP\": 621,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 160\n    },\n    {\n      \"Mentality\": 100,\n      \"MentalityOpinion\": 0,\n      \"StaffID\": 56,\n      \"UnspentXP\": 402,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 160\n    },\n    {\n      \"Mentality\": 91,\n      \"MentalityOpinion\": 0,\n      \"StaffID\": 58,\n      \"UnspentXP\": 140,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 167\n    },\n    {\n      \"Mentality\": 38,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 59,\n      \"UnspentXP\": 880,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 180\n    },\n    {\n      \"Mentality\": 37,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 60,\n      \"UnspentXP\": 374,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 180\n    },\n    {\n      \"Mentality\": 37,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 61,\n      \"UnspentXP\": 1000,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 125\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 63,\n      \"UnspentXP\": 1133,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 152\n    },\n    {\n      \"Mentality\": 43,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 64,\n      \"UnspentXP\": 310,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 144\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 74,\n      \"UnspentXP\": 638,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 108\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 76,\n      \"UnspentXP\": 11,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 16,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 77,\n      \"UnspentXP\": 447,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 20\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 78,\n      \"UnspentXP\": 860,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 25,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 80,\n      \"UnspentXP\": 341,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 172\n    },\n    {\n      \"Mentality\": 73,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 81,\n      \"UnspentXP\": 464,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 59\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 82,\n      \"UnspentXP\": 485,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 56,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 83,\n      \"UnspentXP\": 360,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 22\n    },\n    {\n      \"Mentality\": 42,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 87,\n      \"UnspentXP\": 1406,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 486\n    },\n    {\n      \"Mentality\": 55,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 88,\n      \"UnspentXP\": 103,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 91,\n      \"UnspentXP\": 523,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 2,\n      \"MentalityOpinion\": 4,\n      \"StaffID\": 95,\n      \"UnspentXP\": 698,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 91\n    },\n    {\n      \"Mentality\": 100,\n      \"MentalityOpinion\": 0,\n      \"StaffID\": 99,\n      \"UnspentXP\": 642,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 76\n    },\n    {\n      \"Mentality\": 100,\n      \"MentalityOpinion\": 0,\n      \"StaffID\": 102,\n      \"UnspentXP\": 1970,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 714\n    },\n    {\n      \"Mentality\": 20,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 105,\n      \"UnspentXP\": 777,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 131\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 106,\n      \"UnspentXP\": 1250,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 340\n    },\n    {\n      \"Mentality\": 89,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 107,\n      \"UnspentXP\": 939,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 450\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 109,\n      \"UnspentXP\": 452,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 70\n    },\n    {\n      \"Mentality\": 40,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 110,\n      \"UnspentXP\": 902,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 76\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 114,\n      \"UnspentXP\": 788,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 115,\n      \"UnspentXP\": 749,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 40,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 116,\n      \"UnspentXP\": 550,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 51\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 117,\n      \"UnspentXP\": 132,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 74\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 119,\n      \"UnspentXP\": 67,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 178\n    },\n    {\n      \"Mentality\": 38,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 120,\n      \"UnspentXP\": 749,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 232\n    },\n    {\n      \"Mentality\": 73,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 121,\n      \"UnspentXP\": 929,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 284\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 123,\n      \"UnspentXP\": 964,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 78\n    },\n    {\n      \"Mentality\": 55,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 127,\n      \"UnspentXP\": 533,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 528\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 128,\n      \"UnspentXP\": 701,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 130,\n      \"UnspentXP\": 453,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 87\n    },\n    {\n      \"Mentality\": 72,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 132,\n      \"UnspentXP\": 671,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 113\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 133,\n      \"UnspentXP\": 446,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 47,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 135,\n      \"UnspentXP\": 924,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 57\n    },\n    {\n      \"Mentality\": 100,\n      \"MentalityOpinion\": 0,\n      \"StaffID\": 140,\n      \"UnspentXP\": 885,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 42,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 142,\n      \"UnspentXP\": 1123,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 296\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 143,\n      \"UnspentXP\": 868,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 72,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 144,\n      \"UnspentXP\": 1097,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 133\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 145,\n      \"UnspentXP\": 166,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 146,\n      \"UnspentXP\": 193,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 148,\n      \"UnspentXP\": 936,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 125\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 149,\n      \"UnspentXP\": 907,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 145\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 151,\n      \"UnspentXP\": 382,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 152,\n      \"UnspentXP\": 1059,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 115\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 153,\n      \"UnspentXP\": 264,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 145\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 155,\n      \"UnspentXP\": 504,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 156,\n      \"UnspentXP\": 945,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 158,\n      \"UnspentXP\": 22,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 125\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 159,\n      \"UnspentXP\": 64,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 160,\n      \"UnspentXP\": 805,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 161,\n      \"UnspentXP\": 856,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 162,\n      \"UnspentXP\": 674,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 163,\n      \"UnspentXP\": 485,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 165,\n      \"UnspentXP\": 367,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 166,\n      \"UnspentXP\": 344,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 168,\n      \"UnspentXP\": 230,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 114\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 169,\n      \"UnspentXP\": 382,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 172,\n      \"UnspentXP\": 985,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 105\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 173,\n      \"UnspentXP\": 118,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 105\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 174,\n      \"UnspentXP\": 709,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 125\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 175,\n      \"UnspentXP\": 461,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 125\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 178,\n      \"UnspentXP\": 169,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 125\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 179,\n      \"UnspentXP\": 736,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 181,\n      \"UnspentXP\": 197,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 183,\n      \"UnspentXP\": 439,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 145\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 184,\n      \"UnspentXP\": 716,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 187,\n      \"UnspentXP\": 890,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 191,\n      \"UnspentXP\": 762,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 193,\n      \"UnspentXP\": 24,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 105\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 195,\n      \"UnspentXP\": 523,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 105\n    },\n    {\n      \"Mentality\": 42,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 242,\n      \"UnspentXP\": 407,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 172\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 244,\n      \"UnspentXP\": 890,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 245,\n      \"UnspentXP\": 149,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 297\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 247,\n      \"UnspentXP\": 996,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 395\n    },\n    {\n      \"Mentality\": 32,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 248,\n      \"UnspentXP\": 1372,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 321\n    },\n    {\n      \"Mentality\": 37,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 252,\n      \"UnspentXP\": 646,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 96\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 253,\n      \"UnspentXP\": 847,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 44,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 255,\n      \"UnspentXP\": 589,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 29\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 258,\n      \"UnspentXP\": 482,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 259,\n      \"UnspentXP\": 861,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 260,\n      \"UnspentXP\": 902,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 263,\n      \"UnspentXP\": 1,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 73,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 264,\n      \"UnspentXP\": 165,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 84\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 272,\n      \"UnspentXP\": 249,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 279,\n      \"UnspentXP\": 1172,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 213\n    },\n    {\n      \"Mentality\": 37,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 280,\n      \"UnspentXP\": 10,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 593\n    },\n    {\n      \"Mentality\": 37,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 281,\n      \"UnspentXP\": 648,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 235\n    },\n    {\n      \"Mentality\": 72,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 282,\n      \"UnspentXP\": 373,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 564\n    },\n    {\n      \"Mentality\": 73,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 283,\n      \"UnspentXP\": 382,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 146\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 284,\n      \"UnspentXP\": 1056,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 280\n    },\n    {\n      \"Mentality\": 100,\n      \"MentalityOpinion\": 0,\n      \"StaffID\": 285,\n      \"UnspentXP\": 483,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 579\n    },\n    {\n      \"Mentality\": 73,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 286,\n      \"UnspentXP\": 711,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 405\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 287,\n      \"UnspentXP\": 213,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 161\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 288,\n      \"UnspentXP\": 588,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 297\n    },\n    {\n      \"Mentality\": 100,\n      \"MentalityOpinion\": 0,\n      \"StaffID\": 289,\n      \"UnspentXP\": 976,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 172\n    },\n    {\n      \"Mentality\": 84,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 292,\n      \"UnspentXP\": 748,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 147\n    },\n    {\n      \"Mentality\": 28,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 293,\n      \"UnspentXP\": 975,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 171\n    },\n    {\n      \"Mentality\": 37,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 299,\n      \"UnspentXP\": 877,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 113\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 300,\n      \"UnspentXP\": 327,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 301,\n      \"UnspentXP\": 16,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 234\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 302,\n      \"UnspentXP\": 444,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 303,\n      \"UnspentXP\": 78,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 304,\n      \"UnspentXP\": 810,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 260\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 305,\n      \"UnspentXP\": 80,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 400\n    },\n    {\n      \"Mentality\": 42,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 306,\n      \"UnspentXP\": 784,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 157\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 307,\n      \"UnspentXP\": 888,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 308,\n      \"UnspentXP\": 507,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 190\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 309,\n      \"UnspentXP\": 455,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 145\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 310,\n      \"UnspentXP\": 698,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 311,\n      \"UnspentXP\": 904,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 145\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 312,\n      \"UnspentXP\": 270,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 185\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 313,\n      \"UnspentXP\": 40,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 114\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 314,\n      \"UnspentXP\": 1036,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 145\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 315,\n      \"UnspentXP\": 591,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 185\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 316,\n      \"UnspentXP\": 577,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 115\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 317,\n      \"UnspentXP\": 340,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 318,\n      \"UnspentXP\": 481,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 185\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 319,\n      \"UnspentXP\": 424,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 88,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 320,\n      \"UnspentXP\": 468,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 147\n    },\n    {\n      \"Mentality\": 39,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 321,\n      \"UnspentXP\": 903,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 119\n    },\n    {\n      \"Mentality\": 55,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 322,\n      \"UnspentXP\": 325,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 570\n    },\n    {\n      \"Mentality\": 88,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 333,\n      \"UnspentXP\": 573,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 147\n    },\n    {\n      \"Mentality\": 49,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 334,\n      \"UnspentXP\": 703,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 119\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 335,\n      \"UnspentXP\": 730,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 160\n    },\n    {\n      \"Mentality\": 100,\n      \"MentalityOpinion\": 0,\n      \"StaffID\": 337,\n      \"UnspentXP\": 649,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 338,\n      \"UnspentXP\": 154,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 341,\n      \"UnspentXP\": 43,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 105\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 343,\n      \"UnspentXP\": 768,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 125\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 344,\n      \"UnspentXP\": 647,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 345,\n      \"UnspentXP\": 389,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 361,\n      \"UnspentXP\": 49,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 364,\n      \"UnspentXP\": 807,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 100,\n      \"MentalityOpinion\": 0,\n      \"StaffID\": 365,\n      \"UnspentXP\": 278,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 366,\n      \"UnspentXP\": 515,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 158\n    },\n    {\n      \"Mentality\": 75,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 367,\n      \"UnspentXP\": 1116,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 152\n    },\n    {\n      \"Mentality\": 39,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 368,\n      \"UnspentXP\": 789,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 119\n    },\n    {\n      \"Mentality\": 57,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 369,\n      \"UnspentXP\": 524,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 152\n    },\n    {\n      \"Mentality\": 62,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 370,\n      \"UnspentXP\": 383,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 152\n    },\n    {\n      \"Mentality\": 38,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 373,\n      \"UnspentXP\": 212,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 1080\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 374,\n      \"UnspentXP\": 742,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 131\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 375,\n      \"UnspentXP\": 613,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 771\n    },\n    {\n      \"Mentality\": 84,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 376,\n      \"UnspentXP\": 913,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 630\n    },\n    {\n      \"Mentality\": 47,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 377,\n      \"UnspentXP\": 873,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 400\n    },\n    {\n      \"Mentality\": 89,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 378,\n      \"UnspentXP\": 688,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 121\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 379,\n      \"UnspentXP\": 36,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 648\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 380,\n      \"UnspentXP\": 54,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 340\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 381,\n      \"UnspentXP\": 269,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 260\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 382,\n      \"UnspentXP\": 648,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 260\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 383,\n      \"UnspentXP\": 617,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 90\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 384,\n      \"UnspentXP\": 312,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 560\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 385,\n      \"UnspentXP\": 518,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 380\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 386,\n      \"UnspentXP\": 127,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 380\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 387,\n      \"UnspentXP\": 162,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 1010\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 388,\n      \"UnspentXP\": 95,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 200\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 389,\n      \"UnspentXP\": 220,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 400\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 390,\n      \"UnspentXP\": 972,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 300\n    },\n    {\n      \"Mentality\": 52,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 391,\n      \"UnspentXP\": 417,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 144\n    },\n    {\n      \"Mentality\": 72,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 392,\n      \"UnspentXP\": 967,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 147\n    },\n    {\n      \"Mentality\": 37,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 393,\n      \"UnspentXP\": 557,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 113\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 394,\n      \"UnspentXP\": 158,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 288\n    },\n    {\n      \"Mentality\": 85,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 395,\n      \"UnspentXP\": 41,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 25,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 397,\n      \"UnspentXP\": 994,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 119\n    },\n    {\n      \"Mentality\": 47,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 398,\n      \"UnspentXP\": 712,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 104\n    },\n    {\n      \"Mentality\": 37,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 399,\n      \"UnspentXP\": 794,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 981\n    },\n    {\n      \"Mentality\": 42,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 400,\n      \"UnspentXP\": 689,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 257\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 401,\n      \"UnspentXP\": 857,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 405\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 402,\n      \"UnspentXP\": 330,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 327\n    },\n    {\n      \"Mentality\": 30,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 403,\n      \"UnspentXP\": 378,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 119\n    },\n    {\n      \"Mentality\": 26,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 404,\n      \"UnspentXP\": 478,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 119\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 405,\n      \"UnspentXP\": 954,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 420\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 406,\n      \"UnspentXP\": 649,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 494\n    },\n    {\n      \"Mentality\": 42,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 407,\n      \"UnspentXP\": 403,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 939\n    },\n    {\n      \"Mentality\": 63,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 408,\n      \"UnspentXP\": 693,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 128\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 409,\n      \"UnspentXP\": 645,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 425\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 410,\n      \"UnspentXP\": 34,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 337\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 411,\n      \"UnspentXP\": 305,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 1104\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 413,\n      \"UnspentXP\": 698,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 238\n    },\n    {\n      \"Mentality\": 21,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 414,\n      \"UnspentXP\": 238,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 180\n    },\n    {\n      \"Mentality\": 10,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 415,\n      \"UnspentXP\": 1043,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 125\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 416,\n      \"UnspentXP\": 877,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 42,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 417,\n      \"UnspentXP\": 824,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 469\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 418,\n      \"UnspentXP\": 193,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 264\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 419,\n      \"UnspentXP\": 223,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 446\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 420,\n      \"UnspentXP\": 441,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 421,\n      \"UnspentXP\": 75,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 422,\n      \"UnspentXP\": 852,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 423,\n      \"UnspentXP\": 798,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 424,\n      \"UnspentXP\": 625,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 114\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 425,\n      \"UnspentXP\": 973,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 426,\n      \"UnspentXP\": 782,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 427,\n      \"UnspentXP\": 67,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 428,\n      \"UnspentXP\": 673,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 54,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 429,\n      \"UnspentXP\": 505,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 430,\n      \"UnspentXP\": 564,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 431,\n      \"UnspentXP\": 116,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 432,\n      \"UnspentXP\": 602,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 433,\n      \"UnspentXP\": 576,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 115\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 434,\n      \"UnspentXP\": 4,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 54,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 435,\n      \"UnspentXP\": 552,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 165\n    },\n    {\n      \"Mentality\": 42,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 436,\n      \"UnspentXP\": 254,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 513\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 437,\n      \"UnspentXP\": 590,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 950\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 438,\n      \"UnspentXP\": 189,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 594\n    },\n    {\n      \"Mentality\": 72,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 439,\n      \"UnspentXP\": 651,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 1010\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 536,\n      \"UnspentXP\": 244,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 125\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 537,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 538,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 539,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 43,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 540,\n      \"UnspentXP\": 125,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 125\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 541,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 542,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 543,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 544,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 545,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 546,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 547,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 548,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 549,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 550,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 551,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 554,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 555,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 556,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 557,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 567,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 568,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 100,\n      \"MentalityOpinion\": 0,\n      \"StaffID\": 600,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 601,\n      \"UnspentXP\": 240,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 240\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 602,\n      \"UnspentXP\": 270,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 270\n    },\n    {\n      \"Mentality\": 72,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 603,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 72,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 604,\n      \"UnspentXP\": 612,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 612\n    },\n    {\n      \"Mentality\": 89,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 605,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 37,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 606,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 607,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 608,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 609,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 610,\n      \"UnspentXP\": 353,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 353\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 611,\n      \"UnspentXP\": 340,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 340\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 612,\n      \"UnspentXP\": 300,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 300\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 613,\n      \"UnspentXP\": 342,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 342\n    },\n    {\n      \"Mentality\": 60,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 614,\n      \"UnspentXP\": 380,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 380\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 615,\n      \"UnspentXP\": 270,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 270\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 616,\n      \"UnspentXP\": 200,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 200\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 617,\n      \"UnspentXP\": 180,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 180\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 618,\n      \"UnspentXP\": 240,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 240\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 619,\n      \"UnspentXP\": 270,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 270\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 620,\n      \"UnspentXP\": 270,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 270\n    },\n    {\n      \"Mentality\": 50,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 621,\n      \"UnspentXP\": 260,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 260\n    },\n    {\n      \"Mentality\": 76,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 622,\n      \"UnspentXP\": 154,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 154\n    },\n    {\n      \"Mentality\": 71,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 623,\n      \"UnspentXP\": 154,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 154\n    },\n    {\n      \"Mentality\": 30,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 624,\n      \"UnspentXP\": 95,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 95\n    },\n    {\n      \"Mentality\": 26,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 625,\n      \"UnspentXP\": 95,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 95\n    },\n    {\n      \"Mentality\": 19,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 626,\n      \"UnspentXP\": 144,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 144\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 628,\n      \"UnspentXP\": 126,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 126\n    },\n    {\n      \"Mentality\": 25,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 630,\n      \"UnspentXP\": 95,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 95\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 633,\n      \"UnspentXP\": 122,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 122\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 635,\n      \"UnspentXP\": 154,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 154\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 636,\n      \"UnspentXP\": 122,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 122\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 637,\n      \"UnspentXP\": 137,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 137\n    },\n    {\n      \"Mentality\": 100,\n      \"MentalityOpinion\": 0,\n      \"StaffID\": 638,\n      \"UnspentXP\": 126,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 126\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 639,\n      \"UnspentXP\": 154,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 154\n    },\n    {\n      \"Mentality\": 26,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 640,\n      \"UnspentXP\": 95,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 95\n    },\n    {\n      \"Mentality\": 45,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 641,\n      \"UnspentXP\": 95,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 95\n    },\n    {\n      \"Mentality\": 76,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 642,\n      \"UnspentXP\": 154,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 154\n    },\n    {\n      \"Mentality\": 45,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 643,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 45,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 644,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 29,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 645,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 54,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 646,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 54,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 647,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 77,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 648,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 59,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 649,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 100,\n      \"MentalityOpinion\": 0,\n      \"StaffID\": 650,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 77,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 651,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 77,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 652,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 54,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 653,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 54,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 654,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 54,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 655,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 54,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 656,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 54,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 657,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 54,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 658,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 54,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 659,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 77,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 660,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 51,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 661,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 54,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 662,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 54,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 663,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 54,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 664,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 77,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 665,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 51,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 666,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 51,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 667,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 100,\n      \"MentalityOpinion\": 0,\n      \"StaffID\": 668,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 64,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 669,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 93,\n      \"MentalityOpinion\": 0,\n      \"StaffID\": 670,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 76,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 671,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 59,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 672,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 47,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 673,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 77,\n      \"MentalityOpinion\": 1,\n      \"StaffID\": 674,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 24,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 677,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 97,\n      \"MentalityOpinion\": 0,\n      \"StaffID\": 678,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 24,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 679,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 100,\n      \"MentalityOpinion\": 0,\n      \"StaffID\": 680,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 24,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 681,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 24,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 682,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 44,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 683,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 45,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 684,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 685,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 686,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 687,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 688,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 689,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 690,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 691,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 692,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 693,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 694,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 695,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 696,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 697,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 698,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 699,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 700,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 701,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 702,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 703,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 704,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 705,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 706,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 707,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 708,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 709,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 31,\n      \"MentalityOpinion\": 3,\n      \"StaffID\": 710,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 711,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 712,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 713,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 714,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 715,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    },\n    {\n      \"Mentality\": 36,\n      \"MentalityOpinion\": 2,\n      \"StaffID\": 716,\n      \"UnspentXP\": 0,\n      \"XPGainedLastRace\": 0,\n      \"XPGainedLastWeek\": 0\n    }\n  ]\n}"
  },
  {
    "path": "src/index.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n  <meta charset=\"UTF-8\">\n  <!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->\n  <title>Database Editor for F1 Manager</title>\n  <link rel=\"icon\" href=\"../assets/images/logoAlter.png\" type=\"image/png\">\n</head>\n<script async src=\"https://www.googletagmanager.com/gtag/js?id=G-81CY6HY9K6\"></script>\n<script>\n  window.dataLayer = window.dataLayer || [];\n  function gtag() { dataLayer.push(arguments); }\n  gtag('js', new Date());\n\n  gtag('config', 'G-81CY6HY9K6');\n</script>\n\n<body class=\"font\">\n  <div class=\"tech-grid\"></div>\n  <div class=\"glow-spot\"></div>\n  <div class=\"modal custom-modal fade\" id=\"enginesModal\" data-bs-backdrop=\"static\" data-bs-keyboard=\"false\">\n    <div class=\"modal-dialog modal-lg modal-dialog-centered\" role=\"document\">\n      <div class=\"modal-content custom-modal\">\n        <div class=\"modal-header custom-header\">\n          <h4 class=\"modal-title bold-font\">Edit custom engines</h4>\n        </div>\n        <div class=\"modal-body engine-modal-body custom-body\">\n          <div class=\"custom-engines-div\"></div>\n          <div class=\"add-engine\">\n            <div class=\"button-with-icon\" id=\"addCustomEngineButton\">\n              <i class=\"bi bi-plus-circle\"></i>\n              <span class=\"\">Add custom engine</span>\n            </div>\n          </div>\n        </div>\n        <div class=\"modal-footer custom-footer\">\n          <button type=\"button\" class=\"close-modal\" data-bs-dismiss=\"modal\"\n            id=\"cancelCustomEnginesButton\">Close</button>\n          <button type=\"button\" class=\"confirm-modal\" id=\"confirmCustomEnginesButton\">Confirm</button>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"modal custom-modal fade\" id=\"contractModal\" data-bs-backdrop=\"static\" data-bs-keyboard=\"false\">\n    <div class=\"modal-dialog modal-lg modal-dialog-centered\" role=\"document\">\n      <div class=\"modal-content custom-modal\">\n        <div class=\"modal-header custom-header\">\n          <h4 class=\"modal-title bold-font\" id=\"contractModalTitle\"></h4>\n        </div>\n        <div class=\"modal-body number-and-contract custom-body\">\n          <div class=\"contract-options\">\n            <div class=\"contract-title\" id=\"currentContractTitle\">\n              <div>Current contract</div>\n              <div class=\"contract-categories\" id=\"contractPills\">\n                <div class=\"contract-category f1-contract\" data-category=\"f1\">F1</div>\n                <div class=\"contract-category junior-contract\" data-category=\"junior\">F2/F3</div>\n              </div>\n              <div class=\"team-contract\" id=\"currentContract\"></div>\n              <div class=\"dropdown-global d-none\" id=\"juniorContractDropdown\">\n                <button class=\"redesigned-dropdown bold-font\" id=\"juniorTeamContractButton\" data-teamid=\"-1\">\n                  <span class=\"dropdown-label\">Select junior team</span>\n                  <i class=\"redesigned-chevron\"></i>\n                </button>\n                <ul class=\"redesigned-dropdown-menu dropdown-menu-end\" id=\"juniorTeamContractMenu\"\n                  style=\"font-family: Formula1;\">\n                </ul>\n              </div>\n            </div>\n            <div class=\"contract-details pt-1 mb-3\" id=\"currentContractOptions\">\n              <div>\n                <h5 class=\"modal-subtitle bold-font\">Salary</h5>\n                <div class=\"input-and-buttons pt-1\">\n                  <div class=\"unit-and-input\">\n                    <span class=\"unit-label\">$</span>\n                    <input type=\"text\" class=\"custom-input-number contract-modal-input\" id=\"salaryInput\"\n                      placeholder=\"ex: 2000000\" min=\"0\">\n                  </div>\n                  <div class=\"input-buttons\">\n                    <i class=\"bi bi-plus new-augment-button\"></i>\n                    <i class=\"bi bi-dash new-augment-button\"></i>\n                  </div>\n                </div>\n              </div>\n              <div>\n                <h5 class=\"modal-subtitle bold-font\">Valid until</h5>\n                <div class=\"input-and-buttons pt-1\">\n                  <input type=\"number\" class=\"custom-input-number contract-modal-input\" id=\"yearInput\"\n                    placeholder=\"ex: 2028\">\n                  <div class=\"input-buttons\">\n                    <i class=\"bi bi-plus new-augment-button\"></i>\n                    <i class=\"bi bi-dash new-augment-button\"></i>\n                  </div>\n                </div>\n              </div>\n              <div>\n                <h5 class=\"modal-subtitle bold-font\">Sign bonus</h5>\n                <div class=\"input-and-buttons pt-1\">\n                  <div class=\"unit-and-input\">\n                    <span class=\"unit-label\">$</span>\n                    <input type=\"text\" class=\"custom-input-number contract-modal-input\" id=\"signBonusInput\"\n                      placeholder=\"ex: 10000\" min=\"0\">\n                  </div>\n                  <div class=\"input-buttons\">\n                    <i class=\"bi bi-plus new-augment-button\"></i>\n                    <i class=\"bi bi-dash new-augment-button\"></i>\n                  </div>\n                </div>\n              </div>\n              <div class=\"mt-3\">\n                <h5 class=\"modal-subtitle bold-font\">Race bonus amount</h5>\n                <div class=\"input-and-buttons pt-1 driver-only\">\n                  <div class=\"unit-and-input\">\n                    <span class=\"unit-label\">$</span>\n                    <input type=\"text\" class=\"custom-input-number contract-modal-input\" id=\"raceBonusAmt\"\n                      placeholder=\"ex: 150000\" min=\"0\">\n                  </div>\n                  <div class=\"input-buttons\">\n                    <i class=\"bi bi-plus new-augment-button\"></i>\n                    <i class=\"bi bi-dash new-augment-button\"></i>\n                  </div>\n                </div>\n              </div>\n              <div class=\"mt-3\">\n                <h5 class=\"modal-subtitle bold-font\">Race bonus position</h5>\n                <div class=\"input-and-buttons pt-1 driver-only\">\n                  <input type=\"number\" class=\"custom-input-number contract-modal-input\" id=\"raceBonusPos\"\n                    placeholder=\"ex: 1\" min=\"1\" max=\"22\">\n                  <div class=\"input-buttons\">\n                    <i class=\"bi bi-plus new-augment-button\"></i>\n                    <i class=\"bi bi-dash new-augment-button\"></i>\n                  </div>\n                </div>\n              </div>\n            </div>\n            <div class=\"junior-contract-info d-none\">\n              <div class=\"mt-2\">\n                <h5 class=\"modal-subtitle bold-font\">Position in Team</h5>\n                <div class=\"input-and-buttons pt-1\">\n                  <div class=\"unit-and-input\">\n                    <span class=\"unit-label\">Car</span>\n                    <input type=\"number\" class=\"custom-input-number contract-modal-input\" id=\"juniorPosInTeam\"\n                      placeholder=\"ex: 1\" min=\"1\" max=\"3\">\n                  </div>\n                  <div class=\"input-buttons\">\n                    <i class=\"bi bi-chevron-up new-augment-button\"></i>\n                    <i class=\"bi bi-chevron-down new-augment-button\"></i>\n                  </div>\n                </div>\n              </div>\n              <h5 class=\"modal-subtitle bold-font mt-3\">Drivers</h5>\n              <div class=\"junior-team-drivers-list\"></div>\n            </div>\n            <div class=\"contract-title pt-3\" id=\"futureContractTitle\">\n              <div class=\"year-and-break\">\n                <div id=\"futureYear\"></div>\n                <div class=\"button-with-icon close-modal break-contract ms-4\">\n                  <i class=\"bi bi-x-lg\"></i>\n                  <span>Break contract</span>\n                </div>\n              </div>\n              <div class=\"team-contract\" id=\"futureContract\"></div>\n            </div>\n            <div class=\"contract-details pt-1\" id=\"futureContractOptions\">\n              <div>\n                <h5 class=\"modal-subtitle bold-font\">Salary</h5>\n                <div class=\"input-and-buttons pt-1\">\n                  <div class=\"unit-and-input\">\n                    <span class=\"unit-label\">$</span>\n                    <input type=\"text\" class=\"custom-input-number contract-modal-input\" id=\"salaryInputFuture\"\n                      placeholder=\"ex: 2000000\" min=\"0\">\n                  </div>\n                  <div class=\"input-buttons\">\n                    <i class=\"bi bi-plus new-augment-button\"></i>\n                    <i class=\"bi bi-dash new-augment-button\"></i>\n                  </div>\n                </div>\n              </div>\n              <div>\n                <h5 class=\"modal-subtitle bold-font\">Valid until</h5>\n                <div class=\"input-and-buttons pt-1\">\n                  <input type=\"number\" class=\"custom-input-number contract-modal-input\" id=\"yearInputFuture\"\n                    placeholder=\"ex: 2028\">\n                  <div class=\"input-buttons\">\n                    <i class=\"bi bi-plus new-augment-button\"></i>\n                    <i class=\"bi bi-dash new-augment-button\"></i>\n                  </div>\n                </div>\n              </div>\n              <div>\n                <h5 class=\"modal-subtitle bold-font\">Sign bonus</h5>\n                <div class=\"input-and-buttons pt-1\">\n                  <div class=\"unit-and-input\">\n                    <span class=\"unit-label\">$</span>\n                    <input type=\"text\" class=\"custom-input-number contract-modal-input\" id=\"signBonusInputFuture\"\n                      placeholder=\"ex: 10000\" min=\"0\">\n                  </div>\n                  <div class=\"input-buttons\">\n                    <i class=\"bi bi-plus new-augment-button\"></i>\n                    <i class=\"bi bi-dash new-augment-button\"></i>\n                  </div>\n                </div>\n              </div>\n              <div class=\"mt-3\">\n                <h5 class=\"modal-subtitle bold-font\">Race bonus amount</h5>\n                <div class=\"input-and-buttons pt-1 driver-only\">\n                  <div class=\"unit-and-input\">\n                    <span class=\"unit-label\">$</span>\n                    <input type=\"text\" class=\"custom-input-number contract-modal-input\" id=\"raceBonusAmtFuture\"\n                      placeholder=\"ex: 150000\" min=\"0\">\n                  </div>\n                  <div class=\"input-buttons\">\n                    <i class=\"bi bi-plus new-augment-button\"></i>\n                    <i class=\"bi bi-dash new-augment-button\"></i>\n                  </div>\n                </div>\n              </div>\n              <div class=\"mt-3\">\n                <h5 class=\"modal-subtitle bold-font\">Race bonus position</h5>\n                <div class=\"input-and-buttons pt-1 driver-only\">\n                  <input type=\"number\" class=\"custom-input-number contract-modal-input\" id=\"raceBonusPosFuture\"\n                    placeholder=\"ex: 1\" min=\"1\" max=\"22\">\n                  <div class=\"input-buttons\">\n                    <i class=\"bi bi-plus new-augment-button\"></i>\n                    <i class=\"bi bi-dash new-augment-button\"></i>\n                  </div>\n                </div>\n              </div>\n              <div class=\"mt-3\">\n                <h5 class=\"modal-subtitle bold-font\">Position</h5>\n                <div class=\"input-and-buttons pt-1 driver-only\" id=\"positionInput\">\n                  <input type=\"number\" class=\"custom-input-number contract-modal-input\" id=\"posInTeamFuture\"\n                    placeholder=\"ex: 1\" min=\"1\" max=\"999\">\n                  <div class=\"input-buttons\">\n                    <i class=\"bi bi-plus new-augment-button\"></i>\n                    <i class=\"bi bi-dash new-augment-button\"></i>\n                  </div>\n                </div>\n              </div>\n            </div>\n            <div class=\"add-contract\">\n              <div class=\"button-with-icon\">\n                <i class=\"bi bi-plus-circle\"></i>\n                <span class=\"\">Add future contract</span>\n              </div>\n              <div class=\"dropdown-global\">\n                <button class=\"redesigned-dropdown bold-font\" id=\"teamContractButton\">\n                  <span class=\"dropdown-label\">Select team</span>\n                  <i class=\"redesigned-chevron\"></i>\n                </button>\n                <ul class=\"redesigned-dropdown-menu dropdown-menu-end\" id=\"teamContractMenu\"\n                  style=\"font-family: Formula1;\">\n                  <a class=\"redesigned-dropdown-item bold-font\" style=\"cursor: pointer;\" data-teamid=\"1\">\n                    <div class=\"team-menu-logo\">\n                      <img src=\"../assets/images/logos/ferrari.png\" class=\"team-menu-ferrari\">\n                    </div>\n                    <div class=\"team-menu-name\">\n                      FERRARI\n                    </div>\n                  </a>\n                  <a class=\"redesigned-dropdown-item bold-font\" style=\"cursor: pointer;\" data-teamid=\"2\">\n                    <div class=\"team-menu-logo\">\n                      <div class=\"team-menu-mclaren\"></div>\n                    </div>\n                    <div class=\"team-menu-name\">\n                      MCLAREN\n                    </div>\n                  </a>\n                  <a class=\"redesigned-dropdown-item  bold-font\" style=\"cursor: pointer;\" data-teamid=\"3\">\n                    <div class=\"team-menu-logo\">\n                      <img src=\"../assets/images/logos/redbull.png\"\n                        class=\"team-menu-redbull team-menu-redbull-replace changable-team-menu-redbull redbulllogo redbulllogo-replace\">\n                    </div>\n                    <div class=\"team-menu-name redbull-name\">RED BULL</div>\n                  </a>\n                  <a class=\"redesigned-dropdown-item  bold-font\" style=\"cursor: pointer;\" data-teamid=\"4\">\n                    <div class=\"team-menu-logo\">\n                      <img src=\"../assets/images/logos/mercedes.png\" class=\"team-menu-merc\">\n                    </div>\n\n                    <div class=\"team-menu-name\">\n                      MERCEDES\n                    </div>\n                  </a>\n                  <a class=\"redesigned-dropdown-item bold-font\" style=\"cursor: pointer;\" data-teamid=\"5\">\n                    <div class=\"team-menu-logo\">\n                      <div class=\"alpine-logo-container\">\n                        <div class=\"alpinelogo-replace team-menu-alpine-replace changable-team-menu-alpine\"></div>\n                      </div>\n                    </div>\n                    <div class=\"team-menu-name alpine-name\">\n                      ALPINE\n                    </div>\n                  </a>\n                  <a class=\"redesigned-dropdown-item bold-font\" style=\"cursor: pointer;\" data-teamid=\"6\">\n                    <div class=\"team-menu-logo\">\n                      <div class=\"team-menu-williams team-menu-williams-replace changable-team-menu-williams\"></div>\n                    </div>\n                    <div class=\"team-menu-name williams-name\">\n                      WILLIAMS\n                    </div>\n                  </a>\n                  <a class=\"redesigned-dropdown-item bold-font\" style=\"cursor: pointer;\" data-teamid=\"7\">\n                    <div class=\"team-menu-logo\">\n                      <img src=\"../assets/images/logos/haas.png\"\n                        class=\"team-menu-haas team-menu-haas-replace changable-team-menu-haas haaslogo-replace\">\n                    </div>\n                    <div class=\"team-menu-name haas-name\">\n                      HAAS\n                    </div>\n                  </a>\n                  <a class=\"redesigned-dropdown-item  bold-font\" style=\"cursor: pointer;\" data-teamid=\"8\">\n                    <div class=\"team-menu-logo\">\n                      <div class=\"alphatauri-logo-container\">\n                        <div\n                          class=\"atlogo-replace alphataurilogo team-menu-alphatauri-replace changable-team-menu-alphatauri\">\n                        </div>\n                      </div>\n                    </div>\n                    <div class=\"team-menu-name at-name\">\n                      ALPHA TAURI\n                    </div>\n                  </a>\n                  <a class=\"redesigned-dropdown-item  bold-font\" style=\"cursor: pointer;\" data-teamid=\"9\">\n                    <div class=\"team-menu-logo\">\n                      <img src=\"../assets/images/logos/alfaromeo.png\"\n                        class=\"alfalogo-replace alfalogo team-menu-alfa-replace changable-team-menu-alfa\">\n                    </div>\n                    <div class=\"team-menu-name alfa-name\">\n                      ALFA ROMEO\n                    </div>\n                  </a>\n                  <a class=\"redesigned-dropdown-item bold-font\" style=\"cursor: pointer;\" data-teamid=\"10\">\n                    <div class=\"team-menu-logo\">\n                      <img src=\"../assets/images/logos/astonMartin.png\"\n                        class=\"team-menu-aston team-menu-aston-replace changable-team-menu-aston astonlogo astonlogo-replace\">\n                    </div>\n                    <div class=\"team-menu-name aston-name\" style=\"margin-right: 5px;\">\n                      ASTON MARTIN\n                    </div>\n                  </a>\n                  <a class=\"redesigned-dropdown-item  bold-font\" style=\"cursor: pointer;\" data-teamid=\"32\"\n                    id=\"customTeamContract\">\n                    <div class=\"team-menu-logo\">\n                      <img src=\"../assets/images/logos/placeholder.png\" class=\"team-menu-custom  custom-replace\">\n                    </div>\n                    <div class=\"team-menu-name ct-replace\" style=\"margin-right: 8px;\">\n                      CUSTOM TEAM\n                    </div>\n                  </a>\n                </ul>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"modal-footer custom-footer\">\n          <button type=\"button\" class=\"close-modal\" data-bs-dismiss=\"modal\" id=\"cancelButton\">Close</button>\n          <button type=\"button\" class=\"confirm-modal\" id=\"confirmButton\" data-bs-dismiss=\"modal\">Confirm</button>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"modal custom-modal fade\" id=\"patchModal\" data-bs-backdrop=\"static\" data-bs-keyboard=\"false\">\n    <div class=\"modal-dialog modal-dialog-centered\" role=\"document\">\n      <div class=\"modal-content custom-modal\">\n        <div class=\"modal-header custom-header\">\n          <h3 class=\"modal-title bold-font\" id=\"patchModalTitle\"></h3>\n        </div>\n        <div class=\"modal-body custom-body\" id=\"patchNotesBody\">\n        </div>\n        <div class=\"modal-footer custom-footer\">\n          <button type=\"button\" class=\"close-modal\" data-bs-dismiss=\"modal\">Close</button>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"modal custom-modal modal-lg fade\" id=\"configDetailModal\" data-bs-backdrop=\"static\"\n    data-bs-keyboard=\"false\">\n    <div class=\"modal-dialog modal-dialog-centered\" role=\"document\">\n      <div class=\"modal-content custom-modal\">\n        <div class=\"modal-header custom-header\">\n          <h3 class=\"modal-title bold-font\">Settings</h3>\n        </div>\n        <div class=\"modal-body custom-body\">\n          <div class=\"pb-2 pe-3\">\n            <ul class=\"nav nav-pills\">\n              <li class=\"nav-item\">\n                <a class=\"nav-link bold-font categoryPills generalPills d-none\" data-bs-toggle=\"pill\"\n                  data-section=\".teams-section\" id=\"editorPill\">\n                  <div class=\"basic-label bold-font\">Editor</div>\n                  <div class=\"pill-line\"></div>\n                </a>\n              </li>\n              <li class=\"nav-item\">\n                <a class=\"nav-link bold-font categoryPills generalPills d-none\" data-bs-toggle=\"pill\"\n                  data-section=\".engines-section\" id=\"gamePill\">\n                  <div class=\"basic-label bold-font\">Game</div>\n                  <div class=\"pill-line\"></div>\n                </a>\n              </li>\n              <li class=\"nav-item\">\n                <a class=\"nav-link bold-font categoryPills generalPills active\" data-bs-toggle=\"pill\"\n                  data-section=\".engines-section\" id=\"patreonPill\">\n                  <div class=\"basic-label bold-font\">Patreon</div>\n                  <div class=\"pill-line\"></div>\n                </a>\n              </li>\n            </ul>\n          </div>\n          <div id=\"editorChanges\" class=\"d-none\">\n            <h5 class=\"modal-subtitle bold-font\">\n              Customize your grid\n            </h5>\n            <div class=\"main-team-changes mb-3\" id=\"teamChanges\">\n              <div class=\"d-flex\" style=\"gap: 7px;\">\n                <div class=\"modal-text\">Please note that this changes are <span class=\"important-text bold-font\">VISUAL\n                    AND FOR THE EDITOR\n                    ONLY</span>, they will\n                  <span class=\"important-text bold-font\">NOT APPLY TO YOUR SAVE IN-GAME</span>\n                </div>\n              </div>\n              <div class=\"team-changes-grid\">\n                <div class=\"team-change\">\n                  <div class=\"bold-font logo-and-name\">\n                    <img src=\"../assets/images/logos/haas.png\" class=\"haaslogo non-changable\" data-resizable=\"true\">\n                    <div class=\"team-name\">HAAS</div>\n                  </div>\n                  <div class=\"team-change-button\" id=\"haasReplaceButton\">\n                    <div class=\"dropdown-global\" style=\"width: max-content;\">\n                      <button class=\"redesigned-dropdown bold-font\" data-value=\"haas\">\n                        <span class=\"dropdown-label\">HAAS</span>\n                        <i class=\"redesigned-chevron\"></i>\n                      </button>\n                      <ul class=\"redesigned-dropdown-menu team-select-menu\" style=\"font-family: Formula1;\">\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"haas\">\n                          <img src=\"../assets/images/logos/haas.png\" class=\"haaslogo non-changable\">\n                          <div>HAAS</div>\n                        </a>\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"toyota\">\n                          <div class=\"toyotalogo\"></div>\n                          <div>TOYOTA</div>\n                        </a>\n                      </ul>\n\n                    </div>\n\n                  </div>\n                </div>\n                <div class=\"team-change\">\n                  <div class=\"bold-font logo-and-name\">\n                    <div class=\"alphatauri-logo-container\">\n                      <div class=\"alphataurilogo non-changable\" id=\"alphaModalLogo\" data-resizable=\"true\"></div>\n                    </div>\n                    <div class=\"team-name\" id=\"alphaModalName\">ALPHA TAURI</div>\n                  </div>\n                  <div class=\"team-change-button\" id=\"alphaTauriReplaceButton\">\n                    <div class=\"dropdown-global\" style=\"width: max-content;\">\n                      <button class=\"redesigned-dropdown bold-font\" aria-haspopup=\"true\" data-value=\"alphatauri\">\n                        <span class=\"dropdown-label\">ALPHA TAURI</span>\n                        <i class=\"redesigned-chevron\"></i>\n                      </button>\n                      <ul class=\"redesigned-dropdown-menu team-select-menu\" style=\"font-family: Formula1;\">\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"alphatauri\">\n                          <div class=\"alphatauri-logo-container\">\n                            <div class=\"alphataurilogo non-changable\"></div>\n                          </div>\n                          <div>ALPHA TAURI</div>\n                        </a>\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"visarb\">\n                          <div class=\"alphatauri-logo-container\">\n                            <div class=\"visarblogo\"></div>\n                          </div>\n                          <div>VISA CASHAPP RB</div>\n                        </a>\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"hugo\">\n                          <div class=\"alphatauri-logo-container\">\n                            <div class=\"hugologo\"></div>\n                          </div>\n                          <div>HUGO BOSS</div>\n                        </a>\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"toyota\">\n                          <div class=\"alphatauri-logo-container\">\n                            <div class=\"toyotalogo\"></div>\n                          </div>\n                          <div class=\"\">TOYOTA</div>\n                        </a>\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"porsche\">\n                          <img src=\"../assets/images/logos/porsche.png\" class=\"porschelogo\">\n                          <div class=\"\">PORSCHE</div>\n                        </a>\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"brawn\">\n                          <div class=\"alphatauri-logo-container\">\n                            <div class=\"brawnlogo\"></div>\n                          </div>\n                          <div class=\"\">BRAWN GP</div>\n                        </a>\n                      </ul>\n                    </div>\n\n                  </div>\n                </div>\n                <div class=\"team-change\">\n                  <div class=\"bold-font logo-and-name\">\n                    <div class=\"alpine-logo-container\">\n                      <div class=\"alpinelogo non-changable\" data-resizable=\"true\"></div>\n                    </div>\n                    <div class=\"team-name\">ALPINE</div>\n                  </div>\n                  <div class=\"team-change-button\" id=\"alpineReplaceButton\">\n                    <div class=\"dropdown-global\" style=\"width: max-content;\">\n                      <button class=\"redesigned-dropdown bold-font\" data-value=\"alpine\">\n                        <span class=\"dropdown-label\">ALPINE</span>\n                        <i class=\"redesigned-chevron\"></i>\n                      </button>\n                      <ul class=\"redesigned-dropdown-menu team-select-menu\" style=\"font-family: Formula1;\">\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"alpine\">\n                          <div class=\"alpine-logo-container\">\n                            <div class=\"alpinelogo non-changable\"></div>\n                          </div>\n                          <div class=\"\">ALPINE</div>\n                        </a>\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"andretti\">\n                          <div class=\"alpine-logo-container\">\n                            <div class=\"andrettilogo\"></div>\n                          </div>\n\n                          <div class=\"\">ANDRETTI</div>\n                        </a>\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"renault\">\n                          <div class=\"alpine-logo-container\">\n                            <div class=\"renaultlogo\"></div>\n                          </div>\n\n                          <div class=\"\">RENAULT</div>\n                        </a>\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"lotus\">\n                          <div class=\"alpine-logo-container\">\n                            <div class=\"lotuslogo\"></div>\n                          </div>\n\n                          <div class=\"\">LOTUS</div>\n                        </a>\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"cadillac\">\n                          <img src=\"../assets/images/logos/cadillac.png\" class=\"cadillaclogo\">\n                          <div class=\"\">CADILLAC</div>\n                        </a>\n                      </ul>\n\n                    </div>\n\n                  </div>\n                </div>\n                <div class=\"team-change\">\n                  <div class=\"bold-font logo-and-name\">\n                    <div class=\"williamslogo non-changable\" data-resizable=\"true\"></div>\n                    <div class=\"team-name\">WILLIAMS</div>\n                  </div>\n                  <div class=\"team-change-button\" id=\"williamsReplaceButton\">\n                    <div class=\"dropdown-global\" style=\"width: max-content;\">\n                      <button class=\"redesigned-dropdown bold-font\" data-value=\"williams\">\n                        <span class=\"dropdown-label\">WILLIAMS</span>\n                        <i class=\"redesigned-chevron\"></i>\n                      </button>\n                      <ul class=\"redesigned-dropdown-menu team-select-menu\" style=\"font-family: Formula1;\">\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"williams\">\n                          <div class=\"williamslogo non-changable\"></div>\n                          <div>WILLIAMS</div>\n                        </a>\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"bmw\">\n                          <img src=\"../assets/images/logos/bmw.png\" class=\"bmwlogo\">\n                          <div>BMW</div>\n                        </a>\n                      </ul>\n\n                    </div>\n\n                  </div>\n                </div>\n                <div class=\"team-change\">\n                  <div class=\"bold-font logo-and-name\">\n                    <img src=\"../assets/images/logos/alfaromeo.png\" class=\"alfalogo non-changable\" id=\"alfaModalLogo\"\n                      data-resizable=\"true\">\n                    <div class=\"team-name\" id=\"alfaModalName\">ALFA ROMEO</div>\n                  </div>\n                  <div class=\"team-change-button\" id=\"alfaReplaceButton\">\n                    <div class=\"dropdown-global\" style=\"width: max-content;\">\n                      <button class=\"redesigned-dropdown bold-font\" data-value=\"alfa\">\n                        <span class=\"dropdown-label\">ALFA ROMEO</span>\n                        <i class=\"redesigned-chevron\"></i>\n                      </button>\n                      <ul class=\"redesigned-dropdown-menu team-select-menu\" style=\"font-family: Formula1;\">\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"alfa\">\n                          <img src=\"../assets/images/logos/alfaromeo.png\" class=\"alfalogo non-changable\">\n                          <div class=\"\">ALFA ROMEO</div>\n                        </a>\n                        <a class=\"redesigned-dropdown-item bold-font \" data-value=\"stake\">\n                          <img src=\"../assets/images/logos/kick.png\" class=\"alfalogo\">\n                          <div class=\"\">STAKE SAUBER</div>\n                        </a>\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"sauber\">\n                          <div class=\"team-menu-logo\">\n                            <div class=\"sauberlogo\"></div>\n                          </div>\n                          <div class=\"\">SAUBER</div>\n                        </a>\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"audi\">\n                          <img src=\"../assets/images/logos/audi.png\" class=\"audilogo\">\n                          <div class=\"\">AUDI</div>\n                        </a>\n                      </ul>\n\n                    </div>\n\n                  </div>\n                </div>\n                <div class=\"team-change\">\n                  <div class=\"bold-font logo-and-name\">\n                    <img src=\"../assets/images/logos/redbull.png\" class=\"redbulllogo non-changable\"\n                      data-resizable=\"true\">\n                    <div class=\"team-name\">RED BULL</div>\n                  </div>\n                  <div class=\"team-change-button\" id=\"redbullReplaceButton\">\n                    <div class=\"dropdown-global\" style=\"width: max-content;\">\n                      <button class=\"redesigned-dropdown bold-font\" data-value=\"redbull\">\n                        <span class=\"dropdown-label\">RED BULL</span>\n                        <i class=\"redesigned-chevron\"></i>\n                      </button>\n                      <ul class=\"redesigned-dropdown-menu team-select-menu\" style=\"font-family: Formula1;\">\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"redbull\">\n                          <img src=\"../assets/images/logos/redbull.png\" class=\"redbulllogo non-changable\">\n                          <div>RED BULL</div>\n                        </a>\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"ford\">\n                          <img src=\"../assets/images/logos/ford.png\" class=\"fordlogo\">\n                          <div>FORD</div>\n                        </a>\n                      </ul>\n                    </div>\n\n                  </div>\n                </div>\n                <div class=\"team-change\">\n                  <div class=\"bold-font logo-and-name\">\n                    <img src=\"../assets/images/logos/astonMartin.png\" class=\"astonlogo non-changable\"\n                      data-resizable=\"true\">\n                    <div class=\"team-name\">ASTON MARTIN</div>\n                  </div>\n                  <div class=\"team-change-button\" id=\"astonReplaceButton\">\n                    <div class=\"dropdown-global\" style=\"width: max-content;\">\n                      <button class=\"redesigned-dropdown bold-font\" data-value=\"aston\">\n                        <span class=\"dropdown-label\">ASTON MARTIN</span>\n                        <i class=\"redesigned-chevron\"></i>\n                      </button>\n                      <ul class=\"redesigned-dropdown-menu team-select-menu\" style=\"font-family: Formula1;\">\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"aston\">\n                          <img src=\"../assets/images/logos/astonMartin.png\" class=\"astonlogo non-changable\">\n                          <div class=\"\">ASTON MARTIN</div>\n                        </a>\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"racingpoint\">\n                          <img src=\"../assets/images/logos/racingpoint.png\" class=\"racingpointlogo\">\n                          <div class=\"\">RACING POINT</div>\n                        </a>\n                        <a class=\"redesigned-dropdown-item bold-font\" data-value=\"jordan\">\n                          <img src=\"../assets/images/logos/jordan.png\" class=\"jordanlogo\">\n                          <div class=\"\">JORDAN</div>\n                        </a>\n                      </ul>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n            <div class=\"form-check form-switch mt-2 d-none\">\n              <input class=\"form-check-input custom-toggle\" type=\"checkbox\" role=\"switch\"\n                id=\"forceEditorMinimapColorsToggle\">\n              <label class=\"form-check-label\" for=\"forceEditorMinimapColorsToggle\">Force editor colors in\n                minimap</label>\n            </div>\n            <div id=\"customizeTeam\">\n              <div class=\"custom-logo-selection mt-2\">\n                <div class=\"logo-selector\">\n                  <div class=\"logo-and-preview\">\n                    <div style=\"width: max-content;\">\n                      <div class=\"button-with-icon\" id=\"selectImage\">\n                        <i class=\"bi bi-image\"></i>\n                        <div class=\"bold-font\">Select icon</div>\n                      </div>\n                    </div>\n                    <input class=\"d-none\" type=\"file\" id=\"fileInput\" accept=\"image/*\">\n                    <img class=\"logo-preview\"></img>\n                  </div>\n                </div>\n                <div class=\"colors-selector\">\n                  <div class=\"color-selector\">\n                    <div class=\"bold-font title-secondary\">Primary color</div>\n                    <input class=\"color-picker\" type=\"color\" id=\"primarySelector\">\n                    <input class=\"color-reader\" type=\"text\" id=\"primaryReader\">\n                  </div>\n                  <div class=\"color-selector\">\n                    <div class=\"bold-font title-secondary\">Secondary color</div>\n                    <input class=\"color-picker\" type=\"color\" id=\"secondarySelector\">\n                    <input class=\"color-reader\" type=\"text\" id=\"secondaryReader\">\n                  </div>\n                </div>\n\n              </div>\n            </div>\n            <div class=\"mt-3 d-none\" id=\"turningPointsFrequencyConfig\">\n              <h5 class=\"modal-subtitle bold-font\">Turning Points Frequency</h5>\n              <div class=\"modal-text\">\n                Scales the chance and seasonal cap for all Turning Points.\n              </div>\n              <div class=\"slider-and-label\">\n                <input class=\"form-range\" type=\"range\" min=\"0\" max=\"4\" step=\"1\" value=\"2\"\n                  id=\"turningPointsFrequencySlider\">\n                <span class=\"option-state default\" id=\"turningPointsFrequencyLabel\">Default</span>\n              </div>\n            </div>\n            <div class=\"mt-3\">\n              <h5 class=\"modal-subtitle bold-font\">Panic download</h5>\n              <div class=\"modal-text\">\n                Click this if your save is stuck or bugged to download a version of your save with less fancy stuff in\n                the db. It might fix some issues.\n              </div>\n              <div class=\"button-with-icon\" id=\"panicDownloadButton\">\n                <i class=\"bi bi-exclamation-triangle-fill\"></i>\n                <span>Panic download</span>\n              </div>\n            </div>\n            <div class=\"mt-3\">\n              <h5 class=\"modal-subtitle bold-font\">Engine upgrades turning points</h5>\n              <div class=\"form-check form-switch aduo-tp-toggle-settings\">\n                <input class=\"form-check-input custom-toggle\" type=\"checkbox\" role=\"switch\" id=\"aduoTPSToggleSettings\">\n                <label class=\"form-check-label\" for=\"aduoTPSToggleSettings\">Engine upgrades TPs</label>\n              </div>\n            </div>\n          </div>\n          <div class=\"d-flex\" style=\"gap: 7px;\">\n            <div class=\"d-none\" id=\"gameChanges\">\n              <div class=\"pb-3\">\n                If you change the name of the save file, the <span class=\"important-text bold-font\">name </span>of the\n                difficulty selected may be incorrect.\n              </div>\n              <div class=\"game-changes\">\n                <div class=\"managing-team\">\n                  <span class=\"modal-subtitle bold-font\">Player's team</span>\n                  <div class=\"managing-team-grid\">\n                    <div class=\"team-logo-container fe\" data-teamid=\"1\">\n                      <img src=\"../assets/images/logos/ferrari.png\" class=\"team-logo\">\n                    </div>\n                    <div class=\"team-logo-container mc\" data-teamid=\"2\">\n                      <div class=\"team-logo mclarenlogo\"></div>\n                    </div>\n                    <div class=\"team-logo-container rb\" data-teamid=\"3\">\n                      <img src=\"../assets/images/logos/redbull.png\" class=\"team-logo redbulllogo redbulllogo-replace\">\n                    </div>\n                    <div class=\"team-logo-container me\" data-teamid=\"4\">\n                      <img src=\"../assets/images/logos/mercedes.png\" class=\"team-logo\">\n                    </div>\n                    <div class=\"team-logo-container al\" data-teamid=\"5\">\n                      <div class=\"alpine-logo-container\">\n                        <div class=\"alpinelogo alpinelogo-replace\"></div>\n                      </div>\n                    </div>\n                    <div class=\"team-logo-container wi\" data-teamid=\"6\">\n                      <div class=\"williamslogo williamslogo-replace\"></div>\n                    </div>\n                    <div class=\"team-logo-container ha\" data-teamid=\"7\">\n                      <img src=\"../assets/images/logos/haas.png\" class=\"team-logo haaslogo-replace\">\n                    </div>\n                    <div class=\"team-logo-container at\" data-teamid=\"8\">\n                      <div class=\"alphatauri-logo-container\">\n                        <div class=\"alphataurilogo atlogo-replace\"></div>\n                      </div>\n                    </div>\n                    <div class=\"team-logo-container af\" data-teamid=\"9\">\n                      <img src=\"../assets/images/logos/alfaromeo.png\" class=\"team-logo alfalogo-replace\">\n                    </div>\n                    <div class=\"team-logo-container as\" data-teamid=\"10\">\n                      <img src=\"../assets/images/logos/astonMartin.png\" class=\"team-logo astonlogo astonlogo-replace\">\n                    </div>\n                    <div class=\"team-logo-container ct\" data-teamid=\"32\">\n                      <img src=\"../assets/images/logos/placeholder.png\" class=\"team-logo custom-replace\">\n                    </div>\n                  </div>\n                </div>\n                <div class=\"mentality-difficulty\">\n                  <div class=\"mentality-changes\">\n                    <div class=\"only-mentality\">\n                      <div class=\"modal-subtitle bold-font\">Mentality <span class=\"option-state default\"\n                          id=\"mentalitySpan\">Unfrozen</span></div>\n                      <div class=\"modal-text\">\n                        Freezing the mentality means that all staff and driver's mentality will stay at neutral at all\n                        times.\n                      </div>\n                      <div class=\"mentality-selector\">\n                        <label class=\"form-check-label\">Normal</label>\n                        <div class=\"form-check form-switch freeze-mentality\">\n                          <input class=\"form-check-input custom-toggle\" type=\"checkbox\" role=\"switch\"\n                            id=\"freezeMentalityToggle\">\n                        </div>\n                        <label class=\"form-check-label\" style=\"margin-left: -10px;\">Frozen</label>\n                      </div>\n                    </div>\n                    <div class=\"only-refurbish\">\n                      <div class=\"modal-subtitle bold-font\" id=\"refurbishTitle\">Refurbish <span\n                          class=\"option-state default\" id=\"refurbishSpan\">Default</span></div>\n                      <div class=\"modal-text\">\n                        Enabling it fixes the AI not refurbishing their facilities, even in low conditions.\n                      </div>\n                      <div class=\"mentality-selector\">\n                        <label class=\"form-check-label\">Default</label>\n                        <div class=\"form-check form-switch freeze-mentality\">\n                          <input class=\"form-check-input custom-toggle\" type=\"checkbox\" role=\"switch\"\n                            id=\"refurbishingToggle\">\n                        </div>\n                        <label class=\"form-check-label\" style=\"margin-left: -10px;\">Active</label>\n                      </div>\n                    </div>\n                    <div class=\"only-development d-none\">\n                      <div class=\"modal-subtitle bold-font\">Car development <span class=\"option-state default\"\n                          id=\"developmentSpan\">Active</span></div>\n                      <div class=\"modal-text\">\n                        Freezing development prevents AI teams from progressing or starting new parts while your save is\n                        loaded.\n                      </div>\n                      <div class=\"mentality-selector\">\n                        <label class=\"form-check-label\">Active</label>\n                        <div class=\"form-check form-switch freeze-mentality\">\n                          <input class=\"form-check-input custom-toggle\" type=\"checkbox\" role=\"switch\"\n                            id=\"freezeDevelopmentToggle\">\n                        </div>\n                        <label class=\"form-check-label\" style=\"margin-left: -10px;\">Frozen</label>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"difficulty-changes\">\n                    <div class=\"difficulty-options\">\n                      <div class=\"one-difficulty\">\n                        <div class=\"dif-title\">\n                          <span class=\"dif-name bold-font\" id=\"lightDif\">Weight red.</span>\n                          <div class=\"avg-separator\"></div>\n                          <span class=\"dif-status\" data-value=\"0\">Disabled</span>\n                          <div class=\"dif-buttons\">\n                            <i class=\"bi bi-dash new-augment-button\"></i>\n                            <i class=\"bi bi-plus new-augment-button\"></i>\n                          </div>\n                        </div>\n                        <div class=\"dif-description modal-text\">\n                          The AI will design every part with less weight. With ULTRA, they will put the minimum weight\n                          possible.\n                        </div>\n                      </div>\n                      <div class=\"one-difficulty\">\n                        <div class=\"dif-title\">\n                          <span class=\"dif-name bold-font\" id=\"statDif\">Design boost</span>\n                          <div class=\"avg-separator\"></div>\n                          <span class=\"dif-status\" data-value=\"0\">Disabled</span>\n                          <div class=\"dif-buttons\">\n                            <i class=\"bi bi-dash new-augment-button\"></i>\n                            <i class=\"bi bi-plus new-augment-button\"></i>\n                          </div>\n                        </div>\n                        <div class=\"dif-description modal-text\">\n                          Gives the AI a boost in each stat when designing new parts. The higher the difficulty, the\n                          better the stats.\n                        </div>\n                      </div>\n                      <div class=\"one-difficulty\">\n                        <div class=\"dif-title\">\n                          <span class=\"dif-name bold-font\" id=\"researchDif\">Research boost</span>\n                          <div class=\"avg-separator\"></div>\n                          <span class=\"dif-status\" data-value=\"0\">Disabled</span>\n                          <div class=\"dif-buttons\">\n                            <i class=\"bi bi-dash new-augment-button\"></i>\n                            <i class=\"bi bi-plus new-augment-button\"></i>\n                          </div>\n                        </div>\n                        <div class=\"dif-description modal-text\">\n                          Gives the AI a boost on expertise when doing research. The higher the difficulty, the bigger\n                          the boost.\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n              </div>\n\n            </div>\n          </div>\n          <div id=\"patreonChanges\">\n            <div class=\"patreon-changes-text modal-text\">\n              <span>\n                Becoming a patreon supporter will not only support massively the development of the editor, but also\n                give\n                you access to\n                exclusive content and features. Please consider supporting the tool if you find it useful!\n              </span>\n              <span>\n                If you are already a patreon supporter, please log in with your account to unlock the exclusive features\n                and remove the pop-ups!\n              </span>\n            </div>\n            <div class=\"patreon-unlockables  d-none\">\n              <div class=\"patreon-themes\">\n                <span class=\"modal-subtitle bold-font\">Choose a theme</span>\n                <div class=\"themes-grid\">\n                  <div class=\"one-theme active\" id=\"defaultTheme\" data-theme=\"default-theme\">\n                    <div class=\"theme-title\">\n                      <span>Default</span>\n                      <i class=\"bi bi-check-lg\"></i>\n                    </div>\n                    <div class=\"theme-colors\">\n                      <div class=\"background-color\"></div>\n                      <div class=\"primary-color\"></div>\n                      <div class=\"secondary-color\"></div>\n                    </div>\n                  </div>\n                  <div class=\"one-theme\" id=\"lightTheme\" data-theme=\"light-theme\">\n                    <div class=\"theme-title\">\n                      <span>Light</span>\n                      <i class=\"bi bi-check-lg\"></i>\n                    </div>\n                    <div class=\"theme-colors\">\n                      <div class=\"background-color\"></div>\n                      <div class=\"primary-color\"></div>\n                      <div class=\"secondary-color\"></div>\n                    </div>\n                  </div>\n                  <div class=\"one-theme\" id=\"ogTheme\" data-theme=\"og-theme\">\n                    <div class=\"theme-title\">\n                      <span>OG</span>\n                      <i class=\"bi bi-check-lg\"></i>\n                    </div>\n                    <div class=\"theme-colors\">\n                      <div class=\"background-color\"></div>\n                      <div class=\"primary-color\"></div>\n                      <div class=\"secondary-color\"></div>\n                    </div>\n                  </div>\n                  <div class=\"one-theme\" id=\"vaporwaveTheme\" data-theme=\"vaporwave-theme\">\n                    <div class=\"theme-title\">\n                      <span>Vapor</span>\n                      <i class=\"bi bi-check-lg\"></i>\n                    </div>\n                    <div class=\"theme-colors\">\n                      <div class=\"background-color\"></div>\n                      <div class=\"primary-color\"></div>\n                      <div class=\"secondary-color\"></div>\n                    </div>\n                  </div>\n                  <div class=\"one-theme d-none nightly-only\" id=\"nightlyTheme\" data-theme=\"nightly-theme\">\n                    <div class=\"theme-title\">\n                      <span>Nightly</span>\n                      <i class=\"bi bi-check-lg\"></i>\n                    </div>\n                    <div class=\"theme-colors\">\n                      <div class=\"background-color\"></div>\n                      <div class=\"primary-color\"></div>\n                      <div class=\"secondary-color\"></div>\n                    </div>\n                  </div>\n                  <div class=\"one-theme\" id=\"ferrariTheme\" data-theme=\"ferrari-theme\">\n                    <div class=\"theme-title\">\n                      <span>Ferrari</span>\n                      <i class=\"bi bi-check-lg\"></i>\n                    </div>\n                    <div class=\"theme-colors\">\n                      <div class=\"background-color\"></div>\n                      <div class=\"primary-color\"></div>\n                      <div class=\"secondary-color\"></div>\n                    </div>\n                  </div>\n                  <div class=\"one-theme\" id=\"redbullTheme\" data-theme=\"redbull-theme\">\n                    <div class=\"theme-title\">\n                      <span>Red Bull</span>\n                      <i class=\"bi bi-check-lg\"></i>\n                    </div>\n                    <div class=\"theme-colors\">\n                      <div class=\"background-color\"></div>\n                      <div class=\"primary-color\"></div>\n                      <div class=\"secondary-color\"></div>\n                    </div>\n                  </div>\n                  <div class=\"one-theme\" id=\"mercedesTheme\" data-theme=\"mercedes-theme\">\n                    <div class=\"theme-title\">\n                      <span>Mercedes</span>\n                      <i class=\"bi bi-check-lg\"></i>\n                    </div>\n                    <div class=\"theme-colors\">\n                      <div class=\"background-color\"></div>\n                      <div class=\"primary-color\"></div>\n                      <div class=\"secondary-color\"></div>\n                    </div>\n                  </div>\n                  <div class=\"one-theme\" id=\"astonMartinTheme\" data-theme=\"astonmartin-theme\">\n                    <div class=\"theme-title\">\n                      <span>Aston</span>\n                      <i class=\"bi bi-check-lg\"></i>\n                    </div>\n                    <div class=\"theme-colors\">\n                      <div class=\"background-color\"></div>\n                      <div class=\"primary-color\"></div>\n                      <div class=\"secondary-color\"></div>\n                    </div>\n                  </div>\n                  <div class=\"one-theme\" id=\"mclarenTheme\" data-theme=\"mclaren-theme\">\n                    <div class=\"theme-title\">\n                      <span>McLaren</span>\n                      <i class=\"bi bi-check-lg\"></i>\n                    </div>\n                    <div class=\"theme-colors\">\n                      <div class=\"background-color\"></div>\n                      <div class=\"primary-color\"></div>\n                      <div class=\"secondary-color\"></div>\n                    </div>\n                  </div>\n                  <div class=\"one-theme\" id=\"audiTheme\" data-theme=\"audi-theme\">\n                    <div class=\"theme-title\">\n                      <span>Audi</span>\n                      <i class=\"bi bi-check-lg\"></i>\n                    </div>\n                    <div class=\"theme-colors\">\n                      <div class=\"background-color\"></div>\n                      <div class=\"primary-color\"></div>\n                      <div class=\"secondary-color\"></div>\n                    </div>\n                  </div>\n                  <div class=\"one-theme\" id=\"vcarbTheme\" data-theme=\"vcarb-theme\">\n                    <div class=\"theme-title\">\n                      <span>VCARB</span>\n                      <i class=\"bi bi-check-lg\"></i>\n                    </div>\n                    <div class=\"theme-colors\">\n                      <div class=\"background-color\"></div>\n                      <div class=\"primary-color\"></div>\n                      <div class=\"secondary-color\"></div>\n                    </div>\n                  </div>\n                  <div class=\"one-theme\" id=\"williamsTheme\" data-theme=\"williams-theme\">\n                    <div class=\"theme-title\">\n                      <span>Williams</span>\n                      <i class=\"bi bi-check-lg\"></i>\n                    </div>\n                    <div class=\"theme-colors\">\n                      <div class=\"background-color\"></div>\n                      <div class=\"primary-color\"></div>\n                      <div class=\"secondary-color\"></div>\n                    </div>\n                  </div>\n                  <div class=\"one-theme\" id=\"haasTheme\" data-theme=\"haas-theme\">\n                    <div class=\"theme-title\">\n                      <span>Haas</span>\n                      <i class=\"bi bi-check-lg\"></i>\n                    </div>\n                    <div class=\"theme-colors\">\n                      <div class=\"background-color\"></div>\n                      <div class=\"primary-color\"></div>\n                      <div class=\"secondary-color\"></div>\n                    </div>\n                  </div>\n                  <div class=\"one-theme\" id=\"alpineTheme\" data-theme=\"alpine-theme\">\n                    <div class=\"theme-title\">\n                      <span>Alpine</span>\n                      <i class=\"bi bi-check-lg\"></i>\n                    </div>\n                    <div class=\"theme-colors\">\n                      <div class=\"background-color\"></div>\n                      <div class=\"primary-color\"></div>\n                      <div class=\"secondary-color\"></div>\n                    </div>\n                  </div>\n\n                </div>\n              </div>\n              <div class=\"api-key-section\">\n                <span class=\"modal-subtitle bold-font\">API Limits</span>\n                <div class=\"modal-text\">\n                  The editor uses OpenAI's API for the news' articles generation. This service is not free, so to\n                  prevent super power users from abusing it, there is a daily limit of requests based on your Patreon\n                  tier.\n                </div>\n                <div class=\"limit-bar-and-text\" id=\"rateLimitContainer\">\n                  <div class=\"limit-bar\">\n                    <div class=\"limit-bar-fill\" id=\"limitBarFill\"></div>\n                  </div>\n                  <div class=\"limit-text\" id=\"limitText\">Plenty of requests available</div>\n                </div>\n\n              </div>\n            </div>\n\n\n          </div>\n\n        </div>\n        <div class=\"modal-footer custom-footer\">\n          <button type=\"button\" class=\"close-modal\" data-bs-dismiss=\"modal\" id=\"cancelDetailsButton\">Close</button>\n          <button type=\"button\" class=\"confirm-modal\" id=\"configDetailsButton\" data-bs-dismiss=\"modal\">Save</button>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"modal custom-modal fade\" id=\"standingsmodal\" data-bs-backdrop=\"static\" data-bs-keyboard=\"false\">\n    <div class=\"modal-dialog modal-dialog-centered\" role=\"document\">\n      <div class=\"modal-content custom-modal\">\n        <div class=\"modal-header custom-header\">\n          <h3 class=\"modal-title bold-font\">Standings info</h3>\n        </div>\n        <div class=\"modal-body custom-body\">\n          <div class=\"d-flex\" style=\"gap: 7px;\">\n            <div class=\"standings-list bold-font\">Bold</div> <span> - Pole poisiton in that race</span>\n          </div>\n          <div class=\"d-flex mt-2\" style=\"gap: 7px;\">\n            <div class=\"standings-list fastest\">Pos</div> <span> - Fastest lap that race</span>\n          </div>\n          <div class=\"d-flex mt-2\" style=\"gap: 7px;\">\n            <div class=\"standings-list\" style=\"background-color: #FDE06B; color: #18152e;\">&nbsp;</div> <span> - 1st\n              place that race (drivers)</span>\n          </div>\n          <div class=\"d-flex mt-2\" style=\"gap: 7px;\">\n            <div class=\"standings-list\" style=\"background-color: #AEB2B8; color: #18152e;\">&nbsp;</div> <span> - 2nd\n              place that race (drivers)</span>\n          </div>\n          <div class=\"d-flex mt-2\" style=\"gap: 7px;\">\n            <div class=\"standings-list\" style=\"background-color: #d7985a; color: #18152e;\">&nbsp;</div> <span> - 3rd\n              place that race (drivers)</span>\n          </div>\n          <div class=\"d-flex mt-2\" style=\"gap: 7px;\">\n            <div class=\"standings-list\" style=\"background-color: transparent; position: relative;\">\n              <div class=\"dotd\">Pos</div>\n            </div> <span> - Driver of the day</span>\n          </div>\n          <div class=\"d-flex mt-2\" style=\"gap: 7px;\">\n            <div class=\"standings-list\">DNF</div>\n            <div> - Did not finish that race</div>\n          </div>\n          <div class=\"d-flex mt-2\" style=\"gap: 7px;\">\n            <div class=\"standings-list\">( )</div>\n            <div> - Sprint result (F1 only)</div>\n          </div>\n          <div class=\"d-flex mt-2\" style=\"gap: 7px;\">\n            <div class=\"standings-list standings-list-engine bold-font\">NAME</div>\n            <div> - Engine supplier (teams)</div>\n          </div>\n        </div>\n        <div class=\"modal-footer custom-footer\">\n          <button type=\"button\" class=\"close-modal\" data-bs-dismiss=\"modal\">Close</button>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"modal custom-modal fade\" id=\"contractsModal\" data-bs-backdrop=\"static\" data-bs-keyboard=\"false\">\n    <div class=\"modal-dialog modal-dialog-centered\" role=\"document\">\n      <div class=\"modal-content custom-modal\">\n        <div class=\"modal-header custom-header\">\n          <h3 class=\"modal-title bold-font\">Contracts info</h3>\n        </div>\n        <div class=\"modal-body custom-body\">\n          <div class=\"d-flex mt-2\" style=\"gap: 7px;\">\n            <div><i class=\"bi bi-pencil-square\"></i></div> <span> - Click to edit driver's contract</span>\n          </div>\n          <div class=\"d-flex mt-2\" style=\"gap: 7px;\">\n            <div style=\"width: 173px;\">Auto contract</div> <span> - Will give the drivers contracts automatically based\n              on their rating</span>\n          </div>\n          <div class=\"mt-2\" style=\"gap: 7px;\">\n            You can enable filters in the driver list by <span class=\"important-text bold-font\">clicking </span> in the\n            <span><i class=\"bi bi-filter-circle\"></i></span></i> icon.\n          </div>\n        </div>\n        <div class=\"modal-footer custom-footer\">\n          <button type=\"button\" class=\"close-modal\" data-bs-dismiss=\"modal\">Close</button>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"modal custom-modal fade\" id=\"performancemodal\" data-bs-backdrop=\"static\" data-bs-keyboard=\"false\">\n    <div class=\"modal-dialog modal-dialog-centered\" role=\"document\">\n      <div class=\"modal-content custom-modal\">\n        <div class=\"modal-header custom-header\">\n          <h3 class=\"modal-title bold-font\">Performance info</h3>\n        </div>\n        <div class=\"modal-body custom-body\">\n          <div style=\"gap: 7px;\">\n            The performance shown in the graphs as well as in the bar chart is the <span\n              class=\"important-text bold-font\">LATEST DESIGNS's </span> car performance\n            from that team, which does <span class=\"important-text bold-font\">NOT </span>mean that the parts fitted in\n            the car are the last ones designed. Drops in performance will most likely be because of <span\n              class=\"important-text bold-font\"> WEIGHT</span>.\n            <br>\n            If you want to see the performance of <span class=\"important-text bold-font\">EVERY CAR</span> with exactly\n            their\n            <span class=\"important-text bold-font\">FITTED PARTS</span>, click on the <i class=\"bi bi-people-fill\"></i>\n            icon.\n          </div>\n          <div class=\"mt-2\" style=\"gap: 7px;\">\n            With the <span class=\"extra-hard bold-font\">lightweight parts</span> difficulty modifier enabled, you will\n            stop seeing drops in performance\n            and there will be less variability in the development of the cars.\n          </div>\n          <div class=\"mt-2\" style=\"gap: 7px;\">\n            The <span class=\"important-text bold-font\">OVERALL </span> stat is an approximation of the car's\n            performance, it can't be determined with 100% accuracy, and it's\n            calculated based on the other selectable car attributes.\n          </div>\n          <div class=\"mt-2\" style=\"gap: 7px;\">\n            Creating a custom engine will <span class=\"important-text bold-font\">NOT CREATE </span> a new one in-game,\n            it will just apply\n            the stats that you assign the custom engine to the engines that the teams who run the custom engine use.\n          </div>\n          <div class=\"mt-2\" style=\"gap: 7px;\">\n            Dashed vertical lines indicate engine performance upgrades, either manual or ADUO turning point upgrades.\n          </div>\n        </div>\n        <div class=\"modal-footer custom-footer\">\n          <button type=\"button\" class=\"close-modal\" data-bs-dismiss=\"modal\">Close</button>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"modal custom-modal fade\" id=\"forecastmodal\" data-bs-backdrop=\"static\" data-bs-keyboard=\"false\">\n    <div class=\"modal-dialog modal-dialog-centered\" role=\"document\">\n      <div class=\"modal-content custom-modal\">\n        <div class=\"modal-header custom-header\">\n          <h3 class=\"modal-title bold-font\">Forecast info</h3>\n        </div>\n        <div class=\"modal-body custom-body\">\n          <div style=\"gap: 7px;\">\n            <div>\n              The predictions are made with an AI model trained with the developer's own save file. You can check out\n              predictions\n              for previous races and for the next one in the <span class=\"important-text bold-font\">Race</span> tab.\n            </div>\n            <div class=\"mt-2\">\n              It is <span class=\"important-text bold-font\">NOT ADVISED</span> to predict the first 2/3 of the season, as\n              the model has to take the\n              data from those races to make predictions for the rest of the season.\n            </div>\n          </div>\n          <div class=\"mt-2\" style=\"gap: 7px;\">\n            In the <span class=\"important-text bold-font\">Standings</span> tab, you can configure a prediction for the\n            rest of the\n            season from the race you\n            select in the modal. Take into account that the sooner that race is in the season, the more races it will\n            have to simulate and it will take longer.\n            For example, it will take much longer if you predict from the 3rd race of the season than if you predict\n            only the last race of the season.\n            The model will run dozens of simulations of all the remaining races and calculate the amount of times a\n            driver has finished in every position.\n            The <span class=\"bold-font\" style=\"color: #5bd999;\">darker </span><span class=\"bold-font\"\n              style=\"color: #7adfac;\">the </span><span class=\"bold-font\" style=\"color: #a2dfc0;\">green </span><span\n              class=\"bold-font\" style=\"color: #c5e7d6;\">is</span>,\n            the more chances he has to finish in that position\n          </div>\n        </div>\n        <div class=\"modal-footer custom-footer\">\n          <button type=\"button\" class=\"close-modal\" data-bs-dismiss=\"modal\">Close</button>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"modal custom-modal fade\" id=\"comparisonmodal\" data-bs-backdrop=\"static\" data-bs-keyboard=\"false\">\n    <div class=\"modal-dialog modal-dialog-centered\" role=\"document\">\n      <div class=\"modal-content custom-modal\">\n        <div class=\"modal-header custom-header\">\n          <h3 class=\"modal-title bold-font\">Comparison info</h3>\n        </div>\n        <div class=\"modal-body custom-body\">\n          <div style=\"gap: 7px;\">\n            The <span class=\"bold-font\">Annotations </span>toggle will hide or show the lines marking <span\n              class=\"bold-font\" style=\"color: #FDE06B;\">P1, </span>\n            <span class=\"bold-font\" style=\"color: #AEB2B8;\">P2, </span> <span class=\"bold-font\"\n              style=\"color: #d7985a;\">P3 </span> and <span class=\"bold-font\">P10 </span> in the <span\n              class=\"important-text bold-font\">Race form </span> chart and\n            <span class=\"bold-font q-label\">Q2</span> and <span class=\"bold-font q-label\">Q3</span> lines in the <span\n              class=\"important-text bold-font\">Quali form </span> chart.\n          </div>\n          <div class=\"mt-2\" style=\"gap: 7px;\">\n            The <span class=\"important-text bold-font\">Points progression </span> graph has no <span\n              class=\"bold-font\">Annotations\n            </span>\n          </div>\n          <div class=\"mt-2\" style=\"gap: 7px;\">\n            When comparing teams, only the <span class=\"important-text bold-font\">Points progression </span> graph will\n            be available\n          </div>\n        </div>\n        <div class=\"modal-footer custom-footer\">\n          <button type=\"button\" class=\"close-modal\" data-bs-dismiss=\"modal\">Close</button>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"modal custom-modal fade\" id=\"teammodal\" data-bs-backdrop=\"static\" data-bs-keyboard=\"false\">\n    <div class=\"modal-dialog modal-dialog-centered\" role=\"document\">\n      <div class=\"modal-content custom-modal\">\n        <div class=\"modal-header custom-header\">\n          <h3 class=\"modal-title bold-font\">Team editor info</h3>\n        </div>\n        <div class=\"modal-body custom-body\">\n          <div style=\"gap: 7px;\">\n            The <span class=\"important-text bold-font\">Board confidence </span> is only editable for the player's team.\n          </div>\n        </div>\n        <div class=\"modal-footer custom-footer\">\n          <button type=\"button\" class=\"close-modal\" data-bs-dismiss=\"modal\">Close</button>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"modal custom-modal fade\" id=\"calendarmodal\" data-bs-backdrop=\"static\" data-bs-keyboard=\"false\">\n    <div class=\"modal-dialog modal-dialog-centered\" role=\"document\">\n      <div class=\"modal-content custom-modal\">\n        <div class=\"modal-header custom-header\">\n          <h3 class=\"modal-title bold-font\">Calendar info</h3>\n        </div>\n        <div class=\"modal-body custom-body\">\n          <div class=\"d-flex\" style=\"gap: 7px;\">\n            <div><i class=\"standings-list bi-sun\"></i></div> <span> - Sunny</span>\n          </div>\n          <div class=\"d-flex  mt-2\" style=\"gap: 7px;\">\n            <div><i class=\"standings-list bi bi-cloud-sun\"></i></div> <span> - Partially cloudy</span>\n          </div>\n          <div class=\"d-flex  mt-2\" style=\"gap: 7px;\">\n            <div><i class=\" standings-list bi bi-cloud\"></i></div> <span> - Cloudy</span>\n          </div>\n          <div class=\"d-flex  mt-2\" style=\"gap: 7px;\">\n            <div><i class=\"standings-list bi bi-cloud-drizzle\"></i></div> <span> - Light rain</span>\n          </div>\n          <div class=\"d-flex mt-2\" style=\"gap: 7px;\">\n            <div><i class=\"standings-list bi bi-cloud-rain\"></i></div> <span> - Rain</span>\n          </div>\n          <div class=\"d-flex mt-2\" style=\"gap: 7px;\">\n            <div><i class=\"standings-list bi bi-cloud-rain-heavy\"></i></div> <span> - Heavy Rain</span>\n          </div>\n          <div class=\"d-flex mt-2\" style=\"gap: 7px;\">\n            <div style=\"width: 105px;\">ATA Quali </div> <span> - Q1 will be on hards, Q2 on medium tyres and Q3 with\n              soft\n              tyres (only available in 23 game)</span>\n          </div>\n          <div class=\"d-flex mt-2\" style=\"gap: 7px;\">\n            Due to how the game works, it's only possible to set one of these 6 patterns, and it's not possible to edit\n            with more detail the forecast for the race.\n          </div>\n          <div class=\"d-flex mt-2\" style=\"gap: 7px;\">\n            On sprint weekends, the game will take the Qualifying forecast for the sprint race\n          </div>\n          <div class=\"mt-2\" style=\"gap: 7px;\">\n            You can edit the calendar whenever you want and how many times you want, however, <span\n              class=\"important-text bold-font\">during the season</span> it is <span\n              class=\"danger-text bold-font\">discouraged</span> to edit\n            the order or amount of races, do it at <span class=\"important-text bold-font\">your own risk</span>. Changing\n            weather\n            forecast during the season should be safe.\n          </div>\n        </div>\n        <div class=\"modal-footer custom-footer\">\n          <button type=\"button\" class=\"close-modal\" data-bs-dismiss=\"modal\">Close</button>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"modal custom-modal fade\" id=\"newsModal\" data-bs-keyboard=\"false\">\n    <div class=\"modal-dialog modal-dialog-lg modal-dialog-centered\" role=\"document\">\n      <div class=\"modal-content custom-modal\">\n        <div class=\"modal-header custom-header\">\n          <h3 class=\"modal-title bold-font\" id=\"newsModalTitle\">Example news</h3>\n          <div class=\"news-article-date\">\n            <i class=\"bi bi-calendar-event\"></i>\n            <span class=\"dateSpan\"></span>\n          </div>\n          <div class=\"news-options-global\">\n            <div class=\"news-options\">\n              <i class=\"bi bi-three-dots-vertical\"></i>\n            </div>\n            <div class=\"news-options-menu auto-closable\">\n              <div class=\"reload-article button-with-icon\" id=\"regenerateArticle\">\n                <i class=\"bi bi-arrow-clockwise\"></i>\n                <span class=\"\">Regenerate</span>\n              </div>\n              <div class=\"reload-article button-with-icon\" id=\"regenerateWithContext\">\n                <i class=\"bi bi-chat-text\"></i>\n                <span class=\"\">Regenerate with context</span>\n              </div>\n              <div class=\"news-options-context\" id=\"newsOptionsContext\" aria-hidden=\"true\">\n                <textarea class=\"news-options-context-textarea\" id=\"newsOptionsContextTextarea\"\n                  placeholder=\"Add extra context for the model...\"></textarea>\n                <div class=\"news-options-context-actions\">\n                  <button type=\"button\" class=\"close-modal\" id=\"newsOptionsContextCancel\">Cancel</button>\n                  <button type=\"button\" class=\"confirm-modal\" id=\"newsOptionsContextRegenerate\">Regenerate</button>\n                </div>\n              </div>\n              <div class=\"copy-article button-with-icon\" id=\"copyArticle\">\n                <i class=\"bi bi-copy\"></i>\n                <span class=\"\">Copy</span>\n              </div>\n              <div class=\"edit-article button-with-icon\" id=\"editArticle\">\n                <i class=\"bi bi-pencil-square\"></i>\n                <span class=\"\">Edit</span>\n              </div>\n              <div class=\"edit-article button-with-icon close-modal\" id=\"deleteArticle\">\n                <i class=\"bi bi-trash\"></i>\n                <span class=\"\">Delete</span>\n              </div>\n            </div>\n          </div>\n          <img src=\"\" alt=\"\" class=\"news-image-background\">\n        </div>\n        <div class=\"modal-body custom-body\" id=\"newsModalBody\">\n          <div class=\"news-article\">\n\n          </div>\n        </div>\n        <div class=\"modal-footer custom-footer\">\n          <div class=\"d-flex\">\n            <button type=\"button\" class=\"close-modal\" data-bs-dismiss=\"modal\" id=\"closeNewsArticle\">Close</button>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"modal custom-modal fade\" id=\"customNewsModal\" data-bs-keyboard=\"false\">\n    <div class=\"modal-dialog modal-lg modal-dialog-centered\" role=\"document\">\n      <div class=\"modal-content custom-modal\">\n        <div class=\"modal-header custom-header\">\n          <h4 class=\"modal-title bold-font\" id=\"customNewsModalTitle\">Create custom news</h4>\n        </div>\n        <div class=\"modal-body custom-body\">\n            <div id=\"customNewsForm\">\n              <div class=\"custom-news-row\">\n                <div class=\"custom-news-stack\" data-span=\"6\">\n                  <span class=\"custom-news-label bold-font\">Type</span>\n                  <div class=\"dropdown-global\">\n                    <button type=\"button\" class=\"redesigned-dropdown bold-font\" id=\"customNewsTypeButton\" aria-haspopup=\"true\"\n                      aria-expanded=\"false\" data-value=\"\">\n                      <span class=\"dropdown-label\">Select type</span>\n                      <i class=\"redesigned-chevron\"></i>\n                    </button>\n                    <ul class=\"redesigned-dropdown-menu\" id=\"customNewsTypeMenu\" style=\"font-family: Formula1;\">\n                    </ul>\n                  </div>\n                </div>\n                <div class=\"custom-news-stack\" data-span=\"6\">\n                  <span class=\"custom-news-label bold-font\">Date</span>\n                  <input type=\"date\" class=\"custom-news-input\" id=\"customNewsDateInput\">\n                </div>\n              </div>\n              <div class=\"custom-news-row\">\n                <div class=\"custom-news-stack\" data-span=\"12\">\n                  <span class=\"custom-news-label bold-font\">Title</span>\n                  <div class=\"dropdown-global\" id=\"customNewsTemplateWrap\">\n                    <button type=\"button\" class=\"redesigned-dropdown bold-font\" id=\"customNewsTemplateButton\" aria-haspopup=\"true\"\n                      aria-expanded=\"false\" data-value=\"\">\n                      <span class=\"dropdown-label\">Automatic / default title</span>\n                      <i class=\"redesigned-chevron\"></i>\n                    </button>\n                    <ul class=\"redesigned-dropdown-menu\" id=\"customNewsTemplateMenu\" style=\"font-family: Formula1;\">\n                    </ul>\n                  </div>\n                  <input type=\"text\" class=\"custom-news-input custom-news-hidden custom-news-title-input\" id=\"customNewsTitleInput\" placeholder=\"Write the article title\">\n                </div>\n              </div>\n              <div class=\"custom-news-params custom-news-params-top\" id=\"customNewsParams\"></div>\n              <div class=\"custom-news-error custom-news-hidden\" id=\"customNewsError\"></div>\n            </div>\n        </div>\n        <div class=\"modal-footer custom-footer\">\n          <button type=\"button\" class=\"close-modal\" data-bs-dismiss=\"modal\" id=\"customNewsCancel\">Cancel</button>\n          <button type=\"button\" class=\"confirm-modal\" id=\"customNewsCreateBtn\">Create</button>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"modal custom-modal fade\" id=\"confirmModal\" data-bs-backdrop=\"static\" data-bs-keyboard=\"false\">\n    <div class=\"modal-dialog modal-dialog-sm modal-dialog-centered\" role=\"document\">\n      <div class=\"modal-content custom-modal\">\n        <div class=\"modal-header custom-header\">\n          <h3 class=\"modal-title bold-font\" id=\"confirmModalTitle\">Confirm Action</h3>\n        </div>\n        <div class=\"modal-body custom-body\" id=\"confirmModalBody\">\n          <p>Are you sure you want to proceed with this action?</p>\n        </div>\n        <div class=\"modal-footer custom-footer\">\n          <div class=\"d-flex\">\n            <button type=\"button\" class=\"close-modal\" data-bs-dismiss=\"modal\">Close</button>\n            <button type=\"button\" class=\"confirm-modal\" id=\"confirmActionButton\">Confirm</button>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"modal custom-modal fade\" id=\"newsContextModal\" data-bs-backdrop=\"static\" data-bs-keyboard=\"false\">\n    <div class=\"modal-dialog modal-dialog-sm modal-dialog-centered\" role=\"document\">\n      <div class=\"modal-content custom-modal\">\n        <div class=\"modal-header custom-header\">\n          <h3 class=\"modal-title bold-font\">Add context for this article</h3>\n        </div>\n        <div class=\"modal-body custom-body\">\n          <textarea class=\"news-context-textarea\" placeholder=\"Add extra context for the model...\"></textarea>\n        </div>\n        <div class=\"modal-footer custom-footer\">\n          <div class=\"d-flex\">\n            <button type=\"button\" class=\"close-modal context-cancel\" data-bs-dismiss=\"modal\">Cancel</button>\n            <button type=\"button\" class=\"confirm-modal context-confirm\">Read</button>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"modal custom-modal fade\" id=\"compDataModal\" data-bs-backdrop=\"static\" data-bs-keyboard=\"false\">\n    <div class=\"modal-dialog modal-dialog-lg modal-dialog-centered\" role=\"document\">\n      <div class=\"modal-content custom-modal\">\n        <div class=\"modal-header custom-header\">\n          <h3 class=\"modal-title bold-font\">Comparison data selection</h3>\n        </div>\n        <div class=\"modal-body custom-body\">\n          <div class=\"info-modal-section\">\n            <div class=\"modal-buttons\">\n              <div>\n                <div class=\"dropdown-global\">\n                  <button class=\"redesigned-dropdown bold-font\" id=\"yearButtonH2H\">\n                    <span class=\"dropdown-label\">Year</span>\n                    <i class=\"redesigned-chevron\"></i>\n                  </button>\n                  <ul class=\"redesigned-dropdown-menu\" id=\"yearMenuH2H\" style=\"font-family: Formula1;\">\n                  </ul>\n                </div>\n              </div>\n              <div class=\"drivers-teams-pills\">\n                <ul class=\"nav nav-pills\">\n                  <li class=\"nav-item\">\n                    <a class=\"nav-link bold-font generalPills active\" data-bs-toggle=\"pill\" id=\"driverspillmodal\">\n                      <div class=\"basic-label bold-font\">Drivers</div>\n                      <div class=\"pill-line\"></div>\n                    </a>\n                  </li>\n                  <li class=\"nav-item\">\n                    <a class=\"nav-link bold-font generalPills\" data-bs-toggle=\"pill\" id=\"teamspillmodal\">\n                      <div class=\"basic-label bold-font\">Teams</div>\n                      <div class=\"pill-line\"></div>\n                    </a>\n                  </li>\n                </ul>\n              </div>\n\n            </div>\n            <div class=\"texts-and-clear\">\n              <div class=\"fit-button\" id=\"clearAll\">Clear all</div>\n              <div class=\"info-texts\">\n                <div class=\"H2H-text\">\n                  <span class=\"bold-font text-main\">H2H </span><span class=\"text-normal\">- 0/2 drivers selected</span>\n                </div>\n                <div class=\"graph-text\">\n                  <span class=\"bold-font text-main\">Graph </span><span class=\"text-normal\">- 0 drivers selected</span>\n                </div>\n              </div>\n            </div>\n\n          </div>\n\n          <div class=\"drivers-modal-section\">\n            <div class=\"drivers-modal-title component-subtitle bold-font mt-3\">Select drivers</div>\n            <div class=\"drivers-modal-zone mt-2\"></div>\n          </div>\n          <div class=\"teams-modal-section d-none\">\n            <div class=\"drivers-modal-title component-subtitle bold-font mt-3\">Select teams</div>\n            <div class=\"teams-modal-zone mt-2\">\n              <div class=\"col modal-team fe-transparent d-none\" data-teamid=\"1\">\n                <div class=\"logo-and-name\">\n                  <img src=\"../assets/images/logos/ferrari.png\" class=\"ferrarilogo front-gradient logo-margin-top\">\n                  <div class=\"team-name bold-font front-gradient\">FERRARI</div>\n                </div>\n                <div class=\"buttons-drivers-modal\">\n                  <div data-teamid=\"1\" class=\"H2Hradio\" data-state=\"unchecked\">H2H</div>\n                  <div data-teamid=\"1\" class=\"GraphButton\" data-state=\"unchecked\"><i class=\"bi bi-graph-up\"></i></div>\n                </div>\n              </div>\n              <div class=\"col modal-team mc-transparent d-none\" data-teamid=\"2\">\n                <div class=\"logo-and-name\">\n                  <div class=\"mclarenlogo front-gradient logo-margin-top\"></div>\n                  <div class=\"team-name bold-font front-gradient\">MCLAREN</div>\n                </div>\n                <div class=\"buttons-drivers-modal\">\n                  <div data-teamid=\"2\" class=\"H2Hradio\" data-state=\"unchecked\">H2H</div>\n                  <div data-teamid=\"2\" class=\"GraphButton\" data-state=\"unchecked\"><i class=\"bi bi-graph-up\"></i></div>\n                </div>\n              </div>\n              <div class=\"col modal-team rb-transparent d-none\" data-teamid=\"3\">\n                <div class=\"logo-and-name\">\n                  <img src=\"../assets/images/logos/redbull.png\"\n                    class=\"redbulllogo redbulllogo-replace front-gradient logo-margin-top\">\n                  <div class=\"team-name bold-font front-gradient redbull-name\">RED BULL</div>\n                </div>\n                <div class=\"buttons-drivers-modal\">\n                  <div data-teamid=\"3\" class=\"H2Hradio\" data-state=\"unchecked\">H2H</div>\n                  <div data-teamid=\"3\" class=\"GraphButton\" data-state=\"unchecked\"><i class=\"bi bi-graph-up\"></i></div>\n                </div>\n              </div>\n              <div class=\"col modal-team me-transparent d-none\" data-teamid=\"4\">\n                <div class=\"logo-and-name\">\n                  <img src=\"../assets/images/logos/mercedes.png\" class=\"merclogo2 front-gradient\">\n                  <div class=\"team-name bold-font front-gradient\">MERCEDES</div>\n                </div>\n                <div class=\"buttons-drivers-modal\">\n                  <div data-teamid=\"4\" class=\"H2Hradio\" data-state=\"unchecked\">H2H</div>\n                  <div data-teamid=\"4\" class=\"GraphButton\" data-state=\"unchecked\"><i class=\"bi bi-graph-up\"></i></div>\n                </div>\n              </div>\n              <div class=\"col modal-team al-transparent d-none\" data-teamid=\"5\">\n                <div class=\"logo-and-name\">\n                  <div class=\"alpine-logo-container\">\n                    <div class=\"alpinelogo-replace alpinelogo front-gradient\"></div>\n                  </div>\n                  <div class=\"team-name bold-font front-gradient alpine-name\">ALPINE</div>\n                </div>\n                <div class=\"buttons-drivers-modal\">\n                  <div data-teamid=\"5\" class=\"H2Hradio\" data-state=\"unchecked\">H2H</div>\n                  <div data-teamid=\"5\" class=\"GraphButton\" data-state=\"unchecked\"><i class=\"bi bi-graph-up\"></i></div>\n                </div>\n              </div>\n              <div class=\"col modal-team wi-transparent d-none\" data-teamid=\"6\">\n                <div class=\"logo-and-name\">\n                  <div class=\"williamslogo williamslogo-replace front-gradient logo-margin-top\"></div>\n                  <div class=\"team-name bold-font front-gradient williams-name\">WILLIAMS</div>\n                </div>\n                <div class=\"buttons-drivers-modal\">\n                  <div data-teamid=\"6\" class=\"H2Hradio\" data-state=\"unchecked\">H2H</div>\n                  <div data-teamid=\"6\" class=\"GraphButton\" data-state=\"unchecked\"><i class=\"bi bi-graph-up\"></i></div>\n                </div>\n              </div>\n              <div class=\"col modal-team ha-transparent d-none\" data-teamid=\"7\">\n                <div class=\"logo-and-name\">\n                  <img src=\"../assets/images/logos/haas.png\"\n                    class=\"haaslogo haaslogo-replace front-gradient logo-margin-top\">\n                  <div class=\"team-name bold-font front-gradient haas-name\">HAAS</div>\n                </div>\n                <div class=\"buttons-drivers-modal\">\n                  <div data-teamid=\"7\" class=\"H2Hradio\" data-state=\"unchecked\">H2H</div>\n                  <div data-teamid=\"7\" class=\"GraphButton\" data-state=\"unchecked\"><i class=\"bi bi-graph-up\"></i></div>\n                </div>\n              </div>\n              <div class=\"col modal-team at-transparent d-none\" data-teamid=\"8\">\n                <div class=\"logo-and-name\">\n                  <div class=\"alphatauri-logo-container\">\n                    <div class=\"atlogo-replace alphataurilogo front-gradient\"></div>\n                  </div>\n                  <div class=\"team-name bold-font front-gradient at-name\">ALPHA TAURI</div>\n                </div>\n                <div class=\"buttons-drivers-modal\">\n                  <div data-teamid=\"8\" class=\"H2Hradio\" data-state=\"unchecked\">H2H</div>\n                  <div data-teamid=\"8\" class=\"GraphButton\" data-state=\"unchecked\"><i class=\"bi bi-graph-up\"></i></div>\n                </div>\n              </div>\n              <div class=\"col modal-team af-transparent d-none\" data-teamid=\"9\">\n                <div class=\"logo-and-name\">\n                  <img src=\"../assets/images/logos/alfaromeo.png\"\n                    class=\"alfalogo alfalogo-replace front-gradient logo-margin-top\">\n                  <div class=\"team-name bold-font front-gradient alfa-name\">ALFA ROMEO</div>\n                </div>\n                <div class=\"buttons-drivers-modal\">\n                  <div data-teamid=\"9\" class=\"H2Hradio\" data-state=\"unchecked\">H2H</div>\n                  <div data-teamid=\"9\" class=\"GraphButton\" data-state=\"unchecked\"><i class=\"bi bi-graph-up\"></i></div>\n                </div>\n              </div>\n              <div class=\"col modal-team as-transparent d-none\" data-teamid=\"10\">\n                <div class=\"logo-and-name\">\n                  <img src=\"../assets/images/logos/astonMartin.png\" class=\"astonlogo astonlogo-replace front-gradient\">\n                  <div class=\"team-name bold-font ps-1 front-gradient aston-name\">ASTON MARTIN</div>\n                </div>\n                <div class=\"buttons-drivers-modal\">\n                  <div data-teamid=\"10\" class=\"H2Hradio\" data-state=\"unchecked\">H2H</div>\n                  <div data-teamid=\"10\" class=\"GraphButton\" data-state=\"unchecked\"><i class=\"bi bi-graph-up\"></i>\n                  </div>\n                </div>\n              </div>\n              <div class=\"col modal-team ct-transparent d-none\" data-teamid=\"32\" id=\"customTeamComparison\">\n                <div class=\"logo-and-name\">\n                  <img src=\"../assets/images/logos/placeholder.png\"\n                    class=\"customlogo front-gradient logo-margin-top custom-replace\">\n                  <div class=\"team-name bold-font ps-1 front-gradient ct-replace\">CUSTOM TEAM</div>\n                </div>\n                <div class=\"buttons-drivers-modal\">\n                  <div data-teamid=\"32\" class=\"H2Hradio\" data-state=\"unchecked\">H2H</div>\n                  <div data-teamid=\"32\" class=\"GraphButton\" data-state=\"unchecked\"><i class=\"bi bi-graph-up\"></i>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"modal-footer custom-footer\">\n          <button type=\"button\" class=\"close-modal\" data-bs-dismiss=\"modal\">Close</button>\n          <button type=\"button\" class=\"confirm-modal\" id=\"confirmComparison\" data-bs-dismiss=\"modal\">Confirm</button>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"notification-panel pe-3 pt-3\" id=\"notificationPanel\">\n  </div>\n  <input type=\"text\" class=\"dev-console d-none\"></input>\n  <div class=\"tools-panel\">\n    <div class=\"toolbar-logo-and-title\">\n      <img src=\"../assets/images/logoVector.svg\" class=\"toolbar-logo\">\n      <div class=\"toolbar-title\">\n        <span class=\"bold-font\">DB</span>\n        <span class=\"bold-font\">EDITOR</span>\n      </div>\n    </div>\n    <div class=\"gear-container my-2\">\n      <i class=\"bi bi-gear-fill\" id=\"settingsIcon\"></i>\n      <label class=\"bold-font standard-label\">SETTINGS</label>\n      <div class=\"standard-line\"></div>\n    </div>\n    <div class=\"script-selector hidden bold-font\">\n      <div class=\"py-2\">\n        <ul class=\"nav nav-pills\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link bold-font scriptPills\" data-bs-toggle=\"pill\" id=\"newspill\">\n              <i class=\"bi bi bi-newspaper pill-icon\"></i>\n              <label class=\"bold-font pill-label\">NEWS</label>\n              <div class=\"pill-line\"></div>\n            </a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link bold-font scriptPills\" data-bs-toggle=\"pill\" id=\"h2hpill\">\n              <i class=\"bi bi-bar-chart-fill pill-icon\"></i>\n              <label class=\"bold-font pill-label\">COMPARISON</label>\n              <div class=\"pill-line\"></div>\n            </a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link bold-font scriptPills\" data-bs-toggle=\"pill\" id=\"viewerpill\">\n              <i class=\"bi bi-trophy pill-icon\"></i>\n              <label class=\"bold-font pill-label\">RECORDS</label>\n              <div class=\"pill-line\"></div>\n            </a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link bold-font scriptPills\" data-bs-toggle=\"pill\" id=\"transferpill\">\n              <i class=\"bi bi-currency-dollar pill-icon\"></i>\n              <label class=\"bold-font pill-label\">CONTRACTS</label>\n              <div class=\"pill-line\"></div>\n            </a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link bold-font scriptPills\" data-bs-toggle=\"pill\" id=\"statspill\">\n              <i class=\"bi bi-person-vcard pill-icon\"></i>\n              <label class=\"bold-font pill-label\">ATTRIBUTES</label>\n              <div class=\"pill-line\"></div>\n            </a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link bold-font scriptPills\" data-bs-toggle=\"pill\" id=\"constructorspill\">\n              <i class=\"bi bi-microsoft-teams pill-icon\"></i>\n              <label class=\"bold-font pill-label\">TEAMS</label>\n              <div class=\"pill-line\"></div>\n            </a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link bold-font scriptPills\" data-bs-toggle=\"pill\" id=\"calendarpill\">\n              <i class=\"bi bi-calendar3 pill-icon\"></i>\n              <label class=\"bold-font pill-label\">CALENDAR</label>\n              <div class=\"pill-line\"></div>\n            </a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link bold-font scriptPills\" data-bs-toggle=\"pill\" id=\"regulationspill\">\n              <i class=\"bi bi-journal-bookmark-fill pill-icon\"></i>\n              <label class=\"bold-font pill-label\">REGULATIONS</label>\n              <div class=\"pill-line\"></div>\n            </a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link bold-font scriptPills\" data-bs-toggle=\"pill\" id=\"carpill\">\n              <div id=\"specialCarIcon\" class=\"pill-icon\"></div>\n              <label class=\"bold-font pill-label\">PERFORMANCE</label>\n              <div class=\"pill-line\"></div>\n            </a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link bold-font scriptPills\" data-bs-toggle=\"pill\" id=\"modpill\">\n              <i class=\"bi bi-layers-half pill-icon\"></i>\n              <label class=\"bold-font pill-label\">MODS</label>\n              <div class=\"pill-line\"></div>\n            </a>\n          </li>\n          <li class=\"download-save-controls\">\n            <div class=\"download-save-button hidden\">\n              <i class=\"bi bi-file-earmark-arrow-down\"></i>\n            </div>\n            <div id=\"downloadSaveProgress\" class=\"download-save-progress ai-progress-bar hidden\" aria-hidden=\"true\">\n              <div id=\"downloadSaveProgressFill\" class=\"progress-div\"></div>\n            </div>\n          </li>\n\n        </ul>\n\n      </div>\n\n    </div>\n    <div class=\"patreon-login\">\n      <div type=\"button\" class=\"patreon-login-button button-with-icon\" id=\"patreonToolLoginButton\">\n        <span>Login with Patreon</span>\n      </div>\n      <div class=\"user-name-and-logout-tool d-none\">\n        <div class=\"button-with-icon\" id=\"userToolButton\">\n          <i class=\"bi bi-person-fill\"></i>\n          <span id=\"userToolName\"></span>\n        </div>\n        <div class=\"userToolMenu hidden auto-closable\">\n          <div class=\"button-with-icon\" id=\"patreonStatus\">\n            <i class=\"bi-custom-patreon\"></i>\n            <span id=\"patreonStatusText\">Patreon Supporter</span>\n          </div>\n          <div class=\"button-with-icon\" id=\"patreonLogoutButton\">\n            <i class=\"bi bi-box-arrow-right\"></i>\n            <span>Logout</span>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"scroll-wrapper\">\n    <button class=\"save-button bold-font d-none\">\n      <i class=\"bi bi-floppy-fill\"></i>\n      <label class=\"save-label\">Save changes</label>\n    </button>\n    <div class=\"main-panel\">\n      <div class=\"blocking-div drop-div\" id=\"blockDiv\">\n        <div class=\"hero-section\">\n          <span class=\"badge-version\" data-bs-toggle=\"modal\" data-bs-target=\"#patchModal\">\n            version 3.4.0-dev\n          </span>\n          <h1 class=\"hero-title\">\n            DB Editor Online<br>\n            <span class=\"gradient-text\">F1 Manager</span>\n          </h1>\n          <div class=\"hero-desc\">\n            <div class=\"fake-text-and-animated-container\">\n              <span id=\"animatedText\">Edit your F1 Manager save files directly in your browser.</span>\n              <span class=\"fake-text\">Edit your F1 Manager save files directly in your browser.</span>\n            </div>\n          </div>\n        </div>\n        <div id=\"dropDiv\" class=\"drop-zone\">\n          <div id=\"idle-state\" class=\"idle-content\">\n            <div class=\"icon-circle\" id=\"statusCircle\">\n              <i class=\"bi bi-cloud-arrow-up\" id=\"statusIcon\"></i>\n              <div class=\"loading-spinner\"></div>\n            </div>\n            <h3 id=\"statusTitle\">Upload your save file</h3>\n            <p class=\"upload-desc\" id=\"statusDesc\">\n              Drop your .sav file here or\n              <input type=\"button\" value=\"click\" style=\"display: inline-block;\" class=\"save-file-button\"\n                id=\"saveFileButton\">\n              <input class=\"d-none\" type=\"file\" id=\"saveFileInput\" accept=\".sav\">\n              to select it manually.\n            </p>\n            <div class=\"tags-container\">\n              <!-- <span class=\"tag\">MAX 50MB</span>\n                        <span class=\"tag\">ENCRIPTADO AES-256</span> -->\n            </div>\n            <div class=\"recents-container\">\n              <span class=\"recent-label\">Recent</span>\n              <div class=\"recents-list\" id=\"recentsList\"></div>\n            </div>\n            <div class=\"socials-container\">\n              <a class=\"bi bi-github\" href=\"https://github.com/IUrreta/DatabaseEditor\" target=\"_blank\">&nbsp;DB\n                Editor</a>\n              <a class=\"bi bi-linkedin\" href=\"https://www.linkedin.com/in/ignacio-urretavizcaya-tato-2345a4259\"\n                target=\"_blank\">&nbsp;My\n                profile</a>\n              <a class=\"bi bi-twitter-x\" href=\"https://twitter.com/ignaciourreta_\"\n                target=\"_blank\">&nbsp;@ignaciourreta_</a>\n              <a class=\"bi bi-reddit\" href=\"https://www.reddit.com/user/ignaciourreta\"\n                target=\"_blank\">&nbsp;ignaciourreta</a>\n              <a class=\"bi-custom-patreon\" href=\"https://www.patreon.com/f1dbeditor\" target=\"_blank\">&nbsp;Support the\n                project</a>\n              <a class=\"bi bi-discord\" href=\"https://discord.gg/3QXg3hsD8B\" target=\"_blank\">&nbsp;Join our Discord</a>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class=\"script-view hide unloaded\" id=\"news\">\n        <div class=\"general-top-panel\">\n          <div class=\"title-buttons-left\">\n            <div class=\"dropdown-global\">\n              <button class=\"redesigned-dropdown bold-font\" id=\"newsTypeButton\" aria-haspopup=\"true\"\n                aria-expanded=\"false\">\n                <span class=\"dropdown-label\">Filter</span>\n                <i class=\"redesigned-chevron\"></i>\n              </button>\n              <ul class=\"redesigned-dropdown-menu\" id=\"newsTypeMenu\" style=\"font-family: Formula1;\">\n                <a class=\"redesigned-dropdown-item \" data-value=\"race_result\">Race results <i\n                    class=\"bi bi-check\"></i></a>\n                <a class=\"redesigned-dropdown-item\" data-value=\"quali_result\">Qualifying results <i\n                    class=\"bi bi-check\"></i></a>\n                <a class=\"redesigned-dropdown-item\" data-value=\"driver_transfers\">Driver transfers <i\n                    class=\"bi bi-check\"></i></a>\n                <a class=\"redesigned-dropdown-item\" data-value=\"others\">Other news <i class=\"bi bi-check\"></i></a>\n                <a class=\"redesigned-dropdown-item\" data-value=\"turning_points\">Turning points <i\n                    class=\"bi bi-check\"></i></a>\n              </ul>\n            </div>\n            <div class=\"dropdown-global\">\n              <button class=\"redesigned-dropdown bold-font\" id=\"newsSeasonButton\" aria-haspopup=\"true\"\n                aria-expanded=\"false\">\n                <span class=\"dropdown-label\">Season</span>\n                <i class=\"redesigned-chevron\"></i>\n              </button>\n              <ul class=\"redesigned-dropdown-menu\" id=\"newsSeasonMenu\" style=\"font-family: Formula1;\">\n              </ul>\n            </div>\n            <div class=\"dropdown-global\">\n              <button class=\"redesigned-dropdown bold-font\" id=\"newsLanguageButton\" aria-haspopup=\"true\"\n                aria-expanded=\"false\">\n                <span class=\"dropdown-label\">Language</span>\n                <i class=\"redesigned-chevron\"></i>\n              </button>\n              <ul class=\"redesigned-dropdown-menu\" id=\"newsLanguageMenu\" style=\"font-family: Formula1;\">\n              </ul>\n            </div>\n          </div>\n          <div class=\"title transfer-title bold-font\">\n            Latest news\n          </div>\n          <div class=\"title-buttons-right\">\n            <div class=\"button-with-icon\" id=\"createCustomNews\">\n              <i class=\"bi bi-plus-circle\"></i>\n              <span class=\"\">Create news</span>\n            </div>\n            <div class=\"button-with-icon\" id=\"reloadNews\">\n              <i class=\"bi bi-arrow-clockwise\"></i>\n              <span class=\"\">Regenerate news</span>\n            </div>\n          </div>\n        </div>\n\n        <div class=\"news-grid\">\n\n        </div>\n      </div>\n      <div class=\"script-view hide unloaded\" id=\"head2head_viewer\">\n        <div class=\"general-top-panel\">\n          <div class=\"title-buttons-left\">\n            <div class=\"button-with-icon\" id=\"compDataButton\" data-bs-toggle=\"modal\" data-bs-target=\"#compDataModal\">\n              Data</div>\n            <div class=\"config-content bold-font\" id=\"compConfigContent\"></div>\n          </div>\n          <div class=\"title-buttons-right\">\n            <div class=\"form-check annotations form-switch\">\n              <input class=\"form-check-input custom-toggle\" type=\"checkbox\" role=\"switch\" id=\"annotationsToggle\"\n                checked>\n              <label class=\"form-check-label\" for=\"flexSwitchCheckDefault\">Annotations</label>\n            </div>\n            <div class=\"dropdown-global\">\n              <button class=\"redesigned-dropdown bold-font\" id=\"graphTypeButton\">\n                <span class=\"dropdown-label\">Graph type</span>\n                <i class=\"redesigned-chevron\"></i>\n              </button>\n              <ul class=\"redesigned-dropdown-menu\" id=\"graphTypeDropdown\" style=\"font-family: Formula1;\">\n                <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" id=\"raceForm\">Race form</a>\n                <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" id=\"qualiForm\">Qualifying form</a>\n                <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" id=\"pointsProgression\">Points\n                  progression</a>\n                <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" id=\"gapToWinner\">Gap to winner</a>\n                <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" id=\"gapToPole\">Gap to pole</a>\n              </ul>\n            </div>\n          </div>\n          <div class=\"title bold-font\">\n            Comparison\n            <i class=\"info-titles bold-font\" id=\"comparisoninfo\" data-bs-toggle=\"modal\"\n              data-bs-target=\"#comparisonmodal\">?</i>\n          </div>\n        </div>\n        <div class=\"d-flex d-none\" id=\"mainH2h\">\n          <div class=\"col-3 main-viewer-section\">\n            <div class=\"blocking-h2h\">Select at leat 2 drivers for H2H!</div>\n            <div class=\"driver-names\">\n              <div class=\"driver1-name\">\n                <div class=\"driver1-first\">&nbsp;</div>\n                <div class=\"driver1-second bold-font\">&nbsp;</div>\n                <div class=\"team1 bold-font d-none\">&nbsp;</div>\n              </div>\n              <div class=\"driver2-name\">\n                <div class=\"driver2-first\">&nbsp;</div>\n                <div class=\"driver2-second bold-font\">&nbsp;</div>\n                <div class=\"team2 bold-font d-none\">&nbsp;</div>\n              </div>\n            </div>\n            <div class=\"one-statH2H\" id=\"raceh2h\">\n              <div class=\"name-H2H bold-font\" style=\"justify-content: space-between;\">\n                <i class=\"bi bi-chevron-left new-augment-button transparent\"></i>\n                <div class=\"only-name\">RACE</div>\n                <i class=\"bi bi-chevron-right new-augment-button transparent\"></i>\n              </div>\n              <div class=\"bar-space\">\n                <div class=\"driver1-number bold-font\" style=\"justify-content: space-between;\"></div>\n                <div class=\"custom-H2H\" data-driver1=\"0\" data-driver2=\"0\">\n                  <div class=\"driver1-space\">\n                    <div class=\"driver1-bar\"></div>\n                  </div>\n                  <div class=\"driver2-space\">\n                    <div class=\"driver2-bar\"></div>\n                  </div>\n                </div>\n                <div class=\"driver2-number bold-font\"></div>\n              </div>\n              <div class=\"avg-comparison d-none\">\n                <div class=\"driver1-avg bold-font\"></div>\n                <div class=\"avg-separator\"></div>\n                <div class=\"driver2-avg bold-font\"></div>\n              </div>\n            </div>\n            <div class=\"one-statH2H\" id=\"qualih2h\">\n              <div class=\"name-H2H bold-font\">\n                <i class=\"bi bi-chevron-left new-augment-button transparent\"></i>\n                <div class=\"only-name\">QUALIFYING</div>\n                <i class=\"bi bi-chevron-right new-augment-button transparent\"></i>\n              </div>\n              <div class=\"bar-space\">\n                <div class=\"driver1-number bold-font\"></div>\n                <div class=\"custom-H2H\" data-driver1=\"0\" data-driver2=\"0\">\n                  <div class=\"driver1-space\">\n                    <div class=\"driver1-bar\"></div>\n                  </div>\n                  <div class=\"driver2-space\">\n                    <div class=\"driver2-bar\"></div>\n                  </div>\n                </div>\n                <div class=\"driver2-number bold-font\"></div>\n              </div>\n              <div class=\"avg-comparison d-none\">\n                <div class=\"driver1-avg bold-font\"></div>\n                <div class=\"avg-separator\"></div>\n                <div class=\"driver2-avg bold-font\"></div>\n              </div>\n            </div>\n            <div class=\"one-statH2H\" id=\"ptsh2h\">\n              <div class=\"name-H2H bold-font\">\n                <div class=\"only-name\">POINTS</div>\n              </div>\n              <div class=\"bar-space\">\n                <div class=\"driver1-number bold-font\"></div>\n                <div class=\"custom-H2H\" data-driver1=\"0\" data-driver2=\"0\">\n                  <div class=\"driver1-space\">\n                    <div class=\"driver1-bar\"></div>\n                  </div>\n                  <div class=\"driver2-space\">\n                    <div class=\"driver2-bar\"></div>\n                  </div>\n                </div>\n                <div class=\"driver2-number bold-font\"></div>\n              </div>\n            </div>\n            <div class=\"one-statH2H\" id=\"podiumsh2h\">\n              <div class=\"name-H2H bold-font\">\n                <div class=\"only-name\">PODIUMS</div>\n              </div>\n              <div class=\"bar-space\">\n                <div class=\"driver1-number bold-font\"></div>\n                <div class=\"custom-H2H\" data-driver1=\"0\" data-driver2=\"0\">\n                  <div class=\"driver1-space\">\n                    <div class=\"driver1-bar\"></div>\n                  </div>\n                  <div class=\"driver2-space\">\n                    <div class=\"driver2-bar\"></div>\n                  </div>\n                </div>\n                <div class=\"driver2-number bold-font\"></div>\n              </div>\n            </div>\n            <div class=\"one-statH2H\" id=\"bestrh2h\">\n              <div class=\"name-H2H bold-font\">\n                <i class=\"bi bi-chevron-left d-none new-augment-button\"></i>\n                <div class=\"only-name\">BEST RACE</div>\n                <i class=\"bi bi-chevron-right d-none new-augment-button\"></i>\n              </div>\n              <div class=\"bar-space\">\n                <div class=\"driver1-number bold-font\"></div>\n                <div class=\"custom-H2H\" data-driver1=\"0\" data-driver2=\"0\">\n                  <div class=\"driver1-space\">\n                    <div class=\"driver1-bar\"></div>\n                  </div>\n                  <div class=\"driver2-space\">\n                    <div class=\"driver2-bar\"></div>\n                  </div>\n                </div>\n                <div class=\"driver2-number bold-font\"></div>\n              </div>\n            </div>\n            <div class=\"one-statH2H\" id=\"bestqh2h\">\n              <div class=\"name-H2H bold-font\">\n                <div class=\"only-name\">BEST QUALI</div>\n              </div>\n              <div class=\"bar-space\">\n                <div class=\"driver1-number bold-font\"></div>\n                <div class=\"custom-H2H\" data-driver1=\"0\" data-driver2=\"0\">\n                  <div class=\"driver1-space\">\n                    <div class=\"driver1-bar\"></div>\n                  </div>\n                  <div class=\"driver2-space\">\n                    <div class=\"driver2-bar\"></div>\n                  </div>\n                </div>\n                <div class=\"driver2-number bold-font\"></div>\n              </div>\n            </div>\n            <div class=\"one-statH2H\" id=\"dnfh2h\" style=\"margin-bottom: 10px;\">\n              <div class=\"name-H2H bold-font\">\n                <div class=\"only-name\">DNF</div>\n              </div>\n              <div class=\"bar-space\">\n                <div class=\"driver1-number bold-font\"></div>\n                <div class=\"custom-H2H\" data-driver1=\"0\" data-driver2=\"0\">\n                  <div class=\"driver1-space\">\n                    <div class=\"driver1-bar\"></div>\n                  </div>\n                  <div class=\"driver2-space\">\n                    <div class=\"driver2-bar\"></div>\n                  </div>\n                </div>\n                <div class=\"driver2-number bold-font\"></div>\n              </div>\n            </div>\n          </div>\n          <div class=\"col-9 main-viewer-section\" style=\"max-width: 72.5vw; margin-left: 0px;\">\n            <canvas class=\"graphs\" id=\"driverGraph\"></canvas>\n            <canvas class=\"graphs d-none\" id=\"progressionGraph\"></canvas>\n            <canvas class=\"graphs d-none\" id=\"qualiGraph\"></canvas>\n            <canvas class=\"graphs d-none\" id=\"gapToWinnerGraph\"></canvas>\n            <canvas class=\"graphs d-none\" id=\"gapToPoleGraph\"></canvas>\n          </div>\n        </div>\n\n\n      </div>\n      <div class=\"script-view hide unloaded\" id=\"season_viewer\">\n        <div class=\"general-top-panel\">\n          <div class=\"title-buttons-right\" id=\"recordsSettings\">\n            <div class=\"button-with-icon d-none\" id=\"sessionResultsCompactToggle\">\n              <i class=\"bi bi-arrows-collapse-vertical\"></i>\n              <span>Compact</span>\n            </div>\n            <div class=\"button-with-icon d-none\" id=\"sessionResultsEditToggle\">\n              <i class=\"bi bi-pencil-fill\"></i>\n              <span>Edit</span>\n            </div>\n          </div>\n          <div class=\"title-buttons-right\" id=\"standingsSettings\">\n            <div class=\"hide-historic-drivers\">\n              <i class=\"bi bi-eye\"></i>\n              <i class=\"bi bi-eye-slash\"></i>\n              <span class=\"\">Hide historic drivers</span>\n            </div>\n            <div class=\"button-with-icon\" id=\"standingsDetailsButton\">\n              <i class=\"bi bi-eye\"></i>\n              <i class=\"bi bi-eye-slash\"></i>\n              <span>Show details</span>\n            </div>\n            <div class=\"drivers-teams-pills\">\n              <ul class=\"nav nav-pills\">\n                <li class=\"nav-item\">\n                  <a class=\"nav-link bold-font generalPills active\" data-bs-toggle=\"pill\" id=\"driverspill\">\n                    <div class=\"basic-label bold-font\">Drivers</div>\n                    <div class=\"pill-line\"></div>\n                  </a>\n                </li>\n                <li class=\"nav-item\">\n                  <a class=\"nav-link bold-font generalPills\" data-bs-toggle=\"pill\" id=\"teamspill\">\n                    <div class=\"basic-label bold-font\">Teams</div>\n                    <div class=\"pill-line\"></div>\n                  </a>\n                </li>\n              </ul>\n            </div>\n            <div class=\"dropdown-global\">\n              <button type=\"button\" class=\"redesigned-dropdown bold-font\" id=\"tableTypeButton\">\n                <span class=\"dropdown-label\">Points</span>\n                <i class=\"redesigned-chevron\"></i>\n              </button>\n              <ul class=\"redesigned-dropdown-menu\" id=\"tableTypeDropdown\" style=\"font-family: Formula1;\">\n                <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" id=\"pointspill\"\n                  data-value=\"points\">Points</a>\n                <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" id=\"pospill\" data-value=\"pos\">Positions</a>\n                <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" id=\"qualipill\"\n                  data-value=\"quali\">Qualifying</a>\n              </ul>\n            </div>\n          </div>\n          <div class=\"title bold-font\">\n            Records Hub\n            <i class=\"info-titles bold-font\" id=\"standingsinfo\" data-bs-toggle=\"modal\"\n              data-bs-target=\"#standingsmodal\">?</i>\n          </div>\n          <div class=\"title-buttons-left\">\n            <div class=\"dropdown-global\">\n              <button class=\"redesigned-dropdown bold-font\" id=\"seriesTypeButton\" data-value=\"1\">\n                <span class=\"dropdown-label\">F1</span>\n                <i class=\"redesigned-chevron\"></i>\n              </button>\n              <ul class=\"redesigned-dropdown-menu\" id=\"seriesTypeDropdown\" style=\"font-family: Formula1;\">\n                <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" data-value=\"1\">F1</a>\n                <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" data-value=\"2\">F2</a>\n                <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" data-value=\"3\">F3</a>\n              </ul>\n            </div>\n            <div class=\"dropdown-global\">\n              <button class=\"redesigned-dropdown bold-font\" id=\"recordsTypeButton\" data-value=\"standings\">\n                <span class=\"dropdown-label\">Records</span>\n                <i class=\"redesigned-chevron\"></i>\n              </button>\n              <ul class=\"redesigned-dropdown-menu\" id=\"recordsTypeDropdown\" style=\"font-family: Formula1;\">\n                <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" id=\"reviewpill\"\n                  data-value=\"seasonreview\">Season review</a>\n                <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" id=\"standingspill\"\n                  data-value=\"standings\">Standings</a>\n                <div class=\"dropdown-submenu session-results-dropdown\">\n                  <a class=\"redesigned-dropdown-item session-results-root\" style=\"cursor: pointer;\"\n                    data-value=\"sessionresults\" data-no-check=\"1\">\n                    <span>Session Results</span>\n                    <i class=\"bi bi-chevron-right\"></i>\n                  </a>\n                  <div class=\"redesigned-dropdown-menu dropdown-submenu-menu session-results-gp-menu\"\n                    id=\"sessionResultsGpMenu\">\n                    <div class=\"session-results-scroll\" id=\"sessionResultsGpList\"></div>\n                    <div class=\"redesigned-dropdown-menu dropdown-submenu-menu session-results-session-menu\"\n                      id=\"sessionResultsSessionMenu\"></div>\n                  </div>\n                </div>\n                <li class=\"custom-dropdown-section-title bold-font\">Records</li>\n                <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" id=\"winspill\" data-value=\"wins\">Wins</a>\n                <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" id=\"polespill\" data-value=\"poles\">Poles</a>\n                <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" id=\"podiumspill\"\n                  data-value=\"podiums\">Podiums</a>\n                <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" id=\"dotdpill\" data-value=\"dotd\">Driver of\n                  the day</a>\n                <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" id=\"champspill\"\n                  data-value=\"champs\">Championships</a>\n                <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" id=\"pointsRecordpill\"\n                  data-value=\"points\">Points</a>\n                <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" id=\"racespill\" data-value=\"races\">Races</a>\n              </ul>\n            </div>\n            <div class=\"dropdown-global\">\n              <button class=\"redesigned-dropdown bold-font\" id=\"yearButton\" aria-haspopup=\"true\" aria-expanded=\"false\">\n                <span class=\"dropdown-label\">Year</span>\n                <i class=\"redesigned-chevron\"></i>\n              </button>\n              <ul class=\"redesigned-dropdown-menu\" id=\"yearMenu\" style=\"font-family: Formula1;\">\n              </ul>\n            </div>\n\n          </div>\n        </div>\n        <div class=\"main-viewer-section\">\n          <div class=\"drivers-table d-none\">\n            <div class=\"drivers-table-header\">\n              <div class=\"drivers-table-position bold-font\">#</div>\n              <div class=\"drivers-table-driver bold-font\">DRIVER</div>\n              <div class=\"drivers-table-points bold-font\">PTS</div>\n            </div>\n            <div class=\"drivers-table-data\"></div>\n          </div>\n          <div class=\"teams-table d-none\">\n            <div class=\"teams-table-header\">\n              <div class=\"teams-table-position bold-font\">#</div>\n              <div class=\"teams-table-team bold-font\">TEAM</div>\n              <div class=\"teams-table-points bold-font\">PTS</div>\n            </div>\n            <div class=\"teams-table-data\"></div>\n          </div>\n          <div class=\"records-list\">\n\n          </div>\n          <div class=\"season-review-bento\">\n            <div class=\"bento-grid\">\n              <div class=\"bento-item item-1\">\n                <div class=\"bento-title bold-font\">Standings <span class=\"bento-subtitle\">Drivers</span>\n                  <div class=\"rounds-counter\"><span class=\"round-number first-number\">6</span>/<span\n                      class=\"round-number second-number\">24</span></div>\n                </div>\n                <div class=\"bento-driver-standings\">\n                </div>\n              </div>\n              <div class=\"bento-item item-2\">\n                <div class=\"bento-title bold-font\">Standings <span class=\"bento-subtitle\">Teams</span>\n                  <div class=\"rounds-counter\"><span class=\"round-number first-number\">6</span>/<span\n                      class=\"round-number second-number\">24</span></div>\n                </div>\n                <div class=\"bento-team-standings\">\n                </div>\n              </div>\n              <div class=\"bento-item item-3\">\n                <div class=\"bento-title bold-font\">Qualifying <span class=\"bento-subtitle\">Analysis</span></div>\n                <div class=\"bento-qualifying-container\">\n                  <div class=\"bento-sub-item-qualifying\">\n                    <span class=\"bento-vertical-label bold-font\">POLES</span>\n                    <div class=\"poles-comparison\"></div>\n                  </div>\n                  <div class=\"stats-header-separator\"></div>\n                  <div class=\"bento-sub-item-qualifying\">\n                    <span class=\"bento-vertical-label bold-font\">Q3S</span>\n                    <div class=\"q3-comparison\"></div>\n                  </div>\n                  <div class=\"stats-header-separator\"></div>\n                  <div class=\"bento-sub-item-qualifying\">\n                    <span class=\"bento-vertical-label bold-font\">Q2S</span>\n                    <div class=\"q2-comparison\"></div>\n                  </div>\n                </div>\n              </div>\n              <div class=\"bento-item item-4\">\n                <div class=\"bento-title bold-font\">Head to head <span class=\"bento-subtitle\">Comparison</span></div>\n                <div class=\"bento-comparison-container\">\n                  <div class=\"bento-sub-item-comparison\">\n                    <span class=\"bento-vertical-label bold-font\">RACE</span>\n                    <div class=\"race-comparison\"></div>\n                  </div>\n                  <div class=\"stats-header-separator\"></div>\n                  <div class=\"bento-sub-item-comparison\">\n                    <span class=\"bento-vertical-label bold-font\">QUALI</span>\n                    <div class=\"quali-comparison\"></div>\n                  </div>\n                </div>\n              </div>\n              <div class=\"bento-item item-5\">\n                <div class=\"bento-title bold-font\">Wins <span class=\"bento-subtitle\">Drivers</span></div>\n                <div class=\"wins-drivers-list\"></div>\n              </div>\n              <div class=\"bento-item item-6\">\n                <div class=\"bento-title bold-font\">Wins <span class=\"bento-subtitle\">Teams</span></div>\n                <div class=\"wins-drivers-list wins-teams-list\"></div>\n              </div>\n              <div class=\"bento-item item-7\">\n                <div class=\"bento-title bold-font\">Driver of the day <span class=\"bento-subtitle\">Drivers</span></div>\n                <div class=\"bento-split-list\">\n                  <div class=\"bento-standings-half dotd-drivers-half-1\"></div>\n                  <div class=\"bento-standings-half dotd-drivers-half-2\"></div>\n                </div>\n              </div>\n              <div class=\"bento-item item-8\">\n                <div class=\"bento-title bold-font\">Podiums <span class=\"bento-subtitle\">Teams</span></div>\n                <div class=\"bento-split-list\">\n                  <div class=\"bento-standings-half podiums-teams-half-1\"></div>\n                  <div class=\"bento-standings-half podiums-teams-half-2\"></div>\n                </div>\n              </div>\n              <div class=\"bento-item item-9\">\n                <div class=\"bento-title bold-font\">Podiums <span class=\"bento-subtitle\">Drivers</span></div>\n                <div class=\"bento-split-list\">\n                  <div class=\"bento-standings-half podiums-drivers-half-1\"></div>\n                  <div class=\"bento-standings-half podiums-drivers-half-2\"></div>\n                </div>\n              </div>\n              <div class=\"bento-item item-10\">\n                <div class=\"bento-title bold-font\">Poles <span class=\"bento-subtitle\">Teams</span></div>\n                <div class=\"wins-drivers-list poles-teams-list\"></div>\n              </div>\n            </div>\n          </div>\n          <div class=\"session-results-table d-none\">\n            <div class=\"session-results-title bold-font\">\n              <span class=\"session-results-title-main\"></span>\n              <span class=\"session-results-title-session\"></span>\n              <span class=\"session-results-title-round\"></span>\n            </div>\n            <div class=\"session-results-rows\"></div>\n            <div class=\"session-results-footer d-none\"></div>\n          </div>\n        </div>\n\n\n      </div>\n      <div class=\"script-view hide unloaded\" id=\"driver_transfers\">\n        <div class=\"transfer-top-panel\">\n          <div class=\"title-buttons-left\">\n            <div class=\"dropdown-global\">\n              <button class=\"redesigned-dropdown bold-font\" id=\"staffTransfersDropdown\" aria-haspopup=\"true\"\n                aria-expanded=\"false\" data-value=\"drivers\">\n                <span class=\"dropdown-label\">Drivers</span>\n                <i class=\"redesigned-chevron\"></i>\n              </button>\n              <ul class=\"redesigned-dropdown-menu\" id=\"stafftransfersMenu\" style=\"font-family: Formula1;\"\n                data-bs-display=\"static\">\n                <a class=\"redesigned-dropdown-item\" data-value=\"drivers\">Drivers</a>\n                <a class=\"redesigned-dropdown-item\" data-value=\"staff\">Staff</a>\n              </ul>\n            </div>\n            <div class=\"filter-container\">\n              <i class=\"bi bi-filter-circle filter-icon\" id=\"filterIconTransfers\"></i>\n              <div class=\"category-filters\">\n                <ul class=\"nav nav-pills\">\n                  <li class=\"nav-item\">\n                    <a class=\"nav-link bold-font new-pills-filters\" id=\"freefilterTransfers\">\n                      <div class=\"basic-label bold-font\">FREE</div>\n                    </a>\n                  </li>\n                  <li class=\"nav-item\">\n                    <a class=\"nav-link bold-font new-pills-filters f2-filter\" id=\"F2filterTransfers\">\n                      <div class=\"basic-label bold-font\">F2</div>\n                    </a>\n                  </li>\n                  <li class=\"nav-item\">\n                    <a class=\"nav-link bold-font new-pills-filters f3-filter\" id=\"F3filterTransfers\">\n                      <div class=\"basic-label bold-font\">F3</div>\n                    </a>\n                  </li>\n                </ul>\n              </div>\n            </div>\n          </div>\n          <div class=\"title transfer-title bold-font\">\n            Current grid\n            <i class=\"info-titles bold-font\" id=\"contractsinfo\" data-bs-toggle=\"modal\"\n              data-bs-target=\"#contractsModal\">?</i>\n          </div>\n          <div class=\"title-buttons-right transfer-right-actions\">\n            <div class=\"lineups-season-pills-top d-none\" id=\"lineupsSeasonPillsTop\">\n              <ul class=\"nav nav-pills\">\n                <li class=\"nav-item\">\n                  <a class=\"nav-link bold-font generalPills active\" id=\"lineupsCurrentPill\" data-season-type=\"current\">\n                    <div class=\"basic-label bold-font lineups-pill-label\">Current</div>\n                    <div class=\"pill-line\"></div>\n                  </a>\n                </li>\n                <li class=\"nav-item\">\n                  <a class=\"nav-link bold-font generalPills\" id=\"lineupsNextPill\" data-season-type=\"next\">\n                    <div class=\"basic-label bold-font lineups-pill-label\">Next</div>\n                    <div class=\"pill-line\"></div>\n                  </a>\n                </li>\n              </ul>\n            </div>\n            <div class=\"button-with-icon\" id=\"lineupsViewButton\">\n              <i class=\"bi bi-diagram-3\"></i>\n              <span>Line ups</span>\n            </div>\n            <div class=\"form-check form-switch auto-contract\">\n              <input class=\"form-check-input custom-toggle\" type=\"checkbox\" role=\"switch\" id=\"autoContractToggle\">\n              <label class=\"form-check-label\" for=\"autoContractToggle\">Auto contract</label>\n            </div>\n          </div>\n        </div>\n        <div class=\"d-flex\" id=\"transfersMainLayout\">\n          <div class=\"col-2\">\n            <div class=\"main-columns-drag-section main-resizable\" id=\"allDrivers\">\n              <div class=\"search-and-order\">\n                <div class=\"text-filter-container\" id=\"filterTransfersContainer\">\n                  <input class=\"text-filter\" type=\"text\" id=\"nameFilterTransfer\" placeholder=\"Search...\">\n                  <i class=\"bi bi-x d-none\"></i>\n                </div>\n              </div>\n              <div id=\"free-drivers\">\n              </div>\n              <div class=\"d-none main-columns-drag-section\" id=\"free-staff\"></div>\n            </div>\n          </div>\n          <div class=\"col-10\">\n            <div class=\"main-columns-drag-section teams-columns main-resizable\">\n              <div class=\"team-template  rbborder\">\n                <div class=\"new-logo-and-name\">\n                  <img src=\"../assets/images/logos/redbull.png\" class=\"redbulllogo redbulllogo-replace\">\n                  <div class=\"team-name bold-font redbull-name complete\">RED BULL</div>\n                </div>\n                <div class=\"drivers-section\" data-team=\"redbull\">\n                  <div class=\"driver-space\" id=\"rb1\">\n                  </div>\n                  <div class=\"driver-space\" id=\"rb2\">\n                  </div>\n                  <div class=\"affiliates-and-arrows\" data-team=\"redbull\">\n                    <i class=\"bi bi-chevron-left arrow-left new-augment-button transparent\"></i>\n                    <div class=\"affiliates-space driver-space\" id=\"rb3\"></div>\n                    <i class=\"bi bi-chevron-right arrow-right new-augment-button transparent\"></i>\n                  </div>\n                </div>\n                <div class=\"staff-section d-none\" data-team=\"redbull\" data-teamid=\"3\">\n                  <div class=\"staff-space\" data-type=\"technical-chief\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"2\"></div>\n                  <div class=\"staff-space\" data-type=\"head-aero\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"sporting-director\" data-pos=\"1\"></div>\n                </div>\n              </div>\n              <div class=\"team-template  feborder\">\n                <div class=\"new-logo-and-name\">\n                  <img src=\"../assets/images/logos/ferrari.png\" class=\"ferrarilogo\">\n                  <div class=\"team-name bold-font\">FERRARI</div>\n                </div>\n                <div class=\"drivers-section\" data-team=\"ferrari\">\n                  <div class=\"driver-space\" id=\"fe1\">\n                  </div>\n                  <div class=\"driver-space\" id=\"fe2\">\n                  </div>\n                  <div class=\"affiliates-and-arrows\" data-team=\"ferrari\">\n                    <i class=\"bi bi-chevron-left arrow-left new-augment-button transparent\"></i>\n                    <div class=\"affiliates-space driver-space\" id=\"fe3\"></div>\n                    <i class=\"bi bi-chevron-right arrow-right new-augment-button transparent\"></i>\n                  </div>\n                </div>\n                <div class=\"staff-section d-none\" data-team=\"ferrari\" data-teamid=\"1\">\n                  <div class=\"staff-space\" data-type=\"technical-chief\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"2\"></div>\n                  <div class=\"staff-space\" data-type=\"head-aero\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"sporting-director\" data-pos=\"1\"></div>\n                </div>\n              </div>\n              <div class=\"team-template  mcborder\">\n                <div class=\"new-logo-and-name\">\n                  <div class=\"mclarenlogo\"></div>\n                  <div class=\"team-name bold-font\">MCLAREN</div>\n                </div>\n                <div class=\"drivers-section\" data-team=\"mclaren\">\n                  <div class=\"driver-space\" id=\"mc1\">\n                  </div>\n                  <div class=\"driver-space\" id=\"mc2\">\n                  </div>\n                  <div class=\"affiliates-and-arrows\" data-team=\"mclaren\">\n                    <i class=\"bi bi-chevron-left arrow-left new-augment-button transparent\"></i>\n                    <div class=\"affiliates-space driver-space\" id=\"mc3\"></div>\n                    <i class=\"bi bi-chevron-right arrow-right new-augment-button transparent\"></i>\n                  </div>\n                </div>\n                <div class=\"staff-section d-none\" data-team=\"mclaren\" data-teamid=\"2\">\n                  <div class=\"staff-space\" data-type=\"technical-chief\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"2\"></div>\n                  <div class=\"staff-space\" data-type=\"head-aero\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"sporting-director\" data-pos=\"1\"></div>\n                </div>\n              </div>\n              <div class=\"team-template  meborder\">\n                <div class=\"new-logo-and-name\">\n                  <img src=\"../assets/images/logos/mercedes.png\" class=\"merclogo\">\n                  <div class=\"team-name bold-font\">MERCEDES</div>\n                </div>\n                <div class=\"drivers-section\" data-team=\"merc\">\n                  <div class=\"driver-space\" id=\"me1\">\n                  </div>\n                  <div class=\"driver-space\" id=\"me2\">\n                  </div>\n                  <div class=\"affiliates-and-arrows\" data-team=\"merc\">\n                    <i class=\"bi bi-chevron-left arrow-left new-augment-button transparent\"></i>\n                    <div class=\"affiliates-space driver-space\" id=\"me3\"></div>\n                    <i class=\"bi bi-chevron-right arrow-right new-augment-button transparent\"></i>\n                  </div>\n                </div>\n                <div class=\"staff-section d-none\" data-team=\"merc\" data-teamid=\"4\">\n                  <div class=\"staff-space\" data-type=\"technical-chief\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"2\"></div>\n                  <div class=\"staff-space\" data-type=\"head-aero\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"sporting-director\" data-pos=\"1\"></div>\n                </div>\n              </div>\n              <div class=\"team-template  asborder\">\n                <div class=\"new-logo-and-name\">\n                  <img src=\"../assets/images/logos/astonMartin.png\" class=\"astonlogo astonlogo-replace\">\n                  <div class=\"team-name bold-font aston-name\">ASTON MARTIN</div>\n                </div>\n                <div class=\"drivers-section\" data-team=\"astonmartin\">\n                  <div class=\"driver-space\" id=\"as1\">\n                  </div>\n                  <div class=\"driver-space\" id=\"as2\">\n                  </div>\n                  <div class=\"affiliates-and-arrows\" data-team=\"astonmartin\">\n                    <i class=\"bi bi-chevron-left arrow-left new-augment-button transparent\"></i>\n                    <div class=\"affiliates-space driver-space\" id=\"as3\"></div>\n                    <i class=\"bi bi-chevron-right arrow-right new-augment-button transparent\"></i>\n                  </div>\n                </div>\n                <div class=\"staff-section d-none\" data-team=\"astonmartin\" data-teamid=\"10\">\n                  <div class=\"staff-space\" data-type=\"technical-chief\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"2\"></div>\n                  <div class=\"staff-space\" data-type=\"head-aero\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"sporting-director\" data-pos=\"1\"></div>\n                </div>\n              </div>\n              <div class=\"team-template  alborder\">\n                <div class=\"new-logo-and-name\">\n                  <div class=\"alpine-logo-container\">\n                    <div class=\"alpinelogo alpinelogo-replace\"></div>\n                  </div>\n\n                  <div class=\"team-name bold-font alpine-name\">ALPINE</div>\n                </div>\n                <div class=\"drivers-section\" data-team=\"alpine\">\n                  <div class=\"driver-space\" id=\"al1\">\n                  </div>\n                  <div class=\"driver-space\" id=\"al2\">\n                  </div>\n                  <div class=\"affiliates-and-arrows\" data-team=\"alpine\">\n                    <i class=\"bi bi-chevron-left arrow-left new-augment-button transparent\"></i>\n                    <div class=\"affiliates-space driver-space\" id=\"al3\"></div>\n                    <i class=\"bi bi-chevron-right arrow-right new-augment-button transparent\"></i>\n                  </div>\n                </div>\n                <div class=\"staff-section d-none\" data-team=\"alpine\" data-teamid=\"5\">\n                  <div class=\"staff-space\" data-type=\"technical-chief\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"2\"></div>\n                  <div class=\"staff-space\" data-type=\"head-aero\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"sporting-director\" data-pos=\"1\"></div>\n                </div>\n              </div>\n              <div class=\"team-template  wiborder\">\n                <div class=\"new-logo-and-name\">\n                  <div class=\"williamslogo williamslogo-replace\"></div>\n                  <div class=\"team-name bold-font williams-name\">WILLIAMS</div>\n                </div>\n                <div class=\"drivers-section\" data-team=\"williams\">\n                  <div class=\"driver-space\" id=\"wi1\">\n                  </div>\n                  <div class=\"driver-space\" id=\"wi2\">\n                  </div>\n                  <div class=\"affiliates-and-arrows\" data-team=\"williams\">\n                    <i class=\"bi bi-chevron-left arrow-left new-augment-button transparent\"></i>\n                    <div class=\"affiliates-space driver-space\" id=\"wi3\"></div>\n                    <i class=\"bi bi-chevron-right arrow-right new-augment-button transparent\"></i>\n                  </div>\n                </div>\n                <div class=\"staff-section d-none\" data-team=\"williams\" data-teamid=\"6\">\n                  <div class=\"staff-space\" data-type=\"technical-chief\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"2\"></div>\n                  <div class=\"staff-space\" data-type=\"head-aero\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"sporting-director\" data-pos=\"1\"></div>\n                </div>\n              </div>\n              <div class=\"team-template  atborder\">\n                <div class=\"new-logo-and-name\">\n                  <div class=\"alphatauri-logo-container\">\n                    <div class=\"alphataurilogo atlogo-replace\"></div>\n                  </div>\n                  <div class=\"team-name bold-font at-name\">ALPHA TAURI</div>\n                </div>\n                <div class=\"drivers-section\" data-team=\"alphatauri\">\n                  <div class=\"driver-space\" id=\"at1\">\n                  </div>\n                  <div class=\"driver-space\" id=\"at2\">\n                  </div>\n                  <div class=\"affiliates-and-arrows\" data-team=\"alphatauri\">\n                    <i class=\"bi bi-chevron-left arrow-left new-augment-button transparent\"></i>\n                    <div class=\"affiliates-space driver-space\" id=\"at3\"></div>\n                    <i class=\"bi bi-chevron-right arrow-right new-augment-button transparent\"></i>\n                  </div>\n                </div>\n                <div class=\"staff-section d-none\" data-team=\"alphatauri\" data-teamid=\"8\">\n                  <div class=\"staff-space\" data-type=\"technical-chief\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"2\"></div>\n                  <div class=\"staff-space\" data-type=\"head-aero\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"sporting-director\" data-pos=\"1\"></div>\n                </div>\n              </div>\n              <div class=\"team-template  afborder\">\n                <div class=\"new-logo-and-name\">\n                  <img src=\"../assets/images/logos/alfaromeo.png\" class=\"alfalogo alfalogo-replace\">\n                  <div class=\"team-name bold-font alfa-name\">ALFA ROMEO</div>\n                </div>\n                <div class=\"drivers-section\" data-team=\"alfaromeo\">\n                  <div class=\"driver-space\" id=\"af1\">\n                  </div>\n                  <div class=\"driver-space\" id=\"af2\">\n                  </div>\n                  <div class=\"affiliates-and-arrows\" data-team=\"alfaromeo\">\n                    <i class=\"bi bi-chevron-left arrow-left new-augment-button transparent\"></i>\n                    <div class=\"affiliates-space driver-space\" id=\"af3\"></div>\n                    <i class=\"bi bi-chevron-right arrow-right new-augment-button transparent\"></i>\n                  </div>\n                </div>\n                <div class=\"staff-section d-none\" data-team=\"alfaromeo\" data-teamid=\"9\">\n                  <div class=\"staff-space\" data-type=\"technical-chief\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"2\"></div>\n                  <div class=\"staff-space\" data-type=\"head-aero\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"sporting-director\" data-pos=\"1\"></div>\n                </div>\n              </div>\n              <div class=\"team-template  haborder\">\n                <div class=\"new-logo-and-name\">\n                  <img src=\"../assets/images/logos/haas.png\" class=\"haaslogo haaslogo-replace\">\n                  <div class=\"team-name bold-font haas-name\">HAAS</div>\n                </div>\n                <div class=\"drivers-section\" data-team=\"haas\">\n                  <div class=\"driver-space\" id=\"ha1\">\n                  </div>\n                  <div class=\"driver-space\" id=\"ha2\">\n                  </div>\n                  <div class=\"affiliates-and-arrows\" data-team=\"haas\">\n                    <i class=\"bi bi-chevron-left arrow-left new-augment-button transparent\"></i>\n                    <div class=\"affiliates-space driver-space\" id=\"ha3\"></div>\n                    <i class=\"bi bi-chevron-right arrow-right new-augment-button transparent\"></i>\n                  </div>\n                </div>\n                <div class=\"staff-section d-none\" data-team=\"haas\" data-teamid=\"7\">\n                  <div class=\"staff-space\" data-type=\"technical-chief\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"2\"></div>\n                  <div class=\"staff-space\" data-type=\"head-aero\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"sporting-director\" data-pos=\"1\"></div>\n                </div>\n              </div>\n              <div class=\"team-template ctborder d-none\" id=\"customTeamTransfers\">\n                <div class=\"new-logo-and-name\">\n                  <img src=\"../assets/images/logos/placeholder.png\" class=\"customlogo custom-replace\">\n                  <div class=\"team-name bold-font ct-replace\">CUSTOM TEAM</div>\n                </div>\n                <div class=\"drivers-section\" data-team=\"custom\">\n                  <div class=\"driver-space\" id=\"ct1\">\n                  </div>\n                  <div class=\"driver-space\" id=\"ct2\">\n                  </div>\n                  <div class=\"affiliates-and-arrows\" data-team=\"custom\">\n                    <i class=\"bi bi-chevron-left arrow-left new-augment-button transparent\"></i>\n                    <div class=\"affiliates-space driver-space\" id=\"ct3\"></div>\n                    <i class=\"bi bi-chevron-right arrow-right new-augment-button transparent\"></i>\n                  </div>\n                </div>\n                <div class=\"staff-section d-none\" data-team=\"custom\" data-teamid=\"32\">\n                  <div class=\"staff-space\" data-type=\"technical-chief\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"race-engineer\" data-pos=\"2\"></div>\n                  <div class=\"staff-space\" data-type=\"head-aero\" data-pos=\"1\"></div>\n                  <div class=\"staff-space\" data-type=\"sporting-director\" data-pos=\"1\"></div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"lineups-view d-none\" id=\"lineupsView\">\n          <div class=\"lineups-circle-wrap\">\n            <div class=\"lineups-circle\" id=\"lineupsCircle\"></div>\n          </div>\n        </div>\n      </div>\n      <div class=\"script-view hide unloaded\" id=\"edit_stats\">\n        <div class=\"general-top-panel\">\n          <div class=\"title-buttons-left\">\n            <div class=\"dropdown-global\">\n              <button type=\"button\" class=\"redesigned-dropdown bold-font\" id=\"staffDropdown\" aria-haspopup=\"true\"\n                aria-expanded=\"false\">\n                <span class=\"dropdown-label\">Staff Type</span>\n                <i class=\"redesigned-chevron\"></i>\n              </button>\n              <ul class=\"redesigned-dropdown-menu\" id=\"staffMenu\" style=\"font-family: Formula1;\">\n                <a class=\"redesigned-dropdown-item\" data-list=\"fulldriverlist\" data-spaceStats=\"driverStats\"\n                  id=\"driverStatsDrop\">Drivers</a>\n                <a class=\"redesigned-dropdown-item\" data-list=\"fullTechnicalList\" data-spaceStats=\"chiefStats\">Technical\n                  Chiefs</a>\n                <a class=\"redesigned-dropdown-item\" data-list=\"fullEngineerList\" data-spaceStats=\"engineerStats\">Race\n                  Engineers</a>\n                <a class=\"redesigned-dropdown-item\" data-list=\"fullAeroList\" data-spaceStats=\"aeroStats\">H. of\n                  Aerodynamics</a>\n                <a class=\"redesigned-dropdown-item\" data-list=\"fullDirectorList\"\n                  data-spaceStats=\"directorStats\">Sporting\n                  Directors</a>\n              </ul>\n            </div>\n            <div class=\"stats-add-controls\">\n              <div id=\"addStaffButton\" class=\"button-with-icon d-none\">\n                <i class=\"bi bi-person-plus\"></i>\n                <span class=\"button-text\">Add driver/staff</span>\n              </div>\n            </div>\n            <div class=\"filter-container\">\n              <i class=\"bi bi-filter-circle filter-icon\" id=\"filterIcon\"></i>\n              <div class=\"category-filters\">\n                <ul class=\"nav nav-pills\">\n                  <li class=\"nav-item\">\n                    <a class=\"nav-link bold-font new-pills-filters\" id=\"freefilter\">\n                      <div class=\"basic-label bold-font\">FREE</div>\n                    </a>\n                  </li>\n                  <li class=\"nav-item\">\n                    <a class=\"nav-link bold-font new-pills-filters\" id=\"F1filter\">\n                      <div class=\"basic-label bold-font\">F1</div>\n                    </a>\n                  </li>\n                  <li class=\"nav-item\">\n                    <a class=\"nav-link bold-font new-pills-filters f2-filter\" id=\"F2filter\">\n                      <div class=\"basic-label bold-font\">F2</div>\n                    </a>\n                  </li>\n                  <li class=\"nav-item\">\n                    <a class=\"nav-link bold-font new-pills-filters f3-filter\" id=\"F3filter\">\n                      <div class=\"basic-label bold-font\">F3</div>\n                    </a>\n                  </li>\n                </ul>\n              </div>\n            </div>\n          </div>\n          <div class=\"title bold-font\">\n            Attributes\n          </div>\n        </div>\n        <div class=\"d-flex\">\n          <div class=\"col-3\">\n            <div class=\"main-editStats-section main-resizable\" id=\"StaffLists\">\n              <div class=\"search-and-order\">\n                <div class=\"text-filter-container\" id=\"filterContainer\">\n                  <input class=\"text-filter\" type=\"text\" id=\"nameFilter\" placeholder=\"Search...\">\n                  <i class=\"bi bi-x d-none\"></i>\n                </div>\n                <div class=\"order-space\" data-state=\"0\">\n                  <i class=\"bi bi-sort-numeric-up-alt\"></i>\n                  <i class=\"bi bi-sort-numeric-down hidden\"></i>\n                </div>\n\n              </div>\n              <div class=\"staff-list\" id=\"placeholder\">\n              </div>\n              <div class=\"staff-list d-none\" id=\"fulldriverlist\">\n              </div>\n              <div class=\"staff-list d-none\" id=\"fullTechnicalList\">\n              </div>\n              <div class=\"staff-list d-none\" id=\"fullEngineerList\">\n              </div>\n              <div class=\"staff-list d-none\" id=\"fullAeroList\">\n              </div>\n              <div class=\"staff-list d-none\" id=\"fullDirectorList\">\n              </div>\n            </div>\n          </div>\n          <div class=\"col-9\">\n            <div class=\"main-editStats-section main-resizable\">\n              <div class=\"left-panel-stats d-none\" id=\"editStatsPanel\">\n                <div class=\"upper-section-stats\">\n                  <div class=\"name-and-info\">\n                    <div class=\"name-and-code\">\n                      <span class=\"name-editor bold-font\" id=\"driverStatsTitle\"></span>\n                      <div class=\"custom-separator\"></div>\n                      <span class=\"code-editor bold-font\" id=\"driverCode\"></span>\n                      <div id=\"genderSwapButton\" class=\"button-with-icon compact d-none\">\n                        <i class=\"bi bi-gender-male\"></i>\n                        <span class=\"button-text\">Male</span>\n                      </div>\n                      <i class=\"bi bi-pencil-fill\" id=\"editNameButton\"></i>\n                    </div>\n                    <div class=\"flag-and-team\">\n                      <div class=\"dropdown-global\" id=\"nationalityDropdown\">\n                        <button type=\"button\" class=\"redesigned-dropdown bold-font nationality-dropdown\"\n                          id=\"nationalityButton\" aria-haspopup=\"true\" aria-expanded=\"false\" disabled>\n                          <img src=\"../assets/images/australia.png\" class=\"driver-info-driver-flag\" id=\"driverFlag\">\n                          <span class=\"info-text flag-text\">Placeholder</span>\n                          <i class=\"redesigned-chevron\"></i>\n                        </button>\n                        <ul class=\"redesigned-dropdown-menu\" id=\"nationalityMenu\" style=\"font-family: Formula1;\"></ul>\n                      </div>\n                      <div class=\"custom-separator\"></div>\n                      <div class=\"image-and-text\">\n                        <img src=\"../assets/images/logos/mclaren.png\"\n                          class=\"driver-info-team-logo driver-info-team-logo-img\" id=\"driverTeamLogoImg\">\n                        <div class=\"driver-info-team-logo driver-info-team-logo-masked d-none\" id=\"driverTeamLogoMask\">\n                        </div>\n                        <span class=\"info-text team-text\" id=\"driverTeamName\">Placeholder 2</span>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"stats-header-separator\"></div>\n                  <div class=\"title-and-details\" id=\"ageDetails\">\n                    <div class=\"stats-title\">Details</div>\n                    <div class=\"age-holder\">\n                      <div class=\"age\">\n                        <div class=\"age-ret age-title bold-font\" data-text=\"Age\">Age</div>\n                        <span class=\"age-text\"><span class=\"actual-age\">25</span> <span class=\"hiddable-text\">years\n                            old</span></span>\n                        <div class=\"age-buttons\">\n                          <i class=\"bi bi-dash new-augment-button\"></i>\n                          <i class=\"bi bi-plus new-augment-button\"></i>\n                        </div>\n                      </div>\n                      <div class=\"retirement-age\">\n                        <div class=\"age-ret age-title bold-font shorten-ret\" data-text=\"Ret\">Retirement</div>\n                        <span class=\"age-text\"><span class=\"actual-retirement\">56</span> <span\n                            class=\"hiddable-text\">years old</span></span>\n                        <div class=\"retirement-buttons\">\n                          <i class=\"bi bi-dash new-augment-button\"></i>\n                          <i class=\"bi bi-plus new-augment-button\"></i>\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"stats-header-separator hidable-separator\"></div>\n                  <div class=\"title-and-details\" id=\"numberDetails\">\n                    <div class=\"stats-title\">Number</div>\n                    <div class=\"number-selector-and-number-1\">\n                      <div class=\"number-selector\">\n                        <span class=\"number-holder bold-font\">81</span>\n                        <div class=\"number-buttons\">\n                          <i class=\"bi bi-dash new-augment-button\"></i>\n                          <i class=\"bi bi-plus new-augment-button\"></i>\n                        </div>\n                      </div>\n                      <div class=\"form-check form-switch\">\n                        <input class=\"form-check-input custom-toggle\" type=\"checkbox\" role=\"switch\" id=\"driverNumber1\">\n                        <span class=\"form-check-label\" for=\"flexSwitchCheckDefault\">#1 if WC</span>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"stats-header-separator hidable-separator\"></div>\n                  <div class=\"title-and-details\" id=\"availabilityDetails\">\n                    <div class=\"stats-title\">Availability</div>\n                    <div class=\"super-license-holder form-check form-switch\">\n                      <div class=\"form-check form-switch\" id=\"superLicenseSwitch\">\n                        <input class=\"form-check-input custom-toggle\" type=\"checkbox\" role=\"switch\" id=\"superLicense\">\n                        <span class=\"form-check-label\" for=\"flexSwitchCheckDefault\">Super License</span>\n                      </div>\n                      <div class=\"form-check form-switch\">\n                        <input class=\"form-check-input custom-toggle\" type=\"checkbox\" role=\"switch\" id=\"retiredInput\">\n                        <span class=\"form-check-label\" for=\"flexSwitchCheckDefault\">Retired</span>\n                      </div>\n\n                    </div>\n                  </div>\n                  <div class=\"stats-header-separator\"></div>\n                  <div class=\"title-and-details special-overall\">\n                    <div class=\"stats-title\">Overall</div>\n                    <div class=\"overall-holder bold-font\" id=\"ovrholder\"></div>\n                  </div>\n                </div>\n                <div class=\"attributes-panel\">\n                  <div class=\"attributes-column\">\n                    <div class=\"main-panel-space\">\n                      <div class=\"title-and-stats\">\n                        <div class=\"attributes-title bold-font\"\n                          style=\"display: flex; justify-content: space-between; align-items: center;\">\n                          <div style=\"display:flex; align-items:center; gap:10px;\">\n                            <span id=\"attributesTitleText\">Driver Attributes</span>\n                            <div class=\"dropdown-global d-none\" id=\"draftStaffTypeControl\">\n                              <button type=\"button\" class=\"redesigned-dropdown bold-font draft-staff-type-dropdown\"\n                                id=\"addStaffTypeDropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\n                                <span class=\"dropdown-label\">Drivers</span>\n                                <i class=\"redesigned-chevron\"></i>\n                              </button>\n                              <ul class=\"redesigned-dropdown-menu\" id=\"addStaffTypeMenu\" style=\"font-family: Formula1;\">\n                                <a class=\"redesigned-dropdown-item\" data-staff-type=\"0\">Drivers</a>\n                                <a class=\"redesigned-dropdown-item\" data-staff-type=\"1\">Technical Chiefs</a>\n                                <a class=\"redesigned-dropdown-item\" data-staff-type=\"2\">Race Engineers</a>\n                                <a class=\"redesigned-dropdown-item\" data-staff-type=\"3\">H. of Aerodynamics</a>\n                                <a class=\"redesigned-dropdown-item\" data-staff-type=\"4\">Sporting Directors</a>\n                              </ul>\n                            </div>\n                          </div>\n                          <div id=\"compareButton\" class=\"button-with-icon\">\n                            <i class=\"bi bi-arrow-left-right\"></i>\n                            <span class=\"button-text\">Compare</span>\n                          </div>\n                        </div>\n                        <div class=\"main-panel-stats main-attributes\" id=\"driverStats\">\n                          <div class=\"stats-row\">\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Cornering</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Braking</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Control</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                          </div>\n                          <div class=\"stats-row\">\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Smoothness</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Adaptability</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Overtaking</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                          </div>\n                          <div class=\"stats-row\">\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Defence</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Reactions</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Accuracy</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                          </div>\n                        </div>\n                        <div class=\"main-panel-stats d-none\" id=\"chiefStats\">\n                          <div class=\"stats-row\">\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Chasis</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Front Wing</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Rear Wing</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                          </div>\n                          <div class=\"stats-row\">\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Sidepods</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Floor</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Suspension</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                          </div>\n                        </div>\n                        <div class=\"main-panel-stats d-none\" id=\"engineerStats\">\n                          <div class=\"stats-row\">\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Friendliness</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Feedback</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Composure</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                          </div>\n                        </div>\n                        <div class=\"main-panel-stats d-none\" id=\"aeroStats\">\n                          <div class=\"stats-row\">\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Cooling</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Drs</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">High Speed Performance</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                          </div>\n                          <div class=\"stats-row\">\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Med. Speed Performance</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Low Speed Performance</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Drag</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                          </div>\n                          <div class=\"stats-row\">\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Airflow</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Sensitivity</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator-invisible\"></div>\n                            <div class=\"one-stat-invisible\"></div>\n                          </div>\n                        </div>\n                        <div class=\"main-panel-stats d-none\" id=\"directorStats\">\n                          <div class=\"stats-row\">\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Training</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Aptitude</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Leadership</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                          </div>\n                          <div class=\"stats-row\">\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Processes</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator-invisible\"></div>\n                            <div class=\"one-stat-invisible\"></div>\n                            <div class=\"stats-row-separator-invisible\"></div>\n                            <div class=\"one-stat-invisible\"></div>\n                          </div>\n\n                        </div>\n                      </div>\n                    </div>\n                    <div class=\"bottom-panel\">\n                      <div class=\"title-and-stats\">\n                        <div class=\"attributes-title bold-font\">Other Attributes</div>\n                        <div class=\"other-attributes-stats\">\n                          <div class=\"stats-row\" id=\"driverSpecialAttributes\">\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Growth</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\" id=\"growthInput\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Aggression</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number elegible\" id=\"agressionInput\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\"></div>\n                                </div>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\" id=\"marketability\">\n                              <div class=\"name-and-stat\">\n                                <span class=\"bold-font\">Marketability</span>\n                                <div class=\"stat-number\">\n                                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                                  <input type=\"number\" class=\"custom-input-number\" id=\"marketabilityInput\">\n                                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <div class=\"one-stat-bar\">\n                                  <div class=\"one-stat-progress\" id=\"marketabilityBar\"></div>\n                                </div>\n                              </div>\n                            </div>\n                          </div>\n                          <div class=\"stats-row\" id=\"driverMentalityAttributes\">\n                            <div class=\"one-stat-panel\" data-mentality=\"0\">\n                              <div class=\"name-and-stat mentality\">\n                                <span class=\"bold-font\">Personal situation</span>\n                                <div class=\"mentality-and-emoji\">\n                                  <span class=\"mentality-state\">Positive</span>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <i class=\"bi bi-chevron-left new-augment-button transparent small\"></i>\n                                <div class=\"mentality-level-indicator\" data-value=\"3\" id=\"mentality0\">\n                                  <div class=\"mentality-level\"></div>\n                                  <div class=\"mentality-level\"></div>\n                                  <div class=\"mentality-level\"></div>\n                                  <div class=\"mentality-level\"></div>\n                                  <div class=\"mentality-level\"></div>\n                                </div>\n                                <i class=\"bi bi-chevron-right new-augment-button transparent small\"></i>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\" data-mentality=\"1\">\n                              <div class=\"name-and-stat mentality\">\n                                <span class=\"bold-font\">Team performance</span>\n                                <div class=\"mentality-and-emoji\">\n                                  <span class=\"mentality-state\">Positive</span>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <i class=\"bi bi-chevron-left new-augment-button transparent small\"></i>\n                                <div class=\"mentality-level-indicator\" data-value=\"3\" id=\"mentality1\">\n                                  <div class=\"mentality-level\"></div>\n                                  <div class=\"mentality-level\"></div>\n                                  <div class=\"mentality-level\"></div>\n                                  <div class=\"mentality-level\"></div>\n                                  <div class=\"mentality-level\"></div>\n                                </div>\n                                <i class=\"bi bi-chevron-right new-augment-button transparent small\"></i>\n                              </div>\n                            </div>\n                            <div class=\"stats-row-separator\"></div>\n                            <div class=\"one-stat-panel\" data-mentality=\"2\">\n                              <div class=\"name-and-stat mentality\">\n                                <span class=\"bold-font\">Team principal</span>\n                                <div class=\"mentality-and-emoji\">\n                                  <span class=\"mentality-state\">Positive</span>\n                                </div>\n                              </div>\n                              <div class=\"bar-container\">\n                                <i class=\"bi bi-chevron-left new-augment-button transparent small\"></i>\n                                <div class=\"mentality-level-indicator\" data-value=\"3\" id=\"mentality2\">\n                                  <div class=\"mentality-level\"></div>\n                                  <div class=\"mentality-level\"></div>\n                                  <div class=\"mentality-level\"></div>\n                                  <div class=\"mentality-level\"></div>\n                                  <div class=\"mentality-level\"></div>\n                                </div>\n                                <i class=\"bi bi-chevron-right new-augment-button transparent small\"></i>\n                              </div>\n                            </div>\n                          </div>\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"stats-graph\"></div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class=\"script-view hide unloaded\" id=\"edit_teams\">\n        <div class=\"general-top-panel\">\n          <div class=\"title-buttons-left\">\n            <div class=\"dropdown-global\">\n              <button class=\"redesigned-dropdown bold-font\" id=\"teamButton\" aria-haspopup=\"true\" aria-expanded=\"false\">\n                <span class=\"span dropdown-label\">Team</span>\n                <i class=\"redesigned-chevron\"></i>\n              </button>\n              <ul class=\"redesigned-dropdown-menu\" id=\"teamMenu\" style=\"font-family: Formula1;\">\n                <a class=\"redesigned-dropdown-item bold-font\" style=\"cursor: pointer;\" data-teamid=\"1\">\n                  <div class=\"team-menu-logo\">\n                    <img src=\"../assets/images/logos/ferrari.png\" class=\"team-menu-ferrari\">\n                  </div>\n                  <div class=\"team-menu-name\">\n                    FERRARI\n                  </div>\n                </a>\n                <a class=\"redesigned-dropdown-item bold-font\" style=\"cursor: pointer;\" data-teamid=\"2\">\n                  <div class=\"team-menu-logo\">\n                    <div class=\"team-menu-mclaren\"></div>\n                  </div>\n                  <div class=\"team-menu-name\">\n                    MCLAREN\n                  </div>\n                </a>\n                <a class=\"redesigned-dropdown-item bold-font\" style=\"cursor: pointer;\" data-teamid=\"3\">\n                  <div class=\"team-menu-logo\">\n                    <img src=\"../assets/images/logos/redbull.png\"\n                      class=\"team-menu-redbull team-menu-redbull-replace changable-team-menu-redbull redbulllogo redbulllogo-replace\">\n                  </div>\n                  <div class=\"team-menu-name redbull-name\">RED BULL</div>\n                </a>\n                <a class=\"redesigned-dropdown-item bold-font\" style=\"cursor: pointer;\" data-teamid=\"4\">\n                  <div class=\"team-menu-logo\">\n                    <img src=\"../assets/images/logos/mercedes.png\" class=\"team-menu-merc\">\n                  </div>\n\n                  <div class=\"team-menu-name\">\n                    MERCEDES\n                  </div>\n                </a>\n                <a class=\"redesigned-dropdown-item bold-font\" style=\"cursor: pointer;\" data-teamid=\"5\">\n                  <div class=\"team-menu-logo\">\n                    <div class=\"alpine-logo-container\">\n                      <div class=\"alpinelogo-replace alpinelogo team-menu-alpine-replace changable-team-menu-alpine\">\n                      </div>\n                    </div>\n\n                  </div>\n                  <div class=\"team-menu-name alpine-name\">\n                    ALPINE\n                  </div>\n                </a>\n                <a class=\"redesigned-dropdown-item bold-font\" style=\"cursor: pointer;\" data-teamid=\"6\">\n                  <div class=\"team-menu-logo\">\n                    <div\n                      class=\"team-menu-williams team-menu-williams-replace changable-team-menu-williams williamslogo-replace\">\n                    </div>\n                  </div>\n                  <div class=\"team-menu-name williams-name\">\n                    WILLIAMS\n                  </div>\n                </a>\n                <a class=\"redesigned-dropdown-item bold-font\" style=\"cursor: pointer;\" data-teamid=\"7\">\n                  <div class=\"team-menu-logo\">\n                    <img src=\"../assets/images/logos/haas.png\"\n                      class=\"team-menu-haas team-menu-haas-replace changable-team-menu-haas haaslogo-replace\">\n                  </div>\n                  <div class=\"team-menu-name haas-name\">\n                    HAAS\n                  </div>\n                </a>\n                <a class=\"redesigned-dropdown-item bold-font\" style=\"cursor: pointer;\" data-teamid=\"8\">\n                  <div class=\"team-menu-logo\">\n                    <div class=\"alphatauri-logo-container\">\n                      <div\n                        class=\"atlogo-replace alphataurilogo team-menu-alphatauri-replace changable-team-menu-alphatauri\">\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"team-menu-name at-name\">\n                    ALPHA TAURI\n                  </div>\n                </a>\n                <a class=\"redesigned-dropdown-item bold-font\" style=\"cursor: pointer;\" data-teamid=\"9\">\n                  <div class=\"team-menu-logo\">\n                    <img src=\"../assets/images/logos/alfaromeo.png\"\n                      class=\"alfalogo-replace alfalogo team-menu-alfa-replace changable-team-menu-alfa\">\n                  </div>\n                  <div class=\"team-menu-name alfa-name\">\n                    ALFA ROMEO\n                  </div>\n                </a>\n                <a class=\"redesigned-dropdown-item bold-font\" style=\"cursor: pointer;\" data-teamid=\"10\">\n                  <div class=\"team-menu-logo\">\n                    <img src=\"../assets/images/logos/astonMartin.png\"\n                      class=\"team-menu-aston team-menu-aston-replace changable-team-menu-aston astonlogo astonlogo-replace\">\n                  </div>\n                  <div class=\"team-menu-name aston-name\" style=\"margin-right: 5px;\">\n                    ASTON MARTIN\n                  </div>\n                </a>\n                <a class=\"redesigned-dropdown-item bold-font\" style=\"cursor: pointer;\" data-teamid=\"32\"\n                  id=\"customTeamDropdown\">\n                  <div class=\"team-menu-logo\">\n                    <img src=\"../assets/images/logos/placeholder.png\" class=\"team-menu-custom  custom-replace\">\n                  </div>\n                  <div class=\"team-menu-name ct-replace\" style=\"margin-right: 8px;\">\n                    CUSTOM TEAM\n                  </div>\n                </a>\n              </ul>\n            </div>\n          </div>\n          <div class=\"title bold-font\">\n            Team editor\n            <i class=\"info-titles bold-font\" id=\"teameditortinfo\" data-bs-toggle=\"modal\"\n              data-bs-target=\"#teammodal\">?</i>\n          </div>\n        </div>\n        <div class=\"main-viewer-section team-viewer d-none\">\n          <div id=\"viewer-first\">\n            <div class=\"component-and-title\">\n              <div class=\"component-title bold-font\">Objectives</div>\n              <div class=\"viewer-component\">\n                <div class=\"first-component\" id=\"seasonObjective\">\n                  <div class=\"bold-font\">Season Objective</div>\n                  <div class=\"input-and-buttons\">\n                    <input type=\"number\" class=\"custom-input-number\" id=\"seasonObjectiveInput\" value=\"4\"></input>\n                    <div class=\"input-buttons\">\n                      <i class=\"bi bi-plus new-augment-button\"></i>\n                      <i class=\"bi bi-dash new-augment-button\"></i>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"second-component\">\n                  <div class=\"bold-font\">Long-term Objective</div>\n                  <div id=\"objAndYear\">\n                    <div class=\"dropdown-global\">\n                      <button class=\"redesigned-dropdown\" id=\"objectiveButton\" aria-haspopup=\"true\"\n                        aria-expanded=\"false\">\n                        <span class=\"objective-label dropdown-label\">Constructor's champion</span>\n                        <i class=\"bi bi-chevron-down\"></i>\n                      </button>\n                      <ul class=\"redesigned-dropdown-menu\" id=\"objectiveMenu\" style=\"font-family: Formula1;\">\n                        <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" id=\"longTermObj0\">Constructor's champion</a>\n                        <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" id=\"longTermObj1\">Podium contender</a>\n                        <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" id=\"longTermObj2\">Points contender</a>\n                      </ul>\n                    </div>\n                    <div class=\"input-and-buttons\">\n                      <input type=\"number\" class=\"custom-input-number\" id=\"longTermInput\" value=\"2024\"></input>\n                      <div class=\"input-buttons\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                      </div>\n                    </div>\n\n                  </div>\n\n                </div>\n              </div>\n            </div>\n            <div class=\"component-and-title\">\n              <div class=\"component-title bold-font\">Economy</div>\n              <div class=\"viewer-component\">\n                <div class=\"first-component\" id=\"teamBudget\">\n                  <div class=\"bold-font\">Balance</div>\n                  <div class=\"input-and-buttons\">\n                    <div class=\"unit-and-input\">\n                      <span class=\"unit-label\">$</span>\n                      <input type=\"string\" class=\"custom-input-number\" id=\"teamBudgetInput\" value=\"40000000\"></input>\n                    </div>\n\n                    <div class=\"input-buttons\">\n                      <i class=\"bi bi-plus new-augment-button\"></i>\n                      <i class=\"bi bi-dash new-augment-button\"></i>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"second-component\" id=\"costCap\">\n                  <div class=\"bold-font\">Cost cap spent</div>\n                  <div class=\"input-and-buttons\">\n                    <div class=\"unit-and-input\">\n                      <span class=\"unit-label\">$</span>\n                      <input type=\"string\" class=\"custom-input-number\" id=\"costCapInput\" value=\"120000000\"></input>\n                    </div>\n                    <div class=\"input-buttons\">\n                      <i class=\"bi bi-plus new-augment-button\"></i>\n                      <i class=\"bi bi-dash new-augment-button\"></i>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n            <div class=\"component-and-title\">\n              <div class=\"component-title bold-font\">Others</div>\n              <div class=\"viewer-component\">\n                <div class=\"first-component\" id=\"engineSelector\">\n                  <div class=\"bold-font\">Engine</div>\n                  <div class=\"dropdown-global\">\n                    <button class=\"redesigned-dropdown\" id=\"engineButton\" aria-haspopup=\"true\" aria-expanded=\"false\"\n                      data-value=\"0\">\n                      <span class=\"objective-label dropdown-label\" id=\"engineLabel\">Engine</span>\n                      <i class=\"bi bi-chevron-down\"></i>\n                    </button>\n                    <ul class=\"redesigned-dropdown-menu\" id=\"engineMenu\" style=\"font-family: Formula1;\">\n                      <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" data-engine=\"1\">Ferrari</a>\n                      <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" data-engine=\"4\">Red Bull\n                        Powertrains</a>\n                      <a class=\"redesigned-dropdown-item\" style=\"cursor: pointer;\" data-engine=\"7\">Mercedes</a>\n                      <a class=\"redesigned-dropdown-item renault-engine-menu-item\" style=\"cursor: pointer;\"\n                        data-engine=\"10\">Renault</a>\n                    </ul>\n                  </div>\n                </div>\n                <div class=\"second-component\" id=\"confidence\">\n                  <div class=\"bold-font\">Board confidence</div>\n                  <div class=\"input-and-buttons\">\n                    <input type=\"number\" class=\"custom-input-number\" id=\"confidenceInput\" value=\"48\"></input>\n                    <div class=\"input-buttons\">\n                      <i class=\"bi bi-plus new-augment-button\"></i>\n                      <i class=\"bi bi-dash new-augment-button\"></i>\n                    </div>\n                  </div>\n                </div>\n\n              </div>\n            </div>\n\n            <div class=\"component-and-title\">\n              <div class=\"component-title bold-font\">Pit crew</div>\n              <div class=\"pit-crew-details\">\n                <div class=\"pit-crew-group\">\n                  <div class=\"one-stat-panel\" data-crewStat=\"32\">\n                    <div class=\"name-and-stat\">\n                      <span class=\"bold-font\">Jacks</span>\n                      <div class=\"stat-number\">\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                        <input type=\"text\" class=\"custom-input-number\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                      </div>\n                    </div>\n                    <div class=\"bar-container\">\n                      <div class=\"one-stat-bar\">\n                        <div class=\"one-stat-progress\"></div>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"one-stat-panel pit-crew-middle\" data-crewStat=\"34\">\n                    <div class=\"name-and-stat\">\n                      <span class=\"bold-font\">Wing replace</span>\n                      <div class=\"stat-number\">\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                        <input type=\"text\" class=\"custom-input-number\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                      </div>\n                    </div>\n                    <div class=\"bar-container\">\n                      <div class=\"one-stat-bar\">\n                        <div class=\"one-stat-progress\"></div>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"one-stat-panel\" data-crewStat=\"35\">\n                    <div class=\"name-and-stat\">\n                      <span class=\"bold-font\">Car release</span>\n                      <div class=\"stat-number\">\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                        <input type=\"text\" class=\"custom-input-number\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                      </div>\n                    </div>\n                    <div class=\"bar-container\">\n                      <div class=\"one-stat-bar\">\n                        <div class=\"one-stat-progress\"></div>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"pit-crew-group mt-1\">\n                  <div class=\"one-stat-panel\" data-crewStat=\"36\">\n                    <div class=\"name-and-stat\">\n                      <span class=\"bold-font\">Speed</span>\n                      <div class=\"stat-number\">\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                        <input type=\"text\" class=\"custom-input-number\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                      </div>\n                    </div>\n                    <div class=\"bar-container\">\n                      <div class=\"one-stat-bar\">\n                        <div class=\"one-stat-progress\"></div>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"one-stat-panel pit-crew-middle\" data-crewStat=\"38\">\n                    <div class=\"name-and-stat\">\n                      <span class=\"bold-font\">Fatigue</span>\n                      <div class=\"stat-number\">\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                        <input type=\"text\" class=\"custom-input-number\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                      </div>\n                    </div>\n                    <div class=\"bar-container\">\n                      <div class=\"one-stat-bar\">\n                        <div class=\"one-stat-progress\"></div>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"one-stat-panel\" data-crewStat=\"39\">\n                    <div class=\"name-and-stat\">\n                      <span class=\"bold-font\">Car build</span>\n                      <div class=\"stat-number\">\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                        <input type=\"text\" class=\"custom-input-number\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                      </div>\n                    </div>\n                    <div class=\"bar-container\">\n                      <div class=\"one-stat-bar\">\n                        <div class=\"one-stat-progress\"></div>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"pit-crew-group mt-1\">\n                  <div class=\"one-stat-panel\" data-crewStat=\"40\">\n                    <div class=\"name-and-stat\">\n                      <span class=\"bold-font\">Wheel gun</span>\n                      <div class=\"stat-number\">\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                        <input type=\"text\" class=\"custom-input-number\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                      </div>\n                    </div>\n                    <div class=\"bar-container\">\n                      <div class=\"one-stat-bar\">\n                        <div class=\"one-stat-progress\"></div>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"one-stat-panel pit-crew-middle\" data-crewStat=\"41\">\n                    <div class=\"name-and-stat\">\n                      <span class=\"bold-font\">Tyres off</span>\n                      <div class=\"stat-number\">\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                        <input type=\"text\" class=\"custom-input-number\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                      </div>\n                    </div>\n                    <div class=\"bar-container\">\n                      <div class=\"one-stat-bar\">\n                        <div class=\"one-stat-progress\"></div>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"one-stat-panel\" data-crewStat=\"42\">\n                    <div class=\"name-and-stat\">\n                      <span class=\"bold-font\">Tyres on</span>\n                      <div class=\"stat-number\">\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                        <input type=\"text\" class=\"custom-input-number\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                      </div>\n                    </div>\n                    <div class=\"bar-container\">\n                      <div class=\"one-stat-bar\">\n                        <div class=\"one-stat-progress\"></div>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n\n          </div>\n          <div class=\"team-separator\"></div>\n          <div id=\"viewer-second\">\n            <div class=\"facility-component-lg\">\n              <div class=\"main-second-viewer\">\n                <div class=\"facility-group show\" id=\"carDevCollapse\">\n                  <div class=\"group-title component-title bold-font\">Car Development</div>\n                  <div class=\"facility \" id=\"facility3\">\n                    <div class=\"facility-name\">Factory</div>\n                    <i class=\"bi bi-chevron-left new-augment-button\"></i>\n                    <div class=\"facility-level-indicator\" data-value=\"3\">\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                    </div>\n                    <i class=\"bi bi-chevron-right new-augment-button\"></i>\n                    <div class=\"stats-header-separator\"></div>\n                    <div class=\"gauge-and-buttons\">\n                      <div class=\"gauge-container\" style=\"--perc: 0\">\n                        <svg class=\"gauge-svg\" viewBox=\"0 0 100 100\">\n                          <circle class=\"gauge-circle gauge-bg\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <circle class=\"gauge-circle gauge-progress\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <span class=\"gauge-indicator\">50%</span>\n                        </svg>\n                      </div>\n                      <div class=\"input-buttons\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"facility \" id=\"facility2\">\n                    <div class=\"facility-name\">Design centre</div>\n                    <i class=\"bi bi-chevron-left new-augment-button\"></i>\n                    <div class=\"facility-level-indicator\" data-value=\"3\">\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                    </div>\n                    <i class=\"bi bi-chevron-right new-augment-button\"></i>\n                    <div class=\"stats-header-separator\"></div>\n                    <div class=\"gauge-and-buttons\">\n                      <div class=\"gauge-container\" style=\"--perc: 0\">\n                        <svg class=\"gauge-svg\" viewBox=\"0 0 100 100\">\n                          <circle class=\"gauge-circle gauge-bg\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <circle class=\"gauge-circle gauge-progress\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <span class=\"gauge-indicator\">50%</span>\n                        </svg>\n                      </div>\n                      <div class=\"input-buttons\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"facility \" id=\"facility5\">\n                    <div class=\"facility-name\">Wind tunnel</div>\n                    <i class=\"bi bi-chevron-left new-augment-button\"></i>\n                    <div class=\"facility-level-indicator\" data-value=\"3\">\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                    </div>\n                    <i class=\"bi bi-chevron-right new-augment-button\"></i>\n                    <div class=\"stats-header-separator\"></div>\n                    <div class=\"gauge-and-buttons\">\n                      <div class=\"gauge-container\" style=\"--perc: 0\">\n                        <svg class=\"gauge-svg\" viewBox=\"0 0 100 100\">\n                          <circle class=\"gauge-circle gauge-bg\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <circle class=\"gauge-circle gauge-progress\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <span class=\"gauge-indicator\">50%</span>\n                        </svg>\n                      </div>\n                      <div class=\"input-buttons\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"facility \" id=\"facility6\">\n                    <div class=\"facility-name\">CFD simulator</div>\n                    <i class=\"bi bi-chevron-left new-augment-button\"></i>\n                    <div class=\"facility-level-indicator\" data-value=\"3\">\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                    </div>\n                    <i class=\"bi bi-chevron-right new-augment-button\"></i>\n                    <div class=\"stats-header-separator\"></div>\n                    <div class=\"gauge-and-buttons\">\n                      <div class=\"gauge-container\" style=\"--perc: 0\">\n                        <svg class=\"gauge-svg\" viewBox=\"0 0 100 100\">\n                          <circle class=\"gauge-circle gauge-bg\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <circle class=\"gauge-circle gauge-progress\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <span class=\"gauge-indicator\">50%</span>\n                        </svg>\n                      </div>\n                      <div class=\"input-buttons\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"facility \" id=\"facility7\">\n                    <div class=\"facility-name\">Suspension simulator</div>\n                    <i class=\"bi bi-chevron-left new-augment-button\"></i>\n                    <div class=\"facility-level-indicator\" data-value=\"3\">\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                    </div>\n                    <i class=\"bi bi-chevron-right new-augment-button\"></i>\n                    <div class=\"stats-header-separator\"></div>\n                    <div class=\"gauge-and-buttons\">\n                      <div class=\"gauge-container\" style=\"--perc: 0\">\n                        <svg class=\"gauge-svg\" viewBox=\"0 0 100 100\">\n                          <circle class=\"gauge-circle gauge-bg\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <circle class=\"gauge-circle gauge-progress\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <span class=\"gauge-indicator\">50%</span>\n                        </svg>\n                      </div>\n                      <div class=\"input-buttons\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"facility \" id=\"facility8\">\n                    <div class=\"facility-name\">Car part test centre</div>\n                    <i class=\"bi bi-chevron-left new-augment-button\"></i>\n                    <div class=\"facility-level-indicator\" data-value=\"3\">\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                    </div>\n                    <i class=\"bi bi-chevron-right new-augment-button\"></i>\n                    <div class=\"stats-header-separator\"></div>\n                    <div class=\"gauge-and-buttons\">\n                      <div class=\"gauge-container\" style=\"--perc: 0\">\n                        <svg class=\"gauge-svg\" viewBox=\"0 0 100 100\">\n                          <circle class=\"gauge-circle gauge-bg\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <circle class=\"gauge-circle gauge-progress\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <span class=\"gauge-indicator\">50%</span>\n                        </svg>\n                      </div>\n                      <div class=\"input-buttons\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"facility-group\" id=\"operationCollapse\">\n                  <div class=\"group-title component-title bold-font\">Operations</div>\n                  <div class=\"facility \" id=\"facility15\">\n                    <div class=\"facility-name\">Board room</div>\n                    <i class=\"bi bi-chevron-left new-augment-button\"></i>\n                    <div class=\"facility-level-indicator\" data-value=\"3\">\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                    </div>\n                    <i class=\"bi bi-chevron-right new-augment-button\"></i>\n                    <div class=\"stats-header-separator\"></div>\n                    <div class=\"gauge-and-buttons\">\n                      <div class=\"gauge-container\" style=\"--perc: 0\">\n                        <svg class=\"gauge-svg\" viewBox=\"0 0 100 100\">\n                          <circle class=\"gauge-circle gauge-bg\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <circle class=\"gauge-circle gauge-progress\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <span class=\"gauge-indicator\">50%</span>\n                        </svg>\n                      </div>\n                      <div class=\"input-buttons\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"facility \" id=\"facility13\">\n                    <div class=\"facility-name\">Hospitality centre</div>\n                    <i class=\"bi bi-chevron-left new-augment-button\"></i>\n                    <div class=\"facility-level-indicator\" data-value=\"3\">\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                    </div>\n                    <i class=\"bi bi-chevron-right new-augment-button\"></i>\n                    <div class=\"stats-header-separator\"></div>\n                    <div class=\"gauge-and-buttons\">\n                      <div class=\"gauge-container\" style=\"--perc: 0\">\n                        <svg class=\"gauge-svg\" viewBox=\"0 0 100 100\">\n                          <circle class=\"gauge-circle gauge-bg\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <circle class=\"gauge-circle gauge-progress\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <span class=\"gauge-indicator\">50%</span>\n                        </svg>\n                      </div>\n                      <div class=\"input-buttons\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"facility \" id=\"facility1\">\n                    <div class=\"facility-name\">Weather centre</div>\n                    <i class=\"bi bi-chevron-left new-augment-button\"></i>\n                    <div class=\"facility-level-indicator\" data-value=\"3\">\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                    </div>\n                    <i class=\"bi bi-chevron-right new-augment-button\"></i>\n                    <div class=\"stats-header-separator\"></div>\n                    <div class=\"gauge-and-buttons\">\n                      <div class=\"gauge-container\" style=\"--perc: 0\">\n                        <svg class=\"gauge-svg\" viewBox=\"0 0 100 100\">\n                          <circle class=\"gauge-circle gauge-bg\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <circle class=\"gauge-circle gauge-progress\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <span class=\"gauge-indicator\">50%</span>\n                        </svg>\n                      </div>\n                      <div class=\"input-buttons\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"facility \" id=\"facility10\">\n                    <div class=\"facility-name\">Helipad</div>\n                    <i class=\"bi bi-chevron-left new-augment-button\"></i>\n                    <div class=\"facility-level-indicator\" data-value=\"3\">\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                    </div>\n                    <i class=\"bi bi-chevron-right new-augment-button\"></i>\n                    <div class=\"stats-header-separator\"></div>\n                    <div class=\"gauge-and-buttons\">\n                      <div class=\"gauge-container\" style=\"--perc: 0\">\n                        <svg class=\"gauge-svg\" viewBox=\"0 0 100 100\">\n                          <circle class=\"gauge-circle gauge-bg\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <circle class=\"gauge-circle gauge-progress\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <span class=\"gauge-indicator\">50%</span>\n                        </svg>\n                      </div>\n                      <div class=\"input-buttons\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"facility \" id=\"facility11\">\n                    <div class=\"facility-name\">Memorabilia Room</div>\n                    <i class=\"bi bi-chevron-left new-augment-button\"></i>\n                    <div class=\"facility-level-indicator\" data-value=\"3\">\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                    </div>\n                    <i class=\"bi bi-chevron-right new-augment-button\"></i>\n                    <div class=\"stats-header-separator\"></div>\n                    <div class=\"gauge-and-buttons\">\n                      <div class=\"gauge-container\" style=\"--perc: 0\">\n                        <svg class=\"gauge-svg\" viewBox=\"0 0 100 100\">\n                          <circle class=\"gauge-circle gauge-bg\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <circle class=\"gauge-circle gauge-progress\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <span class=\"gauge-indicator\">50%</span>\n                        </svg>\n                      </div>\n                      <div class=\"input-buttons\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"facility\" id=\"facility12\">\n                    <div class=\"facility-name\">Tour centre</div>\n                    <i class=\"bi bi-chevron-left new-augment-button\"></i>\n                    <div class=\"facility-level-indicator\" data-value=\"3\">\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                    </div>\n                    <i class=\"bi bi-chevron-right new-augment-button\"></i>\n                    <div class=\"stats-header-separator\"></div>\n                    <div class=\"gauge-and-buttons\">\n                      <div class=\"gauge-container\" style=\"--perc: 0\">\n                        <svg class=\"gauge-svg\" viewBox=\"0 0 100 100\">\n                          <circle class=\"gauge-circle gauge-bg\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <circle class=\"gauge-circle gauge-progress\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <span class=\"gauge-indicator\">50%</span>\n                        </svg>\n                      </div>\n                      <div class=\"input-buttons\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"facility-group\" id=\"staffCollapse\">\n                  <div class=\"group-title component-title bold-font\">Staff Facilities</div>\n                  <div class=\"facility \" id=\"facility9\">\n                    <div class=\"facility-name\">Team hub</div>\n                    <i class=\"bi bi-chevron-left new-augment-button\"></i>\n                    <div class=\"facility-level-indicator\" data-value=\"3\">\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                    </div>\n                    <i class=\"bi bi-chevron-right new-augment-button\"></i>\n                    <div class=\"stats-header-separator\"></div>\n                    <div class=\"gauge-and-buttons\">\n                      <div class=\"gauge-container\" style=\"--perc: 0\">\n                        <svg class=\"gauge-svg\" viewBox=\"0 0 100 100\">\n                          <circle class=\"gauge-circle gauge-bg\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <circle class=\"gauge-circle gauge-progress\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <span class=\"gauge-indicator\">50%</span>\n                        </svg>\n                      </div>\n                      <div class=\"input-buttons\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"facility \" id=\"facility14\">\n                    <div class=\"facility-name\">Scouting department</div>\n                    <i class=\"bi bi-chevron-left new-augment-button\"></i>\n                    <div class=\"facility-level-indicator\" data-value=\"3\">\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                    </div>\n                    <i class=\"bi bi-chevron-right new-augment-button\"></i>\n                    <div class=\"stats-header-separator\"></div>\n                    <div class=\"gauge-and-buttons\">\n                      <div class=\"gauge-container\" style=\"--perc: 0\">\n                        <svg class=\"gauge-svg\" viewBox=\"0 0 100 100\">\n                          <circle class=\"gauge-circle gauge-bg\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <circle class=\"gauge-circle gauge-progress\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <span class=\"gauge-indicator\">50%</span>\n                        </svg>\n                      </div>\n                      <div class=\"input-buttons\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                      </div>\n                    </div>\n                  </div>\n                  <div class=\"facility \" id=\"facility4\">\n                    <div class=\"facility-name\">Race simulator</div>\n                    <i class=\"bi bi-chevron-left new-augment-button\"></i>\n                    <div class=\"facility-level-indicator\" data-value=\"3\">\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                      <div class=\"level\"></div>\n                    </div>\n                    <i class=\"bi bi-chevron-right new-augment-button\"></i>\n                    <div class=\"stats-header-separator\"></div>\n                    <div class=\"gauge-and-buttons\">\n                      <div class=\"gauge-container\" style=\"--perc: 0\">\n                        <svg class=\"gauge-svg\" viewBox=\"0 0 100 100\">\n                          <circle class=\"gauge-circle gauge-bg\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <circle class=\"gauge-circle gauge-progress\" cx=\"50\" cy=\"50\" r=\"45\"></circle>\n                          <span class=\"gauge-indicator\">50%</span>\n                        </svg>\n                      </div>\n                      <div class=\"input-buttons\">\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n\n        </div>\n      </div>\n      <div class=\"script-view hide unloaded\" id=\"custom_calendar\">\n        <div class=\"blocking-div d-none\" id=\"calendarBlockDiv\">\n          There is already a modified calendar or you already did the first race! Try again next season!\n        </div>\n        <div class=\"main-calendar\">\n          <div class=\"general-top-panel\">\n            <div class=\"title-buttons-left\">\n              <div class=\"dropdown-global\">\n                <button class=\"redesigned-dropdown bold-font\" id=\"addRaceButton\" data-bs-toggle=\"dropdown\"\n                  aria-haspopup=\"true\" aria-expanded=\"false\">\n                  <span class=\"dropdown-label\">Add race</span>\n                  <i class=\"redesigned-chevron\"></i>\n                </button>\n                <ul class=\"redesigned-dropdown-menu\" id=\"addTrackMenu\" style=\"font-family: Formula1;\">\n                </ul>\n              </div>\n              <div class=\"close-modal\" id=\"deleteTracks\">\n                Delete race\n              </div>\n            </div>\n            <div class=\"title bold-font\">\n              Calendar\n              <i class=\"info-titles bold-font\" id=\"calendarinfo\" data-bs-toggle=\"modal\"\n                data-bs-target=\"#calendarmodal\">?</i>\n            </div>\n          </div>\n          <div class=\"main-calendar-section\" id=\"officialCalendarList\">\n          </div>\n        </div>\n\n      </div>\n      <div class=\"script-view hide unloaded\" id=\"regulations\">\n        <div class=\"general-top-panel\">\n          <div class=\"title bold-font\">\n            Regulations\n          </div>\n        </div>\n\n        <div class=\"d-flex regulations-main\">\n          <div class=\"main-viewer-section small-regulations\">\n            <div class=\"viewer-details\">\n              <div class=\"viewer-title bold-font\">Sporting regulations</div>\n              <div class=\"viewer-element\">\n                <div class=\"viewer-element-name bold-font\">Cost cap</div>\n                <div class=\"input-and-buttons stat-number\">\n                  <div class=\"unit-and-input\">\n                    <span class=\"unit-label\">$</span>\n                    <input type=\"string\" class=\"custom-input-number\" id=\"regSpendingCap\"></input>\n                  </div>\n                  <div class=\"input-buttons\">\n                    <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                    <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  </div>\n                </div>\n              </div>\n\n              <div class=\"viewer-element\">\n                <div class=\"viewer-element-name bold-font\">Season engine limit</div>\n                <div class=\"input-and-buttons stat-number\">\n                  <input type=\"text\" class=\"custom-input-number\" id=\"regEngineLimit\">\n                  <div class=\"input-buttons\">\n                    <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                    <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  </div>\n                </div>\n              </div>\n\n              <div class=\"viewer-element\">\n                <div class=\"viewer-element-name bold-font\">Season ERS limit</div>\n                <div class=\"input-and-buttons stat-number\">\n                  <input type=\"text\" class=\"custom-input-number\" id=\"regErsLimit\">\n                  <div class=\"input-buttons\">\n                    <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                    <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  </div>\n                </div>\n              </div>\n\n              <div class=\"viewer-element\">\n                <div class=\"viewer-element-name bold-font\">Season gearbox limit</div>\n                <div class=\"input-and-buttons stat-number\">\n                  <input type=\"text\" class=\"custom-input-number\" id=\"regGearboxLimit\">\n                  <div class=\"input-buttons\">\n                    <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                    <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  </div>\n                </div>\n              </div>\n\n              <div class=\"viewer-element\">\n                <label class=\"viewer-element-name bold-font\" for=\"regDoubleLastRacePoints\">Double points for last\n                  race</label>\n                <div class=\"form-switch regulations-switch\">\n                  <input class=\"form-check-input custom-toggle\" type=\"checkbox\" role=\"switch\"\n                    id=\"regDoubleLastRacePoints\">\n                </div>\n              </div>\n              <div class=\"viewer-element\">\n                <label class=\"viewer-element-name bold-font\" for=\"regFastestLapBonusPoint\">1 point for fastest\n                  lap</label>\n                <div class=\"form-switch regulations-switch\">\n                  <input class=\"form-check-input custom-toggle\" type=\"checkbox\" role=\"switch\"\n                    id=\"regFastestLapBonusPoint\">\n                </div>\n              </div>\n              <div class=\"viewer-element\">\n                <label class=\"viewer-element-name bold-font\" for=\"regPolePositionBonusPoint\">1 point for pole\n                  position</label>\n                <div class=\"form-switch regulations-switch\">\n                  <input class=\"form-check-input custom-toggle\" type=\"checkbox\" role=\"switch\"\n                    id=\"regPolePositionBonusPoint\">\n                </div>\n              </div>\n            </div>\n          </div>\n\n          <div class=\"main-viewer-section points-and-cfd\">\n            <div class=\"regulations-panels\">\n              <div class=\"viewer-details\">\n                <div class=\"viewer-title-row\">\n                  <div class=\"viewer-title bold-font\">Points system</div>\n                  <div class=\"button-with-icon\" id=\"regCreatePointScheme\">\n                    <i class=\"bi bi-plus-circle\"></i>\n                    <span class=\"\">Create point system</span>\n                  </div>\n                </div>\n                <div class=\"dropdown-global\">\n                  <button class=\"redesigned-dropdown bold-font\" id=\"regPointSchemeButton\" aria-haspopup=\"true\"\n                    aria-expanded=\"false\">\n                    <span class=\"dropdown-label\">Point system</span>\n                    <i class=\"redesigned-chevron\"></i>\n                  </button>\n                  <ul class=\"redesigned-dropdown-menu\" id=\"regPointSchemeMenu\" style=\"font-family: Formula1;\"></ul>\n                </div>\n                <div class=\"viewer-element regulations-table-wrap\">\n                  <div class=\"regulations-grid regulations-grid-points\">\n                    <div class=\"regulations-grid-header\">\n                      <div class=\"regulations-colheader\">Pos</div>\n                      <div class=\"regulations-colheader points-header\">Points</div>\n                    </div>\n                    <div class=\"regulations-grid-body\" id=\"regPointSchemeBody\"></div>\n                  </div>\n                </div>\n              </div>\n\n              <div class=\"viewer-details\">\n                <div class=\"viewer-title-row\">\n                  <div class=\"viewer-title bold-font\">Wind tunnel &amp; CFD</div>\n                  <div class=\"button-with-icon\" id=\"regCreateResourcePackage\">\n                    <i class=\"bi bi-plus-circle\"></i>\n                    <span class=\"\">Create resource package</span>\n                  </div>\n                </div>\n                <div class=\"dropdown-global\">\n                  <button class=\"redesigned-dropdown bold-font\" id=\"regResourcePackageButton\" aria-haspopup=\"true\"\n                    aria-expanded=\"false\">\n                    <span class=\"dropdown-label\">Resource package</span>\n                    <i class=\"redesigned-chevron\"></i>\n                  </button>\n                  <ul class=\"redesigned-dropdown-menu\" id=\"regResourcePackageMenu\" style=\"font-family: Formula1;\"></ul>\n                </div>\n                <div class=\"viewer-element regulations-table-wrap\">\n                  <div class=\"regulations-grid regulations-grid-resources\">\n                    <div class=\"regulations-grid-header\">\n                      <div class=\"regulations-colheader\">Pos</div>\n                      <div class=\"regulations-colheader wind-tunnel-header\">Wind tunnel</div>\n                      <div class=\"regulations-colheader\">CFD</div>\n                    </div>\n                    <div class=\"regulations-grid-body\" id=\"regResourcePackageBody\"></div>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class=\"script-view hide unloaded\" id=\"car_performance\">\n        <div class=\"general-top-panel\">\n          <div class=\"title-buttons-left\" id=\"carAttributeSelector\">\n            <div class=\"dropdown-global\">\n              <button class=\"redesigned-dropdown bold-font\" id=\"attributeButton\" aria-haspopup=\"true\"\n                aria-expanded=\"false\">\n                <span class=\"dropdown-label\">Overall</span>\n                <i class=\"redesigned-chevron\"></i>\n              </button>\n              <ul class=\"redesigned-dropdown-menu\" id=\"attributeMenu\" style=\"font-family: Formula1;\">\n                <a class=\"redesigned-dropdown-item\" data-attribute=\"top_speed\">Top speed</a>\n                <a class=\"redesigned-dropdown-item\" data-attribute=\"acceleration\">Acceleration</a>\n                <a class=\"redesigned-dropdown-item\" data-attribute=\"low_speed\">Low speed</a>\n                <a class=\"redesigned-dropdown-item\" data-attribute=\"medium_speed\">Medium speed</a>\n                <a class=\"redesigned-dropdown-item\" data-attribute=\"high_speed\">High speed</a>\n                <a class=\"redesigned-dropdown-item\" data-attribute=\"drs\">DRS Effectiveness</a>\n                <a class=\"redesigned-dropdown-item\" data-attribute=\"dirty_air\">Dirty air tolerance</a>\n                <a class=\"redesigned-dropdown-item brake-cooling-replace\" data-attribute=\"brake_cooling\">Brake\n                  cooling</a>\n                <a class=\"redesigned-dropdown-item\" data-attribute=\"engine_cooling\">Engine cooling</a>\n                <a class=\"redesigned-dropdown-item\" data-attribute=\"overall\">Overall</a>\n              </ul>\n            </div>\n            <div class=\"button-with-icon\" id=\"teamsCarsButton\" data-value=\"teams\">\n              <i class=\"bi bi-people-fill\"></i>\n              <span>Teams</span>\n            </div>\n            <div class=\"button-with-icon active\" id=\"performanceGraphButton\">\n              <i class=\"bi bi-graph-up\"></i>\n              <span>Graph</span>\n            </div>\n            <div class=\"button-with-icon\" id=\"performanceExpertiseButton\" data-value=\"performance\">\n              <i class=\"bi bi-speedometer2\"></i>\n              <span>Performance</span>\n            </div>\n            <div class=\"fit-button d-none\" id=\"fitButton\">Fit latest designs</div>\n          </div>\n          <div class=\"title-buttons-left d-none\" id=\"customEnginesButtonContainer\">\n            <div class=\"button-with-icon\" id=\"customEngines\">\n              <i class=\"bi bi-plus-circle\"></i>\n              <span class=\"\">Add custom engine</span>\n            </div>\n          </div>\n          <div class=\"title-buttons-right\">\n            <div class=\"form-check annotations form-switch\">\n              <input class=\"form-check-input custom-toggle\" type=\"checkbox\" role=\"switch\"\n                id=\"performanceAnnotationsToggle\" checked>\n              <label class=\"form-check-label\" for=\"performanceAnnotationsToggle\">Annotations</label>\n            </div>\n            <ul class=\"nav nav-pills\">\n              <li class=\"nav-item\">\n                <a class=\"nav-link bold-font categoryPills generalPills active\" data-bs-toggle=\"pill\"\n                  data-section=\".teams-section\" id=\"teamsPill\">\n                  <div class=\"basic-label bold-font\">Teams</div>\n                  <div class=\"pill-line\"></div>\n                </a>\n              </li>\n              <li class=\"nav-item\">\n                <a class=\"nav-link bold-font categoryPills generalPills\" data-bs-toggle=\"pill\"\n                  data-section=\".engines-section\" id=\"enginesPill\">\n                  <div class=\"basic-label bold-font\">Engines</div>\n                  <div class=\"pill-line\"></div>\n                </a>\n              </li>\n            </ul>\n          </div>\n          <div class=\"title bold-font\">\n            Performance\n            <i class=\"info-titles bold-font\" id=\"perfoemanceinfo\" data-bs-toggle=\"modal\"\n              data-bs-target=\"#performancemodal\">?</i>\n          </div>\n        </div>\n        <div class=\"d-flex\" id=\"teamsPerformance\">\n          <div class=\"col-3\">\n            <div class=\"teams-engines\">\n              <div class=\"main-columns-drag-section main-resizable\" id=\"teamsDiv\">\n                <div class=\"number-and-team team bold-font team-performance rb-transparent rb-teamname\" data-teamid=\"3\"\n                  data-teamname=\"Red Bull\">\n                  <div class=\"team-number\">1</div>\n                  <div class=\"col main-car\">\n                    <div class=\"team-title\">\n                      <span class=\"team-title-name redbull-name\">RED BULL</span>\n                      <span class=\"team-title-value\"></span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress rb\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"number-and-team team bold-font team-performance fe-transparent\" data-teamid=\"1\"\n                  data-teamname=\"Ferrari\">\n                  <div class=\"team-number\">1</div>\n                  <div class=\"col main-car\">\n                    <div class=\"team-title\">\n                      <span class=\"team-title-name\">FERRARI</span>\n                      <span class=\"team-title-value\"></span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress fe\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"number-and-team team bold-font team-performance me-transparent\" data-teamid=\"4\"\n                  data-teamname=\"Mercedes\">\n                  <div class=\"team-number\">1</div>\n                  <div class=\"col main-car\">\n                    <div class=\"team-title\">\n                      <span class=\"team-title-name\">MERCEDES</span>\n                      <span class=\"team-title-value\"></span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress me\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"number-and-team team bold-font team-performance al-transparent\" data-teamid=\"5\"\n                  data-teamname=\"Alpine\" id=\"alpineTeam\">\n                  <div class=\"team-number\">1</div>\n                  <div class=\"col main-car\">\n                    <div class=\"team-title\">\n                      <span class=\"team-title-name alpine-name\">ALPINE</span>\n                      <span class=\"team-title-value\"></span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress al\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"number-and-team team bold-font team-performance mc-transparent\" data-teamid=\"2\"\n                  data-teamname=\"McLaren\">\n                  <div class=\"team-number\">1</div>\n                  <div class=\"col main-car\">\n                    <div class=\"team-title\">\n                      <span class=\"team-title-name\">MCLAREN</span>\n                      <span class=\"team-title-value\"></span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress mc\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"number-and-team team bold-font team-performance af-transparent\" data-teamid=\"9\"\n                  data-teamname=\"Alfa Romeo\">\n                  <div class=\"team-number\">1</div>\n                  <div class=\"col main-car\">\n                    <div class=\"team-title\">\n                      <span class=\"team-title-name alfa-name\">ALFA ROMEO</span>\n                      <span class=\"team-title-value\"></span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress af\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"number-and-team team bold-font team-performance as-transparent as-teamname\" data-teamid=\"10\"\n                  data-teamname=\"Aston Martin\">\n                  <div class=\"team-number\">1</div>\n                  <div class=\"col main-car\">\n                    <div class=\"team-title\">\n                      <span class=\"team-title-name aston-name\">ASTON MARTIN</span>\n                      <span class=\"team-title-value\"></span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress as\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"number-and-team team bold-font team-performance ha-transparent ha-teamname\" data-teamid=\"7\"\n                  data-teamname=\"Haas\" data-teamshow=\"Haas\">\n                  <div class=\"team-number\">1</div>\n                  <div class=\"col main-car\">\n                    <div class=\"team-title\">\n                      <span class=\"team-title-name haas-name\">HAAS</span>\n                      <span class=\"team-title-value\"></span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress ha\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"number-and-team team bold-font team-performance at-transparent\" data-teamid=\"8\"\n                  data-teamname=\"Alpha Tauri\" id=\"alphaTauriTeam\">\n                  <div class=\"team-number\">1</div>\n                  <div class=\"col main-car\">\n                    <div class=\"team-title\">\n                      <span class=\"team-title-name at-name complete\">ALPHA TAURI</span>\n                      <span class=\"team-title-value\"></span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress at\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"number-and-team team bold-font team-performance wi-transparent\" data-teamid=\"6\"\n                  data-teamname=\"Williams\">\n                  <div class=\"team-number\">1</div>\n                  <div class=\"col main-car\">\n                    <div class=\"team-title\">\n                      <span class=\"team-title-name williams-name\">WILLIAMS</span>\n                      <span class=\"team-title-value\"></span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress wi\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"number-and-team team bold-font team-performance ct-transparent\" data-teamid=\"32\"\n                  id=\"customTeamPerformance\" data-teamname=\"Custom Team\">\n                  <div class=\"team-number\">1</div>\n                  <div class=\"col main-car\">\n                    <div class=\"team-title\">\n                      <span class=\"team-title-name ct-replace\">CUSTOM TEAM</span>\n                      <span class=\"team-title-value\"></span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress ct\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n              </div>\n              <div class=\"main-columns-drag-section main-resizable d-none\" id=\"carsDiv\">\n                <div class=\"nunmber-and-car car bold-font car-performance rb-transparent rb-teamname\" data-teamid=\"3\"\n                  data-teamname=\"Red Bull\" data-teamshow=\"Red Bull\" data-carnumber=\"1\">\n                  <div class=\"performance-number\">1</div>\n                  <div class=\"col main-car\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name redbull-name\">Red Bull</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress rb\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"nunmber-and-car car bold-font car-performance rb-transparent rb-teamname\" data-teamid=\"3\"\n                  data-teamname=\"Red Bull\" data-teamshow=\"Red Bull\" data-carnumber=\"2\">\n                  <div class=\"performance-number\">2</div>\n                  <div class=\"col main-car\" data-teamid=\"3\" data-teamname=\"Red Bull\" data-teamshow=\"Red Bull\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name redbull-name\">Red Bull</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress rb\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"nunmber-and-car car bold-font car-performance fe-transparent\" data-teamid=\"1\"\n                  data-teamname=\"Ferrari\" data-teamshow=\"Ferrari\" data-carnumber=\"1\">\n                  <div class=\"performance-number\">1</div>\n                  <div class=\"col main-car\" data-teamid=\"1\" data-teamname=\"Ferrari\" data-teamshow=\"Ferrari\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name\">Ferrari</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress fe\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"nunmber-and-car car bold-font car-performance fe-transparent\" data-teamid=\"1\"\n                  data-teamname=\"Ferrari\" data-teamshow=\"Ferrari\" data-carnumber=\"2\">\n                  <div class=\"performance-number\">2</div>\n                  <div class=\"col main-car\" data-teamid=\"1\" data-teamname=\"Ferrari\" data-teamshow=\"Ferrari\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name\">Ferrari</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress fe\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"nunmber-and-car car bold-font car-performance mc-transparent\" data-teamid=\"2\"\n                  data-teamname=\"McLaren\" data-teamshow=\"McLaren\" data-carnumber=\"1\">\n                  <div class=\"performance-number\">1</div>\n                  <div class=\"col main-car\" data-teamid=\"2\" data-teamname=\"McLaren\" data-teamshow=\"McLaren\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name\">Mclaren</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress mc\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"nunmber-and-car car bold-font car-performance mc-transparent\" data-teamid=\"2\"\n                  data-teamname=\"McLaren\" data-teamshow=\"McLaren\" data-carnumber=\"2\">\n                  <div class=\"performance-number\">2</div>\n                  <div class=\"col main-car\" data-teamid=\"2\" data-teamname=\"McLaren\" data-teamshow=\"McLaren\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name\">Mclaren</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress mc\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"nunmber-and-car car bold-font car-performance me-transparent\" data-teamid=\"4\"\n                  data-teamname=\"Mercedes\" data-teamshow=\"Mercedes\" data-carnumber=\"1\">\n                  <div class=\"performance-number\">1</div>\n                  <div class=\"col main-car\" data-teamid=\"4\" data-teamname=\"Mercedes\" data-teamshow=\"Mercedes\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name\">Mercedes</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress me\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"nunmber-and-car car bold-font car-performance me-transparent\" data-teamid=\"4\"\n                  data-teamname=\"Mercedes\" data-teamshow=\"Mercedes\" data-carnumber=\"2\">\n                  <div class=\"performance-number\">2</div>\n                  <div class=\"col main-car\" data-teamid=\"4\" data-teamname=\"Mercedes\" data-teamshow=\"Mercedes\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name\">Mercedes</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress me\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"nunmber-and-car car bold-font car-performance al-transparent al-teamname\" data-teamid=\"5\"\n                  data-teamname=\"Alpine\" data-teamshow=\"Alpine\" data-carnumber=\"1\">\n                  <div class=\"performance-number\">1</div>\n                  <div class=\"col main-car\" data-teamid=\"5\" data-teamname=\"Alpine\" data-teamshow=\"Alpine\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name alpine-name\">Alpine</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress al\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"nunmber-and-car car bold-font car-performance al-transparent al-teamname\" data-teamid=\"5\"\n                  data-teamname=\"Alpine\" data-teamshow=\"Alpine\" data-carnumber=\"2\">\n                  <div class=\"performance-number\">2</div>\n                  <div class=\"col main-car\" data-teamid=\"5\" data-teamname=\"Alpine\" data-teamshow=\"Alpine\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name alpine-name\">Alpine</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress al\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"nunmber-and-car car bold-font car-performance wi-transparent wi-teamname\" data-teamid=\"6\"\n                  data-teamname=\"Williams\" data-teamshow=\"Williams\" data-carnumber=\"1\">\n                  <div class=\"performance-number\">1</div>\n                  <div class=\"col main-car\" data-teamid=\"6\" data-teamname=\"Williams\" data-teamshow=\"Williams\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name williams-name\">Williams</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress wi\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"nunmber-and-car car bold-font car-performance wi-transparent wi-teamname\" data-teamid=\"6\"\n                  data-teamname=\"Williams\" data-teamshow=\"Williams\" data-carnumber=\"2\">\n                  <div class=\"performance-number\">2</div>\n                  <div class=\"col main-car\" data-teamid=\"6\" data-teamname=\"Williams\" data-teamshow=\"Williams\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name williams-name\">Williams</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress wi\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"nunmber-and-car car bold-font car-performance ha-transparent ha-teamname\" data-teamid=\"7\"\n                  data-teamname=\"Haas\" data-teamshow=\"Haas\" data-carnumber=\"1\">\n                  <div class=\"performance-number\">1</div>\n                  <div class=\"col main-car\" data-teamid=\"7\" data-teamname=\"Haas\" data-teamshow=\"Haas\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name haas-name\">Haas</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress ha\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"nunmber-and-car car bold-font car-performance ha-transparent ha-teamname\" data-teamid=\"7\"\n                  data-teamname=\"Haas\" data-teamshow=\"Haas\" data-carnumber=\"2\">\n                  <div class=\"performance-number\">2</div>\n                  <div class=\"col main-car\" data-teamid=\"7\" data-teamname=\"Haas\" data-teamshow=\"Haas\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name haas-name\">Haas</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress ha\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"nunmber-and-car car bold-font car-performance at-transparent at-teamname\" data-teamid=\"8\"\n                  data-teamname=\"Alpha Tauri\" data-teamshow=\"Alpha Tauri\" data-carnumber=\"1\">\n                  <div class=\"performance-number\">1</div>\n                  <div class=\"col main-car\" data-teamid=\"8\" data-teamname=\"Alpha Tauri\" data-teamshow=\"Alpha Tauri\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name at-name complete\">Alpha Tauri</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress at\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"nunmber-and-car car bold-font car-performance at-transparent at-teamname\" data-teamid=\"8\"\n                  data-teamname=\"Alpha Tauri\" data-teamshow=\"Alpha Tauri\" data-carnumber=\"2\">\n                  <div class=\"performance-number\">2</div>\n                  <div class=\"col main-car\" data-teamid=\"8\" data-teamname=\"Alpha Tauri\" data-teamshow=\"Alpha Tauri\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name at-name complete\">Alpha Tauri</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress at\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"nunmber-and-car car bold-font car-performance af-transparent af-teamname\" data-teamid=\"9\"\n                  data-teamname=\"Alfa Romeo\" data-teamshow=\"Alfa Romeo\" data-carnumber=\"1\">\n                  <div class=\"performance-number\">1</div>\n                  <div class=\"col main-car\" data-teamid=\"9\" data-teamname=\"Alfa Romeo\" data-teamshow=\"Alfa Romeo\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name alfa-name\">Alfa Romeo</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress af\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"nunmber-and-car car bold-font car-performance af-transparent af-teamname\" data-teamid=\"9\"\n                  data-teamname=\"Alfa Romeo\" data-teamshow=\"Alfa Romeo\" data-carnumber=\"2\">\n                  <div class=\"performance-number\">2</div>\n                  <div class=\"col main-car\" data-teamid=\"9\" data-teamname=\"Alfa Romeo\" data-teamshow=\"Alfa Romeo\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name alfa-name\">Alfa Romeo</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress af\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"nunmber-and-car car bold-font car-performance as-transparent as-teamname\" data-teamid=\"10\"\n                  data-teamname=\"Aston Martin\" data-teamshow=\"Aston Martin\" data-carnumber=\"1\">\n                  <div class=\"performance-number\">1</div>\n                  <div class=\"col main-car\" data-teamid=\"10\" data-teamname=\"Aston Martin\" data-teamshow=\"Aston Martin\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name aston-name\">Aston Martin</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress as\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"nunmber-and-car car bold-font car-performance as-transparent as-teamname\" data-teamid=\"10\"\n                  data-teamname=\"Aston Martin\" data-teamshow=\"Aston Martin\" data-carnumber=\"2\">\n                  <div class=\"performance-number\">2</div>\n                  <div class=\"col main-car\" data-teamid=\"10\" data-teamname=\"Aston Martin\" data-teamshow=\"Aston Martin\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name aston-name\">Aston Martin</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress as\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div\n                  class=\"nunmber-and-car car bold-font car-performance ct-transparent ct-teamname custom-car-performance\"\n                  data-teamid=\"32\" data-teamname=\"Custom Team\" data-teamshow=\"Custom Team\" data-carnumber=\"1\">\n                  <div class=\"performance-number\">1</div>\n                  <div class=\"col main-car\" data-teamid=\"32\" data-teamname=\"Custom Team\" data-teamshow=\"Custom Team\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name ct-replace\">Custom Team</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress ct\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n                <div\n                  class=\"nunmber-and-car car bold-font car-performance ct-transparent ct-teamname custom-car-performance\"\n                  data-teamid=\"32\" data-teamname=\"Custom Team\" data-teamshow=\"Custom Team\" data-carnumber=\"2\">\n                  <div class=\"performance-number\">2</div>\n                  <div class=\"col main-car\" data-teamid=\"32\" data-teamname=\"Custom Team\" data-teamshow=\"Custom Team\">\n                    <div class=\"car-title\">\n                      <span class=\"team-title-name ct-replace\">Custom Team</span>\n                      <span class=\"car-missing-parts\">\n                        <span class=\"value\"></span>\n                      </span>\n                    </div>\n                    <div class=\"performance-bar\">\n                      <div class=\"performance-bar-progress ct\" data-overall=\"0\" data-top_speed=\"0\" data-acceleration=\"0\"\n                        data-low_speed=\"0\" data-medium_speed=\"0\" data-high_speed=\"0\" data-brake_cooling=\"0\"\n                        data-engine_cooling=\"0\"></div>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n          <div class=\"col-9\">\n            <div class=\"main-columns-drag-section performance-section d-flex main-resizable\">\n              <canvas class=\"graphs\" id=\"performanceGraph\"></canvas>\n              <div class=\"performance-show teams-show d-none\">\n                <div class=\"part-performance\" data-new=\"0\" data-part=\"chassis\" data-partid=\"3\">\n                  <div class=\"part-performance-title\">\n                    <div class=\"arrows\">\n                      <i class=\"bi bi-chevron-up new-augment-button\"></i>\n                      <i class=\"bi bi-chevron-down new-augment-button\"></i>\n                    </div>\n                    <div class=\"part-name-buttons\">\n                      <span>Chasis</span>\n                      <span class=\"part-subtitle\"></span>\n                      <div class=\"part-buttons\">\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                      </div>\n                    </div>\n                    <i class=\"redesigned-chevron\"></i>\n                  </div>\n                  <div class=\"parts-list\" id=\"chasisList\">\n                  </div>\n                  <div class=\"part-performance-stats\">\n                    <div class=\"part-stats\">\n                      <div class=\"part-performance-stat\" data-attribute=\"4\">\n                        <div class=\"part-performance-stat-title\">Drag reduction <span\n                            class=\"unit-measure bold-font\">%</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"0\" max=\"100\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"5\">\n                        <div class=\"part-performance-stat-title\">Engine cooling <span\n                            class=\"unit-measure bold-font\">%</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"0\" max=\"100\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"13\">\n                        <div class=\"part-performance-stat-title\">Airflow middle <span\n                            class=\"unit-measure bold-font\">%</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"0\" max=\"100\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"3\" id=\"drs24\">\n                        <div class=\"part-performance-stat-title\">DRS Delta <span class=\"unit-measure bold-font\">%</span>\n                        </div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"0\" max=\"100\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"part-performance\" data-new=\"0\" data-part=\"front_wing\" data-partid=\"4\">\n                  <div class=\"part-performance-title\">\n                    <div class=\"arrows\">\n                      <i class=\"bi bi-chevron-up new-augment-button\"></i>\n                      <i class=\"bi bi-chevron-down new-augment-button\"></i>\n                    </div>\n                    <div class=\"part-name-buttons\">\n                      <span>Front wing</span>\n                      <span class=\"part-subtitle\"></span>\n                      <div class=\"part-buttons\">\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                      </div>\n                    </div>\n                    <i class=\"redesigned-chevron\"></i>\n                  </div>\n                  <div class=\"parts-list\" id=\"frontList\">\n                  </div>\n                  <div class=\"part-performance-stats\">\n                    <div class=\"part-stats\">\n                      <div class=\"part-performance-stat\" data-attribute=\"0\">\n                        <div class=\"part-performance-stat-title\">Airflow front <span\n                            class=\"unit-measure bold-font\">%</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"0\" max=\"100\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"1\">\n                        <div class=\"part-performance-stat-title\">Airflow sensitivity <span\n                            class=\"unit-measure bold-font\">%</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"0\" max=\"100\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"2\">\n                        <div class=\"part-performance-stat-title brake-cooling-replace\">Brake cooling <span\n                            class=\"unit-measure bold-font\">%</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"0\" max=\"100\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"7\">\n                        <div class=\"part-performance-stat-title\">Low speed downforce <span\n                            class=\"unit-measure bold-font\">kN</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"3\" max=\"5\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"8\">\n                        <div class=\"part-performance-stat-title\">Medium speed downforce <span\n                            class=\"unit-measure bold-font\">kN</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"5\" max=\"7\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"9\">\n                        <div class=\"part-performance-stat-title\">High speed downforce <span\n                            class=\"unit-measure bold-font\">kN</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"7\" max=\"8\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"part-performance\" data-new=\"0\" data-part=\"rear_wing\" data-partid=\"5\">\n                  <div class=\"part-performance-title\">\n                    <div class=\"arrows\">\n                      <i class=\"bi bi-chevron-up new-augment-button\"></i>\n                      <i class=\"bi bi-chevron-down new-augment-button\"></i>\n                    </div>\n                    <div class=\"part-name-buttons\">\n                      <span>Rear wing</span>\n                      <span class=\"part-subtitle\"></span>\n                      <div class=\"part-buttons\">\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                      </div>\n                    </div>\n                    <i class=\"redesigned-chevron\"></i>\n                  </div>\n                  <div class=\"parts-list\" id=\"rearList\">\n                  </div>\n                  <div class=\"part-performance-stats\">\n                    <div class=\"part-stats\">\n                      <div class=\"part-performance-stat\" data-attribute=\"1\">\n                        <div class=\"part-performance-stat-title\">Airflow sensitivity <span\n                            class=\"unit-measure bold-font\">%</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"0\" max=\"100\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"3\">\n                        <div class=\"part-performance-stat-title\">DRS Delta <span class=\"unit-measure bold-font\">%</span>\n                        </div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"0\" max=\"100\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"4\">\n                        <div class=\"part-performance-stat-title\">Drag reduction <span\n                            class=\"unit-measure bold-font\">%</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"7\">\n                        <div class=\"part-performance-stat-title\">Low speed downforce <span\n                            class=\"unit-measure bold-font\">kN</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"3\" max=\"5\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"8\">\n                        <div class=\"part-performance-stat-title\">Medium speed downforce <span\n                            class=\"unit-measure bold-font\">kN</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"5\" max=\"7\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"9\">\n                        <div class=\"part-performance-stat-title\">High speed downforce <span\n                            class=\"unit-measure bold-font\">kN</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"7\" max=\"8\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"part-performance\" data-new=\"0\" data-part=\"sidepods\" data-partid=\"6\">\n                  <div class=\"part-performance-title\">\n                    <div class=\"arrows\">\n                      <i class=\"bi bi-chevron-up new-augment-button\"></i>\n                      <i class=\"bi bi-chevron-down new-augment-button\"></i>\n                    </div>\n                    <div class=\"part-name-buttons\">\n                      <span>Sidepods</span>\n                      <span class=\"part-subtitle\"></span>\n                      <div class=\"part-buttons\">\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                      </div>\n                    </div>\n                    <i class=\"redesigned-chevron\"></i>\n                  </div>\n                  <div class=\"parts-list\" id=\"sidepodsList\">\n                  </div>\n                  <div class=\"part-performance-stats\">\n                    <div class=\"part-stats\">\n                      <div class=\"part-performance-stat\" data-attribute=\"0\">\n                        <div class=\"part-performance-stat-title\">Airflow front <span\n                            class=\"unit-measure bold-font\">%</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"0\" max=\"100\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"4\">\n                        <div class=\"part-performance-stat-title\">Drag reduction <span\n                            class=\"unit-measure bold-font\">%</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"0\" max=\"100\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"5\">\n                        <div class=\"part-performance-stat-title\">Engine cooling <span\n                            class=\"unit-measure bold-font\">%</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"0\" max=\"100\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"13\">\n                        <div class=\"part-performance-stat-title\">Airflow middle <span\n                            class=\"unit-measure bold-font\">%</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"0\" max=\"100\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"part-performance\" data-new=\"0\" data-part=\"underfloor\" data-partid=\"7\">\n                  <div class=\"part-performance-title\">\n                    <div class=\"arrows\">\n                      <i class=\"bi bi-chevron-up new-augment-button\"></i>\n                      <i class=\"bi bi-chevron-down new-augment-button\"></i>\n                    </div>\n                    <div class=\"part-name-buttons\">\n                      <span>Underfloor</span>\n                      <span class=\"part-subtitle\"></span>\n                      <div class=\"part-buttons\">\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                      </div>\n                    </div>\n                    <i class=\"redesigned-chevron\"></i>\n                  </div>\n                  <div class=\"parts-list\" id=\"underList\">\n                  </div>\n                  <div class=\"part-performance-stats\">\n                    <div class=\"part-stats\">\n                      <div class=\"part-performance-stat\" data-attribute=\"1\">\n                        <div class=\"part-performance-stat-title\">Airflow sensitivity <span\n                            class=\"unit-measure bold-font\">%</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"0\" max=\"100\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"4\">\n                        <div class=\"part-performance-stat-title\">Drag reduction <span\n                            class=\"unit-measure bold-font\">%</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"0\" max=\"100\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"7\">\n                        <div class=\"part-performance-stat-title\">Low speed downforce <span\n                            class=\"unit-measure bold-font\">kN</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"3\" max=\"5\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"8\">\n                        <div class=\"part-performance-stat-title\">Medium speed downforce <span\n                            class=\"unit-measure bold-font\">kN</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"5\" max=\"7\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"9\">\n                        <div class=\"part-performance-stat-title\">High speed downforce <span\n                            class=\"unit-measure bold-font\">kN</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"7\" max=\"8\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n                <div class=\"part-performance\" data-new=\"0\" data-part=\"suspension\" data-partid=\"8\">\n                  <div class=\"part-performance-title\">\n                    <div class=\"arrows\">\n                      <i class=\"bi bi-chevron-up new-augment-button\"></i>\n                      <i class=\"bi bi-chevron-down new-augment-button\"></i>\n                    </div>\n                    <div class=\"part-name-buttons\">\n                      <span>Suspension</span>\n                      <span class=\"part-subtitle\"></span>\n                      <div class=\"part-buttons\">\n                        <i class=\"bi bi-dash new-augment-button\"></i>\n                        <i class=\"bi bi-plus new-augment-button\"></i>\n                      </div>\n                    </div>\n                    <i class=\"redesigned-chevron\"></i>\n                  </div>\n                  <div class=\"parts-list\" id=\"suspensionList\">\n                  </div>\n                  <div class=\"part-performance-stats\">\n                    <div class=\"part-stats\">\n                      <div class=\"part-performance-stat\" data-attribute=\"0\">\n                        <div class=\"part-performance-stat-title\">Airflow front <span\n                            class=\"unit-measure bold-font\">%</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"0\" max=\"100\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"2\">\n                        <div class=\"part-performance-stat-title brake-cooling-replace\">Brake cooling <span\n                            class=\"unit-measure bold-font\">%</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"0\" max=\"100\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"4\">\n                        <div class=\"part-performance-stat-title\">Drag reduction <span\n                            class=\"unit-measure bold-font\">%</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"0\" max=\"100\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"7\">\n                        <div class=\"part-performance-stat-title\">Low speed downforce <span\n                            class=\"unit-measure bold-font\">kN</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"3\" max=\"5\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"8\">\n                        <div class=\"part-performance-stat-title\">Medium speed downforce <span\n                            class=\"unit-measure bold-font\">kN</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"5\" max=\"7\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                      <div class=\"part-performance-stat\" data-attribute=\"9\">\n                        <div class=\"part-performance-stat-title\">High speed downforce <span\n                            class=\"unit-measure bold-font\">kN</span></div>\n                        <div class=\"stat-number\">\n                          <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                          <input type=\"text\" class=\"custom-input-number\" min=\"7\" max=\"8\">\n                          <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n              </div>\n              <div class=\"performance-show overview-show d-none\" id=\"performanceOverview\"></div>\n            </div>\n          </div>\n        </div>\n        <div class=\"main-columns-drag-section engines-show d-none\" id=\"enginesPerformance\">\n          <div class=\"engine-performance\" data-engineid=\"1\">\n            <div class=\"engine-performance-title engine-fe\">\n              <img class=\"engine-performance-logo\" src=\"../assets/images/logos/ferrari.png\" alt=\"Ferrari logo\">\n              FERRARI\n            </div>\n            <div class=\"engine-performance-stats\">\n              <div class=\"engine-performance-stat\" data-attribute=\"10\">\n                <div class=\"part-performance-stat-title\">Power <span class=\"unit-measure bold-font\">%</span></div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat\" data-attribute=\"6\">\n                <div class=\"part-performance-stat-title\">Fuel efficiency <span class=\"unit-measure bold-font\">%</span>\n                </div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat engine24\" data-attribute=\"11\">\n                <div class=\"part-performance-stat-title\">Performance threshold <span\n                    class=\"unit-measure bold-font\">%</span></div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat engine24\" data-attribute=\"12\">\n                <div class=\"part-performance-stat-title\">Performance loss <span class=\"unit-measure bold-font\">%</span>\n                </div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat\" data-attribute=\"14\">\n                <div class=\"part-performance-stat-title\">Engine durability <span class=\"unit-measure bold-font\">%</span>\n                </div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat\" data-attribute=\"18\">\n                <div class=\"part-performance-stat-title\">ERS durability <span class=\"unit-measure bold-font\">%</span>\n                </div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat\" data-attribute=\"19\">\n                <div class=\"part-performance-stat-title\">Gearbox durability <span\n                    class=\"unit-measure bold-font\">%</span></div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n            </div>\n          </div>\n          <div class=\"engine-performance\" data-engineid=\"4\">\n            <div class=\"engine-performance-title engine-rb\">\n              <img class=\"engine-performance-logo\" src=\"../assets/images/logos/redbull.png\" alt=\"Red Bull logo\">\n              RED BULL POWERTRAINS\n            </div>\n            <div class=\"engine-performance-stats\">\n              <div class=\"engine-performance-stat\" data-attribute=\"10\">\n                <div class=\"part-performance-stat-title\">Power <span class=\"unit-measure bold-font\">%</span></div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat\" data-attribute=\"6\">\n                <div class=\"part-performance-stat-title\">Fuel efficiency <span class=\"unit-measure bold-font\">%</span>\n                </div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat engine24\" data-attribute=\"11\">\n                <div class=\"part-performance-stat-title\">Performance threshold <span\n                    class=\"unit-measure bold-font\">%</span></div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat engine24\" data-attribute=\"12\">\n                <div class=\"part-performance-stat-title\">Performance loss <span class=\"unit-measure bold-font\">%</span>\n                </div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat\" data-attribute=\"14\">\n                <div class=\"part-performance-stat-title\">Engine durability <span class=\"unit-measure bold-font\">%</span>\n                </div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat\" data-attribute=\"18\">\n                <div class=\"part-performance-stat-title\">ERS durability <span class=\"unit-measure bold-font\">%</span>\n                </div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat\" data-attribute=\"19\">\n                <div class=\"part-performance-stat-title\">Gearbox durability <span\n                    class=\"unit-measure bold-font\">%</span></div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n            </div>\n          </div>\n          <div class=\"engine-performance\" data-engineid=\"7\">\n            <div class=\"engine-performance-title engine-me\">\n              <img class=\"engine-performance-logo\" src=\"../assets/images/logos/mercedes.png\" alt=\"Mercedes logo\">\n              MERCEDES\n            </div>\n            <div class=\"engine-performance-stats\">\n              <div class=\"engine-performance-stat\" data-attribute=\"10\">\n                <div class=\"part-performance-stat-title\">Power <span class=\"unit-measure bold-font\">%</span></div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat\" data-attribute=\"6\">\n                <div class=\"part-performance-stat-title\">Fuel efficiency <span class=\"unit-measure bold-font\">%</span>\n                </div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat engine24\" data-attribute=\"11\">\n                <div class=\"part-performance-stat-title\">Performance threshold <span\n                    class=\"unit-measure bold-font\">%</span></div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat engine24\" data-attribute=\"12\">\n                <div class=\"part-performance-stat-title\">Performance loss <span class=\"unit-measure bold-font\">%</span>\n                </div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat\" data-attribute=\"14\">\n                <div class=\"part-performance-stat-title\">Engine durability <span class=\"unit-measure bold-font\">%</span>\n                </div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat\" data-attribute=\"18\">\n                <div class=\"part-performance-stat-title\">ERS durability <span class=\"unit-measure bold-font\">%</span>\n                </div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat\" data-attribute=\"19\">\n                <div class=\"part-performance-stat-title\">Gearbox durability <span\n                    class=\"unit-measure bold-font\">%</span></div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n            </div>\n          </div>\n          <div class=\"engine-performance\" data-engineid=\"10\">\n            <div class=\"engine-performance-title engine-re renault-engine-title\">\n              <img class=\"engine-performance-logo renault-engine-logo\" src=\"../assets/images/logos/renault.png\"\n                alt=\"Renault logo\">\n              <span class=\"renault-engine-title-text\">RENAULT</span>\n            </div>\n            <div class=\"engine-performance-stats\">\n              <div class=\"engine-performance-stat\" data-attribute=\"10\">\n                <div class=\"part-performance-stat-title\">Power <span class=\"unit-measure bold-font\">%</span></div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat\" data-attribute=\"6\">\n                <div class=\"part-performance-stat-title\">Fuel efficiency <span class=\"unit-measure bold-font\">%</span>\n                </div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat engine24\" data-attribute=\"11\">\n                <div class=\"part-performance-stat-title\">Performance threshold <span\n                    class=\"unit-measure bold-font\">%</span></div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat engine24\" data-attribute=\"12\">\n                <div class=\"part-performance-stat-title\">Performance loss <span class=\"unit-measure bold-font\">%</span>\n                </div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat\" data-attribute=\"14\">\n                <div class=\"part-performance-stat-title\">Engine durability <span class=\"unit-measure bold-font\">%</span>\n                </div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat\" data-attribute=\"18\">\n                <div class=\"part-performance-stat-title\">ERS durability <span class=\"unit-measure bold-font\">%</span>\n                </div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n              <div class=\"engine-performance-stat\" data-attribute=\"19\">\n                <div class=\"part-performance-stat-title\">Gearbox durability <span\n                    class=\"unit-measure bold-font\">%</span></div>\n                <div class=\"stat-number\">\n                  <i class=\"bi bi-dash new-augment-button transparent\"></i>\n                  <input type=\"text\" class=\"custom-input-number\">\n                  <i class=\"bi bi-plus new-augment-button transparent\"></i>\n                </div>\n                <div class=\"engine-performance-bar\">\n                  <div class=\"engine-performance-progress\"></div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n\n      </div>\n      <div class=\"script-view hide unloaded\" id=\"season_mods\">\n        <div class=\"general-top-panel\" id=\"modSelectPanel\">\n          <div class=\"title-buttons-left\">\n            <div class=\"mods-season-pills-top\" id=\"modsSeasonPillsTop\">\n              <ul class=\"nav nav-pills\">\n                <li class=\"nav-item\">\n                  <a class=\"nav-link bold-font generalPills active\" id=\"mods2025Pill\" data-mod-season=\"2025\">\n                    <div class=\"basic-label bold-font lineups-pill-label\">2025</div>\n                    <div class=\"pill-line\"></div>\n                  </a>\n                </li>\n              </ul>\n            </div>\n          </div>\n        </div>\n        <div class=\"mods-year-view\" id=\"mods2025View\">\n          <div class=\"mod-banner\">\n            <div class=\"mod-name\">\n              <img src=\"../assets/images/logoMod2Colors.svg\" alt=\"\">\n              <div class=\"mod-creators\">\n                <a class=\"creator w1echuz\" style=\"--order: 1\" href=\"https://linktr.ee/w1echuz\"\n                  target=\"_blank\">w1echuz</a>\n                <div class=\"creator-separator\" style=\"--order: 2\"></div>\n                <a class=\"creator littleonion\" style=\"--order: 3\" href=\"https://linktr.ee/Little0nion\"\n                  target=\"_blank\">littleonion</a>\n                <div class=\"creator-separator \" style=\"--order: 4\"></div>\n                <a class=\"creator bonnex\" style=\"--order: 5\" href=\"https://x.com/bonnexf1?s=21\"\n                  target=\"_blank\">bonnex</a>\n                <div class=\"creator-separator \" style=\"--order: 6\"></div>\n                <a class=\"creator grzelu\" style=\"--order: 7\" href=\"https://youtube.com/c/GrzeluF1\"\n                  target=\"_blank\">grzelu</a>\n                <div class=\"creator-separator \" style=\"--order: 8\"></div>\n                <a class=\"creator thatgingerdude\" style=\"--order: 9\"\n                  href=\"https://www.overtake.gg/members/thatgingerdude15.3294857/\" target=\"_blank\">thatgingerdude</a>\n                <div class=\"creator-separator \" style=\"--order: 10\"></div>\n                <a class=\"creator n4x\" style=\"--order: 11\" href=\"https://www.patreon.com/f1dbeditor\"\n                  target=\"_blank\">n4x</a>\n                <div class=\"creator-separator \" style=\"--order: 12\"></div>\n                <a class=\"creator nexus\" style=\"--order: 13\"\n                  href=\"https://www.overtake.gg/members/thefir3nexus.1772538/\" target=\"_blank\">thefir3nexus</a>\n              </div>\n            </div>\n            <div class=\"mod-drivers\">\n              <div class=\"small-rectangle lh-rectangle\" style=\"--order: 1\">\n                <img src=\"../assets/images/Hamilton4.png\" alt=\"\" style=\"--order: 4\">\n                <div class=\"ham-lines\"></div>\n              </div>\n              <div class=\"lh-gradient\" style=\"--order: 7\"></div>\n              <div class=\"high-rectangle mv-rectangle\" style=\"--order: 3\">\n                <img src=\"../assets/images/Verstappen4.png\" alt=\"\" style=\"--order: 6\">\n                <div class=\"ver-lines\"></div>\n              </div>\n              <div class=\"mv-gradient\" style=\"--order: 8\"></div>\n              <div class=\"small-rectangle ka-rectangle\" style=\"--order: 2\">\n                <img src=\"../assets/images/Antonelli4.png\" alt=\"\" style=\"--order: 5\">\n                <div class=\"ant-lines\"></div>\n              </div>\n              <div class=\"ka-gradient\" style=\"--order: 9\"></div>\n            </div>\n          </div>\n          <div class=\"mod-blocking\">\n            <div class=\"mod-blocking-title\">Save not compatible with 2025 Season DLC mod</div>\n            <div class=\"mod-blocking-subtitle\">Your save must be from F1 Manager 24, and its date must be before the\n              first\n              race of the 2024 season!</div>\n          </div>\n          <div class=\"changes-grid d-none\">\n            <div class=\"one-change\" style=\"--order: 1\">\n              <div class=\"one-change-title bold-font\">Time travel to end of 2024</div>\n              <div class=\"one-change-description date-holder\">\n                <span class=\"date-part\" id=\"dateDay\">05</span>\n                <span class=\"date-part\" id=\"dateMonth\">February</span>\n                <span class=\"date-part\" id=\"dateYear\">2024</span>\n              </div>\n              <button class=\"one-change-button time-travel\">\n                <i class=\"bi bi-check-lg icon-hidden\"></i>\n                <span>Apply</span>\n              </button>\n            </div>\n            <div class=\"one-change\" style=\"--order: 2\">\n              <div class=\"one-change-title bold-font\">Extra drivers</div>\n              <div class=\"one-change-description-group\">\n                <div class=\"one-change-description missing-staff\">Missing staff</div>\n                <div class=\"one-change-description missing-f2\">New F2/F3 drivers</div>\n                <div class=\"one-change-description missing-academy\">New F1 academy drivers</div>\n              </div>\n              <button class=\"one-change-button extra-drivers\">\n                <i class=\"bi bi-check-lg icon-hidden\"></i>\n                <span>Apply</span>\n              </button>\n            </div>\n            <div class=\"one-change\" style=\"--order: 3\">\n              <div class=\"one-change-title bold-font\">Driver Line-ups</div>\n              <div class=\"one-change-description-group\">\n                <div class=\"one-change-description\"><span class=\"ham-transfer\">Lewis</span> <span class=\"ham-team\">->\n                    Ferrari</span></div>\n                <div class=\"one-change-description\"><span class=\"sai-transfer\">Carlos</span> <span class=\"sai-team\">->\n                    Williams</span></div>\n                <div class=\"one-change-description\"><span class=\"ant-transfer\">A. Kimi</span> <span class=\"ant-team\">->\n                    Mercedes</span></div>\n              </div>\n              <button class=\"one-change-button change-line-ups disabled\">\n                <i class=\"bi bi-check-lg icon-hidden\"></i>\n                <span>Requires extra drivers</span>\n              </button>\n            </div>\n            <div class=\"one-change\" style=\"--order: 4\">\n              <div class=\"one-change-title bold-font\">Driver/staff stats</div>\n              <div class=\"one-change-description-group\">\n                <div class=\"one-change-description\"><span class=\"bold-font bor-ovr mcfont\">BORTOLETO </span> <span\n                    class=\"bold-font ovr-change bor-change\">69</span> OVR</div>\n                <div class=\"one-change-description\"><span class=\"bold-font ant-ovr\">ANTONELLI </span> <span\n                    class=\"bold-font ovr-change ant-change\">71</span> OVR</div>\n                <div class=\"one-change-description\"><span class=\"bold-font pia-ovr mcfont\">PIASTRI </span> <span\n                    class=\"bold-font ovr-change pia-change\">84</span> OVR</div>\n              </div>\n              <button class=\"one-change-button change-stats\">\n                <i class=\"bi bi-check-lg icon-hidden\"></i>\n                <span>Apply</span>\n              </button>\n            </div>\n            <div class=\"one-change\" style=\"--order: 5\">\n              <div class=\"one-change-title bold-font\">Calendar</div>\n              <div class=\"one-change-description-group\">\n                <div class=\"one-change-description\">Season opener: <span class=\"season-change\">Bahrain</span></div>\n                <div class=\"one-change-description\">Sprints: China, Miami, <span class=\"sprint-change\">Austria</span>,\n                </div>\n                <div class=\"one-change-description\">COTA, Brazil, Qatar</div>\n              </div>\n              <button class=\"one-change-button change-calendar\">\n                <i class=\"bi bi-check-lg icon-hidden\"></i>\n                <span>Apply</span>\n              </button>\n            </div>\n            <div class=\"one-change\" style=\"--order: 6\">\n              <div class=\"one-change-title bold-font\">Regulations</div>\n              <div class=\"one-change-description\">Fastest lap <span class=\"fast-lap-general bold-font\">+<span\n                    class=\"fast-lap-change\">1 </span> points</span></div>\n              <button class=\"one-change-button change-regulations\">\n                <i class=\"bi bi-check-lg icon-hidden\"></i>\n                <span>\n                  <i class=\"bi bi-check-lg icon-hidden\"></i>\n                  <span>Apply</span>\n                </span>\n              </button>\n            </div>\n            <div class=\"one-change\" style=\"--order: 7\">\n              <div class=\"one-change-title bold-font\">CFD Adjusted</div>\n              <div class=\"one-change-description-group\">\n                <div class=\"one-change-description\"><span class=\"bold-font cfd-name\">RED BULL</span> <span\n                    class=\"redbull-cfd\">4.2h</span> /ATR Preiod</div>\n                <div class=\"one-change-description\"><span class=\"bold-font cfd-name\">MCLAREN</span> <span\n                    class=\"mclaren-cfd\">4.5h</span> /ATR Preiod</div>\n                <div class=\"one-change-description\"><span class=\"bold-font cfd-name\">FERRARI</span> <span\n                    class=\"ferrari-cfd\">4.8h</span> /ATR Preiod</div>\n              </div>\n              <button class=\"one-change-button change-cfd\">\n                <i class=\"bi bi-check-lg icon-hidden\"></i>\n                <span>Apply</span>\n              </button>\n            </div>\n            <div class=\"one-change\" style=\"--order: 8\">\n              <div class=\"one-change-title bold-font\">Performance</div>\n              <div class=\"one-change-description-group\">\n                <div class=\"one-change-description performance-description redbull-performance-description\"><span\n                    class=\"bold-font one-change-performance-name\">RED BULL</span>\n                  <div class=\"one-change-bar-container\">\n                    <div class=\"one-change-bar-fill performance-bar-progress rb\"></div>\n                  </div>\n                  <span class=\"redbull-performance\">58.5%</span>\n                </div>\n                <div class=\"one-change-description performance-description mclaren-performance-description\"><span\n                    class=\"bold-font one-change-performance-name\">MCLAREN</span>\n                  <div class=\"one-change-bar-container\">\n                    <div class=\"one-change-bar-fill performance-bar-progress mc\"></div>\n                  </div>\n                  <span class=\"mclaren-performance\">56.5%</span>\n                </div>\n                <div class=\"one-change-description performance-description\"><span\n                    class=\"bold-font one-change-performance-name\">WILLIAMS</span>\n                  <div class=\"one-change-bar-container\">\n                    <div class=\"one-change-bar-fill performance-bar-progress wi\"></div>\n                  </div>\n                  <span class=\"williams-performance\">46.1%</span>\n                </div>\n              </div>\n              <button class=\"one-change-button change-performance\">\n                <i class=\"bi bi-check-lg icon-hidden\"></i>\n                <span>Apply</span>\n              </button>\n            </div>\n\n          </div>\n        </div>\n\n        <div class=\"mods-year-view d-none\" id=\"mods2026View\">\n          <div class=\"mod-blocking mods-2026-blocking\">\n            <div class=\"mod-blocking-title\">Save not compatible with 2026 Season Mod</div>\n            <div class=\"mod-blocking-subtitle\">Your save must be from F1 Manager 24 can't have generated staff, and its date must be before the first race of the 2024 season!</div>\n          </div>\n          <div class=\"grid-and-downloads\">\n            <div class=\"changes-grid mods-2026-changes\">\n              <div class=\"apply-all-button\" style=\"--order: 10\">\n                <div class=\"button-with-icon apply-all-2026\">\n                  <i class=\"bi bi-check-lg icon-hidden\"></i>\n                  <span>Apply all</span>\n                </div>\n              </div>\n              <div class=\"one-change\" style=\"--order: 1\">\n                <div class=\"one-change-title bold-font\">Time travel to end of 2025</div>\n                <div class=\"one-change-description date-holder\">\n                  <span class=\"date-part\" id=\"dateDay2026\">05</span>\n                  <span class=\"date-part\" id=\"dateMonth2026\">February</span>\n                  <span class=\"date-part\" id=\"dateYear2026\">2026</span>\n                </div>\n                <button class=\"one-change-button time-travel-2026\">\n                  <i class=\"bi bi-check-lg icon-hidden\"></i>\n                  <span>Apply</span>\n                </button>\n              </div>\n              <div class=\"one-change\" style=\"--order: 2\">\n                <div class=\"one-change-title bold-font\">Extra drivers</div>\n                <div class=\"one-change-description-group\">\n                  <div class=\"one-change-description missing-staff\">Missing staff</div>\n                  <div class=\"one-change-description missing-f2\">New F2/F3 drivers</div>\n                  <div class=\"one-change-description missing-academy\">New F1 academy drivers</div>\n                </div>\n                <button class=\"one-change-button extra-drivers-2026\">\n                  <i class=\"bi bi-check-lg icon-hidden\"></i>\n                  <span>Apply</span>\n                </button>\n              </div>\n              <div class=\"one-change\" style=\"--order: 3\">\n                <div class=\"one-change-title bold-font\">Driver Line-ups</div>\n                <div class=\"one-change-description-group\">\n                  <div class=\"one-change-description lineup-team lineup-team--cadillac\">\n                    <span class=\"lineup-team__name bold-font\">PEREZ &amp; BOTTAS</span>\n                    <span class=\"lineup-team__logo\" aria-hidden=\"true\"></span>\n                  </div>\n                  <div class=\"one-change-description lineup-team lineup-team--hadjar\">\n                    <span class=\"lineup-team__name bold-font\">HADJAR</span>\n                    <span class=\"lineup-team__logo\" aria-hidden=\"true\"></span>\n                  </div>\n                  <div class=\"one-change-description lineup-team lineup-team--lindblad\">\n                    <span class=\"lineup-team__name bold-font\">LINDBLAD</span>\n                    <span class=\"lineup-team__logo\" aria-hidden=\"true\"></span>\n                  </div>\n                </div>\n                <button class=\"one-change-button change-line-ups-2026\">\n                  <i class=\"bi bi-check-lg icon-hidden\"></i>\n                  <span>Apply</span>\n                </button>\n              </div>\n              <div class=\"one-change\" style=\"--order: 4\">\n                <div class=\"one-change-title bold-font\">Driver/staff stats</div>\n                <div class=\"one-change-description-group\">\n                  <div class=\"one-change-description\"><span class=\"bold-font had-ovr atfont\">HADJAR </span> <span\n                      class=\"bold-font ovr-change had-change\">75</span> OVR</div>\n                  <div class=\"one-change-description\"><span class=\"bold-font ant-ovr\">ANTONELLI </span> <span\n                      class=\"bold-font ovr-change ant-change\">71</span> OVR</div>\n                  <div class=\"one-change-description\"><span class=\"bold-font bea-ovr hafont\">BEARMAN </span> <span\n                      class=\"bold-font ovr-change bea-change\">77</span> OVR</div>\n                </div>\n                <button class=\"one-change-button change-stats-2026\">\n                  <i class=\"bi bi-check-lg icon-hidden\"></i>\n                  <span>Apply</span>\n                </button>\n              </div>\n              <div class=\"one-change\" style=\"--order: 5\">\n                <div class=\"one-change-title bold-font\">Calendar</div>\n                <div class=\"one-change-description-group calendar-changes-2026\">\n                  <div class=\"one-change-description\">Season opener: <span class=\"season-change\">Bahrain</span></div>\n                  <div class=\"one-change-description\">Sprints: China, Miami, <span\n                      class=\"sprint-change-2026 change-1\">Austria,</span>\n                  </div>\n                  <div class=\"one-change-description\"><span class=\"sprint-change-2026 change-2\">COTA,</span> <span\n                      class=\"sprint-change-2026 change-3\">Brazil,</span> <span\n                      class=\"sprint-change-2026 change-4\">Qatar</span></div>\n                </div>\n                <button class=\"one-change-button change-calendar-2026\">\n                  <i class=\"bi bi-check-lg icon-hidden\"></i>\n                  <span>Apply</span>\n                </button>\n              </div>\n              <div class=\"one-change\" style=\"--order: 6\">\n                <div class=\"one-change-title bold-font\">Regulations</div>\n                <div class=\"one-change-description-group\">\n                  <div class=\"one-change-description\">Fastest lap <span class=\"fast-lap-general bold-font\">+<span\n                        class=\"fast-lap-change\">1 </span> points</span></div>\n                  <div class=\"one-change-description\">Cost Cap <span class=\"cost-cap-general bold-font\"><span\n                        class=\"cost-cap-change\">139.2 M€</span></span></div>\n                </div>\n                <button class=\"one-change-button change-regulations-2026\">\n                  <i class=\"bi bi-check-lg icon-hidden\"></i>\n                  <span>Apply</span>\n                </button>\n              </div>\n              <div class=\"one-change\" style=\"--order: 7\">\n                <div class=\"one-change-title bold-font\">Add 2025 Results</div>\n                <div class=\"one-change-description-group\">\n                  <div class=\"one-change-description add-results-team\">\n                    <div class=\"add-results-team__left\">\n                      <img class=\"add-results-team__logo\" src=\"../assets/images/logos/mclaren.png\" alt=\"McLaren logo\">\n                      <span class=\"bold-font\">MCLAREN</span>\n                    </div>\n                    <div class=\"add-results-team__right\">\n                      <span class=\"numbersFont add-results-points\" data-team=\"mclaren\" data-target=\"833\">0</span>\n                      <span>pts</span>\n                    </div>\n                  </div>\n                  <div class=\"one-change-description add-results-team\">\n                    <div class=\"add-results-team__left\">\n                      <img class=\"add-results-team__logo\" src=\"../assets/images/logos/mercedes.png\" alt=\"Mercedes logo\">\n                      <span class=\"bold-font\">MERCEDES</span>\n                    </div>\n                    <div class=\"add-results-team__right\">\n                      <span class=\"numbersFont add-results-points\" data-team=\"mercedes\" data-target=\"469\">0</span>\n                      <span>pts</span>\n                    </div>\n                  </div>\n                  <div class=\"one-change-description add-results-team\">\n                    <div class=\"add-results-team__left\">\n                      <img class=\"add-results-team__logo\" src=\"../assets/images/logos/redbull.png\" alt=\"Red Bull logo\">\n                      <span class=\"bold-font\">RED BULL</span>\n                    </div>\n                    <div class=\"add-results-team__right\">\n                      <span class=\"numbersFont add-results-points\" data-team=\"redbull\" data-target=\"468\">0</span>\n                      <span>pts</span>\n                    </div>\n                  </div>\n                </div>\n                <button class=\"one-change-button add-results-2026\">\n                  <i class=\"bi bi-check-lg icon-hidden\"></i>\n                  <span>Apply</span>\n                </button>\n              </div>\n              <div class=\"one-change\" style=\"--order: 8\">\n                <div class=\"one-change-title bold-font\">CARS & ENGINES</div>\n                <div class=\"one-change-description-group\">\n                  <div class=\"one-change-description performance-year-switch\">Car performance of <span\n                      class=\"performance-year-switch__year bold-font\"></span></div>\n                  <div class=\"one-change-description regs-team regs-team--aston\">\n                    <span class=\"regs-team__name bold-font\">ASTON MARTIN</span>\n                    <span class=\"regs-team__logo\" aria-hidden=\"true\"></span>\n                  </div>\n                  <div class=\"one-change-description regs-team regs-team--stake\">\n                    <span class=\"regs-team__name bold-font\">STAKE SAUBER</span>\n                    <span class=\"regs-team__logo\" aria-hidden=\"true\"></span>\n                  </div>\n                </div>\n                <button class=\"one-change-button change-performance-2026\">\n                  <i class=\"bi bi-check-lg icon-hidden\"></i>\n                  <span>Apply</span>\n                </button>\n              </div>\n              <div class=\"one-change\" style=\"--order: 9\">\n                <div class=\"one-change-title bold-font\">ENGINE UPGRADES TPS</div>\n                <div class=\"one-change-description-group\">\n                  <div class=\"one-change-description\">Allows engine upgrades turning points </div>\n                  <div class=\"one-change-description\">to appear in the news section every </div>\n                  <div class=\"one-change-description\">quarter of the season </div>\n                </div>\n                <button class=\"one-change-button change-aduo-tps-2026\">\n                  <i class=\"bi bi-check-lg icon-hidden\"></i>\n                  <span>Apply</span>\n                </button>\n              </div>\n            </div>\n            <div class=\"recommended-downloads\">\n              <div class=\"recommended-downloads-title bold-font\">Recommended downloads</div>\n              <div class=\"download-links\">\n                <a href=\"https://www.overtake.gg/downloads/2026-season-mod-facepack.82754/\" target=\"_blank\"\n                  style=\"--order: 1\">\n                  <div class=\"download-link\" style=\"--order: 1\">\n                    <span class=\"download-link-text\" data-glow=\"Facepack\">Facepack</span>\n                  </div>\n                </a>\n                <div class=\"creator-separator\" style=\"--order: 2\"></div>\n                <a href=\"https://www.overtake.gg/downloads/2026-ui-changes.82743/\" target=\"_blank\" style=\"--order: 3\">\n                  <div class=\"download-link\" style=\"--order: 3\">\n                    <span class=\"download-link-text\" data-glow=\"UI mod\">UI mod</span>\n                  </div>\n                </a>\n                <div class=\"creator-separator\" style=\"--order: 4\"></div>\n                <a href=\"https://www.overtake.gg/downloads/2026-season-update.83636/\" target=\"_blank\" style=\"--order: 5\">\n                  <div class=\"download-link\" style=\"--order: 5\">\n                    <span class=\"download-link-text\" data-glow=\"2026 Season Update\">2026 Season Update</span>\n                  </div>\n                </a>\n                <div class=\"creator-separator\" style=\"--order: 6\"></div>\n                <a href=\"https://www.overtake.gg/downloads/2026-season-update-myteam-livery-pack-add-on.83637/\" target=\"_blank\"\n                  style=\"--order: 7\">\n                  <div class=\"download-link\" style=\"--order: 7\">\n                    <span class=\"download-link-text\" data-glow=\"Custom Team Liveries\">Custom Team Liveries</span>\n                  </div>\n                </a>\n              </div>\n            </div>\n\n          </div>\n          <div class=\"mod-banner mods-2026-banner\">\n            <div class=\"mod-name title-2026\">\n              <img class=\"title-2026\" src=\"../assets/images/f1Mlogo.svg\" alt=\"\">\n              <div class=\"mod-subtitle\" aria-label=\"2026 SEASON MOD\" role=\"text\">\n                <span class=\"mod-subtitle-letter\" style=\"--order: 1\" aria-hidden=\"true\">2</span>\n                <span class=\"mod-subtitle-letter\" style=\"--order: 2\" aria-hidden=\"true\">0</span>\n                <span class=\"mod-subtitle-letter\" style=\"--order: 3\" aria-hidden=\"true\">2</span>\n                <span class=\"mod-subtitle-letter\" style=\"--order: 4\" aria-hidden=\"true\">6</span>\n                <span class=\"mod-subtitle-space\" aria-hidden=\"true\">&nbsp;</span>\n                <span class=\"mod-subtitle-letter\" style=\"--order: 5\" aria-hidden=\"true\">S</span>\n                <span class=\"mod-subtitle-letter\" style=\"--order: 6\" aria-hidden=\"true\">E</span>\n                <span class=\"mod-subtitle-letter\" style=\"--order: 7\" aria-hidden=\"true\">A</span>\n                <span class=\"mod-subtitle-letter\" style=\"--order: 8\" aria-hidden=\"true\">S</span>\n                <span class=\"mod-subtitle-letter\" style=\"--order: 9\" aria-hidden=\"true\">O</span>\n                <span class=\"mod-subtitle-letter\" style=\"--order: 10\" aria-hidden=\"true\">N</span>\n                <span class=\"mod-subtitle-space\" aria-hidden=\"true\">&nbsp;</span>\n                <span class=\"mod-subtitle-letter\" style=\"--order: 11\" aria-hidden=\"true\">U</span>\n                <span class=\"mod-subtitle-letter\" style=\"--order: 12\" aria-hidden=\"true\">P</span>\n                <span class=\"mod-subtitle-letter\" style=\"--order: 13\" aria-hidden=\"true\">D</span>\n                <span class=\"mod-subtitle-letter\" style=\"--order: 14\" aria-hidden=\"true\">A</span>\n                <span class=\"mod-subtitle-letter\" style=\"--order: 15\" aria-hidden=\"true\">T</span>\n                <span class=\"mod-subtitle-letter\" style=\"--order: 16\" aria-hidden=\"true\">E</span>\n              </div>\n              <div class=\"mod-creators\">\n                <a class=\"creator thatgingerdude\" style=\"--order: 17\" href=\"https://www.overtake.gg/members/thatgingerdude15.3294857/\"\n                  target=\"_blank\">thatgingerdude</a>\n                <div class=\"creator-separator\" style=\"--order: 18\"></div>\n                <a class=\"creator lucas\" style=\"--order: 19\" href=\"https://www.overtake.gg/members/lcskpmn.2759987/\" target=\"_blank\">LCSKPMN</a>\n                <div class=\"creator-separator\" style=\"--order: 20\"></div>\n                <a class=\"creator kevintaddo\" style=\"--order: 21\" href=\"https://www.patreon.com/cw/kevintaddo\" target=\"_blank\">kevintaddo</a>\n                <div class=\"creator-separator\" style=\"--order: 22\"></div>\n                <a class=\"creator littleonion\" style=\"--order: 23\" href=\"https://linktr.ee/Little0nion\"\n                  target=\"_blank\">littleonion</a>\n                <div class=\"creator-separator\" style=\"--order: 24\"></div>\n                <a class=\"creator w1echuz\" style=\"--order: 25\" href=\"https://linktr.ee/w1echuz\" target=\"_blank\">w1echuz</a>\n                <div class=\"creator-separator\" style=\"--order: 26\"></div>\n                <a class=\"creator murillo\" style=\"--order: 27\" href=\"https://www.patreon.com/MuriloPaulocci\" target=\"_blank\">Project 212</a>\n                <div class=\"creator-separator\" style=\"--order: 28\"></div>\n                <a class=\"creator cody\" style=\"--order: 29\" href=\"https://www.patreon.com/cw/CMDesigns47\" target=\"_blank\">CMDesigns</a>\n                <div class=\"creator-separator\" style=\"--order: 30\"></div>\n                <a class=\"creator bonnex\" style=\"--order: 31\" href=\"https://www.patreon.com/u92489530\"\n                  target=\"_blank\">bonnex</a>\n                <div class=\"creator-separator\" style=\"--order: 32\"></div>\n                <a class=\"creator n4x\" style=\"--order: 33\" href=\"https://www.patreon.com/f1dbeditor\"\n                  target=\"_blank\">n4x</a>\n                <div class=\"creator-separator\" style=\"--order: 34\"></div>\n                <a class=\"creator nexus\" style=\"--order: 35\" href=\"https://www.overtake.gg/members/thefir3nexus.1772538/\"\n                  target=\"_blank\">thefir3nexus</a>\n                \n              </div>\n            </div>\n            <div class=\"driver-and-rectangle\">\n              <img class=\"driver-2026\" src=\"../assets/images/driver2026.png\" alt=\"\" style=\"--order: 4\">\n              <div class=\"rectangle-2026\">\n                <img class=\"lines-2026\" src=\"../assets/images/lines-2026.png\" alt=\"\">\n              </div>\n            </div>\n          </div>\n          <div class=\"glow-2026\"></div>\n        </div>\n      </div>\n    </div>\n\n  </div>\n  </div>\n  <div class=\"patreon-slide-up\">\n    <div class=\"slide-up-title-and-x bold-font\">\n      <span class=\"slide-up-title\">\n        Support the project\n      </span>\n      <i class=\"bi bi-x\" id=\"patreonSlideUpClose\"></i>\n    </div>\n    <div class=\"patreon-paragraph\">\n      <span class=\"\">\n        The Database Editor will <span class=\"important-text bold-font \">remain free</span>, and no core features\n        will\n        ever be locked behind a paywall.\n        However, running and maintaining this project <span class=\"important-text bold-font\">takes time and\n          resources</span>.\n      </span>\n      <span class=\"\">\n        If you found the tool useful and want to support its development,\n        <br>\n        <span class=\"patreon-text bold-font\">consider becoming a Patron!</span>\n      </span>\n      <div class=\"patreon-perks d-none\">\n        <div class=\"perks-list\">\n          <span>5.5€/month tier:</span>\n          <ul class=\"patreon-perks-list\">\n            <li>Support the project</li>\n            <li>Extra themes for the editor</li>\n            <li>Ad-free experience (no pop-ups)</li>\n            <li>Access to progress posts</li>\n            <li>Recognition as a supporter</li>\n            <li>Ability to request new features</li>\n          </ul>\n        </div>\n        <div class=\"perks-list\">\n          <span>10.5€/month tier:</span>\n          <ul class=\"patreon-perks-list\">\n            <li>All the previous tiers rewards, plus:</li>\n            <li>Even more support to the project!</li>\n            <li>Saving your data from +5 seasons</li>\n            <li>Sneak peeks of future development</li>\n          </ul>\n        </div>\n      </div>\n      <a href=\"https://www.patreon.com/f1dbeditor\" target=\"_blank\">\n        <div class=\"patreon-button\">\n          <div class=\"patreon-button-logo\"></div>\n          <span class=\"patreon-button-text bold-font\">PATREON PAGE</span>\n        </div>\n      </a>\n    </div>\n  </div>\n  <footer class=\"footer hidden\">\n    <div class=\"socials\">\n      <a class=\"bi bi-github\" href=\"https://github.com/IUrreta/DatabaseEditor\" target=\"_blank\">&nbsp;DB Editor</a>\n      <a class=\"bi bi-linkedin\" href=\"https://www.linkedin.com/in/ignacio-urretavizcaya-tato-2345a4259\"\n        target=\"_blank\">&nbsp;My\n        profile</a>\n      <a class=\"bi bi-twitter-x\" href=\"https://twitter.com/ignaciourreta_\" target=\"_blank\">&nbsp;@ignaciourreta_</a>\n      <a class=\"bi bi-reddit\" href=\"https://www.reddit.com/user/ignaciourreta\" target=\"_blank\">&nbsp;ignaciourreta</a>\n      <a class=\"bi-custom-patreon\" href=\"https://www.patreon.com/f1dbeditor\" target=\"_blank\">&nbsp;Support the\n        project</a>\n      <a class=\"bi bi-discord\" href=\"https://discord.gg/3QXg3hsD8B\" target=\"_blank\">&nbsp;Join our Discord</a>\n    </div>\n    <div class=\"save-info\">\n      <div class=\"twenty-three bold-font\" id=\"year23\">\n        <div class=\"front-gradient\">23</div>\n      </div>\n      <div class=\"twenty-four bold-font\" id=\"year24\">\n        <div class=\"front-gradient\">24</div>\n      </div>\n    </div>\n    <div class=\"status\">\n      <!-- <i class=\"bi bi-file-text\" id=\"logFileButton\" style=\"padding-right: 10px;\"></i> -->\n      <div class=\"footer-notification\"></div>\n      <div class=\"status-info\">\n        <i class=\"bi bi-exclamation-triangle-fill error d-none\" id=\"logButton\"></i>\n      </div>\n      <div class=\"version-panel\" data-bs-toggle=\"modal\" data-bs-target=\"#patchModal\"></div>\n    </div>\n  </footer>\n\n\n</body>\n\n</html>\n"
  },
  {
    "path": "src/index.js",
    "content": "// Bootstrap\nimport \"bootstrap/dist/css/bootstrap.min.css\";\nimport 'bootstrap-icons/font/bootstrap-icons.min.css';\n\n// Resto de imports\nimport interact from 'interactjs';\n\nimport Chart from 'chart.js/auto';\nimport Annotation from \"chartjs-plugin-annotation\";\nimport 'chartjs-plugin-annotation';\nimport 'chartjs-plugin-datalabels';\n\nimport './js/frontend/calendar.js';\nimport './js/frontend/renderer.js';\nimport './js/frontend/transfers.js';\nimport './js/frontend/stats.js';\nimport './js/frontend/performance.js';\nimport './js/frontend/seasonViewer.js';\nimport './js/frontend/head2head.js';\nimport './js/frontend/teams.js';\nimport './js/frontend/regulations.js';\nimport './js/frontend/dragFile.js';\nimport './js/frontend/news.js'\nimport './js/frontend/devTools.js';\n\nimport './themes.css'\nimport './styles.css';\n"
  },
  {
    "path": "src/js/backend/UESaveHandler.js",
    "content": "import { Gvas, Serializer } from \"./UESaveTool\";\nimport pako from \"pako\";\nimport { saveAs } from \"file-saver\";\nimport { Buffer } from \"buffer\";\n\nexport const parseGvasProps = (Properties) => {\n  const careerSaveMetadata = {};\n  const metadataProperty = Properties.Properties.filter(x => x.Name === \"MetaData\")[0];\n  const careerSaveMetadataProperty = metadataProperty.Properties[0];\n\n  careerSaveMetadataProperty.Properties.forEach(prop => {\n    careerSaveMetadata[prop.Name] = prop.Property || prop.Properties;\n  })\n\n  return { careerSaveMetadata };\n}\n\nexport const analyzeFileToDatabase = async (file, SQL) => {\n  return new Promise((resolve) => {\n    if (file !== undefined) {\n      let reader = new FileReader();\n      reader.onload = async (e) => {\n        const serial = new Serializer(Buffer.from(reader.result));\n        const gvasMeta = new Gvas().deserialize(serial);\n        const { Header, Properties } = gvasMeta;\n        const { SaveGameVersion, EngineVersion } = Header;\n        const { BuildId, Build } = EngineVersion;\n        let version = 0, gameVersion, gameVersionWithBuild;\n        switch (SaveGameVersion) {\n          case 2:\n            version = 2;\n            gameVersion = BuildId.substring(BuildId.indexOf(\"22_\") + 3);\n            gameVersionWithBuild = `${gameVersion}.${Build & 0x7fffffff}`;\n            break;\n          case 3:\n            if (BuildId.indexOf(\"volta23\") !== -1) {\n              version = 3;\n              gameVersion = BuildId.substring(BuildId.indexOf(\"23+\") + 3);\n              gameVersionWithBuild = `${gameVersion}.${Build & 0x7fffffff}`;\n            }\n            if (BuildId.indexOf(\"volta24\") !== -1) {\n              version = 4;\n              gameVersion = BuildId.substring(BuildId.indexOf(\"24+\") + 8);\n              gameVersionWithBuild = `${gameVersion}.${Build & 0x7fffffff}`;\n            }\n            break;\n          default:\n            version = 0;\n        }\n\n\n        const unk_zero = serial.readInt32();\n        const total_size = serial.readInt32();\n        const size_1 = serial.readInt32();\n        const size_2 = serial.readInt32();\n        const size_3 = serial.readInt32();\n\n        const compressedData = serial.read(total_size);\n        const output = pako.inflate(compressedData);\n        const databaseFile = output.slice(0, size_1);\n\n\n        const text = new TextDecoder().decode(databaseFile.slice(0, 16));\n\n        // @ts-ignore\n\n        const db = new SQL.Database(databaseFile);\n\n        const metadata = {\n          filename: file.name, // for in-app\n\n          version,\n          fullBuildId: BuildId,\n          gameVersion,\n          gameVersionWithBuild,\n\n          databaseFile,\n\n          gvasMeta,\n          gvasHeader: Header, // read-only\n\n          ...parseGvasProps(Properties),\n\n          otherDatabases: [{\n            size: size_2,\n            file: output.slice(size_1, size_1 + size_2),\n          }, {\n            size: size_3,\n            file: output.slice(size_1 + size_2, size_1 + size_2 + size_3),\n          }]\n        }\n\n        if (process.env.NODE_ENV === 'development') {\n          // saveAs(new Blob([metadata.chunk0], {type: \"application/binary\"}), \"chunk0\");\n        }\n\n        resolve({ db, metadata });\n      };\n      reader.readAsArrayBuffer(file);\n    }\n  });\n}\n\nexport const repack = (db, metadata, overwrite = false) => {\n  db.exec(`\n    PRAGMA journal_mode = OFF;\n    PRAGMA temp_store = MEMORY;\n    PRAGMA synchronous = OFF;\n    PRAGMA optimize;\n    VACUUM;\n  `);\n  const db_data = db.export();\n  const db_size = db_data.length;\n\n  const { otherDatabases, gvasMeta } = metadata;\n\n  const s1 = otherDatabases[0].size;\n  const s2 = otherDatabases[1].size;\n\n  const compressedData = new Buffer(db_size + s1 + s2);\n  compressedData.set(db_data, 0);\n  compressedData.set(otherDatabases[0].file, db_size);\n  compressedData.set(otherDatabases[1].file, db_size + s1);\n\n  const compressed = pako.deflate(compressedData, { level: 9 });\n  const compressed_size = compressed.length;\n\n  const serialized = gvasMeta.serialize();\n  const meta_length = serialized.length;\n\n  const check = new Gvas().deserialize(\n    new Serializer(Buffer.from(serialized))\n  );\n\n  if (JSON.stringify(gvasMeta) === JSON.stringify(check)) {\n    const finalData = new Buffer(meta_length + 16 + compressed_size);\n\n    finalData.set(serialized, 0);\n    finalData.writeInt32LE(compressed_size, meta_length);\n    finalData.writeInt32LE(db_size, meta_length + 4);\n    finalData.writeInt32LE(s1, meta_length + 8);\n    finalData.writeInt32LE(s2, meta_length + 12);\n    finalData.set(compressed, meta_length + 16);\n\n    console.log(\"Repacked\", finalData);\n\n    return { finalData, metadata };\n\n    saveAs(new Blob([finalData], { type: \"application/binary\" }), metadata.filename);\n\n  } else {\n    alert(\"Savefile Serialization Check failed.\")\n  }\n\n}\n\nexport const dump = (db, metadata) => {\n  saveAs(new Blob([db.export()], { type: \"application/vnd.sqlite3\" }), metadata.filename + \".db\");\n}"
  },
  {
    "path": "src/js/backend/UESaveTool/Gvas.js",
    "content": "import {PropertyFactory} from './factories';\nimport {GvasHeader} from \"./GvasHeader\";\nimport {Tuple} from './properties';\nimport {SerializationError} from './PropertyErrors';\nimport {Serializer} from \"./Serializer\";\nimport { Buffer } from \"buffer\";\n\nexport class Gvas {\n    constructor() {\n        this.Header = new GvasHeader();\n        this.Properties = new Tuple();\n    }\n    get Size() {\n        let size = this.Header.Size;\n        size += this.Properties.Size;\n        size += 4;\n        return size;\n    }\n    deserialize(serial) {\n        let format = serial.read(4);\n        if (Buffer.compare(Buffer.from('GVAS'), format) !== 0)\n            throw Error(`Unexpected header, expected 'GVAS`)\n        this.Header.deserialize(serial);\n        this.Properties.Name = this.Header.SaveGameClassName;\n        this.Properties.deserialize(serial);\n        return this;\n    }\n    serialize() {\n        let serial = Serializer.alloc(this.Size);\n        serial.write(this.Header.serialize());\n        serial.write(this.Properties.serialize());\n        serial.seek(4);\n        if (serial.tell !== this.Size)\n            throw new SerializationError(this);\n        return serial.Data;\n    }\n    static from(obj) {\n        let gvas = new Gvas();\n        gvas.Header = GvasHeader.from(obj.Header);\n        gvas.Properties = PropertyFactory.create(obj.Properties);\n        return gvas;\n    }\n}\n"
  },
  {
    "path": "src/js/backend/UESaveTool/GvasHeader.js",
    "content": "import {SerializationError} from '.';\nimport {PropertyFactory} from './factories';\nimport {Serializer} from './Serializer';\nimport { Buffer } from \"buffer\";\n\nexport class GvasHeader {\n    constructor() {\n        this.Format = 'GVAS';\n        this.SaveGameVersion = 0;\n        this.PackageVersion = 0;\n        this.PackageFileVersionUE5 = 0;\n        this.EngineVersion = {\n            Major: 0,\n            Minor: 0,\n            Patch: 0,\n            Build: 0,\n            BuildId: \"\"\n        }\n        this.CustomFormatVersion = 0;\n        this.CustomFormatData = {\n            Count: 0,\n            Entries: []\n        }\n        this.SaveGameClassName = \"\";\n    }\n    get Size() {\n        let size = this.Format.length;\n        size += 18;\n\n        size += this.EngineVersion.BuildId.length + 1 + 4;\n        if (this.EngineVersion.Major >= 5) {\n            size += 4;\n        }\n        size += 8;\n        this.CustomFormatData.Entries.forEach(guid => {\n            size += guid.Size; // 20\n        })\n        size += this.SaveGameClassName.length + 1 + 4;\n        return size;\n    }\n    deserialize(serial) {\n        /* 5.3: https://github.com/EpicGames/UnrealEngine/blob/5.3/Engine/Source/Runtime/Engine/Private/GameplayStatics.cpp#L85 */\n\n        // FileTypeTag: GVAS\n        this.SaveGameVersion = serial.readInt32();\n        this.PackageVersion = serial.readInt32();\n        if (this.SaveGameVersion >= 3) {\n            this.PackageFileVersionUE5 = serial.readInt32();\n            /* this needs to be larger than 1000 */\n        }\n        /*\n            3 means PackageFileSummaryVersionChange, rather than F1M 2023\n            https://github.com/EpicGames/UnrealEngine/blob/5.3/Engine/Source/Runtime/Engine/Private/GameplayStatics.cpp#L93\n        */\n        this.EngineVersion.Major = serial.readUInt16();\n        this.EngineVersion.Minor = serial.readUInt16();\n        this.EngineVersion.Patch = serial.readUInt16();\n        this.EngineVersion.Build = serial.readUInt32();\n        this.EngineVersion.BuildId = serial.readString();\n\n        this.CustomFormatVersion = serial.readInt32();\n        this.CustomFormatData.Count = serial.readInt32();\n        for (let i = 0; i < this.CustomFormatData.Count; i++) {\n            let guid = PropertyFactory.create({ Type: 'Guid' })\n            this.CustomFormatData.Entries.push(guid.deserialize(serial));\n        }\n        this.SaveGameClassName = serial.readString();\n        return this;\n    }\n    serialize() {\n        let serial = Serializer.alloc(this.Size);\n        serial.write(Buffer.from(this.Format));\n        serial.writeInt32(this.SaveGameVersion);\n        serial.writeInt32(this.PackageVersion);\n        if (this.SaveGameVersion >= 3) {\n            serial.writeInt32(this.PackageFileVersionUE5);\n        } // UE 5 for F1M 23\n\n        serial.writeUInt16(this.EngineVersion.Major);\n        serial.writeUInt16(this.EngineVersion.Minor);\n        serial.writeUInt16(this.EngineVersion.Patch);\n        serial.writeUInt32(this.EngineVersion.Build);\n        serial.writeString(this.EngineVersion.BuildId);\n\n        serial.writeInt32(this.CustomFormatVersion);\n        serial.writeInt32(this.CustomFormatData.Count);\n        this.CustomFormatData.Entries.forEach(guid => serial.write(guid.serialize()));\n        serial.writeString(this.SaveGameClassName);\n        if (serial.tell != this.Size)\n            throw new SerializationError(this);\n        return serial.Data;\n    }\n    static from(obj) {\n        let header = new GvasHeader();\n        header.SaveGameVersion = obj.SaveGameVersion;\n        header.PackageVersion = obj.PackageVersion;\n        header.EngineVersion = obj.EngineVersion;\n        header.CustomFormatVersion = obj.CustomFormatVersion;\n        header.CustomFormatData.Count = obj.CustomFormatData.Count;\n        obj.CustomFormatData.Entries.forEach(guid => {\n            header.CustomFormatData.Entries.push(PropertyFactory.create(guid));\n        });\n        header.SaveGameClassName = obj.SaveGameClassName;\n        return header;\n    }\n}"
  },
  {
    "path": "src/js/backend/UESaveTool/LICENSE",
    "content": "MIT License\n\nCopyright © 2021 by Ch1pset\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "src/js/backend/UESaveTool/PropertyErrors.js",
    "content": "export class SerializationError extends Error {\n    constructor(prop) {\n        super(`Problem occurred during serialization of Property: ${prop.Name}`);\n    }\n}\n\nexport class DeserializationError extends Error {\n    constructor(type, offset) {\n        super(`Problem occurred during deserialization of Property '${type}' at offset 0x${offset.toString(16)}`)\n    }\n}\n\nexport class TypeNotImplementedError extends Error {\n    constructor(type) {\n        super(`No implementation for Property type: '${type}'`);\n    }\n}\n"
  },
  {
    "path": "src/js/backend/UESaveTool/Serializer.js",
    "content": "\nimport { Buffer } from \"buffer\";\nexport class Serializer {\n    constructor(buf) {\n        this._data = buf;\n        this._offset = 0;\n    }\n    get Data() { return this._data }\n    get tell() { return this._offset }\n    seek(count) {\n        if(this._offset >= this._data.length)\n            throw new Error(`Reached end of Buffer at offset 0x${this.tell.toString(16)}`);\n        return this._offset += count;\n    }\n    read(count) {\n        return this.Data.slice(this.tell, this.seek(count));\n    }\n    readInt32() {\n        let int = this.Data.readInt32LE(this.tell);\n        this.seek(4);\n        return int;\n    }\n    readUInt32() {\n        let int = this.Data.readUInt32LE(this.tell);\n        this.seek(4);\n        return int;\n    }\n    readInt64() {\n        let int1 = this.Data.readUInt32LE(this.tell);\n        this.seek(4);\n        let int2 = this.Data.readInt32LE(this.tell);\n        this.seek(4);\n        const val = (BigInt(int2) << 32n) + BigInt(int1);\n        if (val > (1n << 52n)) {\n            return val.toString()\n        }\n        return Number(val);\n    }\n    readInt16() {\n        let int = this.Data.readInt16LE(this.tell);\n        this.seek(2)\n        return int;\n    }\n    readUInt16() {\n        let int = this.Data.readUInt16LE(this.tell);\n        this.seek(2);\n        return int;\n    }\n    readInt8() {\n        let int = this.Data.readInt8(this.tell);\n        this.seek(1);\n        return int;\n    }\n    readUInt8() {\n        let int = this.Data.readUInt8(this.tell);\n        this.seek(1);\n        return int;\n    }\n    readFloat() {\n        let float = this.Data.readFloatLE(this.tell);\n        this.seek(4);\n        return float;\n    }\n    readString() {\n        let length = this.readInt32();\n        let str = this.read(length - 1).toString('latin1');\n        this.read(1);\n        return str;\n    }\n    readUnicodeString() {\n        let length = this.readInt32();\n        if (length < 0) {\n            let str = this.read(-length * 2 - 2).toString('utf16le');\n            this.read(2);\n            return [str, \"utf16le\"];\n        } else {\n            let str = this.read(length - 1).toString('latin1');\n            this.read(1);\n            return [str, \"latin1\"];\n        }\n    }\n    write(buf) {\n        this._offset += buf.copy(this.Data, this.tell);\n    }\n    writeInt64(num) {\n        let bi = BigInt.asIntN(64, BigInt(num));\n        let high = Number(bi >> 32n);\n        let low = Number(bi & ((1n << 32n) - 1n));\n        this._offset = this.Data.writeUInt32LE(low, this.tell);\n        this._offset = this.Data.writeInt32LE(high, this.tell);\n        // TODO: this._offset = this.Data.writeBigInt64LE(num, this.tell);\n    }\n    writeUInt32(num) {\n        this._offset = this.Data.writeUInt32LE(num, this.tell);\n    }\n    writeInt32(num) {\n        this._offset = this.Data.writeInt32LE(num, this.tell);\n    }\n    writeUInt16(num) {\n        this._offset = this.Data.writeUInt16LE(num, this.tell);\n    }\n    writeInt16(num) {\n        this._offset = this.Data.writeInt16LE(num, this.tell);\n    }\n    writeUInt8(byte) {\n        this._offset = this.Data.writeUInt8(byte, this.tell);\n    }\n    writeInt8(byte) {\n        this._offset = this.Data.writeInt8(byte, this.tell);\n    }\n    writeFloat(num) {\n        this._offset = this.Data.writeFloatLE(num, this.tell);\n    }\n    writeString(str) {\n        this._offset = this.Data.writeInt32LE(str.length + 1, this.tell);\n        this._offset += this.Data.write(str, this.tell);\n        this._offset = this.Data.writeInt8(0, this.tell);\n    }\n    writeUTF16String(str) {\n        this._offset += this.Data.write(str + \"\\0\", this.tell, \"utf16le\");\n    }\n    writeLatin1String(str) {\n        this._offset += this.Data.write(str + \"\\0\", this.tell, \"latin1\");\n    }\n    append(buf) {\n        this._data = Buffer.concat([this.Data, buf]);\n        this._offset += buf.length;\n    }\n    static alloc(size) {\n        return new Serializer(Buffer.alloc(size));\n    }\n}"
  },
  {
    "path": "src/js/backend/UESaveTool/arrays/IntArray.js",
    "content": "import { Property } from '../properties/'\nimport { PropertyFactory } from '../factories'\nimport { SerializationError } from '..';\nimport { Serializer } from '../Serializer';\n\nexport class IntArray extends Property {\n    constructor() {\n        super();\n        this.Type = \"IntProperty\"\n        this.Properties = [];\n    }\n    get Size() {\n        let size = this.Properties.length * 4;\n        this.Properties.forEach((int) => {\n            size += int.Size\n        });\n        return size;\n    }\n    get Count() {\n        return this.Properties.length;\n    }\n    deserialize(serial, count) {\n        serial.seek(count * 4);\n        for (let i = 1; i < count; i++) {\n            let Name = serial.readString();\n            let Type = serial.readString();\n            let Size = serial.readInt32();\n            let prop = PropertyFactory.create({ Name, Type });\n            prop.deserialize(serial);\n            this.Properties.push(prop);\n        }\n        return this;\n    }\n    serialize() {\n        let serial = Serializer.alloc(this.Size);\n        serial.seek(this.Count * 4);\n        this.Properties.forEach(int => serial.write(int.serialize()))\n        if (serial.tell !== this.Size)\n            throw new SerializationError(this);\n        return serial.Data;\n    }\n    static from(obj) {\n        let array = new IntArray();\n        if (obj.Properties !== undefined)\n            obj.Properties.forEach(int => array.Properties.push(PropertyFactory.create(int)));\n        return array;\n    }\n}"
  },
  {
    "path": "src/js/backend/UESaveTool/arrays/SoftObjectArray.js",
    "content": "import { Property } from '../properties/'\nimport { SerializationError } from '..';\nimport { Serializer } from '../Serializer';\n\nexport class SoftObjectArray extends Property {\n    constructor() {\n        super();\n        this.Type = \"SoftObjectProperty\";\n        this.Properties = [];\n    }\n    get Size() {\n        let size = 0;\n        this.Properties.forEach((str) => {\n            size += str.length + 1 + 4;\n            size += 4;\n        });\n        return size;\n    }\n    get Count() {\n        return this.Properties.length;\n    }\n    deserialize(serial, count) {\n        for (let i = 0; i < count; i++) {\n            this.Properties.push(serial.readString());\n            serial.seek(4);\n        }\n        return this;\n    }\n    serialize() {\n        let serial = Serializer.alloc(this.Size);\n        this.Properties.forEach(str => {\n            serial.writeString(str);\n            serial.seek(4);\n        });\n        if (serial.tell !== this.Size)\n            throw new SerializationError(this);\n        return serial.Data;\n    }\n    static from(obj) {\n        let array = new SoftObjectArray();\n        if (obj.Properties !== undefined)\n            array.Properties = obj.Properties;\n        return array;\n    }\n}"
  },
  {
    "path": "src/js/backend/UESaveTool/arrays/StructArray.js",
    "content": "import { StructProperty } from \"../properties/index.js\";\nimport { PropertyFactory } from \"../index.js\";\n\nexport class StructArray extends StructProperty {\n    deserialize(serial, count) {\n        // console.log(`Deserializing ${this.Name} Count: ${count}`)\n        this.Name = serial.readString()\n        this.Type = serial.readString()\n        let Size = serial.readInt32();\n        serial.seek(4);\n        this.StoredPropertyType = serial.readString();\n        serial.seek(17);\n        let i = 0;\n        while (i < count) {\n            let Name = this.StoredPropertyType;\n            let Type = 'Tuple';\n            let prop = PropertyFactory.create({ Name, Type })\n            prop.deserialize(serial)\n            this.Properties.push(prop);\n            i++;\n        }\n        // console.log(`Done Deserializing ${this.Name} Offset: ${serial.tell}`)\n        return this;\n    }\n    static from(obj) {\n        let struct = new StructArray();\n        struct.Name = obj.Name;\n        struct.Type = obj.Type;\n        struct.StoredPropertyType = obj.StoredPropertyType;\n        struct.Properties = [];\n        if (obj.Properties !== undefined)\n            obj.Properties.forEach((prop) => struct.Properties.push(PropertyFactory.create(prop)));\n        return struct;\n    }\n}"
  },
  {
    "path": "src/js/backend/UESaveTool/arrays/index.js",
    "content": "\nexport { IntArray } from './IntArray'\nexport { SoftObjectArray } from './SoftObjectArray'\nexport { StructArray } from '../arrays/StructArray'"
  },
  {
    "path": "src/js/backend/UESaveTool/factories.js",
    "content": "import { TypeNotImplementedError } from './index';\n\nclass Factory {\n  constructor() {\n    this.Properties = {}\n    this.Arrays = {}\n  }\n  create(obj) {\n    let type = obj.Type\n\n    if (this.Properties[type] === undefined)\n      throw new TypeNotImplementedError(type);\n\n    return this.Properties[type].from(obj);\n  }\n  createArray(obj) {\n    let type = obj.Type\n\n    if (this.Arrays[type] === undefined)\n      throw new TypeNotImplementedError(type);\n\n    return this.Arrays[type].from(obj);\n  }\n}\n\nexport const PropertyFactory = new Factory();"
  },
  {
    "path": "src/js/backend/UESaveTool/index.js",
    "content": "import {IntArray, SoftObjectArray, StructArray} from './arrays'\nimport {PropertyFactory} from './factories';\nimport {\n    ArrayProperty,\n    BoolProperty,\n    EnumProperty,\n    FloatProperty,\n    Guid,\n    Int16Property,\n    Int64Property,\n    Int8Property,\n    IntProperty,\n    UInt32Property,\n    ObjectProperty,\n    SoftObjectProperty,\n    StrProperty,\n    StructProperty,\n    Tuple\n} from './properties'\n\nPropertyFactory.Properties['ArrayProperty'] = ArrayProperty;\nPropertyFactory.Properties['BoolProperty'] = BoolProperty;\nPropertyFactory.Properties['EnumProperty'] = EnumProperty;\nPropertyFactory.Properties['FloatProperty'] = FloatProperty;\nPropertyFactory.Properties['IntProperty'] = IntProperty;\nPropertyFactory.Properties['UInt32Property'] = UInt32Property;\nPropertyFactory.Properties['Int64Property'] = Int64Property;\nPropertyFactory.Properties['UInt64Property'] = Int64Property;\nPropertyFactory.Properties['Int8Property'] = Int8Property;\nPropertyFactory.Properties['Int16Property'] = Int16Property;\nPropertyFactory.Properties['ObjectProperty'] = ObjectProperty;\nPropertyFactory.Properties['SoftObjectProperty'] = SoftObjectProperty;\nPropertyFactory.Properties['StrProperty'] = StrProperty;\nPropertyFactory.Properties['StructProperty'] = StructProperty;\nPropertyFactory.Properties['Tuple'] = Tuple;\nPropertyFactory.Properties['Guid'] = Guid;\nPropertyFactory.Arrays['IntArray'] = IntArray;\nPropertyFactory.Arrays['SoftObjectArray'] = SoftObjectArray;\nPropertyFactory.Arrays['StructProperty'] = StructArray;\nPropertyFactory.Arrays['IntProperty'] = IntArray;\nPropertyFactory.Arrays['IntProperty'] = IntArray;\nPropertyFactory.Arrays['SoftObjectProperty'] = SoftObjectArray;\n\nexport { PropertyFactory }\nexport { Gvas } from './Gvas'\nexport { GvasHeader } from './GvasHeader'\nexport { Serializer } from './Serializer'\nexport * from './PropertyErrors'\nexport * from './properties'\nexport * from './arrays'\n"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/ArrayProperty.js",
    "content": "import { Buffer } from 'buffer'\nimport { Property } from './'\nimport { PropertyFactory } from '../factories';\nimport { SerializationError } from '../'\nimport { Serializer } from '../Serializer';\n\nexport class ArrayProperty extends Property {\n    constructor() {\n        super();\n        this.StoredPropertyType = \"\";\n        this.Property = new Property();\n    }\n    get Size() {\n        let size = 0;\n        size += this.Name.length + 1 + 4;\n        size += this.Type.length + 1 + 4;\n        size += 8; // 4 byte size + 4 byte padding\n        size += this.StoredPropertyType.length + 1 + 4;\n        size += 5; // 1 byte padding + 2 byte int + 2 byte padding\n        size += this.Property.Size;\n        return size;\n    }\n    get HeaderSize() {\n        let size = this.Name.length + 1 + 4;\n        size += this.Type.length + 1 + 4;\n        size += 8;\n        size += this.StoredPropertyType.length + 1 + 4;\n        size += 1;\n        return size;\n    }\n    get ArraySize() {\n        if (this.StoredPropertyType === 'IntProperty')\n            return 12;\n        else\n            return this.Size - this.HeaderSize;\n    }\n    deserialize(serial) {\n        serial.seek(4);\n        this.StoredPropertyType = serial.readString()\n        serial.seek(1);\n        let count = serial.readInt16();\n        serial.seek(2);\n        this.Property = PropertyFactory.createArray({\n            Name: this.Name,\n            Type: this.StoredPropertyType\n        });\n        this.Property.deserialize(serial, count)\n\n        return this;\n    }\n    serialize() {\n        let serial = Serializer.alloc(this.Size);\n        serial.writeString(this.Name);\n        serial.writeString(this.Type);\n        serial.writeInt32(this.ArraySize);\n        serial.seek(4);\n        serial.writeString(this.StoredPropertyType);\n        serial.seek(1);\n        serial.writeInt16(this.Property.Count);\n        serial.seek(2);\n        serial.write(this.Property.serialize());\n        if (serial.tell !== this.Size)\n            throw new SerializationError(this);\n        return serial.Data;\n    }\n    static from(obj) {\n        let array = new ArrayProperty();\n        array.Name = obj.Name;\n        array.Type = obj.Type;\n        array.StoredPropertyType = obj.StoredPropertyType;\n        if (obj.Property !== undefined)\n            array.Property = PropertyFactory.createArray(obj.Property);\n        return array;\n    }\n}"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/BoolProperty.js",
    "content": "import { Property } from './'\nimport { Serializer } from '..';\nimport { SerializationError } from '../PropertyErrors';\n\nexport class BoolProperty extends Property {\n    constructor() {\n        super();\n        this.Property = false;\n    }\n    get Size() {\n        return this.Name.length + 1 + 4\n            + this.Type.length + 1 + 4\n            + 10;\n    }\n    deserialize(serial) {\n        serial.seek(4);\n        this.Property = serial.readUInt8() === 1;\n        serial.seek(1);\n        return this;\n    }\n    serialize() {\n        let serial = Serializer.alloc(this.Size);\n        serial.writeString(this.Name);\n        serial.writeString(this.Type);\n        serial.seek(8);\n        serial.writeUInt8(this.Property === true ? 1 : 0);\n        serial.seek(1);\n        if (serial.tell !== this.Size)\n            throw new SerializationError(this)\n        return serial.Data;\n    }\n    static from(obj) {\n        let prop = new BoolProperty();\n        obj.Property = !!obj.Property;\n        Object.assign(prop, obj);\n        return prop;\n    }\n}\n"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/EnumProperty.js",
    "content": "import { Serializer } from '../Serializer';\nimport { SerializationError } from '../PropertyErrors';\nimport { Property } from '.';\n\nexport class EnumProperty extends Property {\n    constructor() {\n        super();\n        this.EnumType = \"\";\n        this.Property = \"\";\n    }\n    get Size() {\n        return this.Name.length + 1 + 4\n            + this.Type.length + 1 + 4\n            + this.Property.length + 1 + 4\n            + this.EnumType.length + 1 + 4\n            + 9;\n    }\n    deserialize(serial) {\n        serial.seek(4);\n        this.EnumType = serial.readString();\n        serial.seek(1);\n        this.Property = serial.readString();\n        return this;\n    }\n    serialize() {\n        let serial = Serializer.alloc(this.Size);\n        serial.writeString(this.Name);\n        serial.writeString(this.Type);\n        serial.writeInt32(this.Property.length + 1 + 4);\n        serial.seek(4);\n        serial.writeString(this.EnumType);\n        serial.seek(1);\n        serial.writeString(this.Property);\n        if (serial.tell !== this.Size)\n            throw new SerializationError(this);\n        return serial.Data;\n    }\n    static from(obj) {\n        let prop = new EnumProperty();\n        Object.assign(prop, obj);\n        return prop;\n    }\n}\n"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/FloatProperty.js",
    "content": "import { Serializer } from '../Serializer';\nimport { SerializationError } from '../PropertyErrors';\nimport { Property } from './'\n\nexport class FloatProperty extends Property {\n    constructor() {\n        super();\n        this.Property = 0;\n        this.Index = 0;\n    }\n    get Size() {\n        return this.Name.length + 1 + 4\n            + this.Type.length + 1 + 4\n            + 13;\n    }\n    deserialize(serial) {\n        this.Index = serial.readInt32();\n        serial.seek(1);\n        this.Property = serial.readFloat();\n        return this;\n    }\n    serialize() {\n        let serial = Serializer.alloc(this.Size);\n        serial.writeString(this.Name);\n        serial.writeString(this.Type);\n        serial.writeInt32(4);\n        serial.writeInt32(this.Index);\n        serial.seek(1);\n        serial.writeFloat(this.Property);\n        if (serial.tell !== this.Size)\n            throw new SerializationError(this);\n        return serial.Data;\n    }\n    static from(obj) {\n        let prop = new FloatProperty();\n        obj.Property = Number(obj.Property);\n        Object.assign(prop, obj);\n        return prop;\n    }\n}\n"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/Guid.js",
    "content": "import { Buffer } from 'buffer'\nimport { Property } from './'\nimport { SerializationError } from '..';\nimport { Serializer } from '../Serializer';\n\nexport class Guid extends Property {\n    constructor() {\n        super();\n        this.Type = 'Guid';\n        this.Id = \"00000000-00-00-00-000000000000\";\n        this.Value = 0;\n    }\n    get Size() {\n        return 20;\n    }\n    deserialize(serial) {\n        this.Id = `${serial.read(4).swap32().toString('hex')}`\n        this.Id += `-${serial.read(2).swap16().toString('hex')}`\n        this.Id += `-${serial.read(2).swap16().toString('hex')}`\n        this.Id += `-${serial.read(2).toString('hex')}`\n        this.Id += `-${serial.read(6).toString('hex')}`\n        this.Value = serial.readInt32();\n        return this;\n    }\n    serialize() {\n        let guid = this.Id.split('-');\n        let serial = Serializer.alloc(this.Size);\n        serial.write(Buffer.from(guid[0], 'hex').swap32());\n        serial.write(Buffer.from(guid[1], 'hex').swap16());\n        serial.write(Buffer.from(guid[2], 'hex').swap16());\n        serial.write(Buffer.from(guid[3], 'hex'));\n        serial.write(Buffer.from(guid[4], 'hex'));\n        serial.writeInt32(this.Value);\n        if (serial.tell !== 20)\n            throw new SerializationError(this);\n        return serial.Data;\n    }\n    static from(obj) {\n        let guid = new Guid();\n        guid.Id = obj.Id;\n        guid.Value = obj.Value;\n        return guid;\n    }\n}\n"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/Int16Property.js",
    "content": "import { Property } from './'\nimport { Serializer } from '..';\nimport { SerializationError } from '../PropertyErrors';\n\nexport class Int16Property extends Property {\n    constructor() {\n        super();\n        this.Property = 0;\n        this.Index = 0;\n    }\n    get Size() {\n        return this.Name.length + 1 + 4\n            + this.Type.length + 1 + 4\n            + 9 + 2;\n    }\n    deserialize(serial) {\n        this.Index = serial.readInt32();\n        serial.seek(1);\n        this.Property = serial.readInt16();\n        return this;\n    }\n    serialize() {\n        let serial = Serializer.alloc(this.Size);\n        serial.writeString(this.Name);\n        serial.writeString(this.Type);\n        serial.writeInt32(4);\n        serial.writeInt32(this.Index);\n        serial.seek(1);\n        serial.writeInt16(this.Property);\n        if (serial.tell !== this.Size)\n            throw new SerializationError(this);\n        return serial.Data;\n    }\n    static from(obj) {\n        let prop = new Int16Property();\n        obj.Property = obj.Property || 0;\n        const lb = -1 << 15;\n        const ub = (1 << 15) - 1;\n        if (obj.Property > ub || obj.Property < lb) {\n            throw Error(`${obj.Name} = ${obj.Property} out of range [${lb}, ${ub}]`)\n        }\n        Object.assign(prop, obj);\n        return prop;\n    }\n}\n"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/Int64Property.js",
    "content": "import { Property } from './'\nimport { Serializer } from '..';\nimport { SerializationError } from '../PropertyErrors';\n\nexport class Int64Property extends Property {\n    constructor() {\n        super();\n        this.Property = 0n;\n        this.Index = 0;\n    }\n    get Size() {\n        return this.Name.length + 1 + 4\n          + this.Type.length + 1 + 4\n          + 9 + 8;\n    }\n    deserialize(serial) {\n        this.Index = serial.readInt32();\n        serial.seek(1);\n        this.Property = serial.readInt64();\n        return this;\n    }\n    serialize() {\n        let serial = Serializer.alloc(this.Size);\n        serial.writeString(this.Name);\n        serial.writeString(this.Type);\n        serial.writeInt32(4);\n        serial.writeInt32(this.Index);\n        serial.seek(1);\n        serial.writeInt64(this.Property);\n        if (serial.tell !== this.Size)\n            throw new SerializationError(this);\n        return serial.Data;\n    }\n    static from(obj) {\n        let prop = new Int64Property();\n        let bi = 0n;\n        try {\n            bi = BigInt(obj.Property || 0);\n            const lb = -1n << 64n;\n            const ub = (1n << 63n) - 1n;\n            if (bi > ub || bi < lb) {\n                throw Error(`out of range [${lb}, ${ub}]`)\n            }\n            const doubleVal = Number(obj.Property);\n            if (Math.abs(doubleVal) >= (2 ** 53)) {\n                obj.Property = BigInt(obj.Property).toString();\n            } else {\n                obj.Property = Number(obj.Property);\n            }\n        } catch (e) {\n            throw Error(`${obj.Name} = ${obj.Property}: ${e.toString()}`)\n        }\n        Object.assign(prop, obj);\n        return prop;\n    }\n}\n"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/Int8Property.js",
    "content": "import { Property } from './'\nimport { Serializer } from '..';\nimport { SerializationError } from '../PropertyErrors';\n\nexport class Int8Property extends Property {\n    constructor() {\n        super();\n        this.Property = 0;\n        this.Index = 0;\n    }\n    get Size() {\n        return this.Name.length + 1 + 4\n            + this.Type.length + 1 + 4\n            + 9 + 1;\n    }\n    deserialize(serial) {\n        this.Index = serial.readInt32();\n        serial.seek(1);\n        this.Property = serial.readInt8();\n        return this;\n    }\n    serialize() {\n        let serial = Serializer.alloc(this.Size);\n        serial.writeString(this.Name);\n        serial.writeString(this.Type);\n        serial.writeInt32(4);\n        serial.writeInt32(this.Index);\n        serial.seek(1);\n        serial.writeInt8(this.Property);\n        if (serial.tell !== this.Size)\n            throw new SerializationError(this);\n        return serial.Data;\n    }\n    static from(obj) {\n        let prop = new Int8Property();\n        obj.Property = obj.Property || 0;\n        const lb = -128;\n        const ub = 127;\n        if (obj.Property > ub || obj.Property < lb) {\n            throw Error(`${obj.Name} = ${obj.Property} out of range [${lb}, ${ub}]`)\n        }\n        Object.assign(prop, obj);\n        return prop;\n    }\n}\n"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/IntProperty.js",
    "content": "import { Property } from './'\nimport { Serializer } from '..';\nimport { SerializationError } from '../PropertyErrors';\n\nexport class IntProperty extends Property {\n    constructor() {\n        super();\n        this.Property = 0;\n        this.Index = 0;\n    }\n    get Size() {\n        return this.Name.length + 1 + 4\n            + this.Type.length + 1 + 4\n            + 9 + 4;\n    }\n    deserialize(serial) {\n        this.Index = serial.readInt32();\n        serial.seek(1);\n        this.Property = serial.readInt32();\n        return this;\n    }\n    serialize() {\n        let serial = Serializer.alloc(this.Size);\n        serial.writeString(this.Name);\n        serial.writeString(this.Type);\n        serial.writeInt32(4);\n        serial.writeInt32(this.Index);\n        serial.seek(1);\n        serial.writeInt32(this.Property);\n        if (serial.tell !== this.Size)\n            throw new SerializationError(this);\n        return serial.Data;\n    }\n    static from(obj) {\n        let prop = new IntProperty();\n        obj.Property = obj.Property || 0;\n        const lb = -1 << 31;\n        const ub = 0x7fffffff;\n        if (obj.Property > ub || obj.Property < lb) {\n            throw Error(`${obj.Name} = ${obj.Property} out of range [${lb}, ${ub}]`)\n        }\n        Object.assign(prop, obj);\n        return prop;\n    }\n}\n\nexport class UInt32Property extends Property {\n    constructor() {\n        super();\n        this.Property = 0;\n        this.Index = 0;\n    }\n    get Size() {\n        return this.Name.length + 1 + 4\n            + this.Type.length + 1 + 4\n            + 9 + 4;\n    }\n    deserialize(serial) {\n        this.Index = serial.readInt32();\n        serial.seek(1);\n        this.Property = serial.readUInt32();\n        return this;\n    }\n    serialize() {\n        let serial = Serializer.alloc(this.Size);\n        serial.writeString(this.Name);\n        serial.writeString(this.Type);\n        serial.writeInt32(4);\n        serial.writeInt32(this.Index);\n        serial.seek(1);\n        serial.writeUInt32(this.Property);\n        if (serial.tell !== this.Size)\n            throw new SerializationError(this);\n        return serial.Data;\n    }\n    static from(obj) {\n        let prop = new IntProperty();\n        obj.Property = obj.Property || 0;\n        const lb = 0;\n        const ub = 0xffffffff;\n        if (obj.Property > ub || obj.Property < lb) {\n            throw Error(`${obj.Name} = ${obj.Property} out of range [${lb}, ${ub}]`)\n        }\n        Object.assign(prop, obj);\n        return prop;\n    }\n}\n"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/ObjectProperty.js",
    "content": "import { Serializer } from '../Serializer';\nimport { SerializationError } from '../PropertyErrors';\nimport { Property } from './'\n\nexport class ObjectProperty extends Property {\n    constructor() {\n        super();\n        this.Property = \"\";\n    }\n    get Size() {\n        return this.Name.length + 1 + 4\n            + this.Type.length + 1 + 4\n            + this.Property.length + 1 + 4\n            + 9;\n    }\n    deserialize(serial) {\n        serial.seek(5);\n        this.Property = serial.readString();\n        return this;\n    }\n    serialize() {\n        let serial = Serializer.alloc(this.Size);\n        serial.writeString(this.Name);\n        serial.writeString(this.Type);\n        serial.writeInt32(this.Property.length + 1 + 4);\n        serial.seek(5);\n        serial.writeString(this.Property);\n        if (serial.tell !== this.Size)\n            throw new SerializationError(this);\n        return serial.Data;\n    }\n    static from(obj) {\n        let prop = new ObjectProperty();\n        Object.assign(prop, obj);\n        return prop;\n    }\n}\n"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/Property.js",
    "content": "import { Serializer } from '../'\nexport class Property {\n    constructor() {\n        this.Name = \"\";\n        this.Type = \"\";\n    }\n    /**\n     * Per-property byte size getter\n     * @returns {Number} `Size` in bytes of all attributes and properties held by this property to be serialized\n     */\n    get Size() {\n        throw new Error(`Size getter not implemented for property: ${this.Type}`);\n    }\n    /**\n     * Per-property deserialization function\n     * @param {Serializer} serial Serializer instance used to read a buffer\n     * @param {Number} size Size in bytes or Count of elements for Arrays\n     * @returns {Property} Returns `this` instance\n     */\n    deserialize(serial, size) {\n        throw new Error(`Deserialization not implemented for property: ${this.Type}`);\n    }\n    /**\n     * Per-property serialization function\n     * @returns {Buffer} Returns a `Buffer` of the serialized data\n     */\n    serialize() {\n        throw new Error(`Serialization not implemented for property: ${this.Type}`);\n    }\n    /**\n     * Factory function for a `Property` type. This should instantiate a `new Property` with default values if not given in the `json`\n     * @param {Object} json Template from which to create a new instance of a `Property`\n     */\n    static from(json) {\n        throw new Error(`from() not implemented for property: ${this.Type}`);\n    }\n}\n"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/SoftObjectProperty.js",
    "content": "import { SerializationError } from '../PropertyErrors';\nimport { Property } from './'\nimport { Serializer } from '../Serializer';\n\nexport class SoftObjectProperty extends Property {\n    constructor() {\n        super();\n        this.Property = \"\";\n    }\n    get Size() {\n        return this.Name.length + 1 + 4\n            + this.Type.length + 1 + 4\n            + this.Property.length + 1 + 4\n            + 13;\n    }\n    deserialize(serial) {\n        serial.seek(5);\n        this.Property = serial.readString();\n        serial.seek(4);\n        return this;\n    }\n    serialize() {\n        let serial = Serializer.alloc(this.Size);\n        serial.writeString(this.Name);\n        serial.writeString(this.Type);\n        serial.writeInt32(this.Property.length + 8);\n        serial.seek(5);\n        serial.writeString(this.Property);\n        serial.seek(4);\n        if (serial.tell !== this.Size)\n            throw new SerializationError(this);\n        return serial.Data;\n    }\n    static from(obj) {\n        let prop = new SoftObjectProperty();\n        Object.assign(prop, obj);\n        return prop;\n    }\n}\n"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/StrProperty.js",
    "content": "import {SerializationError} from \"../PropertyErrors\";\nimport {Serializer} from '../Serializer';\nimport {Property} from './'\nimport { Buffer } from \"buffer\";\n\nconst is8Bit = string => /^[\\x00-\\xFF]*$/.test(string);\n\nexport class StrProperty extends Property {\n    constructor() {\n        super();\n        this.Property = \"\";\n    }\n\n    get Encoding() {\n        return is8Bit(this.Property) ? \"latin1\" : \"utf16le\";\n    }\n\n    get StringEncodedLength() {\n        return Buffer.from(this.Property + \"\\0\", this.Encoding).length;\n    }\n\n    get Size() {\n        const baseLength = this.Name.length + 1 + 4 + this.Type.length + 1 + 4;\n        return baseLength + this.StringEncodedLength + 4 + 9;\n    }\n    deserialize(serial) {\n        serial.seek(5);\n        [this.Property, ] = serial.readUnicodeString();\n        return this;\n    }\n    serialize() {\n        let serial = Serializer.alloc(this.Size);\n        serial.writeString(this.Name);\n        serial.writeString(this.Type);\n\n        serial.writeInt32(this.StringEncodedLength + 4);\n        serial.seek(5);\n        switch (this.Encoding) {\n            case \"latin1\":\n                serial.writeInt32(this.StringEncodedLength);\n                serial.writeLatin1String(this.Property);\n                break;\n            case \"utf16le\":\n                serial.writeInt32(-(this.StringEncodedLength / 2));\n                serial.writeUTF16String(this.Property);\n                break;\n        }\n        if (serial.tell !== this.Size)\n            throw new SerializationError(this);\n        return serial.Data;\n    }\n    static from(obj) {\n        let prop = new StrProperty();\n        Object.assign(prop, obj);\n        return prop;\n    }\n}\n"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/StrProperty_.js",
    "content": "import {SerializationError} from \"../PropertyErrors\";\nimport {Serializer} from '../Serializer';\nimport {Property} from './'\n\nconst is8Bit = string => /^[\\x00-\\xFF]*$/.test(string);\n\nexport class StrProperty extends Property {\n    constructor() {\n        super();\n        this.Property = \"\";\n        this.Encoding = \"latin1\";\n    }\n\n    get Encoding() {\n        return is8Bit(this.Property) ? \"latin1\" : \"utf16le\";\n    }\n\n    get StringEncodedLength() {\n        return Buffer.from(this.Property + \"\\0\", this.Encoding).length;\n    }\n\n    get Size() {\n        const baseLength = this.Name.length + 1 + 4 + this.Type.length + 1 + 4;\n        return baseLength + this.StringEncodedLength + 4 + 9;\n    }\n    deserialize(serial) {\n        serial.seek(5);\n        [this.Property, this.Encoding] = serial.readUnicodeString();\n        return this;\n    }\n    serialize() {\n        let serial = Serializer.alloc(this.Size);\n        serial.writeString(this.Name);\n        serial.writeString(this.Type);\n\n        serial.writeInt32(this.StringEncodedLength + 4);\n        serial.seek(5);\n        switch (this.Encoding) {\n            case \"latin1\":\n                serial.writeInt32(this.StringEncodedLength);\n                serial.writeLatin1String(this.Property);\n                break;\n            case \"utf16le\":\n                serial.writeInt32(-(this.StringEncodedLength / 2));\n                serial.writeUTF16String(this.Property);\n                break;\n        }\n        if (serial.tell !== this.Size)\n            throw new SerializationError(this);\n        return serial.Data;\n    }\n    static from(obj) {\n        let prop = new StrProperty();\n        if (obj.Encoding === \"utf8\") {\n            obj.Encoding = \"latin1\";\n            console.warn(\"utf8 should be latin1\");\n        }\n\n        if (obj.Encoding === \"latin1\") {\n            if (!is8Bit(obj.Property)) {\n                throw Error(`${obj.Name} = ${obj.Property} is outside latin1. consider using utf16le?`)\n            }\n        } else if (obj.Encoding === \"utf16le\") {\n        } else if (!obj.Encoding) {\n        } else {\n            throw Error(`${obj.Name}: ${obj.Encoding} is unsupported. valid options are: [latin1, utf16le]`)\n        }\n        Object.assign(prop, obj);\n        return prop;\n    }\n}\n"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/StructProperty.js",
    "content": "import { Property } from './'\nimport { PropertyFactory } from '../factories';\nimport { Serializer } from '../Serializer';\n\nexport class StructProperty extends Property {\n    constructor() {\n        super();\n        this.StoredPropertyType = \"\";\n        this.Properties = [];\n    }\n    get Size() {\n        let size = this.Name.length + 1 + 4;\n        size += this.Type.length + 1 + 4;\n        size += 8; // 4 byte size + 4 byte padding\n        size += this.StoredPropertyType.length + 1 + 4;\n        size += 17; // 17 byte padding\n        for (let i = 0; i < this.Properties.length; i++) {\n            size += this.Properties[i].Size;\n        }\n        return size;\n    }\n    get HeaderSize() {\n        let size = this.Name.length + 1 + 4;\n        size += this.Type.length + 1 + 4;\n        size += 8;\n        size += this.StoredPropertyType.length + 1 + 4;\n        size += 17;\n        return size\n    }\n    get Count() {\n        return this.Properties.length;\n    }\n    deserialize(serial, size) {\n        // console.log(`Deserializing ${this.Name} Size: ${size}`)\n        serial.seek(4);\n        this.StoredPropertyType = serial.readString();\n        serial.seek(17);\n        let end = serial.tell + size;\n        let i = 0;\n        while (serial.tell < end) {\n            let Name = this.StoredPropertyType;\n            let Type = 'Tuple';\n            let prop = PropertyFactory.create({ Name, Type })\n            prop.deserialize(serial)\n            this.Properties.push(prop);\n            i++;\n        }\n        // console.log(`Done Deserializing ${this.Name} Offset: ${serial.tell}`)\n        return this;\n    }\n    serialize() {\n        let serial = Serializer.alloc(this.Size);\n        serial.writeString(this.Name);\n        serial.writeString(this.Type);\n        serial.writeInt32(this.Size - this.HeaderSize);\n        serial.seek(4);\n        serial.writeString(this.StoredPropertyType);\n        serial.seek(17);\n        for (let i = 0; i < this.Properties.length; i++) {\n            serial.write(this.Properties[i].serialize());\n        }\n        if (serial.tell !== this.Size)\n            throw new SerializationError(this);\n        return serial.Data;\n    }\n    static from(obj) {\n        let struct = new StructProperty();\n        struct.Name = obj.Name;\n        struct.Type = obj.Type;\n        struct.StoredPropertyType = obj.StoredPropertyType;\n        struct.Properties = [];\n        if (obj.Properties !== undefined)\n            obj.Properties.forEach((prop) => struct.Properties.push(PropertyFactory.create(prop)));\n        return struct;\n    }\n}\n"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/Tuple.js",
    "content": "import { Property } from './'\nimport { PropertyFactory } from '../factories';\nimport { SerializationError } from '..';\nimport { Serializer } from '../Serializer';\n\nexport class Tuple extends Property {\n    constructor() {\n        super();\n        this.Type = 'Tuple';\n        this.Properties = [];\n    }\n    get Size() {\n        let size = 0;\n        for (let i = 0; i < this.Properties.length; i++) {\n            size += this.Properties[i].Size;\n        }\n        size += 9;\n        return size;\n    }\n    get Count() {\n        return this.Properties.length;\n    }\n    deserialize(serial) {\n        let Name;\n        while ((Name = serial.readString()) !== 'None') {\n            let Type = serial.readString();\n            let Size = serial.readInt32();\n            let prop = PropertyFactory.create({ Name, Type });\n            prop.deserialize(serial, Size);\n            this.Properties.push(prop);\n        }\n        return this;\n    }\n    serialize() {\n        let serial = Serializer.alloc(this.Size);\n        for (let i = 0; i < this.Properties.length; i++) {\n            serial.write(this.Properties[i].serialize());\n        }\n        serial.writeString('None');\n        if (serial.tell !== this.Size)\n            throw new SerializationError(this);\n        return serial.Data;\n    }\n    static from(obj) {\n        let tuple = new Tuple();\n        tuple.Name = obj.Name;\n        if (obj.Properties !== undefined)\n            obj.Properties.forEach(prop => tuple.Properties.push(PropertyFactory.create(prop)));\n        return tuple;\n    }\n}"
  },
  {
    "path": "src/js/backend/UESaveTool/properties/index.js",
    "content": "export { Property } from './Property'\nexport { BoolProperty } from './BoolProperty'\nexport { IntProperty } from './IntProperty'\nexport { Int8Property } from './Int8Property'\nexport { Int16Property } from './Int16Property'\nexport { UInt32Property } from './IntProperty'\nexport { Int64Property } from './Int64Property'\nexport { FloatProperty } from './FloatProperty'\nexport { StrProperty } from './StrProperty'\nexport { ObjectProperty } from './ObjectProperty'\nexport { SoftObjectProperty } from './SoftObjectProperty'\nexport { StructProperty } from './StructProperty'\nexport { ArrayProperty } from './ArrayProperty'\nexport { EnumProperty } from './EnumProperty'\nexport { Tuple } from './Tuple'\nexport { Guid } from './Guid'\n"
  },
  {
    "path": "src/js/backend/command.js",
    "content": "// Command.js\nimport { updateFront } from \"../frontend/renderer\";\nimport { dbWorker } from \"../frontend/dragFile\";\nimport { teamReplaceDict, prettyNames, getGlobals, setGlobals } from \"./commandGlobals\";\n\n\nexport class Command {\n    /**\n     * @param {string} commandName - Name of the command to execute.\n     * @param {Object} data - Data to send to the worker.\n     */\n    constructor(commandName, data) {\n        this.commandName = commandName;\n        this.data = data;\n    }\n\n\n    async execute() {\n        console.log(`[Command] Executing command: ${this.commandName}`);\n        console.log(`[Command] Data:`, this.data);\n\n        dbWorker.postMessage({ command: this.commandName, data: this.data });\n\n        dbWorker.onmessage = async (msg) => {\n            const response = msg.data;\n            if (response.error) {\n                console.error(`[${this.commandName}] Error:`, response.error);\n                document.querySelector(\".error\").classList.remove(\"d-none\");\n            } else {\n                console.log(`[${this.commandName}] Response:`, response.responseMessage);\n                await updateFront(response);\n                if (this.commandName === \"saveSelected\") {\n                    if (response.responseMessage === \"Game Year\") {\n                        this.updateTeamsFor24(response.content[0]);\n                        this.addTeam(\"Custom Team\", response.content[1]);\n                    }\n                }\n            }\n\n        };\n    }\n\n    promiseExecute() {\n        return new Promise((resolve, reject) => {\n            const handler = (e) => {\n                const resp = e.data;\n                if (resp.command && resp.command !== this.commandName) return;\n                dbWorker.removeEventListener(\"message\", handler);\n\n                if (resp.error) return reject(resp.error);\n                resolve(resp);\n            };\n\n            dbWorker.addEventListener(\"message\", handler);\n            dbWorker.postMessage({ command: this.commandName, data: this.data });\n        });\n    }\n\n    async updateTeamsFor24(year) {\n        if (year === \"24\") {\n            const data = {\n                teams: {\n                    alphatauri: \"visarb\",\n                    alpine: \"alpine\",\n                    alfa: \"stake\"\n                }\n            }\n            this.replaceTeam(\"Alpha Tauri\", data.teams.alphatauri);\n            this.replaceTeam(\"Alpine\", data.teams.alpine);\n            this.replaceTeam(\"Alfa Romeo\", data.teams.alfa);\n            const yearResponse = { responseMessage: \"24 Year\", content: data };\n            await updateFront(yearResponse);\n        }\n    }\n\n    replaceTeam(originalTeam, newTeam) {\n        teamReplaceDict[originalTeam] = prettyNames[newTeam] || newTeam;\n    }\n\n    addTeam(originalTeam, newTeam) {\n        teamReplaceDict[originalTeam] = newTeam;\n    }\n}\n"
  },
  {
    "path": "src/js/backend/commandGlobals.js",
    "content": "// commandGlobals.js\nexport const teamReplaceDict = {\n    \"Alpha Tauri\": \"Alpha Tauri\", \"Alpine\": \"Alpine\", \"Alfa Romeo\": \"Alfa Romeo\", \"Aston Martin\": \"Aston Martin\",\n    \"Ferrari\": \"Ferrari\", \"Haas\": \"Haas\", \"McLaren\": \"McLaren\", \"Mercedes\": \"Mercedes\",\n    \"Red Bull\": \"Red Bull\", \"Williams\": \"Williams\", \"Renault\": \"Renault\", \"F2\": \"Formula 2\", \"F3\": \"Formula 3\", \"Custom Team\": \"Custom Team\"\n};\n\nexport const prettyNames = {\n    \"visarb\": \"Visa Cashapp RB\", \"toyota\": \"Toyota\", \"hugo\": \"Hugo Boss\", \"alphatauri\": \"Alpha Tauri\", \"brawn\": \"Brawn GP\", \"porsche\": \"Porsche\",\n    \"alpine\": \"Alpine\", \"renault\": \"Renault\", \"andretti\": \"Andretti\", \"lotus\": \"Lotus\", \"cadillac\": \"Cadillac\", \"alfa\": \"Alfa Romeo\",\n    \"audi\": \"Audi\", \"sauber\": \"Sauber\", \"stake\": \"Stake Sauber\", \"redbull\": \"Red Bull\", \"ford\": \"Ford\", \"aston\": \"Aston Martin\",\n    \"racingpoint\": \"Racing Point\", \"jordan\": \"Jordan\"\n};\n\nlet path = null;\nlet yearIteration = null;\nlet isCreateATeam = false;\nlet currentDate = null;\n\nexport function setGlobals({dbPath, year, createTeam, date }) {\n    path = dbPath || path;\n    yearIteration = year || yearIteration;\n    isCreateATeam = createTeam || isCreateATeam;\n    currentDate = date || currentDate;\n}\n\nexport function getGlobals() {\n    return { path, yearIteration, isCreateATeam, currentDate };\n}\n"
  },
  {
    "path": "src/js/backend/dbManager.js",
    "content": "let db = null;\nlet metadata = null;\n\nexport function setDatabase(database, meta) {\n  db = database;\n\n  metadata = meta;\n}\n\nexport function getDatabase() {\n  return db;\n}\n\nexport function getMetadata() {\n  return metadata;\n}\n\nexport function setMetaData(meta) {\n  metadata = meta;\n}\n\n/**\n * Ejecuta una consulta SQL y devuelve el resultado según 'type'.\n * @param {string} query - La consulta a ejecutar.\n * @param {Array} [params=[]] - Los parámetros para la consulta.\n * @param {\"singleValue\"|\"singleRow\"|\"allRows\"|\"run\"} [type=\"allRows\"] - El tipo de resultado.\n * @returns {any} \n *    - 'singleValue': un único valor (o null).\n *    - 'singleRow': la primera fila (array de valores) o null.\n *    - 'allRows': array de filas (cada fila, array de valores), o [] si no hay ninguna.\n *    - 'run': devuelve true si se ejecutó correctamente.\n */\nexport function queryDB(query, params = [], type = 'allRows') {\n  try {\n    const sanitizedParams = Array.isArray(params)\n      ? params.map(p => (Array.isArray(p) && p.length === 1 ? p[0] : p))\n      : params;\n\n    if (type === 'exec') {\n      db.exec(query);\n      return true;\n    }\n\n    if (type === 'run') {\n      db.run(query, sanitizedParams);\n      return true;\n    }\n    \n    const stmt = db.prepare(query);\n    stmt.bind(sanitizedParams);\n\n    let result = null;\n\n    if (type === 'singleValue') {\n      if (stmt.step()) {\n        const row = stmt.get();\n        result = row[0] ?? null;\n      } else {\n        result = null;\n      }\n    } else if (type === 'singleRow') {\n      if (stmt.step()) {\n        result = stmt.get();\n      } else {\n        result = null;\n      }\n    } else {\n      // allRows\n      result = [];\n      while (stmt.step()) {\n        result.push(stmt.get());\n      }\n    }\n\n    stmt.free();\n    return result;\n\n  } catch (err) {\n    // 💥 AQUÍ cazamos errores de SQL.js, incluyendo binds mal pasados\n    const fullErr = new Error(\n      `SQL ERROR\\nQuery: ${query}\\nParams: ${JSON.stringify(params)}\\nOriginal: ${err.message}`\n    );\n    console.error(fullErr);\n    throw fullErr;\n  }\n}\n\n"
  },
  {
    "path": "src/js/backend/scriptUtils/calendarUtils.js",
    "content": "import { queryDB } from \"../dbManager\";\n\nconst weatherDict = {\n  \"0\": 1,\n  \"1\": 2,\n  \"2\": 4,\n  \"3\": 8,\n  \"4\": 16,\n  \"5\": 32\n};\n\nexport function fetchCalendar() {\n  const daySeason = queryDB(`\n    SELECT Day, CurrentSeason\n    FROM Player_State\n  `, [], 'singleRow');\n\n  if (!daySeason) {\n    console.warn(\"No data found in Player_State.\");\n    return [];\n  }\n\n  const currentSeason = daySeason[1];\n\n  const calendarRows = queryDB(`\n    SELECT r.TrackID,\n           r.WeatherStatePractice,\n           r.WeatherStateQualifying,\n           r.WeatherStateRace,\n           r.WeekendType,\n           r.State,\n           t.isF2Race,\n           t.IsF3Race AS isF3Race\n    FROM Races r\n    LEFT JOIN Races_Tracks t ON r.TrackID = t.TrackID\n    WHERE r.SeasonID = ?\n  `, [currentSeason], 'allRows') || [];\n\n  return calendarRows.map((row) => ({\n    trackId: row[0],\n    weatherStatePractice: row[1],\n    weatherStateQualifying: row[2],\n    weatherStateRace: row[3],\n    weekendType: row[4],\n    state: row[5],\n    isF2Race: row[6] ?? 0,\n    isF3Race: row[7] ?? 0,\n  }));\n}\n\nexport function editCalendar(year_iteration, racesData) {\n  const yearIteration = year_iteration;\n\n  let maxRaces;\n  let weeks;\n\n  if (yearIteration === \"24\") {\n    maxRaces = 24;\n    weeks = [11, 8, 15, 36, 24, 20, 22, 25, 26, 9, 28, 29, 34, 37, 13, 42, 41, 43, 48, 17, 33, 19, 46, 47];\n  } else if (yearIteration === \"23\") {\n    maxRaces = 23;\n    weeks = [12, 8, 16, 21, 20, 23, 25, 26, 10, 28, 29, 34, 36, 37, 42, 41, 43, 46, 17, 33, 19, 45, 39];\n  } else {\n    maxRaces = 0;\n    weeks = [];\n  }\n\n  const raceBlanks = maxRaces - racesData.length;\n\n  const daySeason = queryDB(`\n    SELECT Day, CurrentSeason\n    FROM Player_State\n  `, [], 'singleRow');\n\n  let actualCalendar = queryDB(`\n    SELECT TrackID\n    FROM Races\n    WHERE SeasonID = ?\n  `, [daySeason[1]], 'allRows') || [];\n\n  actualCalendar = actualCalendar.map(row => row[0]);\n  //build newCalendar with trackId from each element from the array racesData\n  const newCalendar = racesData.map(race => parseInt(race.trackId));\n\n  if (arraysEqual(actualCalendar, newCalendar)) {\n    const ids = queryDB(`\n      SELECT RaceID\n      FROM Races\n      WHERE SeasonID = ?\n    `, [daySeason[1]], 'allRows') || [];\n    const raceIDs = ids.map(row => row[0]);\n\n    for (let i = 0; i < racesData.length; i++) {\n      const race = racesData[i];\n      const state = race.state;\n      const format = race.type;\n      const rainR = weatherDict[race.rainRace];\n      const rainRBool = (parseFloat(rainR) >= 8) ? 1 : 0;\n      const rainQ = weatherDict[race.rainQuali];\n      const rainQBool = (parseFloat(rainQ) >= 8) ? 1 : 0;\n      const rainP = weatherDict[race.rainPractice];\n      const rainPBool = (parseFloat(rainP) >= 8) ? 1 : 0;\n      const isF2Race = parseInt(race.isF2Race, 10) || 0;\n      const isF3Race = parseInt(race.isF3Race, 10) || 0;\n      const trackId = parseInt(race.trackId, 10);\n      // race_code = race.slice(0, -5); // en Python, no lo usas aquí para nada\n\n      queryDB(`\n        UPDATE Races\n        SET\n          RainPractice = ?,\n          WeatherStatePractice = ?,\n          RainQualifying = ?,\n          WeatherStateQualifying = ?,\n          RainRace = ?,\n          WeatherStateRace = ?,\n          WeekendType = ?\n        WHERE RaceID = ?\n      `, [rainPBool, rainP, rainQBool, rainQ, rainRBool, rainR, format, raceIDs[i]], 'run');\n\n      queryDB(`\n        UPDATE Races_Tracks\n        SET\n          isF2Race = ?,\n          IsF3Race = ?\n        WHERE TrackID = ?\n      `, [isF2Race, isF3Race, trackId], 'run');\n    }\n  } else {\n    const randomBlanks = [];\n    for (let i = 0; i < raceBlanks; i++) {\n      let n = Math.floor(Math.random() * maxRaces);\n      while (randomBlanks.includes(n)) {\n        n = Math.floor(Math.random() * maxRaces);\n      }\n      randomBlanks.push(n);\n    }\n\n    for (const el of randomBlanks) {\n      weeks[el] = 0;\n    }\n\n    weeks = weeks.filter(x => x !== 0);\n    weeks.sort((a, b) => a - b);\n\n\n\n    let leapYearCount = 2;\n    const yearDiff = daySeason[1] - 2023;\n    leapYearCount += yearDiff;\n\n    let dayStart = 44927 + (yearDiff * 365) + Math.floor(leapYearCount / 4);\n    const dayOfWeek = dayStart % 7;\n    const daysUntilSunday = (8 - dayOfWeek) % 7;\n    dayStart += daysUntilSunday;\n\n    const lastRaceLastSeason = queryDB(`\n      SELECT MAX(RaceID)\n      FROM Races\n      WHERE SeasonID = ?\n    `, [daySeason[1] - 1], 'singleValue');\n\n    const firstRaceThisSeason = queryDB(`\n      SELECT MIN(RaceID)\n      FROM Races\n      WHERE SeasonID = ?\n    `, [daySeason[1]], 'singleValue');\n\n    let raceid;\n    if (parseInt(lastRaceLastSeason, 10) === (parseInt(firstRaceThisSeason, 10) - 1)) {\n      raceid = lastRaceLastSeason;\n    } else {\n      raceid = firstRaceThisSeason - 1;\n    }\n\n    queryDB(`\n      DELETE FROM Races\n      WHERE State != 2\n        AND SeasonID = ?\n    `, [daySeason[1]], 'run');\n\n    for (let i = 0; i < racesData.length; i++) {\n      const race = racesData[i];\n      const state = race.state;\n      const format = race.type;\n      const rainR = weatherDict[race.rainRace];\n      const rainRBool = (parseFloat(rainR) >= 8) ? 1 : 0;\n      const rainQ = weatherDict[race.rainQuali];\n      const rainQBool = (parseFloat(rainQ) >= 8) ? 1 : 0;\n      const rainP = weatherDict[race.rainPractice];\n      const rainPBool = (parseFloat(rainP) >= 8) ? 1 : 0;\n      const raceCode = parseInt(race.trackId);\n      const isF2Race = parseInt(race.isF2Race, 10) || 0;\n      const isF3Race = parseInt(race.isF3Race, 10) || 0;\n\n      const temps = queryDB(`\n        SELECT TemperatureMin, TemperatureMax\n        FROM Races_Templates\n        WHERE TrackID = ?\n      `, [raceCode], 'singleRow');\n\n      const tempP = randomInt(temps[0], temps[1]);\n      const tempQ = randomInt(temps[0], temps[1]);\n      const tempR = randomInt(temps[0], temps[1]);\n\n      const day = ((weeks[i] + 1) * 7) + dayStart;\n      raceid += 1;\n\n      if (state !== \"2\") {\n        queryDB(`\n          INSERT INTO Races\n          VALUES (\n            ?,\n            ?,\n            ?,\n            ?,\n            ?,\n            ?,\n            ?,\n            ?,\n            ?,\n            ?,\n            ?,\n            ?,\n            ?,\n            ?,\n            ?\n          )\n        `, [\n          raceid,\n          daySeason[1],\n          day,\n          raceCode,\n          state,\n          rainPBool,\n          tempP,\n          rainP,\n          rainQBool,\n          tempQ,\n          rainQ,\n          rainRBool,\n          tempR,\n          rainR,\n          format\n        ], 'run');\n      }\n\n      queryDB(`\n        UPDATE Races_Tracks\n        SET\n          isF2Race = ?,\n          IsF3Race = ?\n        WHERE TrackID = ?\n      `, [isF2Race, isF3Race, raceCode], 'run');\n    }\n  }\n}\n\n// Helpers\n\nfunction arraysEqual(a, b) {\n  if (a.length !== b.length) return false;\n  for (let i = 0; i < a.length; i++) {\n    if (a[i] !== b[i]) return false;\n  }\n  return true;\n}\n\nfunction randomInt(min, max) {\n  const mn = parseInt(min, 10);\n  const mx = parseInt(max, 10);\n  return Math.floor(Math.random() * (mx - mn + 1)) + mn;\n}\n"
  },
  {
    "path": "src/js/backend/scriptUtils/carAnalysisUtils.js",
    "content": "import * as carConstants from './carConstants.js';\nimport { queryDB } from '../dbManager.js';\nimport { manage_engine_change } from './editTeamUtils.js';\n\n\n\n/**\n * Devuelve las mejores piezas para cada equipo.\n * @param {boolean} customTeam - si es true, incluye el equipo 32 además de 1..10\n */\nexport function getBestParts(customTeam = false) {\n    const teams = {};\n    // Creamos la lista de equipos\n    const teamList = customTeam\n        ? [...Array(10).keys()].map(i => i + 1).concat(32) // 1..10 y 32\n        : [...Array(10).keys()].map(i => i + 1);          // 1..10\n\n    for (const teamId of teamList) {\n        teams[teamId] = getPartsFromTeam(teamId);\n    }\n    return teams;\n}\n\n/**\n * Obtiene TODAS las piezas (varias designs) de un equipo\n * (Como en Python: get_all_parts_from_team)\n */\nexport function getAllPartsFromTeam(teamId) {\n    // Obtenemos Day y Season\n    const [day, currentSeason] = queryDB(\n        \"SELECT Day, CurrentSeason FROM Player_State\",\n        [], \"singleRow\"\n    ) || [0, 0];\n\n\n    const partsDict = {};\n\n    // Ej. en Python, PartType iba de 3..8\n    for (let j = 3; j < 9; j++) {\n        const sql = `\n          SELECT \n            d.DesignID,\n            d.DayCreated,\n            d.DayCompleted, \n            (\n              SELECT r.TrackID \n              FROM Races r \n              WHERE r.Day >= d.DayCompleted \n              ORDER BY r.Day ASC \n              LIMIT 1\n            ) AS TrackID\n          FROM Parts_Designs d\n          WHERE \n            d.PartType = ?\n            AND d.TeamID = ?\n            AND d.ValidFrom = ?\n            AND d.DayCompleted > 0\n        `;\n        let designs = queryDB(sql, [j, teamId, currentSeason], \"allRows\");\n\n        // Para cada design, agregamos info extra: equipped_1, equipped_2, n_parts\n        designs = designs.map(designRow => {\n            // designRow => [ DesignID, DayCreated, DayCompleted, TrackID ]\n            const [designID, dayCreated, dayCompleted, trackID] = designRow;\n\n            // Vemos si está equipado en loadout 1\n            const equipped1 = queryDB(`\n            SELECT DesignID\n            FROM Parts_CarLoadout\n            WHERE TeamID = ?\n              AND PartType = ?\n              AND LoadoutID = 1\n          `, [teamId, j], \"singleValue\");\n            let eq1 = (equipped1 === designID) ? 1 : 0;\n\n            // Equipado en loadout 2?\n            const equipped2 = queryDB(`\n            SELECT DesignID\n            FROM Parts_CarLoadout\n            WHERE TeamID = ?\n              AND PartType = ?\n              AND LoadoutID = 2\n          `, [teamId, j], \"singleValue\");\n            let eq2 = (equipped2 === designID) ? 1 : 0;\n\n            // Número de partes (items) construidas\n            const nParts = queryDB(`\n            SELECT COUNT(*)\n            FROM Parts_Items\n            WHERE DesignID = ?\n              AND BuildWork = ?\n          `, [designID, carConstants.standardBuildworkPerPart[j]], \"singleValue\") || 0;\n\n            // Devolvemos un nuevo array con toda la info\n            return [\n                designID,      // 0\n                dayCreated,    // 1\n                dayCompleted,  // 2\n                trackID,       // 3\n                eq1,           // 4\n                eq2,           // 5\n                nParts         // 6\n            ];\n        });\n\n        // Asignamos a partsDict[ parts[j] ] = designs\n        // Asumiendo que 'parts[j]' existe. Ajusta si es distinto\n        partsDict[carConstants.parts[j]] = designs;\n    }\n\n    return partsDict;\n}\n\n/**\n * Obtiene las piezas \"mejores\" (MAX(DesignID)) para un equipo y su season actual\n * (Similar a get_parts_from_team en el Python original)\n */\nexport function getPartsFromTeam(teamId) {\n    // Day, Season\n    const [day, season] = queryDB(\n        \"SELECT Day, CurrentSeason FROM Player_State\",\n        [], \"singleRow\"\n    ) || [0, 0];\n\n    const designs = {};\n    // En Python, j va de 3..8 => motor = 0\n    for (let j = 3; j < 9; j++) {\n        const row = queryDB(`\n          SELECT MAX(DesignID)\n          FROM Parts_Designs\n          WHERE PartType = ?\n            AND TeamID = ?\n            AND ValidFrom = ?\n            AND (DayCompleted > 0 OR DayCreated < 0)\n        `, [j, teamId, season], \"allRows\");\n        designs[j] = row;\n    }\n\n    // engine:\n    const engine = queryDB(`\n        SELECT MAX(DesignID)\n        FROM Parts_Designs\n        WHERE PartType = 0\n          AND TeamID = ?\n      `, [teamId], \"allRows\");\n    designs[0] = engine;\n\n    return designs;\n}\n\n/**\n * Obtiene las mejores piezas hasta un día concreto (versión con day param)\n * (Similar a get_best_parts_until en el Python original)\n */\nexport function getBestPartsUntil(day, customTeam = false) {\n    // Day, season\n    const [dayCur, season] = queryDB(`\n        SELECT Day, CurrentSeason \n        FROM Player_State\n      `, [], \"singleRow\") || [0, 0];\n\n    const teamList = customTeam\n        ? [...Array(10).keys()].map(i => i + 1).concat(32)\n        : [...Array(10).keys()].map(i => i + 1);\n\n    const teams = {};\n    for (const t of teamList) {\n        const designs = {};\n        for (let j = 3; j < 9; j++) {\n            const row = queryDB(`\n            SELECT MAX(DesignID)\n            FROM Parts_Designs\n            WHERE PartType = ?\n              AND TeamID = ?\n              AND ValidFrom = ?\n              AND ((DayCompleted > 0 AND DayCompleted <= ?) OR DayCreated < 0)\n          `, [j, t, season, day], \"allRows\");\n          designs[j] = row;\n        }\n        // engine\n        const engine = queryDB(`\n          SELECT MAX(DesignID)\n          FROM Parts_Designs\n          WHERE PartType = 0\n            AND TeamID = ?\n        `, [t], \"allRows\");\n        designs[0] = engine;\n\n        teams[t] = designs;\n    }\n    return teams;\n}\n\n/**\n * Devuelve un diccionario con los valores de stats (PartStat -> Value)\n * de cada parte (partType).\n * (get_car_stats en el Python original)\n */\nexport function getCarStats(designDict) {\n    const statsValues = {};\n    for (const part in designDict) {\n\n        const designInfo = designDict[part][0];\n        const designID = (designInfo && designInfo.length) ? designInfo[0] : null;\n\n        if (designID !== null) {\n            const rows = queryDB(`\n            SELECT PartStat, Value\n            FROM Parts_Designs_StatValues\n            WHERE DesignID = ?\n          `, [designID], \"allRows\");\n            // rows => [ [PartStat, Value], [PartStat, Value], ... ]\n            const tmp = {};\n            for (const [stat, val] of rows) {\n                tmp[stat] = Math.round(val * 1000) / 1000; // round to 3 decimals\n            }\n            statsValues[part] = tmp;\n        } else {\n            const zeroStats = {};\n            for (const stat of carConstants.defaultPartsStats[part]) {\n                zeroStats[stat] = 0;\n            }\n            statsValues[part] = zeroStats;\n        }\n    }\n    return statsValues;\n}\n\nexport function getTyreDegStats(designDict) {\n    const statsValues = {};\n    //only part 4 and 8\n    const tyreDegDict = {4: designDict[4], 8: designDict[8]};\n    for (const part in tyreDegDict) {\n        const designInfo = tyreDegDict[part][0];\n        const designID = (designInfo && designInfo.length) ? designInfo[0] : null;\n\n        if (designID !== null) {\n            const rows = queryDB(`\n            SELECT PartStat, Value\n            FROM Parts_Designs_StatValues\n            WHERE DesignID = ?\n          `, [designID], \"allRows\");\n            // rows => [ [PartStat, Value], [PartStat, Value], ... ]\n            const tmp = {};\n            for (const [stat, val] of rows) {\n                tmp[stat] = Math.round(val * 1000) / 1000; // round to 3 decimals\n            }\n            statsValues[part] = tmp;\n        } else {\n            const zeroStats = {};\n            for (const stat of carConstants.defaultPartsStats[part]) {\n                zeroStats[stat] = 0;\n            }\n            statsValues[part] = zeroStats;\n        }\n    }\n    return statsValues;\n}\n\nexport function updateTyreDegStats(designDictTeamReceiver, designDictTeamGiver, teamReceiver, teamGiver) {\n    //only part 4 and 8\n    const reducedDesignDictTeamReceiver = {4: designDictTeamReceiver[4][0][0], 8: designDictTeamReceiver[8][0][0]};\n    for (const part in reducedDesignDictTeamReceiver){\n        let designID = reducedDesignDictTeamReceiver[part];\n        let newTyreDegStat = designDictTeamGiver[part][2];\n        let newTyreDegUnitValue = carConstants.valueToUnitValue[2](newTyreDegStat);\n        queryDB(`\n            UPDATE Parts_Designs_StatValues\n            SET Value = ?, UnitValue = ?\n            WHERE DesignID = ? AND PartStat = 2\n        `, [newTyreDegStat, newTyreDegUnitValue, designID], 'run');\n\n        queryDB(`UPDATE Parts_TeamExpertise\n            SET Expertise = ?\n            WHERE TeamID = ?\n                AND PartType = ?\n                AND PartStat = 2\n        `, [newTyreDegStat, teamReceiver, part], 'run');\n    }\n}\n\nexport function applyExpertiseBoost(boost, team) {\n    //multiply expertise for every stat for every part of the team by the boost\n    queryDB(`\n        UPDATE Parts_TeamExpertise\n        SET Expertise = Expertise * ?\n        WHERE TeamID = ?\n    `, [boost, team], 'run');\n}\n\nexport function applyNextSeasonExpertiseBoost(boost, team) {\n    queryDB(`\n        UPDATE Parts_TeamExpertise\n        SET NextSeasonExpertise = NextSeasonExpertise + ?\n        WHERE TeamID = ?\n    `, [boost, team], 'run');\n}\n\nexport function applyBoostToCarStats(designDict, boost, team) {\n    const statsValues = {};\n    for (const part in designDict) {\n\n        const designInfo = designDict[part][0];\n        const designID = (designInfo && designInfo.length) ? designInfo[0] : null;\n\n        if (designID !== null) {\n            const rows = queryDB(`\n            SELECT PartStat, Value, UnitValue\n            FROM Parts_Designs_StatValues\n            WHERE DesignID = ?\n          `, [designID], \"allRows\");\n            const tmp = {};\n            for (const [stat, val, unitVal] of rows) {\n                if (stat !== 15) {\n                  let newUnitVal = applyScaledBoostToStatValue(unitVal, stat, boost);\n                  let newVal = carConstants.unitValueToValue[stat](newUnitVal);\n        \n                //   console.log(\n                //     `Old UnitValue: ${unitVal}, New UnitValue: ${newUnitVal} | ` +\n                //     `Old Value: ${val}, New Value: ${newVal} | Part: ${part} | Stat: ${stat} | Team: ${team}`\n                //   );\n\n                  queryDB(\n                    `UPDATE Parts_Designs_StatValues\n                     SET UnitValue = ?, Value = ?\n                     WHERE DesignID = ? AND PartStat = ?`, [newUnitVal, newVal, designID, stat], 'run'\n                  );\n\n                  queryDB(`\n                    UPDATE Parts_TeamExpertise\n                    SET Expertise = ?\n                    WHERE TeamID = ?\n                        AND PartType = ?\n                        AND PartStat = ?\n                    `, [newVal, team, part, stat], 'run');\n\n                  tmp[stat] = Math.round(newVal * 1000) / 1000; // redondeo a 3 decimales\n                }\n              }\n            statsValues[part] = tmp;\n        } else {\n            const zeroStats = {};\n            for (const stat of carConstants.defaultPartsStats[part]) {\n                zeroStats[stat] = 0;\n            }\n            statsValues[part] = zeroStats;\n        }\n    }\n    return statsValues;\n}\n\nfunction applyScaledBoostToStatValue(originalValue, statID, boost) {\n    // 1) Identificar el rango correspondiente a este stat\n    const [minVal, maxVal] = carConstants.statsMinMax[statID] || [0, 100]; // fallback [0,100] si no está en el diccionario\n    \n    // Evitar división por cero en caso de minVal == maxVal\n    const rangeSize = maxVal - minVal;\n    if (rangeSize <= 0) {\n      return originalValue; \n    }\n  \n    // 2) Normalizar (0 a 1)\n    let normalized = (originalValue - minVal) / rangeSize;\n  \n    // 3) Multiplicar por el boost\n    normalized *= boost;\n  \n    // 4) Clamp a [0,1]\n    if (normalized > 1) normalized = 1;\n    if (normalized < 0) normalized = 0;\n  \n    // 5) Des-normalizar\n    const newValue = minVal + normalized * rangeSize;\n    return newValue;\n  }\n\n/**\n * Devuelve el UnitValue de cada stat de un dict de diseños\n * (En Python: get_unitvalue_from_parts)\n */\nexport function getUnitValueFromParts(designDict) {\n    const statsValues = {};\n    for (const part in designDict) {\n        const designID = designDict[part][0][0];\n        const rows = queryDB(`\n          SELECT PartStat, UnitValue\n          FROM Parts_Designs_StatValues\n          WHERE DesignID = ?\n        `, [designID], 'allRows');\n\n        const tmp = {};\n        for (const [stat, unitVal] of rows) {\n            tmp[stat] = unitVal;\n        }\n        statsValues[carConstants.parts[part]] = tmp;\n    }\n    return statsValues;\n}\n\n/**\n * UnitValue de un solo diseño\n * (get_unitvalue_from_one_part en Python)\n */\nexport function getTeamExpertise(teamId, yearIteration = null) {\n    const expertise = {};\n    const partTypes = [3, 4, 5, 6, 7, 8];\n\n    partTypes.forEach((partType) => {\n        expertise[carConstants.parts[partType]] = {};\n    });\n\n    const rows = queryDB(`\n        SELECT PartType, PartStat, Expertise\n        FROM Parts_TeamExpertise\n        WHERE TeamID = ?\n          AND PartType IN (3, 4, 5, 6, 7, 8)\n          AND PartStat != 15\n    `, [teamId], 'allRows') || [];\n\n    rows.forEach((row) => {\n        const partType = Number(row[0]);\n        const stat = Number(row[1]);\n        const rawValue = Number(row[2]);\n\n        const partKey = carConstants.parts[partType];\n        if (!partKey) return;\n\n        let unitValue = rawValue;\n        if (yearIteration === \"24\" && stat >= 7 && stat <= 9 && carConstants.downforce24ValueToUnitValue?.[stat]) {\n            unitValue = carConstants.downforce24ValueToUnitValue[stat](rawValue);\n        }\n        else if (carConstants.valueToUnitValue?.[stat]) {\n            unitValue = carConstants.valueToUnitValue[stat](rawValue);\n        }\n\n        expertise[partKey][stat] = Math.round(unitValue * 1000) / 1000;\n    });\n\n    partTypes.forEach((partType) => {\n        const partKey = carConstants.parts[partType];\n        const partStats = expertise[partKey];\n        for (const stat of carConstants.defaultPartsStats[partType] || []) {\n            if (stat === 15) continue;\n            if (partStats[stat] === undefined) {\n                partStats[stat] = 0;\n            }\n        }\n    });\n\n    return expertise;\n}\n\nexport function updateTeamExpertise(teamId, expertiseUnitValues, yearIteration = null) {\n    if (!expertiseUnitValues || typeof expertiseUnitValues !== \"object\") return;\n\n    for (const partTypeKey of Object.keys(expertiseUnitValues)) {\n        const partType = Number(partTypeKey);\n        const stats = expertiseUnitValues[partTypeKey];\n        if (!Number.isFinite(partType) || !stats || typeof stats !== \"object\") continue;\n\n        for (const statKey of Object.keys(stats)) {\n            const stat = Number(statKey);\n            const unitValue = Number(stats[statKey]);\n            if (!Number.isFinite(stat) || !Number.isFinite(unitValue)) continue;\n            if (stat === 15) continue;\n\n            let value = unitValue;\n            if (yearIteration === \"24\" && stat >= 7 && stat <= 9 && carConstants.downforce24UnitValueToValue?.[stat]) {\n                value = carConstants.downforce24UnitValueToValue[stat](unitValue);\n            }\n            else if (carConstants.unitValueToValue?.[stat]) {\n                value = carConstants.unitValueToValue[stat](unitValue);\n            }\n\n            queryDB(`\n                UPDATE Parts_TeamExpertise\n                SET Expertise = ?\n                WHERE TeamID = ?\n                  AND PartType = ?\n                  AND PartStat = ?\n            `, [value, teamId, partType, stat], 'run');\n        }\n    }\n}\n\nexport function getUnitValueFromOnePart(designId) {\n\n    const partType = queryDB(`\n            SELECT PartType\n            FROM Parts_Designs\n            WHERE DesignID = ?\n        `, [designId], 'singleValue');\n\n\n    const rows = queryDB(`\n            SELECT PartStat, UnitValue\n            FROM Parts_Designs_StatValues\n            WHERE DesignID = ?\n        `, [designId], 'allRows');\n\n\n    const statsValues = {};\n    for (const [stat, uv] of rows) {\n        statsValues[stat] = uv;\n    }\n    const partValues = {};\n    partValues[carConstants.parts[partType]] = statsValues;\n    return partValues;\n}\n\n/**\n * Simple helper: convierte un porcentaje a valor físico según min/max\n * (convert_percentage_to_value en Python)\n */\nexport function convertPercentageToValue(attribute, percentage, minMax) {\n    // minMax[attribute] = [min_value, max_value]\n    const [minValue, maxValue] = minMax[attribute];\n    return minValue + (maxValue - minValue) * (percentage / 100.0);\n}\n\n/**\n * Pasa todos los atributos a rango human-readable\n * (make_attributes_readable en Python)\n */\nexport function makeAttributesReadable(attributes) {\n    for (const attribute in attributes) {\n        attributes[attribute] = convertPercentageToValue(\n            attribute,\n            attributes[attribute],\n            carConstants.attributesMinMax\n        );\n        // redondea a 3 dec\n        attributes[attribute] = Math.round(attributes[attribute] * 1000) / 1000;\n        attributes[attribute] = `${attributes[attribute]} ${carConstants.attributesUnits[attribute]}`;\n    }\n    return attributes;\n}\n\n/**\n * Calcula la performance global sumando (valorStat * contribución)\n * (calculate_overall_performance en Python)\n */\nexport function calculateOverallPerformance(attributes) {\n    let ovr = 0;\n    for (const attr in attributes) {\n        ovr += attributes[attr] * carConstants.attributesContributions4[attr];\n    }\n    return Math.round(ovr * 100) / 100;\n}\n\n/**\n * Devuelve un diccionario con las contribuciones\n * (get_contributors_dict en Python)\n */\nexport function getContributorsDict() {\n    // Lógica similar a Python\n    const contributorsValues = {};\n    const totalValues = {};\n\n    for (const attribute in carConstants.carAttributes) {\n        totalValues[attribute] = 0;\n        const referenceDict = carConstants[`${carConstants.carAttributes[attribute]}_contributors`];\n        // O donde sea que esté definido\n        for (const stat in referenceDict) {\n            totalValues[attribute] += referenceDict[stat];\n        }\n    }\n\n    for (const attribute in carConstants.carAttributes) {\n        const referenceDict = carConstants[`${carConstants.carAttributes[attribute]}_contributors`];\n        contributorsValues[attribute] = {};\n        for (const stat in referenceDict) {\n            contributorsValues[attribute][stat] =\n                Math.round((referenceDict[stat] / totalValues[attribute]) * 1000) / 1000;\n        }\n    }\n\n    return contributorsValues;\n}\n\n/**\n * Suma los factores de cada stat de cada parte\n * (get_part_stats_dict en Python)\n */\nexport function getPartStatsDict(carDict) {\n    const partStats = {};\n    for (const part in carDict) {\n        for (const stat in carDict[part]) {\n            const factor = carConstants[`${carConstants.stats[stat]}_factors`][part];\n            if (!partStats[stat]) {\n                partStats[stat] = 0;\n            }\n            partStats[stat] += carDict[part][stat] * factor;\n        }\n    }\n    return partStats;\n}\n\n/**\n * Calcula los atributos finales sumando (contribución * partStats[stat]) / 10\n * (calculate_car_attributes en Python)\n */\nexport function calculateCarAttributes(contributors, partsStats) {\n    const attributesDict = {};\n    // Ajuste: partsStats[16] = (20000 - partsStats[15]) / 20  (como en el .py)\n    partsStats[16] = (20000 - partsStats[15]) / 20;\n\n    for (const attribute in contributors) {\n        attributesDict[carConstants.carAttributes[attribute]] = 0;\n        for (const stat in contributors[attribute]) {\n            attributesDict[carConstants.carAttributes[attribute]] +=\n                (contributors[attribute][stat] * partsStats[stat]) / 10;\n        }\n    }\n    return attributesDict;\n}\n\n/**\n * Obtiene días de carreras\n * (get_races_days en Python)\n */\nexport function getRacesDays() {\n    const [day, season] = queryDB(`\n        SELECT Day, CurrentSeason \n        FROM Player_State\n      `, [], 'singleRow') || [0, 0];\n\n    // state=2 => completadas, state=0 => no comenzadas\n    const races = queryDB(`\n        SELECT RaceID, Day, TrackID\n        FROM Races\n        WHERE SeasonID = ?\n          AND State = 2\n      `, [season], 'allRows');\n\n    // first_race_state_0 => la primera no iniciada\n    const firstRaceState0 = queryDB(`\n        SELECT RaceID, Day, TrackID\n        FROM Races\n        WHERE SeasonID = ?\n          AND State = 0\n        ORDER BY Day ASC\n        LIMIT 1\n      `, [season], 'singleRow');\n\n    if (firstRaceState0) {\n        races.push(firstRaceState0);\n    }\n    return races;\n}\n\nexport function getAllRaces() {\n    const [day, season] = queryDB(`\n        SELECT Day, CurrentSeason\n        FROM Player_State\n      `, [], 'singleRow') || [0, 0];\n\n    const rows = queryDB(`\n        SELECT RaceID, Day, TrackID\n        FROM Races\n        WHERE SeasonID = ?\n      `, [season], 'allRows');\n    return rows;\n}\n\nfunction buildEnginePowerProgressionContext() {\n    const seasonId = Number(queryDB(`SELECT CurrentSeason FROM Player_State`, [], 'singleValue')) || null;\n    if (!seasonId) {\n        return { enabled: false };\n    }\n\n    const progressionTableExists = queryDB(\n        `SELECT 1 FROM sqlite_master WHERE type='table' AND name='Custom_Engine_Progression'`,\n        [],\n        'singleValue'\n    );\n    if (!progressionTableExists) {\n        return { enabled: false };\n    }\n\n    const allocations = queryDB(`SELECT teamId, engineId FROM Custom_Engine_Allocations`, [], 'allRows') || [];\n    const teamEngineIdByTeamId = {};\n    for (const row of allocations) {\n        const teamId = Number(row?.[0]);\n        const engineId = Number(row?.[1]);\n        if (!teamId || !engineId) continue;\n        teamEngineIdByTeamId[teamId] = engineId;\n    }\n\n    const currentPowerRows = queryDB(`\n        SELECT engineId, unitValue\n        FROM Custom_Engines_Stats\n        WHERE designId = engineId\n          AND partStat = 10\n    `, [], 'allRows') || [];\n\n    const currentPowerByEngineId = {};\n    for (const row of currentPowerRows) {\n        const engineId = Number(row?.[0]);\n        const unitValue = Number(row?.[1]);\n        if (!engineId || !Number.isFinite(unitValue)) continue;\n        currentPowerByEngineId[engineId] = unitValue;\n    }\n\n    return {\n        enabled: true,\n        seasonId,\n        teamEngineIdByTeamId,\n        currentPowerByEngineId\n    };\n}\n\nfunction getEnginePowerUnitValueForRace(engineId, raceId, ctx) {\n    const current = ctx?.currentPowerByEngineId?.[engineId];\n    if (!Number.isFinite(current)) {\n        return null;\n    }\n\n    const snapshot = queryDB(`\n        SELECT Power\n        FROM Custom_Engine_Progression\n        WHERE SeasonID = ?\n          AND EngineID = ?\n          AND RaceID > ?\n        ORDER BY RaceID ASC\n        LIMIT 1\n    `, [ctx.seasonId, engineId, raceId], 'singleValue');\n\n    if (snapshot !== null && snapshot !== undefined) {\n        const snapNum = Number(snapshot);\n        if (Number.isFinite(snapNum)) {\n            return snapNum;\n        }\n    }\n\n    return current;\n}\n\n/**\n * Devuelve la performance de todos los equipos en un día dado (o actual)\n * (get_performance_all_teams en Python)\n */\nexport function getPerformanceAllTeams(day = null, previous = null, customTeam = false, options = null) {\n    const teams = {};\n    const contributors = getContributorsDict();\n\n    const teamList = customTeam\n        ? [...Array(10).keys()].map(i => i + 1).concat(32)\n        : [...Array(10).keys()].map(i => i + 1);\n\n    const raceId = options?.raceId;\n    const useHistoricalEnginePower = options?.useHistoricalEnginePower === true;\n    const enginePowerCtx = options?.enginePowerCtx;\n    const canOverrideEnginePower = Boolean(\n        useHistoricalEnginePower &&\n        enginePowerCtx?.enabled &&\n        Number.isFinite(Number(raceId))\n    );\n\n    let enginePowerValueByEngineId = null;\n    if (canOverrideEnginePower) {\n        enginePowerValueByEngineId = {};\n        const enginesUsed = new Set();\n        for (const teamId of teamList) {\n            const engineId = enginePowerCtx.teamEngineIdByTeamId?.[teamId];\n            if (engineId) enginesUsed.add(engineId);\n        }\n\n        const powerToValue = carConstants.engine_unitValueToValue?.[10];\n        if (typeof powerToValue === \"function\") {\n            for (const engineId of enginesUsed) {\n                const unitValue = getEnginePowerUnitValueForRace(engineId, Number(raceId), enginePowerCtx);\n                if (!Number.isFinite(unitValue)) continue;\n                const value = powerToValue(unitValue);\n                enginePowerValueByEngineId[engineId] = Math.round(value * 1000) / 1000;\n            }\n        }\n    }\n\n    let parts;\n    if (day == null) {\n        // Usamos getBestParts\n        parts = getBestParts(customTeam);\n    } else {\n        parts = getBestPartsUntil(day, customTeam);\n    }\n\n    for (const teamId of teamList) {\n        const dict = getCarStats(parts[teamId]);\n        if (enginePowerValueByEngineId && dict?.[0]) {\n            const engineId = enginePowerCtx?.teamEngineIdByTeamId?.[teamId];\n            const overridePower = enginePowerValueByEngineId[engineId];\n            if (overridePower !== undefined && overridePower !== null) {\n                dict[0][10] = overridePower;\n            }\n        }\n        const partStats = getPartStatsDict(dict);\n        const attributes = calculateCarAttributes(contributors, partStats);\n        const ovr = calculateOverallPerformance(attributes);\n        teams[teamId] = ovr;\n    }\n    return teams;\n}\n\n/**\n * Devuelve la performance de todos los coches (car1 y car2) de cada equipo\n * (get_performance_all_cars en Python)\n */\nexport function getPerformanceAllCars(customTeam = false) {\n    const cars = {};\n    const contributors = getContributorsDict();\n\n    const teamList = customTeam\n        ? [...Array(10).keys()].map(i => i + 1).concat(32)\n        : [...Array(10).keys()].map(i => i + 1);\n\n    // Este método en Python usaba \"get_fitted_designs(custom_team=custom_team)\"\n    const carsParts = getFittedDesigns(customTeam);\n\n    for (const teamId of Object.keys(carsParts)) {\n        cars[teamId] = {};\n        for (const carId of Object.keys(carsParts[teamId])) {\n            const dict = getCarStats(carsParts[teamId][carId]);\n            // Falta ver si hay partes sin design\n            const missingParts = [];\n            for (const part in carsParts[teamId][carId]) {\n                if (carsParts[teamId][carId][part][0][0] == null) {\n                    missingParts.push(part);\n                }\n            }\n\n            const partStats = getPartStatsDict(dict);\n            const attributes = calculateCarAttributes(contributors, partStats);\n            const ovr = calculateOverallPerformance(attributes);\n\n            const driverNumber = getDriverNumberWithCar(teamId, carId);\n            cars[teamId][carId] = [ovr, driverNumber, missingParts];\n        }\n    }\n\n    return cars;\n}\n\n/**\n * Devuelve los atributos de todos los coches\n * (get_attributes_all_cars en Python)\n */\nexport function getAttributesAllCars(customTeam = false) {\n    const cars = {};\n    const contributors = getContributorsDict();\n\n    const teamList = customTeam\n        ? [...Array(10).keys()].map(i => i + 1).concat(32)\n        : [...Array(10).keys()].map(i => i + 1);\n\n    const carsParts = getFittedDesigns(customTeam);\n\n    for (const teamId of Object.keys(carsParts)) {\n        cars[teamId] = {};\n        for (const carId of Object.keys(carsParts[teamId])) {\n            const dict = getCarStats(carsParts[teamId][carId]);\n            const partStats = getPartStatsDict(dict);\n            const attributes = calculateCarAttributes(contributors, partStats);\n            // (En Python, se dejaba la opción de \"make_attributes_readable\")\n            // attributes = makeAttributesReadable(attributes);\n            cars[teamId][carId] = attributes;\n        }\n    }\n    return cars;\n}\n\n/**\n * Devuelve el número del driver que conduce un coche concreto\n * (get_driver_number_with_car en Python)\n */\nexport function getDriverNumberWithCar(teamId, carId) {\n    const row = queryDB(`\n        SELECT con.StaffID\n        FROM Staff_Contracts con\n        JOIN Staff_GameData gam ON con.StaffID = gam.StaffID\n        WHERE con.TeamID = ?\n          AND gam.StaffType = 0\n          AND con.ContractType = 0\n          AND con.PosInTeam = ?\n      `, [teamId, carId], 'singleRow');\n    if (!row) {\n        return null;\n    }\n    const driverId = row[0];\n\n    const number = queryDB(`\n        SELECT Number\n        FROM Staff_DriverNumbers\n        WHERE CurrentHolder = ?\n      `, [driverId], 'singleValue');\n    return number ?? null;\n}\n\n/**\n * Obtiene los diseños equipados en cada coche (loadout 1 y 2) de cada equipo\n * (get_fitted_designs en Python)\n */\nexport function getFittedDesigns(customTeam = false) {\n    const teams = {};\n    const teamList = customTeam\n        ? [...Array(10).keys()].map(i => i + 1).concat(32)\n        : [...Array(10).keys()].map(i => i + 1);\n\n    for (const t of teamList) {\n        teams[t] = {};\n        // loadout => 1 o 2\n        for (let loadout = 1; loadout <= 2; loadout++) {\n            const designs = {};\n            for (let part = 3; part < 9; part++) {\n                const row = queryDB(`\n                    SELECT DesignID\n                    FROM Parts_CarLoadout\n                    WHERE TeamID = ?\n                        AND PartType = ?\n                        AND LoadoutID = ?\n                    `, [t, part, loadout], 'allRows');\n                designs[part] = row;\n            }\n            // engine\n            const engine = queryDB(`\n                    SELECT MAX(DesignID)\n                    FROM Parts_Designs\n                    WHERE PartType = 0\n                    AND TeamID = ?\n                `, [t], 'allRows');\n            designs[0] = engine;\n\n            teams[t][loadout] = designs;\n        }\n    }\n    return teams;\n}\n\n// Asumiendo que tu clase CarAnalysisUtils ya tiene otros métodos traducidos\n// Añadimos/completamos con estos métodos:\n\nexport function fitLatestDesignsAllGrid(customTeam = false) {\n    // SELECT Day, CurrentSeason FROM Player_State\n    const row = queryDB(`\n        SELECT Day, CurrentSeason \n        FROM Player_State\n        `, [], \"singleRow\");\n\n    if (!row) {\n        console.warn(\"No Player_State data found.\");\n        return;\n    }\n\n    const [day, season] = row;\n    // Obtenemos las mejores piezas hasta 'day'\n    const bestParts = getBestPartsUntil(day, customTeam);\n\n    // Para cada equipo en bestParts\n    for (const team of Object.keys(bestParts)) {\n        fitLatestDesignsOneTeam(team, bestParts[team]);\n    }\n\n    // conn.commit() (en SQL.js no es necesario típicamente)\n}\n\nexport function fitLatestDesignsOneTeam(teamId, parts) {\n    // Recorremos loadout = 1 y 2\n    for (let loadout = 1; loadout <= 2; loadout++) {\n        // Para cada 'part' en el objeto parts\n        for (const partKey of Object.keys(parts)) {\n            const part = Number(partKey);\n            if (part !== 0) {\n                // En Python, parts[part] = [[designId], ...], asumiendo la estructura\n                const design = parts[part][0][0]; // -> designID\n                // fitted_design actual\n                const fittedRow = queryDB(`\n                        SELECT DesignID \n                        FROM Parts_CarLoadout\n                        WHERE TeamID = ?\n                        AND PartType = ?\n                        AND LoadoutID = ?\n                    `, [teamId, part, loadout], \"singleRow\");\n\n                if (!fittedRow) {\n                    console.warn(`No fittedRow found for TeamID=${teamId}, part=${part}, loadout=${loadout}`);\n                    continue;\n                }\n                const fittedDesign = fittedRow[0];\n\n                if (design !== fittedDesign) {\n                    // Buscamos items disponibles\n                    const partsAvailable = queryDB(`\n                        SELECT ItemID\n                        FROM Parts_Items\n                        WHERE DesignID = ?\n                            AND AssociatedCar IS NULL\n                        `, [design], \"allRows\");\n\n                    if (!partsAvailable.length) {\n                        // no hay items disponibles => creamos uno nuevo\n                        const item = createNewItem(design, part);\n                        addPartToLoadout(design, part, teamId, loadout, item);\n                    } else {\n                        const item = partsAvailable[0][0]; // primer item\n                        addPartToLoadout(design, part, teamId, loadout, item);\n                    }\n                } else {\n                    // design ya está equipado en este loadout\n                    // Miramos si loadout 1 y 2 comparten item\n                    const otherLoadout = (loadout === 2) ? 1 : 2;\n\n                    const fittedItemOther = queryDB(`\n                        SELECT ItemID \n                        FROM Parts_CarLoadout\n                        WHERE TeamID = ?\n                            AND PartType = ?\n                            AND LoadoutID = ?\n                        `, [teamId, part, otherLoadout], \"singleRow\");\n\n                    const fittedItem = queryDB(`\n                        SELECT ItemID \n                        FROM Parts_CarLoadout\n                        WHERE TeamID = ?\n                            AND PartType = ?\n                            AND LoadoutID = ?\n                        `, [teamId, part, loadout], \"singleRow\");\n\n                    if (fittedItemOther && fittedItem\n                        && fittedItemOther[0] === fittedItem[0]) {\n                        // Ambos loadouts tienen el mismo item => creamos uno nuevo\n                        const item = createNewItem(design, part);\n                        addPartToLoadout(design, part, teamId, loadout, item);\n                    }\n                }\n            }\n        }\n    }\n\n    // commit\n    // (en SQL.js no es necesario, pero podrías hacer db.run(\"BEGIN/COMMIT\") si fuera el caso)\n}\n\nexport function updateItemsForDesignDict(designDict, teamId) {\n    for (const designKey of Object.keys(designDict)) {\n        const design = Number(designKey);\n        const nParts = parseInt(designDict[designKey], 10);\n\n        // SELECT PartType FROM Parts_Designs WHERE DesignID = {design}\n        const partType = queryDB(`\n        SELECT PartType\n        FROM Parts_Designs\n        WHERE DesignID = ?\n      `, [design], \"singleValue\");\n\n        // SELECT COUNT(*) FROM Parts_Items WHERE DesignID = {design} AND BuildWork = X\n        let actualParts = queryDB(`\n        SELECT COUNT(*)\n        FROM Parts_Items\n        WHERE DesignID = ?\n          AND BuildWork = ?\n      `, [design, carConstants.standardBuildworkPerPart[partType]], \"singleValue\");\n        if (actualParts == null) actualParts = 0;\n\n        let diff = nParts - actualParts;\n        if (diff > 0) {\n            while (diff > 0) {\n                createNewItem(design, partType);\n                diff--;\n            }\n        } else if (diff < 0) {\n            while (diff < 0) {\n                deleteItem(design);\n                diff++;\n            }\n        }\n    }\n\n    // commit\n}\n\nexport function fitLoadoutsDict(loadoutsDict, teamId) {\n    for (const partKey of Object.keys(loadoutsDict)) {\n        const part = Number(partKey);\n        const design1 = loadoutsDict[part][0];\n        const design2 = loadoutsDict[part][1];\n\n        // SELECT DesignID, ItemID FROM Parts_CarLoadout ...\n        let fittedDesign1 = queryDB(`\n                SELECT DesignID, ItemID\n                FROM Parts_CarLoadout\n                WHERE TeamID = ?\n                AND PartType = ?\n                AND LoadoutID = 1\n            `, [teamId, part], \"singleRow\");\n\n        if (design1 != null) {\n            if (fittedDesign1 && fittedDesign1[0] != null && fittedDesign1[1] != null) {\n                // \"UPDATE Parts_Items SET AssociatedCar = NULL WHERE ItemID = ?\"\n                const itemId = fittedDesign1[1];\n                queryDB(`\n                        UPDATE Parts_Items\n                        SET AssociatedCar = NULL\n                        WHERE ItemID = ?\n                    `, [itemId], 'run');\n                // fittedDesign1 = fittedDesign1[0]\n                fittedDesign1 = [fittedDesign1[0], itemId]; // si necesitas retenerlo\n            }\n\n            // Si la design1 actual es distinta...\n            if (!fittedDesign1 || fittedDesign1[0] !== design1) {\n                // SELECT ItemID FROM Parts_Items WHERE ...\n                const items1 = queryDB(`\n                        SELECT ItemID\n                        FROM Parts_Items\n                        WHERE DesignID = ?\n                        AND BuildWork = ?\n                        AND AssociatedCar IS NULL\n                    `, [design1, carConstants.standardBuildworkPerPart[part]], \"allRows\");\n\n                let item1;\n                if (!items1.length) {\n                    item1 = createNewItem(design1, part);\n                } else {\n                    item1 = items1[0][0];\n                }\n\n                addPartToLoadout(design1, part, teamId, 1, item1);\n            }\n        }\n\n        // Ahora loadout 2\n        let fittedDesign2 = queryDB(`\n                SELECT DesignID, ItemID\n                FROM Parts_CarLoadout\n                WHERE TeamID = ?\n                AND PartType = ?\n                AND LoadoutID = 2\n            `, [teamId, part], \"singleRow\");\n\n        if (design2 != null) {\n            if (fittedDesign2 && fittedDesign2[0] != null && fittedDesign2[1] != null) {\n                const itemId2 = fittedDesign2[1];\n                queryDB(`\n                        UPDATE Parts_Items\n                        SET AssociatedCar = NULL\n                        WHERE ItemID = ?\n                    `, [itemId2], 'run');\n                fittedDesign2 = [fittedDesign2[0], itemId2];\n            }\n\n            if (!fittedDesign2 || fittedDesign2[0] !== design2) {\n                const items2 = queryDB(`\n                        SELECT ItemID\n                        FROM Parts_Items\n                        WHERE DesignID = ?\n                        AND BuildWork = ?\n                        AND AssociatedCar IS NULL\n                    `, [design2, carConstants.standardBuildworkPerPart[part]], \"allRows\");\n\n                let item2;\n                if (!items2.length) {\n                    item2 = createNewItem(design2, part);\n                } else {\n                    item2 = items2[0][0];\n                }\n\n                addPartToLoadout(design2, part, teamId, 2, item2);\n            }\n        }\n    }\n\n    // commit\n}\n\n// En Python: create_new_item(design_id, part)\nexport function createNewItem(designId, part) {\n    // SELECT MAX(ItemID) FROM Parts_Items\n    let maxItem = queryDB(`\n        SELECT MAX(ItemID)\n        FROM Parts_Items\n        `, [], \"singleValue\");\n\n    const newItem = maxItem + 1;\n\n    const numberOfManufactures = queryDB(`\n        SELECT ManufactureCount\n        FROM Parts_Designs\n        WHERE DesignID = ?\n        `, [designId], \"singleValue\");\n\n    const newNManufactures = numberOfManufactures + 1;\n\n    queryDB(`\n        INSERT INTO Parts_Items\n        VALUES (\n            ?,\n            ?,\n            ?,\n            1,\n            ?,\n            NULL,\n            NULL,\n            0,\n            NULL\n        )\n        `, [newItem, designId, carConstants.standardBuildworkPerPart[part], newNManufactures], 'run');\n\n    queryDB(`\n            UPDATE Parts_Designs\n            SET ManufactureCount = ?\n            WHERE DesignID = ?\n            `, [newNManufactures, designId], 'run');\n\n    return newItem;\n}\n\nexport function deleteItem(designId) {\n    // SELECT PartType FROM Parts_Designs WHERE DesignID = {designId}\n    const partType = queryDB(`\n      SELECT PartType\n      FROM Parts_Designs\n      WHERE DesignID = ?\n    `, [designId], \"singleValue\");\n\n    // SELECT ItemID FROM Parts_Items WHERE DesignID = {designId} AND BuildWork = ...\n    const item = queryDB(`\n      SELECT ItemID\n      FROM Parts_Items\n      WHERE DesignID = ?\n        AND BuildWork = ?\n    `, [designId, carConstants.standardBuildworkPerPart[partType]], \"singleValue\");\n\n    queryDB(`\n      DELETE FROM Parts_Items\n      WHERE ItemID = ?\n    `, [item], 'run');\n}\n\nexport function addNewDesign(part, teamId, day, season, latestDesignPartFromTeam, newDesignId) {\n    const maxDesignFromPart = queryDB(`\n      SELECT MAX(DesignNumber)\n      FROM Parts_Designs\n      WHERE PartType = ?\n        AND TeamID = ?\n    `, [part, teamId], \"singleValue\");\n\n    const newMaxDesign = maxDesignFromPart + 1;\n\n    queryDB(`\n        UPDATE Parts_Designs_TeamData\n        SET NewDesignsThisSeason = ?\n        WHERE TeamID = ?\n            AND PartType = ?\n        `, [newMaxDesign, teamId, part], 'run');\n\n    //check if newDesignId already exists (it shouldn't, but just in case)\n    const existingDesign = queryDB(`\n        SELECT DesignID\n        FROM Parts_Designs\n        WHERE DesignID = ?\n        `, [newDesignId], 'singleValue')\n\n    if (existingDesign) {\n        return;\n    }\n\n    queryDB(`\n        INSERT INTO Parts_Designs\n        VALUES (\n            ?,\n            ?,\n            6720, \n            6600, \n            ?,\n            ?,\n            NULL,\n            5,\n            1,\n            0,\n            0,\n            1500,\n            ?,\n            0,\n            0,\n            4,\n            ?,\n            1,\n            ?,\n            1\n        )\n        `, [newDesignId, part, day - 1, day, season, newMaxDesign, teamId], 'run');\n\n    queryDB(`\n        INSERT INTO Parts_DesignHistoryData\n        VALUES (\n            ?,\n            0,\n            0,\n            0,\n            0\n        )\n        `, [newDesignId], 'run');\n\n    copyFromTable(\"building\", latestDesignPartFromTeam, newDesignId);\n    copyFromTable(\"staff\", latestDesignPartFromTeam, newDesignId);\n    add4Items(newDesignId, part, teamId);\n}\n\nexport function copyFromTable(table, latestDesignId, newDesignId) {\n    let tableName = \"\";\n    if (table === \"building\") {\n        tableName = \"Parts_Designs_BuildingEffects\";\n    } else if (table === \"staff\") {\n        tableName = \"Parts_Designs_StaffEffects\";\n    }\n\n    const rows = queryDB(`\n        SELECT *\n        FROM ${tableName}\n        WHERE DesignID = ?\n        `, [latestDesignId], \"allRows\");\n\n    for (const row of rows) {\n        // row => [DesignID, col1, col2, ...]\n        queryDB(`\n                INSERT INTO ${tableName}\n                VALUES (?, ?, ?, 0)\n            `, [newDesignId, row[1], row[2]], 'run');\n    }\n}\n\nexport function add4Items(newDesignId, part, teamId) {\n    let maxItem = queryDB(`\n        SELECT MAX(ItemID)\n        FROM Parts_Items\n        `, [], \"singleValue\");\n\n    for (let i = 1; i <= 4; i++) {\n        maxItem += 1;\n        queryDB(`\n        INSERT INTO Parts_Items\n        VALUES (\n          ?,\n          ?,\n          ?,\n          1,\n          ?,\n          NULL,\n          NULL,\n          0,\n          NULL\n        )\n      `, [maxItem, newDesignId, carConstants.standardBuildworkPerPart[part], i], 'run');\n\n        // Para loadout 1 y 2\n        if (i <= 2) {\n            const loadoutId = i;\n            addPartToLoadout(newDesignId, part, teamId, loadoutId, maxItem);\n        }\n    }\n}\n\nexport function addPartToLoadout(designId, part, teamId, loadoutId, itemId) {\n    queryDB(`\n            UPDATE Parts_CarLoadout\n            SET DesignID = ?, ItemID = ?\n            WHERE TeamID = ?\n                AND PartType = ?\n                AND LoadoutID = ?\n        `, [designId, itemId, teamId, part, loadoutId], 'run');\n\n    queryDB(`\n            UPDATE Parts_Items\n            SET AssociatedCar = ?, LastEquippedCar = ?\n            WHERE ItemID = ?\n        `, [loadoutId, loadoutId, itemId], 'run');\n}\n\nexport function overwritePerformanceTeam(teamId, performance, customTeam = null, yearIteration = null, loadoutDict = null) {\n    const row = queryDB(`\n      SELECT Day, CurrentSeason\n      FROM Player_State\n    `, [], 'singleRow');\n\n    if (!row) {\n        console.warn(\"Player_State not found\");\n        return;\n    }\n    const [day, season] = row;\n\n    const bestParts = getBestPartsUntil(day, customTeam);\n    const teamParts = bestParts[Number(teamId)];\n\n    for (const partKey of Object.keys(teamParts)) {\n        const part = Number(partKey);\n        if (part !== 0) {\n            const design = teamParts[part][0][0]; // design actual\n            const partName = carConstants.parts[part];         // \"Suspension\", \"Wing\", etc.\n            const newDesign = performance[partName][\"designEditing\"];\n            delete performance[partName][\"designEditing\"];\n            let latestDesignPartFromTeam = null;\n\n            let finalDesign = design;\n            if (Number(newDesign) === -1) {\n                // new part\n                const maxDesign = queryDB(`\n                        SELECT MAX(DesignID)\n                        FROM Parts_Designs\n                    `, [], 'singleValue');\n\n                latestDesignPartFromTeam = queryDB(`\n                        SELECT MAX(DesignID)\n                        FROM Parts_Designs\n                        WHERE PartType = ?\n                        AND TeamID = ?\n                    `, [part, teamId], 'singleValue');\n\n                const newDesignId = maxDesign + 1;\n                addNewDesign(part, Number(teamId), day, season, latestDesignPartFromTeam, newDesignId);\n                finalDesign = newDesignId;\n            } else {\n                finalDesign = Number(newDesign);\n            }\n\n            const statsObj = performance[partName];\n            for (const statKey of Object.keys(statsObj)) {\n                const statNum = parseFloat(statsObj[statKey]);\n                let value;\n                if (yearIteration === \"24\" && Number(statKey) >= 7 && Number(statKey) <= 9) {\n                    value = carConstants.downforce24UnitValueToValue[statKey](statNum);\n                } else {\n                    value = carConstants.unitValueToValue[statKey](statNum);\n                }\n\n                if (Number(newDesign) !== -1) {\n                    // update\n                    changeExpertiseBased(part, statKey, value, Number(teamId));\n                    queryDB(`\n                    UPDATE Parts_Designs_StatValues\n                    SET UnitValue = ?\n                    WHERE DesignID = ?\n                        AND PartStat = ?\n                    `, [statsObj[statKey], finalDesign, statKey], 'run');\n\n                    queryDB(`\n                    UPDATE Parts_Designs_StatValues\n                    SET Value = ?\n                    WHERE DesignID = ?\n                        AND PartStat = ?\n                    `, [value, finalDesign, statKey], 'run');\n                } else {\n                    // insert\n                    queryDB(`\n                    INSERT INTO Parts_Designs_StatValues\n                    VALUES (\n                        ?,\n                        ?,\n                        ?,\n                        ?,\n                        0.5, \n                        1, \n                        0.1\n                    )\n                    `, [finalDesign, statKey, value, statsObj[statKey]], 'run');\n                }\n            }\n\n            // si newDesign == -1 => insertamos el peso standard\n            if (Number(newDesign) === -1) {\n                queryDB(`\n                    INSERT INTO Parts_Designs_StatValues\n                    VALUES (\n                    ?,\n                    15,\n                    500,\n                    ?,\n                    0.5,\n                    0,\n                    0\n                    )\n                `, [finalDesign, carConstants.standardWeightPerPart[part]], 'run');\n\n                // Tras insertar stats, cambiamos expertise\n                for (const statKey of Object.keys(statsObj)) {\n                    const statNum = parseFloat(statsObj[statKey]);\n                    let value;\n                    if (yearIteration === \"24\" && Number(statKey) >= 7 && Number(statKey) <= 9) {\n                        value = carConstants.downforce24UnitValueToValue[statKey](statNum);\n                    } else {\n                        value = carConstants.unitValueToValue[statKey](statNum);\n                    }\n                    changeExpertiseBased(part, statKey, value, Number(teamId), \"new\", latestDesignPartFromTeam);\n                }\n            }\n        }\n    }\n\n    // commit\n}\n\nexport function changeExpertiseBased(part, stat, newValue, teamId, type = \"existing\", oldDesign = null) {\n    // SELECT Day, CurrentSeason FROM Player_State\n    const row = queryDB(`\n      SELECT Day, CurrentSeason\n      FROM Player_State\n    `, [], 'singleRow');\n    if (!row) {\n        console.warn(\"No Player_State found to do expertise changes\");\n        return;\n    }\n    const [day, curSeason] = row;\n\n    let currentValue = null;\n    if (type === \"existing\") {\n        // SELECT MAX(Value) FROM Parts_Designs_StatValues ...\n        currentValue = queryDB(`\n        SELECT MAX(Value)\n        FROM Parts_Designs_StatValues\n        WHERE PartStat = ?\n          AND DesignID IN (\n            SELECT MAX(DesignID)\n            FROM Parts_Designs\n            WHERE PartType = ?\n              AND TeamID = ?\n              AND ValidFrom = ?\n          )\n      `, [stat, part, teamId, curSeason], 'singleValue');\n    } else if (type === \"new\") {\n        // SELECT Value FROM Parts_Designs_StatValues ...\n        currentValue = queryDB(`\n        SELECT Value\n        FROM Parts_Designs_StatValues\n        WHERE PartStat = ?\n          AND DesignID = ?\n      `, [stat, oldDesign], 'singleValue');\n    }\n\n    if (!currentValue) {\n        currentValue = 1; // si no hay valor\n    }\n    if (currentValue === 0) {\n        currentValue = 1;\n    }\n\n    const currentExpertise = queryDB(`\n        SELECT Expertise\n        FROM Parts_TeamExpertise\n        WHERE TeamID = ?\n          AND PartType = ?\n          AND PartStat = ?\n      `, [teamId, part, stat], 'singleValue') || 0;\n\n    // console.log(newValue, currentValue, currentExpertise);\n\n    const newExpertise = (Number(newValue) * Number(currentExpertise)) / Number(currentValue);\n\n\n    // console.log(`Old expertise: ${currentExpertise}, New expertise: ${newExpertise}`);\n    queryDB(`\n        UPDATE Parts_TeamExpertise\n        SET Expertise = ?\n        WHERE TeamID = ?\n            AND PartType = ?\n            AND PartStat = ?\n        `, [newExpertise, teamId, part, stat], 'run');\n}\n\n\nexport function getPerformanceAllTeamsSeason(customTeam = false, options = {}) {\n    const useHistoricalEnginePower = options?.useHistoricalEnginePower === true;\n    const enginePowerCtx = useHistoricalEnginePower ? buildEnginePowerProgressionContext() : null;\n\n    const races = getRacesDays();\n    const firstDay = getFirstDaySeason();\n    // Insertamos al principio (0, firstDay, 0)\n    races.unshift([0, firstDay, 0]); // similar a insert(0, first_tuple)\n\n    const racesPerformances = [];\n    let previous = null;\n    for (const raceDay of races) {\n        // raceDay => [RaceID, Day, TrackID], en python pilla el day en [1]\n        const raceId = raceDay[0];\n        const day = raceDay[1];\n        const performances = getPerformanceAllTeams(day, previous, customTeam, {\n            raceId,\n            useHistoricalEnginePower,\n            enginePowerCtx\n        });\n        racesPerformances.push(performances);\n        previous = performances;\n    }\n\n    const allRaces = getAllRaces();\n    return [racesPerformances, allRaces];\n}\n\nexport function getAduoEngineUpgradeRaceIds(seasonId = null) {\n    const resolvedSeasonId = Number(seasonId) || Number(queryDB(`SELECT CurrentSeason FROM Player_State`, [], 'singleValue')) || null;\n    if (!resolvedSeasonId) return [];\n\n    const progressionTableExists = queryDB(\n        `SELECT 1 FROM sqlite_master WHERE type='table' AND name='Custom_Engine_Progression'`,\n        [],\n        'singleValue'\n    );\n    if (!progressionTableExists) return [];\n\n    const rows = queryDB(`\n        SELECT DISTINCT RaceID\n        FROM Custom_Engine_Progression\n        WHERE SeasonID = ?\n          AND Source IN ('pre_aduo_tp', 'pre_engine_edit')\n        ORDER BY RaceID ASC\n    `, [resolvedSeasonId], 'allRows') || [];\n\n    return rows\n        .map(r => Number(r?.[0]))\n        .filter(raceId => Number.isFinite(raceId) && raceId > 0);\n}\n\nexport function getFirstDaySeason() {\n    const query = `\n        SELECT Number, COUNT(*) as Occurrences\n        FROM (\n            SELECT DayCreated as Number FROM Parts_Designs\n            UNION ALL\n            SELECT DayCompleted as Number FROM Parts_Designs\n        ) Combined\n        GROUP BY Number\n        ORDER BY Occurrences DESC\n        LIMIT 1;\n        `;\n    const row = queryDB(query, [], 'singleRow');\n    if (!row) {\n        console.warn(\"No firstDay found\");\n        return 0;\n    }\n    const firstDay = row[0];\n    return firstDay;\n}\n\nexport function getAttributesAllTeams(customTeam = false) {\n    const teams = {};\n    const contributors = getContributorsDict();\n    const bestParts = getBestParts(customTeam);\n\n    const teamList = customTeam\n        ? [...Array(10).keys()].map(i => i + 1).concat(32)\n        : [...Array(10).keys()].map(i => i + 1);\n\n    for (const i of teamList) {\n        const dict = getCarStats(bestParts[i]);\n        const partStats = getPartStatsDict(dict);\n        const attributes = calculateCarAttributes(contributors, partStats);\n        attributes.engine_power = getOneStatUnitValueFromTeam(0, 10, i) || 0;\n        teams[i] = attributes;\n    }\n    return teams;\n}\n\nexport function getOneStatUnitValueFromTeam(part, stat, teamId) {\n    const designId = queryDB(`\n        SELECT MAX(DesignID)\n        FROM Parts_Designs\n        WHERE PartType = ?\n          AND TeamID = ?\n      `, [part, teamId], 'singleValue');\n\n    if (designId){\n        const unitValue = queryDB(`\n            SELECT UnitValue\n            FROM Parts_Designs_StatValues\n            WHERE DesignID = ?\n              AND PartStat = ?\n        `, [designId, stat], 'singleValue');\n        return unitValue;\n    }\n}\n\nexport function getMaxDesign() {\n    const val = queryDB(`\n        SELECT MAX(DesignID)\n        FROM Parts_Designs\n        `, [], 'singleValue');\n    return val;\n}\n\nexport function deleteCustomEngineAndReassign(engineIdRaw, fallbackEngineIdRaw) {\n    const engineId = Number(engineIdRaw);\n    if (!engineId || engineId <= 10) {\n        return { ok: false, error: \"Invalid custom engine id\" };\n    }\n\n    let fallbackEngineId = Number(fallbackEngineIdRaw);\n    if (!fallbackEngineId || fallbackEngineId === engineId) {\n        fallbackEngineId = Number(queryDB(\n            `SELECT engineID FROM Custom_Engines_List WHERE engineID <= 10 ORDER BY engineID ASC LIMIT 1`,\n            [],\n            \"singleValue\"\n        ));\n    }\n    if (!fallbackEngineId || fallbackEngineId === engineId) {\n        fallbackEngineId = Number(queryDB(\n            `SELECT engineID FROM Custom_Engines_List WHERE engineID != ? ORDER BY engineID ASC LIMIT 1`,\n            [engineId],\n            \"singleValue\"\n        ));\n    }\n\n    if (!fallbackEngineId || fallbackEngineId === engineId) {\n        return { ok: false, error: \"No fallback engine available\" };\n    }\n\n    const teamsSupplied = queryDB(\n        `SELECT teamId FROM Custom_Engine_Allocations WHERE engineId = ?`,\n        [engineId],\n        \"allRows\"\n    ) || [];\n\n    teamsSupplied.forEach(team => {\n        const teamId = Number(team?.[0]);\n        if (!teamId) return;\n        manage_engine_change(teamId, fallbackEngineId);\n    });\n\n    queryDB(`DELETE FROM Custom_Engine_Allocations WHERE engineId = ?`, [engineId], \"run\");\n    queryDB(`DELETE FROM Custom_Engines_Stats WHERE engineId = ?`, [engineId], \"run\");\n    queryDB(`DELETE FROM Custom_Engines_List WHERE engineId = ?`, [engineId], \"run\");\n\n    return { ok: true, fallbackEngineId, reassignedTeams: teamsSupplied.length };\n}\n\n\n\n"
  },
  {
    "path": "src/js/backend/scriptUtils/carConstants.js",
    "content": "export const stats = {\n    0: \"airflow_front\",\n    1: \"airflow_sensitivity\",\n    2: \"brake_cooling\",\n    3: \"drs_delta\",\n    4: \"drag_reduction\",\n    5: \"engine_cooling\",\n    6: \"fuel_efficiency\",\n    7: \"low_speed_downforce\",\n    8: \"medium_speed_downforce\",\n    9: \"high_speed_downforce\",\n    10: \"power\",\n    11: \"performance_loss\",\n    12: \"performance_threshold\",\n    13: \"airflow_middle\",\n    14: \"operational_range\",\n    15: \"lifespan\",\n    16: \"special_weight\"\n};\n\nexport const defaultPartsStats = {\n    3: [3, 4, 5, 13, 15],\n    4: [0, 1, 2, 7, 8, 9, 15],\n    5: [1, 3, 4, 7, 8, 9, 15],\n    6: [0, 4, 5, 13, 15],\n    7: [1, 4, 7, 8, 9, 15],\n    8: [0, 2, 4, 7, 8, 9, 15]\n};\n\nexport const unitValueToValue = {\n  0: (x) => x * 10,\n  1: (x) => x * 10,\n  2: (x) => x * 10,\n    3: (x) => x * 10,\n    4: (x) => x * 10,\n    5: (x) => x * 10,\n    6: (x) => (x - 90) * 1000 / 10,\n    7: (x) => (x - 3) / 0.002,\n    8: (x) => (x - 5) / 0.002,\n    9: (x) => (x - 7) / 0.001,\n    10: (x) => (x - 90) * 1000 / 10,\n    11: (x) => (85 - x) * 1000 / 20,\n    12: (x) => (x - 70) * 1000 / 15,\n    13: (x) => x * 10,\n    14: (x) => (85 - x) * 1000 / 15,\n    15: (x) => (x - 40) * 1000 / 30,\n    18: (x) => (x - 40) * 1000 / 30,\n  19: (x) => (x - 40) * 1000 / 30\n};\n\nexport const valueToUnitValue = {\n  0: (x) => x / 10,\n  1: (x) => x / 10,\n  2: (x) => x / 10,\n  3: (x) => x / 10,\n  4: (x) => x / 10,\n  5: (x) => x / 10,\n  6: (x) => x / 100 + 90,\n  7: (x) => x * 0.002 + 3,\n  8: (x) => x * 0.002 + 5,\n  9: (x) => x * 0.001 + 7,\n  10: (x) => x / 100 + 90,\n  11: (x) => 85 - x / 50,\n  12: (x) => x * 15 / 1000 + 70,\n  13: (x) => x / 10,\n  14: (x) => 85 - x * 15 / 1000,\n  15: (x) => x * 30 / 1000 + 40,\n  18: (x) => x * 30 / 1000 + 40,\n  19: (x) => x * 30 / 1000 + 40\n};\n\nexport const engine_unitValueToValue = {\n  6: (x) => 20 * (x - 50),\n  10: (x) => 50 * (x - 80),\n  11: (x) => -50 * (x - 85),\n    12: (x) => (200 / 3) * (x - 70),\n    14: (x) => 50 * (x - 60),\n    18: (x) => 50 * (x - 50),\n    19: (x) => 50 * (x - 50),\n}\n\nexport const downforce24UnitValueToValue = {\n  7: (x) => 497.6 * x - 1489.8,\n  8: (x) => 496.8 * x - 2479.5,\n  9: (x) => 974.048 * x - 6803.2614\n};\n\nexport const downforce24ValueToUnitValue = {\n  7: (x) => (x + 1489.8) / 497.6,\n  8: (x) => (x + 2479.5) / 496.8,\n  9: (x) => (x + 6803.2614) / 974.048\n};\n\nexport const parts = {\n    0: \"engine\",\n    3: \"chassis\",\n    4: \"front_wing\",\n    5: \"rear_wing\",\n    6: \"sidepods\",\n    7: \"underfloor\",\n    8: \"suspension\"\n};\n\nexport const standardWeightPerPart = {\n    3: 5150,\n    4: 2625,\n    5: 3125,\n    6: 4125,\n    7: 3550,\n    8: 2900\n};\n\nexport const standardBuildworkPerPart = {\n    3: 2000,\n    4: 500,\n    5: 500,\n    6: 1500,\n    7: 1500,\n    8: 1500\n};\n\nexport const optimalWeightPerPart = {\n    3: 4070,\n    4: 1525,\n    5: 1945,\n    6: 3025,\n    7: 2390,\n    8: 1940\n};\n\nexport const minimalWeightPerPart = {\n    3: 3800,\n    4: 1250,\n    5: 1650,\n    6: 2750,\n    7: 2100,\n    8: 1700\n};\n\nexport const carAttributes = {\n    0: \"top_speed\",\n    1: \"acceleration\",\n    2: \"drs\",\n    3: \"low_speed\",\n    4: \"medium_speed\",\n    5: \"high_speed\",\n    6: \"dirty_air\",\n    7: \"brake_cooling\",\n    8: \"engine_cooling\"\n};\n\nexport const statsMinMax = {\n    0: [0, 100],\n    1: [0, 100],\n    2: [0, 100],\n    3: [0, 100],\n    4: [0, 100],\n    5: [0, 100],\n    7: [3, 5],\n    8: [5, 7],\n    9: [7, 8],\n    10: [90, 100],\n    13: [0, 100]\n};\n\nexport const lifespanPartsMinMax = {\n    3: [3800, 6500],\n    4: [1250, 4000],\n    5: [1650, 4600],\n    6: [2750, 5500],\n    7: [2100, 5000],\n    8: [1700, 4100]\n};\n\nexport const attributesMinMax = {\n    top_speed: [313.00, 328.00],\n    acceleration: [1.800, 1.900],\n    drs: [0, 100],\n    low_speed: [2.000, 3.000],\n    medium_speed: [3.000, 4.000],\n    high_speed: [4.000, 5.500],\n    dirty_air: [0, 100],\n    brake_cooling: [0, 100],\n    engine_cooling: [0, 100]\n};\n\nexport const attributesUnits = {\n    top_speed: \"km/h\",\n    acceleration: \"G\",\n    drs: \"%\",\n    low_speed: \"G\",\n    medium_speed: \"G\",\n    high_speed: \"G\",\n    dirty_air: \"%\",\n    brake_cooling: \"%\",\n    engine_cooling: \"%\"\n};\n\nexport const attributesContributions = {\n    top_speed: 0.15,\n    acceleration: 0,\n    drs: 0.15,\n    low_speed: 0.1666,\n    medium_speed: 0.1666,\n    high_speed: 0.1666,\n    dirty_air: 0.0666,\n    brake_cooling: 0.0666,\n    engine_cooling: 0.0666\n};\n\nexport const attributesContributions2 = {\n    top_speed: 0.15,\n    acceleration: 0,\n    drs: 0.15,\n    low_speed: 0.2166,\n    medium_speed: 0.2166,\n    high_speed: 0.2166,\n    dirty_air: 0.03,\n    brake_cooling: 0.01,\n    engine_cooling: 0.01\n};\n\nexport const attributesContributions3 = {\n    top_speed: 0.144,\n    acceleration: 0.018,\n    drs: 0.115,\n    low_speed: 0.195,\n    medium_speed: 0.195,\n    high_speed: 0.195,\n    dirty_air: 0.029,\n    brake_cooling: 0.078,\n    engine_cooling: 0.031\n};\n\n/* way more impact to accelaration*/\nexport const attributesContributions4 = {\n    top_speed: 0.15,\n    acceleration: 0.05,\n    drs: 0.1,\n    low_speed: 0.18,\n    medium_speed: 0.18,\n    high_speed: 0.18,\n    dirty_air: 0.05,\n    brake_cooling: 0.05,\n    engine_cooling: 0.015\n}\n\nexport const fuel_efficiency_factors = {\n    0: 1\n};\n\nexport const power_factors = {\n    0: 1\n};\n\nexport const performance_loss_factors = {\n    0: 1\n};\n\nexport const performance_threshold_factors = {\n    0: 1\n};\n\nexport const operational_range_factors = {\n    0: 1\n};\n\nexport const lifespan_factors = {\n    1: 0,\n    2: 0,\n    3: 5,\n    4: 2,\n    5: 3,\n    6: 5,\n    7: 4,\n    8: 1\n};\n\nexport const drag_reduction_factors = {\n    3: 0.2,\n    5: 0.3,\n    6: 0.2,\n    7: 0.2,\n    8: 0.1\n};\n\nexport const engine_cooling_factors = {\n    3: 0.4,\n    6: 0.6\n};\n\nexport const airflow_middle_factors = {\n    3: 0.6,\n    6: 0.4\n};\n\nexport const airflow_front_factors = {\n    4: 0.4,\n    6: 0.2,\n    8: 0.4\n};\n\nexport const airflow_sensitivity_factors = {\n    4: 0.4,\n    5: 0.4,\n    7: 0.2\n};\n\nexport const brake_cooling_factors = {\n    4: 0.4,\n    8: 0.6\n};\n\nexport const low_speed_downforce_factors = {\n    4: 0.2,\n    5: 0.2,\n    7: 0.3,\n    8: 0.3\n};\n\nexport const medium_speed_downforce_factors = {\n    4: 0.2,\n    5: 0.2,\n    7: 0.5,\n    8: 0.1\n};\n\nexport const high_speed_downforce_factors = {\n    4: 0.2,\n    5: 0.2,\n    7: 0.5,\n    8: 0.1\n};\n\nexport const drs_delta_factors = {\n    5: 0.75,\n    3: 0.25\n};\n\nexport const top_speed_contributors = {\n    4: 1\n};\n\nexport const acceleration_contributors = {\n    10: 0.5,\n    4: 0.5,\n    16: 0.15\n};\n\nexport const drs_contributors = {\n    3: 1\n};\n\nexport const low_speed_contributors = {\n    0: 0.6,\n    7: 1,\n    16: 0.24\n};\n\nexport const medium_speed_contributors = {\n    0: 0.4,\n    13: 0.4,\n    8: 1,\n    16: 0.27\n};\n\nexport const high_speed_contributors = {\n    13: 0.6,\n    9: 1,\n    16: 0.24\n};\n\nexport const dirty_air_contributors = {\n    1: 1\n};\n\nexport const brake_cooling_contributors = {\n    2: 1\n};\n\nexport const engine_cooling_contributors = {\n    5: 1\n};\n"
  },
  {
    "path": "src/js/backend/scriptUtils/countries.js",
    "content": "export const countries_abreviations = {\n    \"Andorra\": \"AD\",\n    \"United Arab Emirates\": \"AE\",\n    \"Afghanistan\": \"AF\",\n    \"Antigua and Barbuda\": \"AG\",\n    \"Anguilla\": \"AI\",\n    \"Albania\": \"AL\",\n    \"Armenia\": \"AM\",\n    \"Netherlands Antilles\": \"AN\",\n    \"Angola\": \"AO\",\n    \"Antarctica\": \"AQ\",\n    \"Argentina\": \"AR\",\n    \"American Samoa\": \"AS\",\n    \"Austria\": \"AT\",\n    \"Australia\": \"AU\",\n    \"Aruba\": \"AW\",\n    \"Åland Islands\": \"AX\",\n    \"Azerbaijan\": \"AZ\",\n    \"Bosnia and Herzegovina\": \"BA\",\n    \"Barbados\": \"BB\",\n    \"Bangladesh\": \"BD\",\n    \"Belgium\": \"BE\",\n    \"Burkina Faso\": \"BF\",\n    \"Bulgaria\": \"BG\",\n    \"Bahrain\": \"BH\",\n    \"Burundi\": \"BI\",\n    \"Benin\": \"BJ\",\n    \"Saint Barthélemy\": \"BL\",\n    \"Bermuda\": \"BM\",\n    \"Brunei Darussalam\": \"BN\",\n    \"Bolivia\": \"BO\",\n    \"Brazil\": \"BR\",\n    \"Bahamas\": \"BS\",\n    \"Bhutan\": \"BT\",\n    \"Bouvet Island\": \"BV\",\n    \"Botswana\": \"BW\",\n    \"Belarus\": \"BY\",\n    \"Belize\": \"BZ\",\n    \"Canada\": \"CA\",\n    \"Cocos (Keeling) Islands\": \"CC\",\n    \"Congo, Democratic Republic of the\": \"CD\",\n    \"Central African Republic\": \"CF\",\n    \"Congo, Republic of the\": \"CG\",\n    \"Switzerland\": \"CH\",\n    \"Côte d'Ivoire\": \"CI\",\n    \"Cook Islands\": \"CK\",\n    \"Chile\": \"CL\",\n    \"Cameroon\": \"CM\",\n    \"China\": \"CN\",\n    \"Colombia\": \"CO\",\n    \"Costa Rica\": \"CR\",\n    \"Cuba\": \"CU\",\n    \"Cape Verde\": \"CV\",\n    \"Curaçao\": \"CW\",\n    \"Christmas Island\": \"CX\",\n    \"Cyprus\": \"CY\",\n    \"Czech Republic\": \"CZ\",\n    \"Germany\": \"DE\",\n    \"Djibouti\": \"DJ\",\n    \"Denmark\": \"DK\",\n    \"Dominica\": \"DM\",\n    \"Dominican Republic\": \"DO\",\n    \"Algeria\": \"DZ\",\n    \"Ecuador\": \"EC\",\n    \"Estonia\": \"EE\",\n    \"Egypt\": \"EG\",\n    \"Western Sahara\": \"EH\",\n    \"Eritrea\": \"ER\",\n    \"Spain\": \"ES\",\n    \"Ethiopia\": \"ET\",\n    \"Finland\": \"FI\",\n    \"Fiji\": \"FJ\",\n    \"Falkland Islands (Malvinas)\": \"FK\",\n    \"Micronesia, Federated States of\": \"FM\",\n    \"Faroe Islands\": \"FO\",\n    \"France\": \"FR\",\n    \"Gabon\": \"GA\",\n    \"United Kingdom\": \"GB\",\n    \"Grenada\": \"GD\",\n    \"Georgia\": \"GE\",\n    \"French Guiana\": \"GF\",\n    \"Guernsey\": \"GG\",\n    \"Ghana\": \"GH\",\n    \"Gibraltar\": \"GI\",\n    \"Greenland\": \"GL\",\n    \"Gambia\": \"GM\",\n    \"Guinea\": \"GN\",\n    \"Guadeloupe\": \"GP\",\n    \"Equatorial Guinea\": \"GQ\",\n    \"Greece\": \"GR\",\n    \"South Georgia and the South Sandwich Islands\": \"GS\",\n    \"Guatemala\": \"GT\",\n    \"Guam\": \"GU\",\n    \"Guinea-Bissau\": \"GW\",\n    \"Guyana\": \"GY\",\n    \"Hong Kong\": \"HK\",\n    \"Heard Island and McDonald Islands\": \"HM\",\n    \"Honduras\": \"HN\",\n    \"Croatia\": \"HR\",\n    \"Haiti\": \"HT\",\n    \"Hungary\": \"HU\",\n    \"Indonesia\": \"ID\",\n    \"Ireland\": \"IE\",\n    \"Israel\": \"IL\",\n    \"Isle of Man\": \"IM\",\n    \"India\": \"IN\",\n    \"British Indian Ocean Territory\": \"IO\",\n    \"Iraq\": \"IQ\",\n    \"Iran, Islamic Republic of\": \"IR\",\n    \"Iceland\": \"IS\",\n    \"Italy\": \"IT\",\n    \"Jersey\": \"JE\",\n    \"Jamaica\": \"JM\",\n    \"Jordan\": \"JO\",\n    \"Japan\": \"JP\",\n    \"Kenya\": \"KE\",\n    \"Kyrgyzstan\": \"KG\",\n    \"Cambodia\": \"KH\",\n    \"Kiribati\": \"KI\",\n    \"Comoros\": \"KM\",\n    \"Saint Kitts and Nevis\": \"KN\",\n    \"Korea, Democratic People's Republic of\": \"KP\",\n    \"Korea, Republic of\": \"KR\",\n    \"Kuwait\": \"KW\",\n    \"Cayman Islands\": \"KY\",\n    \"Kazakhstan\": \"KZ\",\n    \"Lao People's Democratic Republic\": \"LA\",\n    \"Lebanon\": \"LB\",\n    \"Saint Lucia\": \"LC\",\n    \"Liechtenstein\": \"LI\",\n    \"Sri Lanka\": \"LK\",\n    \"Liberia\": \"LR\",\n    \"Lesotho\": \"LS\",\n    \"Lithuania\": \"LT\",\n    \"Luxembourg\": \"LU\",\n    \"Latvia\": \"LV\",\n    \"Libya\": \"LY\",\n    \"Morocco\": \"MA\",\n    \"Monaco\": \"MC\",\n    \"Moldova, Republic of\": \"MD\",\n    \"Montenegro\": \"ME\",\n    \"Saint Martin (French part)\": \"MF\",\n    \"Madagascar\": \"MG\",\n    \"Marshall Islands\": \"MH\",\n    \"Macedonia, the Former Yugoslav Republic of\": \"MK\",\n    \"Mali\": \"ML\",\n    \"Myanmar\": \"MM\",\n    \"Mongolia\": \"MN\",\n    \"Macao\": \"MO\",\n    \"Northern Mariana Islands\": \"MP\",\n    \"Martinique\": \"MQ\",\n    \"Mauritania\": \"MR\",\n    \"Montserrat\": \"MS\",\n    \"Malta\": \"MT\",\n    \"Mauritius\": \"MU\",\n    \"Maldives\": \"MV\",\n    \"Malawi\": \"MW\",\n    \"Mexico\": \"MX\",\n    \"Malaysia\": \"MY\",\n    \"Mozambique\": \"MZ\",\n    \"Namibia\": \"NA\",\n    \"New Caledonia\": \"NC\",\n    \"Niger\": \"NE\",\n    \"Norfolk Island\": \"NF\",\n    \"Nigeria\": \"NG\",\n    \"Nicaragua\": \"NI\",\n    \"Netherlands\": \"NL\",\n    \"Norway\": \"NO\",\n    \"Nepal\": \"NP\",\n    \"Nauru\": \"NR\",\n    \"Niue\": \"NU\",\n    \"New Zealand\": \"NZ\",\n    \"Oman\": \"OM\",\n    \"Panama\": \"PA\",\n    \"Peru\": \"PE\",\n    \"French Polynesia\": \"PF\",\n    \"Papua New Guinea\": \"PG\",\n    \"Philippines\": \"PH\",\n    \"Pakistan\": \"PK\",\n    \"Poland\": \"PL\",\n    \"Saint Pierre and Miquelon\": \"PM\",\n    \"Pitcairn\": \"PN\",\n    \"Puerto Rico\": \"PR\",\n    \"Palestine, State of\": \"PS\",\n    \"Portugal\": \"PT\",\n    \"Palau\": \"PW\",\n    \"Paraguay\": \"PY\",\n    \"Qatar\": \"QA\",\n    \"Réunion\": \"RE\",\n    \"Romania\": \"RO\",\n    \"Serbia\": \"RS\",\n    \"Russian\": \"RU\",\n    \"Rwanda\": \"RW\",\n    \"Saudi Arabia\": \"SA\",\n    \"Solomon Islands\": \"SB\",\n    \"Seychelles\": \"SC\",\n    \"Sudan\": \"SD\",\n    \"Sweden\": \"SE\",\n    \"Singapore\": \"SG\",\n    \"Saint Helena, Ascension and Tristan da Cunha\": \"SH\",\n    \"Slovenia\": \"SI\",\n    \"Svalbard and Jan Mayen\": \"SJ\",\n    \"Slovakia\": \"SK\",\n    \"Sierra Leone\": \"SL\",\n    \"San Marino\": \"SM\",\n    \"Senegal\": \"SN\",\n    \"Somalia\": \"SO\",\n    \"Suriname\": \"SR\",\n    \"South Sudan\": \"SS\",\n    \"Sao Tome and Principe\": \"ST\",\n    \"El Salvador\": \"SV\",\n    \"Sint Maarten (Dutch part)\": \"SX\",\n    \"Syrian Arab Republic\": \"SY\",\n    \"Swaziland\": \"SZ\",\n    \"Turks and Caicos Islands\": \"TC\",\n    \"Chad\": \"TD\",\n    \"French Southern Territories\": \"TF\",\n    \"Togo\": \"TG\",\n    \"Thailand\": \"TH\",\n    \"Tajikistan\": \"TJ\",\n    \"Tokelau\": \"TK\",\n    \"Timor-Leste\": \"TL\",\n    \"Turkmenistan\": \"TM\",\n    \"Tunisia\": \"TN\",\n    \"Tonga\": \"TO\",\n    \"Turkey\": \"TR\",\n    \"Trinidad and Tobago\": \"TT\",\n    \"Tuvalu\": \"TV\",\n    \"Taiwan, Province of China\": \"TW\",\n    \"Tanzania, United Republic of\": \"TZ\",\n    \"Ukraine\": \"UA\",\n    \"Uganda\": \"UG\",\n    \"United States Minor Outlying Islands\": \"UM\",\n    \"United States\": \"US\",\n    \"Uruguay\": \"UY\",\n    \"Uzbekistan\": \"UZ\",\n    \"Holy See (Vatican City State)\": \"VA\",\n    \"Saint Vincent and the Grenadines\": \"VC\",\n    \"Venezuela\": \"VE\",\n    \"Virgin Islands, British\": \"VG\",\n    \"Virgin Islands, U.S.\": \"VI\",\n    \"Vietnam\": \"VN\",\n    \"Vanuatu\": \"VU\",\n    \"Wallis and Futuna\": \"WF\",\n    \"Samoa\": \"WS\",\n    \"Yemen\": \"YE\",\n    \"Mayotte\": \"YT\",\n    \"South Africa\": \"ZA\",\n    \"Zambia\": \"ZM\",\n    \"Zimbabwe\": \"ZW\"\n}\n\nexport const inverted_countries_abreviations = Object.fromEntries(\n    Object.entries(countries_abreviations).map(([key, value]) => [value, key])\n);\n"
  },
  {
    "path": "src/js/backend/scriptUtils/createStaffUtils.js",
    "content": "import { queryDB } from \"../dbManager\";\nimport { countries_abreviations, inverted_countries_abreviations } from \"./countries.js\";\n\nconst DRIVER_STAT_IDS = [2, 3, 4, 5, 6, 7, 8, 9, 10];\nconst STAFF_STAT_IDS = {\n  1: [0, 1, 14, 15, 16, 17],\n  2: [13, 25, 43],\n  3: [19, 20, 26, 27, 28, 29, 30, 31],\n  4: [11, 22, 23, 24]\n};\n\nconst STAFF_TYPE_NAMES = {\n  0: \"Drivers\",\n  1: \"Technical Chiefs\",\n  2: \"Race Engineers\",\n  3: \"H. of Aerodynamics\",\n  4: \"Sporting Directors\"\n};\n\nexport function fetchRandomStaffDraft(typeStaffRaw, gameYear = \"24\") {\n  const typeStaff = normalizeStaffType(typeStaffRaw);\n  const nationality = pickRandomNationality(gameYear);\n  const gender = randomInt(0, 1);\n  const firstNameLocKey = pickRandomForename(gender, nationality.staffNameLocale);\n  const lastNameLocKey = pickRandomSurname(nationality.staffNameLocale);\n  const firstName = extractNameToken(firstNameLocKey);\n  const lastName = extractNameToken(lastNameLocKey);\n  const { age, retirementAge } = buildAgeDetails(typeStaff);\n  const stats = buildRandomStats(typeStaff);\n  const driverCode = typeStaff === 0 ? buildDriverCode(firstName, lastName) : \"\";\n  const driverNumber = typeStaff === 0 ? pickAvailableDriverNumber() : 0;\n  const statsArray = (typeStaff === 0)\n    ? [...stats.values, stats.improvability, stats.aggression]\n    : stats.values;\n\n  return {\n    draftId: `draft-${Date.now()}-${randomInt(1000, 9999)}`,\n    draft: true,\n    typeStaff: String(typeStaff),\n    typeName: STAFF_TYPE_NAMES[typeStaff],\n    gender,\n    firstName,\n    lastName,\n    firstNameLocKey,\n    lastNameLocKey,\n    name: `${firstName} ${lastName}`.trim(),\n    nationality: nationality.code,\n    countryId: nationality.countryId,\n    countryName: nationality.name,\n    staffNameLocale: nationality.staffNameLocale,\n    stats: statsArray.join(\" \"),\n    statsArray,\n    age,\n    retirement_age: retirementAge,\n    marketability: typeStaff === 0 ? stats.marketability : undefined,\n    improvability: typeStaff === 0 ? stats.improvability : undefined,\n    aggression: typeStaff === 0 ? stats.aggression : undefined,\n    driver_number: driverNumber,\n    wants1: 0,\n    superlicense: typeStaff === 0 ? 1 : 0,\n    driver_code: driverCode,\n    isRetired: 0,\n    race_formula: 4,\n    teamid: 0,\n    mentality0: gameYear === \"24\" ? 2 : -1,\n    mentality1: gameYear === \"24\" ? 2 : -1,\n    mentality2: gameYear === \"24\" ? 2 : -1,\n    global_mentality: gameYear === \"24\" ? 59 : -1\n  };\n}\n\nexport function fetchRandomDraftForename(genderRaw, staffNameLocaleRaw) {\n  const gender = Number(genderRaw);\n  const staffNameLocale = Number(staffNameLocaleRaw);\n  const genderText = gender === 1 ? \"Female\" : \"Male\";\n\n  const firstNameLocKey = queryDB(`\n    SELECT LocKey\n    FROM Staff_ForenamePool\n    WHERE LocKey LIKE ?\n      AND Locale = ?\n    ORDER BY RANDOM()\n    LIMIT 1\n  `, [`%StaffName_Forename_${genderText}_%`, staffNameLocale], \"singleValue\");\n\n  const lastNameLocKey = pickRandomSurname(staffNameLocale);\n\n  return {\n    firstNameLocKey,\n    firstName: extractNameToken(firstNameLocKey),\n    lastNameLocKey,\n    lastName: extractNameToken(lastNameLocKey)\n  };\n}\n\nexport function fetchCountryLocaleForCode(codeRaw) {\n  const code = String(codeRaw || \"\").toUpperCase();\n  const nationalityName = inverted_countries_abreviations[code] || \"\";\n  const key = nationalityName.replace(/\\s+/g, \"\");\n\n  const row = queryDB(`\n    SELECT CountryID, Name, StaffNameLocale\n    FROM Countries\n    WHERE Name LIKE ?\n    LIMIT 1\n  `, [`%[Nationality_${key}]%`], \"singleRow\");\n\n  return {\n    code,\n    countryId: row?.[0] ?? null,\n    countryName: nationalityName,\n    staffNameLocale: row?.[2] ?? null\n  };\n}\n\nfunction normalizeStaffType(typeStaffRaw) {\n  const typeStaff = Number(typeStaffRaw);\n  if (!Number.isInteger(typeStaff) || typeStaff < 0 || typeStaff > 4) {\n    throw new Error(`Invalid staff type: ${typeStaffRaw}`);\n  }\n  return typeStaff;\n}\n\nfunction buildAgeDetails(typeStaff) {\n  let minAge = 18;\n  let maxAge = 38;\n  let minRetirementGap = 4;\n  let maxRetirementAge = 46;\n\n  if (typeStaff === 1 || typeStaff === 3 || typeStaff === 4) {\n    minAge = 32;\n    maxAge = 66;\n    minRetirementGap = 5;\n    maxRetirementAge = 75;\n  } else if (typeStaff === 2) {\n    minAge = 24;\n    maxAge = 60;\n    minRetirementGap = 5;\n    maxRetirementAge = 70;\n  }\n\n  const age = randomInt(minAge, maxAge);\n  const retirementAge = randomInt(age + minRetirementGap, maxRetirementAge);\n\n  return { age, retirementAge };\n}\n\nfunction buildRandomStats(typeStaff) {\n  const statIDs = typeStaff === 0 ? DRIVER_STAT_IDS : STAFF_STAT_IDS[typeStaff];\n  const base = pickBaseRating(typeStaff);\n  const spread = typeStaff === 0 ? 12 : 10;\n  const values = statIDs.map(() => statAroundBase(base, spread, { min: 64, max: 100 }));\n\n  return {\n    values,\n    improvability: typeStaff === 0 ? statAroundBase(base, 22, { min: 0, max: 100 }) : undefined,\n    aggression: typeStaff === 0 ? statAroundBase(base, 22, { min: 0, max: 100 }) : undefined,\n    marketability: typeStaff === 0 ? statAroundBase(base, 25, { min: 0, max: 100 }) : undefined\n  };\n}\n\nfunction pickRandomForename(gender, staffNameLocale = null) {\n  const genderText = gender === 1 ? \"Female\" : \"Male\";\n  const locKey = queryDB(`\n    SELECT LocKey\n    FROM Staff_ForenamePool\n    WHERE LocKey LIKE ?\n      AND Locale = ?\n    ORDER BY RANDOM()\n    LIMIT 1\n  `, [`%StaffName_Forename_${genderText}_%`, staffNameLocale], \"singleValue\");\n\n  if (locKey) return locKey;\n\n  return \"[STRING_LITERAL:Value=|New|]\";\n}\n\nfunction pickRandomSurname(staffNameLocale = null) {\n  const locKey = queryDB(`\n    SELECT LocKey\n    FROM Staff_SurnamePool\n    WHERE LocKey IS NOT NULL\n      AND Locale = ?\n    ORDER BY RANDOM()\n    LIMIT 1\n  `, [staffNameLocale], \"singleValue\");\n\n  if (locKey) return locKey;\n\n  return \"[STRING_LITERAL:Value=|Person|]\";\n}\n\nfunction pickRandomNationality(gameYear) {\n  let year = String(gameYear || \"\").trim();\n  if (year === \"2024\") year = \"24\";\n  if (year === \"2023\") year = \"23\";\n\n  if (year === \"24\") {\n    const row = queryDB(`\n      SELECT CountryID, Name, StaffNameLocale\n      FROM Countries\n      WHERE Name LIKE '%[Nationality_%'\n      ORDER BY RANDOM()\n      LIMIT 1\n    `, [], \"singleRow\");\n\n    const match = String(row?.[1] || \"\").match(/(?<=\\[Nationality_)[^\\]]+/);\n    const nationalityName = match ? match[0].replace(/(?<!^)([A-Z])/g, \" $1\") : \"\";\n    const code = fetchCountryCode(nationalityName);\n    return { countryId: row?.[0] ?? null, code, name: nationalityName, staffNameLocale: row?.[2] ?? null };\n  }\n\n  const nationalityRaw = queryDB(`\n    SELECT Nationality\n    FROM Staff_BasicData\n    WHERE Nationality IS NOT NULL\n      AND Nationality != ''\n    ORDER BY RANDOM()\n    LIMIT 1\n  `, [], \"singleValue\");\n\n  const nationalityName = String(nationalityRaw || \"\").replace(/(?<!^)([A-Z])/g, \" $1\");\n  const code = fetchCountryCode(nationalityName);\n  return { countryId: null, code, name: nationalityName, staffNameLocale: null };\n}\n\nfunction fetchCountryCode(nationalityName) {\n  return countries_abreviations[nationalityName] || \"\";\n}\n\nfunction pickAvailableDriverNumber() {\n  const available = queryDB(`\n    SELECT Number\n    FROM Staff_DriverNumbers\n    WHERE CurrentHolder IS NULL\n    ORDER BY RANDOM()\n    LIMIT 1\n  `, [], \"singleValue\");\n\n  return available || 0;\n}\n\nfunction buildDriverCode(firstName, lastName) {\n  const compact = `${firstName}${lastName}`.replace(/[^A-Za-z]/g, \"\").toUpperCase();\n  return (compact || \"NEW\").slice(0, 3).padEnd(3, \"X\");\n}\n\nfunction extractNameToken(value) {\n  const stringValue = String(value || \"\");\n  const literalMatch = stringValue.match(/\\|([^|]+)\\|/);\n  if (literalMatch) {\n    return literalMatch[1];\n  }\n\n  const forenameMatch = stringValue.match(/StaffName_Forename_(?:Male|Female)_(\\w+)/);\n  if (forenameMatch) {\n    return removeTrailingDigits(forenameMatch[1]);\n  }\n\n  const surnameMatch = stringValue.match(/Staff(?:Name)?_Surname_(\\w+)/);\n  if (surnameMatch) {\n    return removeTrailingDigits(surnameMatch[1]);\n  }\n\n  return \"New\";\n}\n\nfunction removeTrailingDigits(value) {\n  return String(value || \"\").replace(/\\d+$/, \"\");\n}\n\nfunction randomInt(min, max) {\n  return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\nfunction clampInt(n, min, max) {\n  return Math.max(min, Math.min(max, Math.round(n)));\n}\n\nfunction pickBaseRating(typeStaff) {\n  const min = 64;\n  const max = typeStaff === 0 ? 92 : 90;\n  const u = (Math.random() + Math.random()) / 2;\n  return clampInt(min + u * (max - min), min, max);\n}\n\nfunction statAroundBase(base, spread, { min, max }) {\n  const delta = (Math.random() - Math.random()) * spread;\n  return clampInt(base + delta, min, max);\n}\n"
  },
  {
    "path": "src/js/backend/scriptUtils/dbUtils.js",
    "content": "import { countries_abreviations } from \"./countries.js\";\nimport { engine_unitValueToValue } from \"./carConstants.js\";\nimport { manageDifficultyTriggers, manageRefurbishTrigger, editFreezeMentality, fetchExistingTriggers, editFreezeDevelopment } from \"./triggerUtils.js\";\nimport { getMetadata, queryDB } from \"../dbManager.js\";\nimport { getGlobals } from \"../commandGlobals.js\";\nimport { customColors, default_dict, defaultColors, defaultTurningPointsFrequencyPreset } from \"../../frontend/config.js\";\nimport { _standingsCache, rebuildStandingsUntil, rebuildStandingsUntilCached } from \"./newsUtils.js\";\n\n\n/**\n * Convierte un color ARGB a hexadecimal.\n */\nexport function argbToHex(argb) {\n  const rgb = argb & 0xFFFFFF; // Ignora el canal alfa\n  return `#${rgb.toString(16).padStart(6, '0').toUpperCase()}`;\n}\n\nexport function hexToArgb(hex) {\n  hex = hex.replace(\"#\", \"\");\n\n  if (hex.length === 3) {\n    hex = hex.split(\"\").map(c => c + c).join(\"\");\n  }\n\n  const r = parseInt(hex.substring(0, 2), 16);\n  const g = parseInt(hex.substring(2, 4), 16);\n  const b = parseInt(hex.substring(4, 6), 16);\n\n  const a = 255;\n\n  return ((a << 24) | (r << 16) | (g << 8) | b) >>> 0;\n}\n\n/**\n * Convierte un color hex a uint32 en formato ARGB (AARRGGBB) como en tu DB.\n * Acepta: #RGB, #RRGGBB, #AARRGGBB (también sin #).\n *\n * @param {string} hex - Color en hex.\n * @param {number} [defaultAlpha=255] - Alpha (0-255) si el hex NO incluye alpha.\n * @returns {number} - Entero uint32 (0..4294967295)\n */\nexport function hexToDbArgb(hex, defaultAlpha = 255) {\n  if (typeof hex !== \"string\") throw new TypeError(\"hex must be a string\");\n\n  let s = hex.trim().replace(/^#/, \"\");\n\n  // #RGB -> #RRGGBB\n  if (s.length === 3) {\n    s = s.split(\"\").map(ch => ch + ch).join(\"\");\n  }\n\n  if (![6, 8].includes(s.length) || !/^[0-9a-fA-F]+$/.test(s)) {\n    throw new Error(`Invalid hex color: \"${hex}\"`);\n  }\n\n  let a, r, g, b;\n\n  if (s.length === 6) {\n    a = clampByte(defaultAlpha);\n    r = parseInt(s.slice(0, 2), 16);\n    g = parseInt(s.slice(2, 4), 16);\n    b = parseInt(s.slice(4, 6), 16);\n  } else {\n    a = parseInt(s.slice(0, 2), 16);\n    r = parseInt(s.slice(2, 4), 16);\n    g = parseInt(s.slice(4, 6), 16);\n    b = parseInt(s.slice(6, 8), 16);\n  }\n\n  return (((a << 24) | (r << 16) | (g << 8) | b) >>> 0);\n}\n\nfunction clampByte(n) {\n  const x = Number(n);\n  return Math.max(0, Math.min(255, Math.round(x)));\n}\n\n\nexport function getDate() {\n  const daySeason = queryDB(`\n        SELECT Day, CurrentSeason\n        FROM Player_State\n    `, [], 'singleRow');\n\n  return daySeason\n}\n\n/**\n * Verifica si el archivo de guardado es de un año específico.\n * @returns {Array} [ \"23\" o \"24\", TeamName, primaryColor, secondaryColor ]\n */\nexport function checkYearSave() {\n  // Ver si existe la tabla Countries_RaceRecord\n  const row = queryDB(`\n      SELECT name \n      FROM sqlite_master \n      WHERE type='table' AND name='Countries_RaceRecord'\n    `, [], 'singleRow');\n\n  if (!row) {\n    // No existe la tabla -> asumo que es \"23\"\n    return [\"23\", null, null, null];\n  }\n\n  // Si existe, entonces busco TeamNameLocKey del TeamID=32\n  const nameValue = queryDB(`\n      SELECT TeamNameLocKey \n      FROM Teams \n      WHERE TeamID = 32\n    `, [], 'singleValue');\n\n  if (!nameValue) {\n    // No hay valor -> devuelvo \"24\" sin datos\n    return [\"24\", null, null, null];\n  }\n\n  // Extraer nombre\n  const match = nameValue.match(/\\[STRING_LITERAL:Value=\\|(.*?)\\|\\]/);\n  let name = null, primaryColor = null, secondaryColor = null;\n\n  if (match) {\n    name = match[1];\n\n    // Busco los colores\n    const primaryColorRow = queryDB(`\n        SELECT Colour\n        FROM Teams_Colours\n        WHERE TeamID = 32 AND ColourID = 0\n      `, [], 'singleRow');\n\n    const secondaryColorRow = queryDB(`\n        SELECT Colour\n        FROM Teams_Colours\n        WHERE TeamID = 32 AND ColourID = 1\n      `, [], 'singleRow');\n\n    if (primaryColorRow) {\n      primaryColor = argbToHex(primaryColorRow[0]);\n    }\n    if (secondaryColorRow) {\n      secondaryColor = argbToHex(secondaryColorRow[0]);\n    }\n  }\n\n  return [\"24\", name, primaryColor, secondaryColor];\n}\n\nexport function fetchNationality(driverID, gameYear) {\n  let year = String(gameYear || \"\").trim();\n  if (year === \"2024\") year = \"24\";\n  if (year === \"2023\") year = \"23\";\n\n  if (year === \"24\") {\n    const countryID = queryDB(`\n        SELECT CountryID \n        FROM Staff_BasicData \n        WHERE StaffID = ?\n      `, [driverID], 'singleValue');\n    if (!countryID) return \"\";\n\n    const countryName = queryDB(`\n        SELECT Name \n        FROM Countries \n        WHERE CountryID = ?\n      `, [countryID], 'singleValue');\n    if (!countryName) return \"\";\n\n\n    const match = countryName.match(/(?<=\\[Nationality_)[^\\]]+/);\n    if (match) {\n      const nat = match[0];\n      const natName = nat.replace(/(?<!^)([A-Z])/g, \" $1\");\n      return countries_abreviations[natName] || \"\";\n    }\n\n    return \"\";\n  } else if (year === \"23\") {\n    const nationality = queryDB(`\n        SELECT Nationality \n        FROM Staff_BasicData \n        WHERE StaffID = ?\n      `, [driverID], 'singleValue');\n    if (!nationality) return \"\";\n\n    const natName = nationality.replace(/(?<!^)([A-Z])/g, \" $1\");\n    return countries_abreviations[natName] || \"\";\n  }\n\n  return \"\";\n}\n\nexport function fetchForFutureContract(driverID) {\n  const teamInfo = queryDB(`\n      SELECT TeamID, PosInTeam \n      FROM Staff_Contracts \n      WHERE StaffID = ?\n        AND ContractType = 3\n    `, [driverID], 'singleRow');\n\n  let futureTeamInfo = {\n    teamId: -1,\n    posInTeam: -1\n  }\n\n  if (teamInfo) {\n    futureTeamInfo.teamId = teamInfo[0];\n    futureTeamInfo.posInTeam = teamInfo[1];\n  }\n\n  return futureTeamInfo;\n}\n\nfunction fetchJuniorContracts(driverID) {\n  const juniorContracts = queryDB(`\n    SELECT TeamID, PosInTeam\n    FROM Staff_Contracts\n    WHERE StaffID = ?\n      AND (ContractType = 0 OR ContractType = 3)\n      AND TeamID BETWEEN 11 AND 31\n  `, [driverID], 'allRows');\n\n  let juniorFormulaInfo = {\n    teamId: -1,\n    posInTeam: -1\n  }\n  if (juniorContracts && juniorContracts.length > 0) {\n    juniorFormulaInfo.teamId = juniorContracts[0][0];\n    juniorFormulaInfo.posInTeam = juniorContracts[0][1];\n  }\n\n  return juniorFormulaInfo;\n}\n\nexport function fetchEngines() {\n  const statsIds = [6, 10, 11, 12, 14, 15];\n  const enginesList = [];\n\n\n  let newEngineIds = queryDB(`\n      SELECT engineID FROM Custom_Engines_List`, [], 'allRows');\n\n  newEngineIds = newEngineIds.map(row => row[0]);\n  let newErsIds = newEngineIds.map(id => id + 1);\n  let newGearboxesIds = newEngineIds.map(id => id + 2);\n\n  for (let i = 0; i < newEngineIds.length; i++) {\n    let resultDict = {};\n\n    // Obtener valores de stats\n    for (const stat of statsIds) {\n      const statResult = queryDB(`\n                SELECT partStat, unitValue \n                FROM Custom_Engines_Stats \n                WHERE designId = ? AND partStat = ?\n            `, [newEngineIds[i], stat], 'singleRow');\n      if (statResult) {\n        resultDict[statResult[0]] = statResult[1];\n      }\n    }\n\n\n    // Obtener valor de ERS\n    const ersResult = queryDB(`\n            SELECT UnitValue \n            FROM Custom_Engines_Stats \n            WHERE designId = ? AND partStat = 15\n        `, [newErsIds[i]], 'singleValue');\n    if (ersResult !== null) {\n      resultDict[18] = ersResult;\n    }\n\n    // Obtener valor de gearbox\n    const gearboxResult = queryDB(`\n            SELECT UnitValue \n            FROM Custom_Engines_Stats \n            WHERE designId = ? AND partStat = 15\n        `, [newGearboxesIds[i]], 'singleValue');\n    if (gearboxResult !== null) {\n      resultDict[19] = gearboxResult;\n    }\n\n    const engineName = queryDB(`\n          SELECT name \n          FROM Custom_Engines_List\n          WHERE engineID = ?\n      `, [newEngineIds[i]], 'singleValue');\n\n    // Añadir la información del motor a la lista\n    enginesList.push([newEngineIds[i], resultDict, engineName]);\n  }\n\n  const engineAllocations = queryDB(`\n      SELECT * FROM Custom_Engine_Allocations\n    `, [], 'allRows');\n\n  return [enginesList, engineAllocations];\n}\n\nexport function ensureCustomEngineProgressionTable() {\n  queryDB(`\n    CREATE TABLE IF NOT EXISTS Custom_Engine_Progression (\n      SeasonID INTEGER NOT NULL,\n      RaceID INTEGER NOT NULL,\n      EngineID INTEGER NOT NULL,\n      Power REAL NOT NULL,\n      Source TEXT NULL,\n      PRIMARY KEY (SeasonID, RaceID, EngineID)\n    )\n  `, [], 'run');\n\n  queryDB(`\n    CREATE INDEX IF NOT EXISTS idx_Custom_Engine_Progression_Season_Engine_Race\n    ON Custom_Engine_Progression (SeasonID, EngineID, RaceID)\n  `, [], 'run');\n}\n\nfunction getNextSnapshotRaceIdForSeason(seasonId) {\n  if (!Number.isFinite(Number(seasonId))) {\n    return null;\n  }\n\n  const nextRaceIdRaw = queryDB(`\n    SELECT RaceID\n    FROM Races\n    WHERE SeasonID = ?\n      AND State != 2\n    ORDER BY Day ASC\n    LIMIT 1\n  `, [seasonId], 'singleValue');\n\n  if (nextRaceIdRaw !== null && nextRaceIdRaw !== undefined) {\n    const nextRaceId = Number(nextRaceIdRaw);\n    return Number.isFinite(nextRaceId) && nextRaceId > 0 ? nextRaceId : null;\n  }\n\n  const maxRaceIdRaw = queryDB(`SELECT MAX(RaceID) FROM Races WHERE SeasonID = ?`, [seasonId], 'singleValue');\n  const maxRaceId = Number(maxRaceIdRaw) || 0;\n  return maxRaceId > 0 ? (maxRaceId + 1) : null;\n}\n\nexport function snapshotEnginePowerProgression(engineIdsRaw, source, seasonIdRaw = null, raceIdRaw = null) {\n  ensureCustomEngineProgressionTable();\n\n  const seasonId = Number(seasonIdRaw) || Number(queryDB(`SELECT CurrentSeason FROM Player_State`, [], 'singleValue')) || null;\n  if (!seasonId) return { ok: false, error: \"Missing season id\" };\n\n  const raceId = Number(raceIdRaw) || getNextSnapshotRaceIdForSeason(seasonId);\n  if (!Number.isFinite(raceId) || raceId <= 0) return { ok: false, error: \"Missing race id\" };\n\n  const engineIds = (engineIdsRaw || [])\n    .map((id) => Number(id))\n    .filter((id) => Number.isFinite(id) && id > 0);\n\n  if (!engineIds.length) return { ok: true, seasonId, raceId, inserted: 0 };\n\n  const placeholders = engineIds.map(() => '?').join(', ');\n  const powerRows = queryDB(`\n    SELECT engineId, unitValue\n    FROM Custom_Engines_Stats\n    WHERE designId = engineId\n      AND partStat = 10\n      AND engineId IN (${placeholders})\n  `, engineIds, 'allRows') || [];\n\n  let inserted = 0;\n  for (const row of powerRows) {\n    const engineId = Number(row?.[0]);\n    const power = Number(row?.[1]);\n    if (!engineId || !Number.isFinite(power)) continue;\n\n    queryDB(`\n      INSERT OR IGNORE INTO Custom_Engine_Progression (SeasonID, RaceID, EngineID, Power, Source)\n      VALUES (?, ?, ?, ?, ?)\n    `, [seasonId, raceId, engineId, power, source || null], 'run');\n    inserted += 1;\n  }\n\n  return { ok: true, seasonId, raceId, inserted };\n}\n\n\nexport function fetchMentality(staffID) {\n  // Obtengo todas las filas (morale es un array de arrays [[opinion],[opinion], ...])\n  const morale = queryDB(`\n      SELECT Opinion\n      FROM Staff_Mentality_AreaOpinions\n      WHERE StaffID = ?\n    `, [staffID], 'allRows');\n\n  // Obtengo un solo valor\n  const globalMentality = queryDB(`\n      SELECT Mentality\n      FROM Staff_State\n      WHERE StaffID = ?\n    `, [staffID], 'singleValue');\n\n  return [morale, globalMentality];\n}\n\nexport function checkDrivesForTeam32(staffData) {\n  // staffData = [ firstName, lastName, staffID, teamID, posInTeam, minContractType, retired, countContracts ]\n\n  const contractRow = queryDB(`\n      SELECT TeamID, PosInTeam\n      FROM Staff_Contracts\n      WHERE StaffID = ?\n        AND ContractType = 0 \n        AND TeamID = 32\n    `, [staffData[2]], 'singleRow');\n\n  if (contractRow) {\n    return [\n      staffData[0],\n      staffData[1],\n      staffData[2],\n      32,\n      contractRow[1],\n      staffData[5],\n      staffData[6],\n      staffData[7]\n    ];\n  }\n  return staffData;\n}\n\nexport function removeNumber(str) {\n  if (str && /\\d$/.test(str)) {\n    return str.slice(0, -1);\n  }\n  return str;\n}\n\nexport function formatNamesAndFetchStats(nameData, type) {\n  // nameData: [ FirstName, LastName, StaffID, teamId, positionInTeam, minContractType, retired, countContracts ]\n  let firstName = \"\";\n  let lastName = \"\";\n\n  // Extract firstName\n  if (!nameData[0].includes(\"STRING_LITERAL\")) {\n    const m = nameData[0].match(/StaffName_Forename_(?:Male|Female)_(\\w+)/);\n    firstName = m ? removeNumber(m[1]) : \"\";\n  } else {\n    const m = nameData[0].match(/\\|([^|]+)\\|/);\n    firstName = m ? m[1] : \"\";\n  }\n\n  // Extract lastName\n  if (!nameData[1].includes(\"STRING_LITERAL\")) {\n    const m = nameData[1].match(/StaffName_Surname_(\\w+)/);\n    lastName = m ? removeNumber(m[1]) : \"\";\n  } else {\n    const m = nameData[1].match(/\\|([^|]+)\\|/);\n    lastName = m ? m[1] : \"\";\n  }\n\n  const formattedName = `${firstName} ${lastName}`;\n  let teamId = nameData[3] ?? 0;\n  let positionInTeam = nameData[4] ?? 0;\n\n  // para drivers que tienen minContractType != 0 (p.ej. reservas)\n  if (type === \"driver\" && nameData[5] !== 0) {\n    teamId = 0;\n    positionInTeam = 0;\n  }\n\n  let baseResult;\n  if (type === \"driver\") {\n    // [nombre, staffID, teamID, posInTeam, retired]\n    baseResult = [formattedName, nameData[2], teamId, positionInTeam, nameData[6]];\n  } else {\n    // staff normal\n    baseResult = [formattedName, nameData[2], teamId, positionInTeam];\n  }\n\n  // Buscamos stats\n  if (type === \"driver\") {\n    const statsRows = queryDB(`\n        SELECT Val\n        FROM Staff_PerformanceStats\n        WHERE StaffID = ?\n          AND StatID BETWEEN 2 AND 10\n      `, [nameData[2]], 'allRows');\n\n    let stats = statsRows;\n    if (!stats || !stats.length) {\n      // si no hay stats, por defecto 50\n      stats = Array(9).fill([50]);\n    }\n\n    const extraRow = queryDB(`\n        SELECT Improvability, Aggression\n        FROM Staff_DriverData\n        WHERE StaffID = ?\n      `, [nameData[2]], 'singleRow');\n\n    // Concatenamos: baseResult + stats + extraRow\n    // stats es array de arrays: [[val],[val],...]\n    // mapeamos para quedarnos con stats[i][0]\n    return baseResult.concat(\n      stats.map(s => s[0]),\n      extraRow ?? []\n    );\n  }\n\n  // staff normal\n  let statIDs = [];\n  if (type === \"staff1\") {\n    statIDs = [0, 1, 14, 15, 16, 17];\n  } else if (type === \"staff2\") {\n    statIDs = [13, 25, 43];\n  } else if (type === \"staff3\") {\n    statIDs = [19, 20, 26, 27, 28, 29, 30, 31];\n  } else if (type === \"staff4\") {\n    statIDs = [11, 22, 23, 24];\n  }\n\n  if (statIDs.length) {\n    const statsRows = queryDB(`\n        SELECT Val\n        FROM Staff_PerformanceStats\n        WHERE StaffID = ?\n          AND StatID IN (${statIDs.join(\",\")})\n      `, [nameData[2]], 'allRows');\n\n    return baseResult.concat(statsRows.map(s => s[0]));\n  }\n\n  // Si no entra en esos casos, simplemente devolvemos baseResult\n  return baseResult;\n}\n\nexport function fetchDriverRetirement(driverID) {\n  const playerRow = queryDB(`\n      SELECT Day, CurrentSeason\n      FROM Player_State\n    `, [], 'singleRow');\n\n  let day = 0, currentSeason = 0;\n  if (playerRow) {\n    [day, currentSeason] = playerRow;\n  } else {\n    console.warn(\"No se encontraron datos en Player_State.\");\n  }\n\n  const retirementAge = queryDB(`\n      SELECT RetirementAge\n      FROM Staff_GameData\n      WHERE StaffID = ?\n    `, [driverID], 'singleValue');\n\n  const dob = queryDB(`\n      SELECT DOB\n      FROM Staff_BasicData\n      WHERE StaffID = ?\n    `, [driverID], 'singleValue');\n\n  const age = (dob != null) ? Math.floor((day - dob) / 365.25) : 0;\n  return [retirementAge, age];\n}\n\nexport function fetchDriverCode(driverID) {\n  let code = queryDB(`\n      SELECT DriverCode\n      FROM Staff_DriverData\n      WHERE StaffID = ?\n    `, [driverID], 'singleValue');\n\n  if (!code) return \"\";\n\n  if (!code.includes(\"STRING_LITERAL\")) {\n    const m = code.match(/\\[DriverCode_(...)\\]/);\n    code = m ? m[1] : \"\";\n  } else {\n    const m = code.match(/\\[STRING_LITERAL:Value=\\|(...)\\|\\]/);\n    code = m ? m[1] : \"\";\n  }\n\n  return code.toUpperCase();\n}\n\nexport function fetchYear() {\n  const row = queryDB(`\n      SELECT Day, CurrentSeason\n      FROM Player_State\n    `, [], 'singleRow');\n\n  if (!row) {\n    console.warn(\"No data found in Player_State.\");\n    return 0;\n  }\n  // Devolvemos CurrentSeason (row[1])\n  return row[1];\n}\n\nexport function fetchDriverNumberDetails(driverID) {\n  let currentNumber = queryDB(`\n      SELECT Number\n      FROM Staff_DriverNumbers\n      WHERE CurrentHolder = ?\n    `, [driverID], 'singleValue');\n\n  if (currentNumber == null) {\n    // Si no tiene número, ver si hay libres\n    const available = queryDB(`\n        SELECT Number\n        FROM Staff_DriverNumbers\n        WHERE CurrentHolder IS NULL\n      `, [], 'allRows');\n\n    if (!available.length) {\n      currentNumber = 0;\n    } else {\n      // Elige uno aleatorio\n      const randomIdx = Math.floor(Math.random() * available.length);\n      currentNumber = available[randomIdx][0];\n    }\n  }\n\n  // Quiere usar número de campeón?\n  const wantsChampion = queryDB(`\n      SELECT WantsChampionDriverNumber\n      FROM Staff_DriverData\n      WHERE StaffID = ?\n    `, [driverID], 'singleValue');\n\n  return [currentNumber, wantsChampion];\n}\n\nexport function fetchRaceFormula(driverID) {\n  const category = queryDB(`\n      SELECT MAX(\n        CASE \n          WHEN (TeamID <= 10 OR TeamID = 32) THEN 1\n          WHEN TeamID BETWEEN 11 AND 21 THEN 2\n          WHEN TeamID BETWEEN 22 AND 31 THEN 3\n          ELSE 4\n        END\n      ) AS Cat\n      FROM Staff_Contracts\n      WHERE ContractType = 0 AND StaffID = ?\n    `, [driverID], 'singleValue');\n\n  // Por defecto 4 si no existe\n  return category ?? 4;\n}\n\nexport function fetchMarketability(driverID) {\n  return queryDB(`\n      SELECT Marketability\n      FROM Staff_DriverData\n      WHERE StaffID = ?\n    `, [driverID], 'singleValue');\n}\n\nexport function fetchSuperlicense(driverID) {\n  return queryDB(`\n      SELECT HasSuperLicense\n      FROM Staff_DriverData\n      WHERE StaffID = ?\n    `, [driverID], 'singleValue');\n}\n\nexport function fetchDrivers(gameYear) {\n  const rows = queryDB(`\n      SELECT DISTINCT \n        bas.FirstName, bas.LastName, bas.StaffID, con.TeamID, con.PosInTeam, \n        MIN(con.ContractType) AS MinContractType, gam.Retired, COUNT(*)\n      FROM Staff_BasicData bas\n      JOIN Staff_DriverData dri ON bas.StaffID = dri.StaffID\n      LEFT JOIN Staff_Contracts con ON dri.StaffID = con.StaffID\n      LEFT JOIN Staff_GameData gam ON dri.StaffID = gam.StaffID\n      GROUP BY gam.StaffID\n      ORDER BY con.TeamID;\n    `, [], 'allRows');\n\n  const formattedData = [];\n\n  for (let driver of rows) {\n    // Si driver[7] > 1 => hay más de un contrato\n    if (driver[7] > 1) {\n      driver = checkDrivesForTeam32(driver);\n    }\n\n    const driverID = driver[2];\n\n    // Ignoramos placeholders\n    if (driver[0] === \"Placeholder\") {\n      continue;\n    }\n\n    // Format + stats\n    const result = formatNamesAndFetchStats(driver, \"driver\");\n\n    // Extra info\n    const [retirementAge, age] = fetchDriverRetirement(driverID);\n    let raceFormula = fetchRaceFormula(driverID) || 4;\n    const [driverNumber, wants1] = fetchDriverNumberDetails(driverID);\n    const superlicense = fetchSuperlicense(driverID);\n    const futureTeam = fetchForFutureContract(driverID);\n    const juniorContracts = fetchJuniorContracts(driverID);\n    const driverCode = fetchDriverCode(driverID);\n    const nationality = fetchNationality(driverID, gameYear);\n\n    // result es array, lo convertimos a objeto para mayor claridad\n    const data = { ...result };\n    data.driver_number = driverNumber;\n    data.wants1 = wants1;\n    data.retirement_age = retirementAge;\n    data.age = age;\n    data.superlicense = superlicense;\n    data.race_formula = raceFormula;\n    data.team_future = futureTeam;\n    data.team_junior = juniorContracts;\n    data.driver_code = driverCode;\n    data.nationality = nationality;\n\n    // Datos específicos para 2024\n    if (gameYear === \"24\") {\n      const [morale, gMentality] = fetchMentality(driverID);\n      data.global_mentality = gMentality ?? null;\n\n      // morale es array de arrays. Ejemplo: [ [op1], [op2], [op3] ]\n      if (morale.length >= 3) {\n        data.mentality0 = morale[0][0];\n        data.mentality1 = morale[1][0];\n        data.mentality2 = morale[2][0];\n      }\n\n      const market = fetchMarketability(driverID);\n      data.marketability = market ?? 0;\n    }\n\n    formattedData.push(data);\n  }\n\n  return formattedData;\n}\n\nexport function fetchStaff(gameYear) {\n  const rows = queryDB(`\n      SELECT DISTINCT\n        bas.FirstName, \n        bas.LastName, \n        bas.StaffID, \n        con.TeamID, \n        gam.StaffType\n      FROM Staff_GameData gam\n      JOIN Staff_BasicData bas ON gam.StaffID = bas.StaffID\n      LEFT JOIN Staff_Contracts con \n        ON bas.StaffID = con.StaffID \n        AND (con.ContractType = 0 OR con.ContractType IS NULL)\n      WHERE gam.StaffType != 0\n      ORDER BY \n        CASE WHEN con.TeamID IS NULL THEN 1 ELSE 0 END,\n        con.TeamID\n    `, [], 'allRows');\n\n  if (!rows.length) {\n    console.warn(\"No staff data found.\");\n    return [];\n  }\n\n  const formattedData = [];\n\n  for (let staff of rows) {\n    // staff = [ FirstName, LastName, StaffID, TeamID, StaffType ]\n    if (staff[0] === \"Placeholder\") {\n      continue;\n    }\n\n    const staffID = staff[2];\n    const staffType = `staff${staff[4]}`;\n    const result = formatNamesAndFetchStats(staff, staffType);\n\n    const [retirementAge, age] = fetchDriverRetirement(staffID);\n    let raceFormula = fetchRaceFormula(staffID) || 4;\n    const futureTeam = fetchForFutureContract(staffID);\n    const nationality = fetchNationality(staffID, gameYear);\n    const isRetired = queryDB(`\n      SELECT Retired\n      FROM Staff_GameData\n      WHERE StaffID = ?\n    `, [staffID], 'singleValue');\n\n    const data = { ...result };\n    data.retirement_age = retirementAge;\n    data.age = age;\n    data.race_formula = raceFormula;\n    data.team_future = futureTeam;\n    data.nationality = nationality;\n    data.is_retired = isRetired ?? 0;\n\n    if (gameYear === \"24\") {\n      const [morale, gMentality] = fetchMentality(staffID);\n      data.global_mentality = gMentality ?? -1;\n\n      if (morale.length >= 3) {\n        data.mentality0 = morale[0][0] ?? -1;\n        data.mentality1 = morale[1][0] ?? -1;\n        data.mentality2 = morale[2][0] ?? -1;\n      } else {\n        data.mentality0 = -1;\n        data.mentality1 = -1;\n        data.mentality2 = -1;\n      }\n    }\n\n    formattedData.push(data);\n  }\n\n  return formattedData;\n}\n\nexport function fetchDriversPerYear(year) {\n  // Construimos la consulta SQL\n  const sql = `\n      SELECT \n        bas.FirstName, \n        bas.LastName, \n        res.DriverID, \n        res.TeamID\n      FROM Staff_BasicData bas\n      JOIN Races_Results res \n        ON bas.StaffID = res.DriverID\n      WHERE Season = ?\n      GROUP BY \n        bas.FirstName, \n        bas.LastName, \n        bas.StaffID, \n        res.TeamID\n      ORDER BY res.TeamID\n    `;\n\n  // Obtenemos todas las filas (array de objetos o tuplas)\n  const drivers = queryDB(sql, [year], 'allRows') || [];\n\n  // Formateamos cada fila como quieras (equivalente a \"format_names_simple\")\n  const formattedTuples = drivers.map(row => formatNamesSimple(row));\n\n  return formattedTuples;\n}\n\nexport function formatNamesSimple(name) {\n  let nombre = \"\";\n  let apellido = \"\";\n\n  // Si no contiene \"STRING_LITERAL\", buscamos \"StaffName_Forename_(Male|Female)_(...)\".\n  if (!name[0].includes(\"STRING_LITERAL\")) {\n    const nombrePattern = /StaffName_Forename_(Male|Female)_(\\w+)/;\n    const match = name[0].match(nombrePattern);\n    if (match) {\n      // Asumiendo que tienes un método removeNumber similar al de Python\n      nombre = removeNumber(match[2]);\n    } else {\n      nombre = \"\";\n    }\n  } else {\n    // De lo contrario, buscamos la parte entre \"| ... |\"\n    const pattern = /\\|([^|]+)\\|/;\n    const match = name[0].match(pattern);\n    if (match) {\n      nombre = match[1];\n    } else {\n      nombre = \"\";\n    }\n  }\n\n  // Repetimos la lógica para el apellido\n  if (!name[1].includes(\"STRING_LITERAL\")) {\n    const apellidoPattern = /StaffName_Surname_(\\w+)/;\n    const match = name[1].match(apellidoPattern);\n    if (match) {\n      apellido = removeNumber(match[1]);\n    } else {\n      apellido = \"\";\n    }\n  } else {\n    const pattern = /\\|([^|]+)\\|/;\n    const match = name[1].match(pattern);\n    if (match) {\n      apellido = match[1];\n    } else {\n      apellido = \"\";\n    }\n  }\n\n  // Construimos el nombre completo\n  const nameFormatted = `${nombre} ${apellido}`.trim();\n\n  // El TeamID (índice 3 en el array). Si es nulo/indefinido, lo ponemos a 0\n  const teamId = name[3] != null ? name[3] : 0;\n\n  // Devolvemos la misma estructura que en Python: (Nombre Formateado, DriverID, TeamID)\n  return [nameFormatted, name[2], teamId];\n}\n\nfunction getSeasonRaceIds(season) {\n  return (queryDB(`\n    SELECT RaceID\n    FROM Races\n    WHERE SeasonID = ?\n    ORDER BY RaceID ASC\n  `, [season], 'allRows') || []).map(r => Number(r[0]));\n}\n\nexport function buildPerRaceTeamRankContext(seasonResults, raceIds, season) {\n  const cacheKey = `teamRanks:${season}:prev=false:pts=false`;\n  const cached = _standingsCache.get(cacheKey);\n  if (cached) return cached;\n\n  const perRaceTeamPoints = new Map();\n\n  for (const dr of (seasonResults || [])) {\n    const races = dr.races || [];\n    for (const r of races) {\n      const raceId = Number(r.raceId);\n      const teamId = Number(r.teamId);\n      const pts = Math.max(0, Number(r.points) || 0);\n      const spts = (r.sprintPoints != null && Number(r.sprintPoints) !== -1) ? Number(r.sprintPoints) : 0;\n      const total = pts + spts;\n\n      if (!perRaceTeamPoints.has(raceId)) perRaceTeamPoints.set(raceId, new Map());\n      const m = perRaceTeamPoints.get(raceId);\n      m.set(teamId, (m.get(teamId) || 0) + total);\n    }\n  }\n\n  const perRaceRank = new Map();\n  const cumPoints = new Map();\n\n  const orderedRaceIds = [...(raceIds || [])].map(Number).sort((a, b) => a - b);\n\n  for (const rid of orderedRaceIds) {\n    const standingsArr = [...cumPoints.entries()]\n      .map(([teamId, points]) => ({ teamId: Number(teamId), points: Number(points) }))\n      .sort((a, b) => b.points - a.points);\n\n    const rankMap = new Map();\n    standingsArr.forEach((t, idx) => rankMap.set(t.teamId, idx + 1));\n    perRaceRank.set(rid, rankMap);\n\n    const thisRacePts = perRaceTeamPoints.get(rid);\n    if (thisRacePts) {\n      for (const [teamId, pts] of thisRacePts.entries()) {\n        cumPoints.set(teamId, (cumPoints.get(teamId) || 0) + pts);\n      }\n    }\n  }\n\n  _standingsCache.set(cacheKey, perRaceRank);\n  return perRaceRank;\n}\n\nexport function buildPerRaceTeamRankContext_OLD(seasonResults, raceIds, season) {\n  // raceId -> Map(teamId -> rank 1..10)\n  const perRace = new Map();\n\n  for (const raceId of raceIds) {\n    // reconstruye standings \"hasta\" esa carrera\n    const { teamStandings } = rebuildStandingsUntilCached(\n      season,\n      seasonResults,\n      raceId,\n      false,\n      false\n    );\n\n    const rankMap = new Map();\n    teamStandings.forEach((t, idx) => rankMap.set(Number(t.teamId), idx + 1));\n    perRace.set(Number(raceId), rankMap);\n  }\n\n  return perRace;\n}\n\nfunction applyDoDFlagsToSeasonResults(seasonResults, dodMap) {\n  for (const dr of seasonResults) {\n    const driverId =\n      Number(dr.driverID?.[0] ?? dr.DriverID?.[0] ?? dr.driverId ?? dr.id ?? -1);\n    for (const r of (dr.races || [])) {\n      const rid = Number(r.raceId ?? r.RaceID ?? r.id);\n      r.driverOfTheDay = dodMap.get(rid) === driverId;\n    }\n  }\n  return seasonResults;\n}\n\nexport function getDotDWinnersMap(season) {\n  const rows = queryDB(`\n    SELECT RaceID, DriverID\n    FROM Custom_DriverOfTheDay_Ranking\n    WHERE Season = ? AND Rank = 1\n  `, [season], 'allRows') || [];\n\n  const m = new Map();\n  for (const [raceId, driverId] of rows) {\n    m.set(Number(raceId), Number(driverId));\n  }\n  return m;\n}\n\nfunction computeSeasonDriverOfTheDay(seasonResults, season) {\n  ensureCustomDoDRankingTable();\n\n  // A) contexto por carrera\n  const raceIds = getSeasonRaceIds(season).map(Number);\n  const perRaceTeamRank = buildPerRaceTeamRankContext(seasonResults, raceIds, season);\n\n  // B) ganadores ya cacheados (Rank=1)\n  const winnersMap = getDotDWinnersMap(season); // Map<raceId, driverId>\n\n  // C) carreras faltantes\n  const missing = raceIds.filter(rid => !winnersMap.has(rid));\n  if (missing.length > 0) {\n    // Trae solo lo necesario\n    const rows = queryDB(`\n      SELECT RaceID, DriverID, TeamID, StartingPos, FinishingPos, DNF, Time, Laps\n      FROM Races_Results\n      WHERE Season = ${season}\n        AND RaceID IN (${missing.join(',')})\n    `, [], 'allRows') || [];\n\n    // Agrupar por carrera en el formato que ya usas\n    const byRace = new Map();\n    for (const [raceId, driverId, teamId, startPos, finishPos, dnf, time, laps] of rows) {\n      const r = Number(raceId);\n      if (!byRace.has(r)) byRace.set(r, []);\n      byRace.get(r).push([\n        null, null, Number(driverId), Number(teamId),\n        Number(finishPos), Number(startPos),\n        null, Number(dnf), null, null,\n        Number(time), Number(laps)\n      ]);\n    }\n\n    // Calcular leaderboard y guardar top-3\n    for (const raceId of missing) {\n      const raceRows = (byRace.get(raceId) || []).sort((a, b) => Number(a[4]) - Number(b[4]));\n      const ctx = { teamRankByTeamId: perRaceTeamRank.get(raceId) || new Map() };\n\n      const leaderboard = computeDriverOfTheDayLeaderboardFromRows(raceRows, raceId, ctx);\n      if (leaderboard?.length) {\n        upsertDoDRanking(season, raceId, leaderboard, /*topN*/ 3);\n        winnersMap.set(raceId, Number(leaderboard[0].driverId));\n      }\n    }\n  }\n\n  // D) aplicar flags como ya hacías\n  const dodMap = winnersMap; // Map<raceId, driverId>\n  const enriched = applyDoDFlagsToSeasonResults(seasonResults, dodMap);\n  enriched._driverOfTheDayMap = dodMap;\n  return enriched;\n}\n\nexport function fetchSeasonResults(\n  yearSelected,\n  isCurrentYear = true,\n  fetchDriverOfTheDay = false,\n  formula = 1\n) {\n  const drivers = queryDB(`\n        SELECT DriverID\n        FROM Races_DriverStandings\n        WHERE RaceFormula = ?\n          AND SeasonID = ?\n        ORDER BY Position\n      `, [formula, yearSelected], 'allRows') || [];\n\n  const seasonResults = [];\n  for (const row of drivers) {\n    const driverID = row[0];\n    const driverRes = fetchOneDriverSeasonResults([driverID], [yearSelected], isCurrentYear, formula);\n    if (driverRes) seasonResults.push(driverRes);\n  }\n\n  if (!fetchDriverOfTheDay || Number(formula) !== 1) {\n    return seasonResults;\n  }\n\n  const resultsWithDoD = computeSeasonDriverOfTheDay(seasonResults, yearSelected);\n\n\n  return resultsWithDoD;\n}\n\nexport function fetchQualiResults(yearSelected) {\n  const drivers = queryDB(`\n      SELECT DriverID\n      FROM Races_DriverStandings\n      WHERE RaceFormula = 1\n        AND SeasonID = ?\n    `, [yearSelected], 'allRows') || [];\n\n  const seasonResults = [];\n  drivers.forEach((row) => {\n    const driverID = row[0];\n    const driverRes = fetchOneDriverQualiResults([driverID], [yearSelected]);\n    if (driverRes) {\n      seasonResults.push(driverRes);\n    }\n  });\n  return seasonResults;\n}\n\nexport function fetchTeamsStandings(year, formula = 1) {\n  return queryDB(`\n        SELECT TeamID, Position\n        FROM Races_TeamStandings\n        WHERE SeasonID = ?\n          AND RaceFormula = ?\n        ORDER BY Position\n      `, [year, formula], 'allRows') || [];\n}\n\nexport function fetchTeamsStandingsWithPoints(year, formula = 1) {\n  return queryDB(`\n        SELECT TeamID, Position, Points\n        FROM Races_TeamStandings\n        WHERE SeasonID = ?\n          AND RaceFormula = ?\n        ORDER BY Position\n      `, [year, formula], 'allRows') || [];\n}\n\nfunction fetchTeamSeasonCountsFromRaceResults(year, extraWhereSql) {\n  const isCreateATeam = !!getGlobals().isCreateATeam;\n  const teamFilterSql = isCreateATeam\n    ? `(rr.TeamID BETWEEN 1 AND 10 OR rr.TeamID = 32)`\n    : `(rr.TeamID BETWEEN 1 AND 10)`;\n\n  const rows = queryDB(`\n    SELECT rr.TeamID, COUNT(*) AS Cnt\n    FROM Races_Results rr\n    WHERE rr.Season = ?\n      AND ${teamFilterSql}\n      AND ${extraWhereSql}\n    GROUP BY rr.TeamID\n    ORDER BY Cnt DESC, rr.TeamID ASC\n  `, [year], 'allRows') || [];\n\n  return rows.map(r => ({\n    teamId: r[0],\n    value: r[1] ?? 0,\n  }));\n}\n\nexport function fetchTeamSeasonWinsTotals(year, formula = 1) {\n  if (Number(formula) !== 1) return [];\n  return fetchTeamSeasonCountsFromRaceResults(year, `rr.FinishingPos = 1`);\n}\n\nexport function fetchTeamSeasonPodiumsTotals(year, formula = 1) {\n  if (Number(formula) !== 1) return [];\n  return fetchTeamSeasonCountsFromRaceResults(year, `rr.FinishingPos BETWEEN 1 AND 3`);\n}\n\nexport function fetchTeamSeasonPolesTotals(year, formula = 1) {\n  if (Number(formula) !== 1) return [];\n  return fetchTeamSeasonCountsFromRaceResults(year, `rr.StartingPos = 1`);\n}\n\nexport function fetchDriversStandings(year, formula = 1) {\n  if (Number(formula) === 1) {\n    const rows = queryDB(`\n      SELECT\n        ds.DriverID,\n        ds.Position,\n        ds.Points,\n        COALESCE((\n          SELECT rr.TeamID\n          FROM Races_Results rr\n          JOIN Races r ON r.RaceID = rr.RaceID\n          WHERE rr.DriverID = ds.DriverID\n            AND r.SeasonID = ?\n          ORDER BY r.Day DESC, r.RaceID DESC\n          LIMIT 1\n        ), -1) AS TeamID\n      FROM Races_DriverStandings ds\n      WHERE ds.SeasonID = ?\n        AND ds.RaceFormula = ?\n        AND EXISTS (\n          SELECT 1\n          FROM Races_Results rr2\n          WHERE rr2.Season = ?\n            AND rr2.DriverID = ds.DriverID\n            AND rr2.FinishingPos > 0\n            AND rr2.FinishingPos != 99\n          LIMIT 1\n        )\n      ORDER BY ds.Position\n    `, [year, year, formula, year], 'allRows');\n\n    const formatted = rows.map(r => {\n      let names = queryDB(`\n        SELECT FirstName, LastName, 1, 1\n        FROM Staff_BasicData\n        WHERE StaffID = ?\n      `, [r[0]], 'singleRow');\n      let name = formatNamesSimple(names);\n      return {\n        DriverID: r[0],\n        DriverName: name[0],\n        Position: r[1],\n        Points: r[2],\n        TeamID: r[3]\n      }\n    });\n\n    return formatted;\n\n  }\n\n  return queryDB(`\n    SELECT\n      ds.DriverID,\n      ds.Position,\n      ds.Points,\n      COALESCE((\n        SELECT fr.TeamID\n        FROM Races_FeatureRaceResults fr\n        JOIN Races r ON r.RaceID = fr.RaceID\n        WHERE fr.DriverID = ds.DriverID\n          AND fr.SeasonID = ?\n          AND fr.RaceFormula = ?\n        ORDER BY r.Day DESC, r.RaceID DESC\n        LIMIT 1\n      ), -1) AS TeamID\n    FROM Races_DriverStandings ds\n    WHERE ds.SeasonID = ?\n      AND ds.RaceFormula = ?\n      AND EXISTS (\n        SELECT 1\n        FROM Races_FeatureRaceResults fr2\n        WHERE fr2.SeasonID = ?\n          AND fr2.RaceFormula = ?\n          AND fr2.DriverID = ds.DriverID\n          AND fr2.FinishingPos > 0\n          AND fr2.FinishingPos != 99\n        LIMIT 1\n      )\n    ORDER BY ds.Position\n  `, [year, formula, year, formula, year, formula], 'allRows') || [];\n}\n\nexport function fetchTeamsStandingsWithPositionChange(year, formula = 1) {\n  return queryDB(`\n        SELECT TeamID, Position, LastPositionChange\n        FROM Races_TeamStandings\n        WHERE SeasonID = ?\n          AND RaceFormula = ?\n        ORDER BY Position\n      `, [year, formula], 'allRows') || [];\n}\n\nexport function fetchPointsRegulations() {\n  const pointScheme = queryDB(`SELECT CurrentValue FROM Regulations_Enum_Changes WHERE ChangeID = 7`, [], 'singleValue');\n  const twoBiggestPoints = queryDB(`SELECT Points FROM Regulations_NonTechnical_PointSchemes WHERE (PointScheme = ?) AND (RacePos = 1 OR RacePos = 2); `, [pointScheme], 'allRows');\n  const isLastraceDouble = queryDB(`SELECT CurrentValue FROM Regulations_Enum_Changes WHERE ChangeID = 8`, [], 'singleValue');\n  const fastestLapBonusPoint = queryDB(`SELECT CurrentValue FROM Regulations_Enum_Changes WHERE ChangeID = 9`, [], 'singleValue');\n  const poleBonusPoint = queryDB(`SELECT CurrentValue FROM Regulations_Enum_Changes WHERE ChangeID = 10`, [], 'singleValue');\n  const positionAndPointsRows = queryDB(`SELECT RacePos, Points FROM Regulations_NonTechnical_PointSchemes WHERE PointScheme = ?`, [pointScheme], 'allRows');\n  const res = {\n    pointScheme: pointScheme,\n    twoBiggestPoints: twoBiggestPoints,\n    isLastraceDouble: isLastraceDouble,\n    fastestLapBonusPoint: fastestLapBonusPoint,\n    poleBonusPoint: poleBonusPoint,\n    positionAndPoints: positionAndPointsRows\n  }\n\n  return res;\n}\n\nexport function fetchOneTeamSeasonResults(team, year) {\n  const teamID = team;\n  const season = year;\n  const drivers = queryDB(` SELECT DISTINCT DriverID\n       FROM Races_Results\n       WHERE Season = ?\n       AND TeamID = ? `,\n    [season, teamID], 'allRows') || [];\n\n  const results = [];\n  for (let driver of drivers) {\n    const driverID = driver[0];\n    const driverResults = fetchOneDriverSeasonResults(driverID, season);\n    if (driverResults) {\n      results.push(driverResults);\n    }\n  }\n\n  return results;\n}\n\nexport function fetchOneDriverSeasonResults(driver, year, isCurrentYear = true, formula = 1) {\n  const driverID = Array.isArray(driver) ? driver[0] : driver; //if its not an array, take it as is, if it is, take first element\n  const season = Array.isArray(year) ? year[0] : year;\n\n  if (Number(formula) === 1) {\n    const results = queryDB(`\n          SELECT DriverID, TeamID, FinishingPos, Points\n          FROM Races_Results\n          WHERE Season = ?\n            AND DriverID = ?\n        `, [season, driverID], 'allRows') || [];\n\n    if (results.length > 0) {\n      const sprintResults = queryDB(`\n            SELECT RaceID, FinishingPos, ChampionshipPoints\n            FROM Races_SprintResults\n            WHERE SeasonID = ?\n              AND DriverID = ?\n              AND RaceFormula = ?\n          `, [season, driverID, formula], 'allRows') || [];\n\n      const teamID = results[0][1];\n\n      const driverNameRow = queryDB(`\n            SELECT FirstName, LastName\n            FROM Staff_BasicData\n            WHERE StaffID = ?\n          `, [driverID], 'singleRow');\n\n      return formatSeasonResults(\n        results,\n        driverNameRow,\n        teamID,\n        driver,\n        year,\n        sprintResults,\n        isCurrentYear,\n        formula\n      );\n    }\n\n    return null;\n  }\n  else if (Number(formula) > 1) {\n\n    const results = queryDB(`\n      SELECT RaceID, TeamID, FinishingPos, ChampionshipPoints, 0, FastestLap\n      FROM Races_FeatureRaceResults\n      WHERE SeasonID = ?\n        AND DriverID = ?\n        AND RaceFormula = ?\n      ORDER BY RaceID\n    `, [season, driverID, formula], 'allRows') || [];\n\n    if (results.length > 0) {\n      const sprintResults = queryDB(`\n        SELECT RaceID, FinishingPos, ChampionshipPoints\n        FROM Races_SprintResults\n        WHERE SeasonID = ?\n          AND DriverID = ?\n          AND RaceFormula = ?\n      `, [season, driverID, formula], 'allRows') || [];\n\n      const teamID = results[0][1];\n\n      const driverNameRow = queryDB(`\n        SELECT FirstName, LastName\n        FROM Staff_BasicData\n        WHERE StaffID = ?\n      `, [driverID], 'singleRow');\n\n      return formatSeasonResults(\n        results,\n        driverNameRow,\n        teamID,\n        driver,\n        year,\n        sprintResults,\n        isCurrentYear,\n        formula\n      );\n    }\n\n    return null;\n  }\n\n\n}\n\n\nexport function computeDriverOfTheDayFromRows(rows, raceId, opts = {}) {\n  // const lb = computeDriverOfTheDayLeaderboardFromRows(rows, raceId, opts); //debug\n  // console.table(lb.slice(0, 10));\n  // return lb[0]?.driverId || null;\n  const dodId = computeDriverOfTheDayFromRows_fast(rows, raceId, opts);\n  return dodId;\n}\n\nexport function computeDriverOfTheDayFromRows_fast(rows, raceId, opts = {}) {\n  if (!rows || !rows.length) return null;\n\n  // --- constantes internas (sin pasar por opts si quieres fijarlas) ---\n  const TEAM_WEIGHT = 0.4;\n  const TEAM_BONUS_CAP = 4;\n  const RANDOM_INTENSITY = 0.8; // ±0.4\n  const dominancePerGap = 1;   // +1 punto por bloque de gap\n  const dominanceBlock = 4;   // cada 4s → 1 punto\n  const dominanceMax = 10;\n\n  // ranking de equipo\n  const teamRankByTeamId = (opts.teamRankByTeamId instanceof Map) ? opts.teamRankByTeamId : new Map();\n\n  // bonus por dominancia del ganador (P1 vs P2 en misma vuelta)\n  let p1GapBonus = 0;\n  const p1 = rows.find(r => Number(r[4]) === 1 && Number(r[7]) === 0);\n  const p2 = rows.find(r => Number(r[4]) === 2 && Number(r[7]) === 0);\n  if (p1 && p2) {\n    const p1Time = Number(p1[10]), p2Time = Number(p2[10]);\n    const p1Laps = Number(p1[11]), p2Laps = Number(p2[11]);\n    if (p1Laps === p2Laps) {\n      const gapBehind = p2Time - p1Time;\n      if (gapBehind > 0) {\n        const blocks = Math.floor(gapBehind / dominanceBlock);\n        p1GapBonus = Math.min(blocks * dominancePerGap, dominanceMax);\n      }\n    }\n  }\n\n  // posScore fijo\n  const posScore = (finishingPos) => {\n    if (finishingPos === 1) return 4;\n    if (finishingPos === 2) return 2;\n    if (finishingPos === 3) return 1;\n    if (finishingPos > 13) return -10;\n    if (finishingPos > 10) return -7;\n    if (finishingPos > 8) return -2;\n    return 0;\n  };\n\n  // grid válido para expectedPos por equipo\n  const validRows = rows.filter(r => Number(r[7]) !== 1 && Number(r[5]) > 0 && Number(r[4]) > 0 && Number(r[4]) !== 99);\n  const gridSize = validRows.length;\n  const gridFactor = gridSize > 0 ? (gridSize / 20) : 1;\n\n  const teamBonus = (teamRank, finishingPos) => {\n    const expectedPos = (2 * teamRank - 0.5) * gridFactor; // 2 coches por equipo\n    const delta = expectedPos - finishingPos; // + si rinde mejor que lo esperado\n    let bonus = delta * TEAM_WEIGHT;\n    if (bonus > TEAM_BONUS_CAP) bonus = TEAM_BONUS_CAP;\n    if (bonus < -TEAM_BONUS_CAP) bonus = -TEAM_BONUS_CAP;\n    return bonus;\n  };\n\n  // ganador en una sola pasada (sin arrays ni sort)\n  let bestId = null, bestScore = -Infinity, bestFinishPos = 99;\n\n  for (const row of rows) {\n    const driverId = Number(row[2]);\n    const teamId = Number(row[3]);\n    const finishingPos = Number(row[4]);\n    const startingPos = Number(row[5]);\n    const dnf = Number(row[7]) === 1;\n\n    if (dnf || startingPos <= 0 || finishingPos <= 0 || finishingPos === 99) continue;\n\n    const gain = startingPos - finishingPos;\n    const ps = posScore(finishingPos);\n    const tr = Number(teamRankByTeamId.get(teamId));\n    const tb = teamBonus(tr, finishingPos);\n    const dominanceBonus = (finishingPos === 1) ? p1GapBonus : 0;\n\n    const rand = seededRandom(Number(raceId));\n    const randomOffset = (rand() - 0.5) * RANDOM_INTENSITY;\n\n    const score = gain + ps + tb + dominanceBonus + randomOffset;\n\n    // desempate por mejor posición final\n    if (\n      score > bestScore ||\n      (score === bestScore && finishingPos < bestFinishPos)\n    ) {\n      bestScore = score;\n      bestFinishPos = finishingPos;\n      bestId = driverId;\n    }\n  }\n\n  return bestId;\n}\n\nexport function computeDriverOfTheDayLeaderboardFromRows(rows, raceId, opts = {}) {\n  if (!rows || !rows.length) return [];\n\n  raceId = Number(raceId);\n\n  const teamRankByTeamId = (opts.teamRankByTeamId instanceof Map) ? opts.teamRankByTeamId : new Map();\n  const TEAM_WEIGHT = 0.4;\n  const TEAM_BONUS_CAP = 4;\n\n  const dominancePerGap = 1;\n  const dominanceMax = 10;\n\n  let p1GapBonus = 0;\n  const p1 = rows.find(r => Number(r[4]) === 1 && Number(r[7]) === 0);\n  const p2 = rows.find(r => Number(r[4]) === 2 && Number(r[7]) === 0);\n  if (p1 && p2) {\n    const p1Time = Number(p1[10]), p2Time = Number(p2[10]);\n    const p1Laps = Number(p1[11]), p2Laps = Number(p2[11]);\n    if (p1Laps === p2Laps) {\n      const gapBehind = p2Time - p1Time; // s\n      if (gapBehind > 0) {\n        const blocks = Math.floor(gapBehind / 4);\n        p1GapBonus = Math.min(blocks * dominancePerGap, dominanceMax);\n      }\n    }\n  }\n\n  const posScore = (finishingPos) => {\n    if (finishingPos === 1) return 4;\n    if (finishingPos === 2) return 2;\n    if (finishingPos === 3) return 1;\n    if (finishingPos > 13) return -10;\n    if (finishingPos > 10) return -7;\n    if (finishingPos > 8) return -2;\n    return 0;\n  };\n\n  const validRows = rows.filter(r => Number(r[7]) !== 1 && Number(r[5]) > 0 && Number(r[4]) > 0 && Number(r[4]) !== 99);\n  const gridSize = validRows.length;\n\n  const teamBonus = (teamRank, finishingPos) => {\n    const factor = gridSize > 0 ? (gridSize / 20) : 1;\n    const expectedPos = (2 * teamRank - 0.5) * factor;\n    const delta = expectedPos - finishingPos;\n    let bonus = delta * TEAM_WEIGHT;\n    if (TEAM_BONUS_CAP > 0) {\n      if (bonus > TEAM_BONUS_CAP) bonus = TEAM_BONUS_CAP;\n      if (bonus < -TEAM_BONUS_CAP) bonus = -TEAM_BONUS_CAP;\n    }\n    return bonus;\n  };\n\n  const rand = seededRandom(raceId);\n  const RANDOM_INTENSITY = 0.8;\n\n  const rowsScored = [];\n  for (const row of rows) {\n    const driverId = Number(row[2]);\n    const teamId = Number(row[3]);\n    const finishingPos = Number(row[4]);\n    const startingPos = Number(row[5]);\n    const dnf = Number(row[7]) === 1;\n\n    if (dnf || startingPos <= 0 || finishingPos <= 0 || finishingPos === 99) continue;\n\n    const gain = startingPos - finishingPos;\n    const ps = posScore(finishingPos);\n    const tr = Number(teamRankByTeamId.get(teamId));\n    const tb = teamBonus(tr, finishingPos);\n\n    const dominanceBonus = (finishingPos === 1) ? p1GapBonus : 0;\n    const poleBonus = (startingPos === 1) ? 1.0 : 0.0;\n\n    const randomOffset = (rand() - 0.5) * RANDOM_INTENSITY;\n    const scoreRaw = gain + ps + tb + dominanceBonus + randomOffset + poleBonus;\n\n    const name = getNameByIdAndFormat(driverId);\n    rowsScored.push({\n      driverId,\n      name: name[0],\n      scoreRaw,             // <-- guardamos el bruto para depurar\n      finishPos: finishingPos,\n      startPos: startingPos,\n      teamId,\n      components: { gain, posScore: ps, teamBonus: tb, dominanceBonus, poleBonus, randomOffset }\n    });\n  }\n\n  // Orden: mayor scoreRaw\n  rowsScored.sort((a, b) =>\n    (b.scoreRaw - a.scoreRaw) || (a.finishPos - b.finishPos)\n  );\n\n  return rowsScored;\n}\n\nfunction softmaxToPercent(values, temperature = 1.0) {\n  // estabilidad numérica\n  const maxV = Math.max(...values);\n  const exps = values.map(v => Math.exp((v - maxV) / temperature));\n  const sum = exps.reduce((a, b) => a + b, 0);\n  return exps.map(x => (x / sum) * 100);\n}\n\nfunction softmaxToPercentBounded(values, opts = {}) {\n  const {\n    maxSharePct = 45,\n    initialTemperature = 1.0,\n    maxTemperature = 256,\n    minTemperature = 0.001,\n    iterations = 28\n  } = opts;\n\n  if (!values || values.length === 0) return [];\n  if (values.length === 1) return [100];\n\n  // Si el tope es matemáticamente imposible (p.ej. solo 2 candidatos), usamos el máximo factible.\n  const feasibleCap = (values.length * maxSharePct >= 100) ? maxSharePct : (100 / values.length);\n\n  const maxOf = (arr) => arr.reduce((m, v) => (v > m ? v : m), -Infinity);\n  const sharesAt = (t) => softmaxToPercent(values, t);\n\n  let lo = Math.max(minTemperature, Number(initialTemperature) || 1.0);\n  let sharesLo = sharesAt(lo);\n  if (maxOf(sharesLo) <= feasibleCap) return sharesLo;\n\n  let hi = lo;\n  let sharesHi = sharesLo;\n  while (hi < maxTemperature) {\n    hi *= 2;\n    sharesHi = sharesAt(hi);\n    if (maxOf(sharesHi) <= feasibleCap) break;\n  }\n\n  // Si aún no se cumple, devolvemos lo mejor que tenemos (distribución más \"plana\").\n  if (maxOf(sharesHi) > feasibleCap) return sharesHi;\n\n  // Búsqueda binaria: al subir la temperatura, el máximo share baja (más uniforme).\n  for (let i = 0; i < iterations; i++) {\n    const mid = (lo + hi) / 2;\n    const sharesMid = sharesAt(mid);\n    if (maxOf(sharesMid) > feasibleCap) lo = mid;\n    else {\n      hi = mid;\n      sharesHi = sharesMid;\n    }\n  }\n\n  return sharesHi;\n}\n\nfunction roundPercentsToTargetSum(values, opts = {}) {\n  const { decimals = 1, targetSum = 100, maxPerItem = Infinity } = opts;\n  if (!values || values.length === 0) return [];\n\n  const factor = Math.pow(10, decimals);\n  const targetUnits = Math.round(targetSum * factor);\n  const capUnits = Math.floor(maxPerItem * factor + 1e-9);\n\n  const rawUnits = values.map(v => {\n    const unit = Math.round((Number(v) || 0) * factor * 1e12) / 1e12;\n    return unit;\n  });\n\n  const floorUnits = rawUnits.map(u => Math.floor(u));\n  let remaining = targetUnits - floorUnits.reduce((a, b) => a + b, 0);\n\n  const frac = rawUnits.map((u, i) => ({ i, frac: u - floorUnits[i] }));\n  frac.sort((a, b) => b.frac - a.frac);\n\n  // Reparte las décimas restantes priorizando las fracciones más grandes, respetando el tope cuando sea posible.\n  let guard = 0;\n  while (remaining > 0 && guard++ < (values.length * 5 + 1000)) {\n    let progressed = false;\n    for (const { i } of frac) {\n      if (remaining <= 0) break;\n      if (floorUnits[i] + 1 > capUnits) continue;\n      floorUnits[i] += 1;\n      remaining -= 1;\n      progressed = true;\n    }\n    if (!progressed) break;\n  }\n\n  // Si el tope impidió sumar exactamente 100 (raro), prioriza sumar 100 antes que clavar el tope.\n  if (remaining > 0) {\n    for (const { i } of frac) {\n      if (remaining <= 0) break;\n      floorUnits[i] += 1;\n      remaining -= 1;\n    }\n  }\n\n  return floorUnits.map(u => u / factor);\n}\n\nexport function upsertDoDRanking(season, raceId, leaderboard, topN = 3) {\n  const top = leaderboard.slice(0, topN);\n  for (let i = 0; i < top.length; i++) {\n    const { driverId, scoreRaw, name, teamId } = top[i];\n    const rank = i + 1;\n    queryDB(`\n      INSERT INTO Custom_DriverOfTheDay_Ranking (Season, RaceID, Rank, DriverID, Name, TeamID, Score)\n      VALUES (?, ?, ?, ?, ?, ?, ?)\n      ON CONFLICT(Season, RaceID, Rank) DO UPDATE\n      SET DriverID = excluded.DriverID,\n          Name = excluded.Name,\n          TeamID = excluded.TeamID,\n          Score = excluded.Score\n    `, [season, raceId, rank, driverId, name, teamId, Number(scoreRaw) || 0], 'run');\n  }\n}\n\nexport function getDoDTopNForRace(season, raceId, topN = 3) {\n  const rows = queryDB(`\n    SELECT DriverID, Rank, Name, Score, TeamID\n    FROM Custom_DriverOfTheDay_Ranking\n    WHERE Season = ? AND RaceID = ?\n    ORDER BY Rank ASC\n    LIMIT ?\n  `, [season, raceId, topN], 'allRows') || [];\n\n  return rows.map(([driverId, rank, name, score, teamId]) => ({\n    driverId: Number(driverId),\n    rank: Number(rank),\n    name,\n    score: Number(score),\n    teamId: Number(teamId)\n  }));\n}\n\nexport function ensureCustomDoDRankingTable() {\n  queryDB(`\n    CREATE TABLE IF NOT EXISTS Custom_DriverOfTheDay_Ranking (\n      Season    INTEGER NOT NULL,\n      RaceID    INTEGER NOT NULL,\n      Rank      INTEGER NOT NULL,   -- 1,2,3...\n      DriverID  INTEGER NOT NULL,\n      Name      TEXT    NOT NULL,\n      Score     REAL    NOT NULL,\n      TeamID    INTEGER NOT NULL,\n      PRIMARY KEY (Season, RaceID, Rank)\n    )\n  `, [], 'run');\n\n}\n\nexport function fetchDriverOfTheDayCounts(season) {\n\n  const rows = queryDB(`\n    SELECT\n      t.DriverID,\n      (\n        SELECT w.Name\n        FROM Custom_DriverOfTheDay_Ranking w\n        JOIN Races r ON r.RaceID = w.RaceID\n        WHERE w.Season = ?\n          AND w.Rank = 1\n          AND w.DriverID = t.DriverID\n        ORDER BY r.Day DESC, w.RaceID DESC\n        LIMIT 1\n      ) AS Name,\n      COALESCE((\n        SELECT w.TeamID\n        FROM Custom_DriverOfTheDay_Ranking w\n        JOIN Races r ON r.RaceID = w.RaceID\n        WHERE w.Season = ?\n          AND w.Rank = 1\n          AND w.DriverID = t.DriverID\n        ORDER BY r.Day DESC, w.RaceID DESC\n        LIMIT 1\n      ), -1) AS TeamID,\n      COUNT(*) AS Count\n    FROM Custom_DriverOfTheDay_Ranking t\n    WHERE t.Season = ?\n      AND t.Rank = 1\n    GROUP BY t.DriverID\n    ORDER BY Count DESC\n  `, [season, season, season], 'allRows') || [];\n\n  return rows.map(r => ({\n    id: Number(r[0]),\n    name: r[1],\n    teamId: Number(r[2]),\n    count: Number(r[3]) || 0\n  }));\n}\n\nexport function fetchTeamMateQualiRaceHeadToHead(season) {\n  const globals = getGlobals();\n  const teams = globals.isCreateATeam\n    ? [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 32]\n    : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n\n  const lastRaceId = queryDB(`\n    SELECT RaceID\n    FROM Races\n    WHERE SeasonID = ? AND State = 2\n    ORDER BY Day DESC, RaceID DESC\n    LIMIT 1\n  `, [season], 'singleValue');\n\n  if (!lastRaceId) return [];\n\n  const normalizePos = (pos) => {\n    const n = Number(pos);\n    if (n <= 0 || n === 99) return 999;\n    return n;\n  };\n\n  const pickTwoDriversForTeamAtLastRace = (teamId) => {\n    const rows = queryDB(`\n      SELECT DriverID, FinishingPos\n      FROM Races_Results\n      WHERE Season = ?\n        AND RaceID = ?\n        AND TeamID = ?\n      ORDER BY\n        CASE\n          WHEN FinishingPos IS NULL OR FinishingPos <= 0 OR FinishingPos = 99 THEN 999\n          ELSE FinishingPos\n        END ASC,\n        DriverID ASC\n    `, [season, lastRaceId, teamId], 'allRows') || [];\n\n    const ids = [];\n    for (const r of rows) {\n      const id = Number(r[0]);\n      if (!ids.includes(id)) ids.push(id);\n      if (ids.length >= 2) break;\n    }\n    return ids;\n  };\n\n  const getDriverName = (driverId) => {\n    const row = queryDB(`\n      SELECT FirstName, LastName, StaffID, 1\n      FROM Staff_BasicData\n      WHERE StaffID = ?\n    `, [driverId], 'singleRow');\n    const formatted = formatNamesSimple(row || [\"\", \"\", driverId, 1]);\n    return formatted[0] || \"\";\n  };\n\n  const results = [];\n\n  for (const teamId of teams) {\n    const driverIds = pickTwoDriversForTeamAtLastRace(teamId);\n    if (driverIds.length < 2) continue;\n\n    const [driver1Id, driver2Id] = driverIds;\n    const driver1Name = getDriverName(driver1Id);\n    const driver2Name = getDriverName(driver2Id);\n\n    const rows = queryDB(`\n      SELECT RaceID, DriverID, FinishingPos, StartingPos\n      FROM Races_Results\n      WHERE Season = ?\n        AND TeamID = ?\n        AND DriverID IN (?, ?)\n      ORDER BY RaceID\n    `, [season, teamId, driver1Id, driver2Id], 'allRows') || [];\n\n    const byRace = new Map();\n    for (const [raceId, driverId, finishingPos, startingPos] of rows) {\n      const rid = Number(raceId);\n      if (!byRace.has(rid)) byRace.set(rid, new Map());\n      byRace.get(rid).set(Number(driverId), { finishingPos, startingPos });\n    }\n\n    let raceAhead1 = 0, raceAhead2 = 0;\n    let qualiAhead1 = 0, qualiAhead2 = 0;\n\n    for (const raceMap of byRace.values()) {\n      const d1 = raceMap.get(driver1Id);\n      const d2 = raceMap.get(driver2Id);\n      if (!d1 || !d2) continue;\n\n      const fin1 = normalizePos(d1.finishingPos);\n      const fin2 = normalizePos(d2.finishingPos);\n      if (fin1 < fin2) raceAhead1++;\n      else if (fin2 < fin1) raceAhead2++;\n\n      const st1 = normalizePos(d1.startingPos);\n      const st2 = normalizePos(d2.startingPos);\n      if (st1 < st2) qualiAhead1++;\n      else if (st2 < st1) qualiAhead2++;\n    }\n\n    results.push({\n      teamId: Number(teamId),\n      driver1Id,\n      driver2Id,\n      driver1Name,\n      driver2Name,\n      raceHeadToHead: `${raceAhead1}-${raceAhead2}`,\n      qualiHeadToHead: `${qualiAhead1}-${qualiAhead2}`,\n      raceAhead1,\n      raceAhead2,\n      qualiAhead1,\n      qualiAhead2\n    });\n  }\n\n  return results;\n}\n\nfunction seededRandom(seed) {\n  // xmur3 + mulberry32 style\n  let t = (seed + 0x6D2B79F5) | 0;\n  return function () {\n    t ^= t << 13; t ^= t >>> 17; t ^= t << 5;\n    return ((t < 0 ? ~t + 1 : t) % 4294967296) / 4294967296;\n  };\n}\n\nfunction getNameByIdAndFormat(driverID) {\n  const driverNameRow = queryDB(`\n      SELECT FirstName, LastName, StaffID\n      FROM Staff_BasicData\n      WHERE StaffID = ?\n    `, [driverID], 'singleRow');\n\n  const name = formatNamesSimple(driverNameRow);\n  return name;\n}\n\n\nexport function fetchOneDriverQualiResults(driver, year) {\n  const driverID = Array.isArray(driver) ? driver[0] : driver;\n  const season = Array.isArray(year) ? year[0] : year;\n\n  const results = queryDB(`\n      SELECT DriverID, TeamID, StartingPos, Points\n      FROM Races_Results\n      WHERE Season = ?\n        AND DriverID = ?\n    `, [season, driverID], 'allRows') || [];\n\n\n  if (results.length > 0) {\n    const teamID = results[0][1];\n\n    const driverNameRow = queryDB(`\n        SELECT FirstName, LastName\n        FROM Staff_BasicData\n        WHERE StaffID = ?\n      `, [driverID], 'singleRow');\n\n    return formatSeasonResults(\n      results,\n      driverNameRow,\n      teamID,\n      driver,\n      year,\n      [],\n      true\n    );\n  }\n\n  return null;\n}\n\n\nexport function fetchEventsDoneFrom(year) {\n  const daySeasonRow = queryDB(`\n      SELECT Day, CurrentSeason\n      FROM Player_State\n    `, [], 'singleRow');\n\n  if (!daySeasonRow) {\n    return [];\n  }\n  const [currentDay, currentSeason] = daySeasonRow;\n\n  const seasonIdsRows = queryDB(`\n      SELECT RaceID\n      FROM Races\n      WHERE SeasonID = ?\n        AND Day < ?\n    `, [year, currentDay], 'allRows') || [];\n\n\n  const eventsIds = seasonIdsRows.map(row => row[0]);\n\n  return eventsIds;\n}\n\nexport function fetchEventsDoneBefore(year, day) {\n  const daySeasonRow = queryDB(`\n      SELECT Day, CurrentSeason\n      FROM Player_State\n    `, [], 'singleRow');\n\n  if (!daySeasonRow) {\n    return [];\n  }\n\n  const seasonIdsRows = queryDB(`\n      SELECT RaceID\n      FROM Races\n      WHERE SeasonID = ?\n        AND Day < ?\n    `, [year, day], 'allRows') || [];\n\n\n  const eventsIds = seasonIdsRows.map(row => row[0]);\n\n  return eventsIds;\n}\n\nexport function fetchEventsFrom(year, formula = 1) {\n  const seasonEventsRows = queryDB(`\n      SELECT r.RaceID, r.TrackID, r.WeekendType, r.State, t.isF2Race, t.IsF3Race\n      FROM Races r\n      LEFT JOIN Races_Tracks t ON r.TrackID = t.TrackID\n      WHERE r.SeasonID = ?\n      ORDER BY r.RaceID\n    `, [year], 'allRows') || [];\n\n  if (Number(formula) === 2) {\n    return seasonEventsRows.filter(row => Number(row[4]) === 1);\n  }\n  if (Number(formula) === 3) {\n    return seasonEventsRows.filter(row => Number(row[5]) === 1);\n  }\n  return seasonEventsRows;\n}\n\nexport function fetchLastCompletedRaceId(year, formula = 1) {\n  const filterSql = Number(formula) === 2\n    ? `AND t.isF2Race = 1`\n    : (Number(formula) === 3\n      ? `AND t.IsF3Race = 1`\n      : ``);\n\n  return queryDB(`\n    SELECT r.RaceID\n    FROM Races r\n    LEFT JOIN Races_Tracks t ON r.TrackID = t.TrackID\n    WHERE r.SeasonID = ?\n      AND r.State = 2\n      ${filterSql}\n    ORDER BY r.Day DESC, r.RaceID DESC\n    LIMIT 1\n  `, [year], 'singleValue');\n}\n\nfunction fetchPracticeResultsRows(raceId, practiceSession = 1) {\n  const raceIdNum = Number(raceId);\n  const sessionNum = Number(practiceSession);\n\n  const rows = queryDB(`\n    SELECT\n      bas.FirstName,\n      bas.LastName,\n      res.DriverID,\n      res.TeamID,\n      res.BestLapTime,\n      res.LapCount\n    FROM Staff_BasicData bas\n    JOIN Races_PracticeResults res\n      ON bas.StaffID = res.DriverID\n    WHERE res.RaceID = ?\n      AND res.RaceFormula = 1\n      AND res.PracticeSession = ?\n    ORDER BY\n      CASE\n        WHEN res.BestLapTime IS NULL OR res.BestLapTime <= 0 THEN 1\n        ELSE 0\n      END,\n      res.BestLapTime ASC\n  `, [raceIdNum, sessionNum], 'allRows') || [];\n\n  return { rows, error: null };\n}\n\nfunction fetchRaceResultsRows(raceId) {\n  return queryDB(`\n    SELECT\n      bas.FirstName,\n      bas.LastName,\n      res.DriverID,\n      res.TeamID,\n      res.FinishingPos,\n      res.StartingPos,\n      res.Points,\n      res.DNF,\n      res.SafetyCarDeployments,\n      res.VirtualSafetyCarDeployments,\n      res.Time,\n      res.Laps,\n      res.FastestLap\n    FROM Staff_BasicData bas\n    JOIN Races_Results res\n      ON bas.StaffID = res.DriverID\n    WHERE res.RaceID = ?\n    ORDER BY res.FinishingPos\n  `, [raceId], 'allRows') || [];\n}\n\nfunction fetchSprintResultsRows(raceId) {\n  return queryDB(`\n    SELECT\n      bas.FirstName,\n      bas.LastName,\n      res.DriverID,\n      res.TeamID,\n      res.FinishingPos,\n      res.ChampionshipPoints,\n      res.DNF,\n      res.RaceTime,\n      res.LapCount,\n      res.FastestLap\n    FROM Staff_BasicData bas\n    JOIN Races_SprintResults res\n      ON bas.StaffID = res.DriverID\n    WHERE res.RaceID = ?\n      AND res.RaceFormula = 1\n    ORDER BY res.FinishingPos\n  `, [raceId], 'allRows') || [];\n}\n\nfunction fetchQualifyingResultsRows(raceId, sprintShootout = 0) {\n  return queryDB(`\n    SELECT\n      bas.FirstName,\n      bas.LastName,\n      res.DriverID,\n      res.TeamID,\n      res.FinishingPos,\n      (\n        SELECT q1.FastestLap\n        FROM Races_QualifyingResults q1\n        WHERE q1.RaceID = res.RaceID\n          AND q1.DriverID = res.DriverID\n          AND q1.RaceFormula = 1\n          AND q1.SprintShootout = ?\n          AND q1.QualifyingStage = 1\n      ) AS Q1FastestLap,\n      (\n        SELECT q2.FastestLap\n        FROM Races_QualifyingResults q2\n        WHERE q2.RaceID = res.RaceID\n          AND q2.DriverID = res.DriverID\n          AND q2.RaceFormula = 1\n          AND q2.SprintShootout = ?\n          AND q2.QualifyingStage = 2\n      ) AS Q2FastestLap,\n      (\n        SELECT q3.FastestLap\n        FROM Races_QualifyingResults q3\n        WHERE q3.RaceID = res.RaceID\n          AND q3.DriverID = res.DriverID\n          AND q3.RaceFormula = 1\n          AND q3.SprintShootout = ?\n          AND q3.QualifyingStage = 3\n      ) AS Q3FastestLap,\n      res.ChampionshipPoints,\n      res.GridPenalty AS GridPenalty,\n      res.LapCount\n    FROM Staff_BasicData bas\n    JOIN Races_QualifyingResults res\n      ON bas.StaffID = res.DriverID\n    WHERE res.RaceID = ?\n      AND res.RaceFormula = 1\n      AND res.SprintShootout = ?\n      AND res.QualifyingStage =\n        (SELECT MAX(res2.QualifyingStage)\n         FROM Races_QualifyingResults res2\n         WHERE res2.RaceID = ?\n           AND res2.DriverID = res.DriverID\n           AND res2.RaceFormula = 1\n           AND res2.SprintShootout = ?)\n    ORDER BY res.FinishingPos;\n  `, [sprintShootout, sprintShootout, sprintShootout, raceId, sprintShootout, raceId, sprintShootout], 'allRows') || [];\n}\n\nfunction buildQualifyingGridPositionMap(rows) {\n  const orderedRows = (rows || [])\n    .map((row) => ({\n      driverId: Number(row?.[2]),\n      pos: Number(row?.[4]),\n      gridPenalty: Number(row?.[9])\n    }))\n    .filter((row) => row.driverId > 0 && row.pos > 0)\n    .sort((a, b) => a.pos - b.pos);\n\n  const slots = new Array(orderedRows.length).fill(null);\n  const penalizedRows = orderedRows\n    .filter((row) => row.gridPenalty > 0)\n    .sort((a, b) => b.pos - a.pos);\n\n  penalizedRows.forEach((row) => {\n    const targetPos = Math.min(orderedRows.length, row.pos + row.gridPenalty);\n    for (let slotIdx = targetPos - 1; slotIdx >= 0; slotIdx--) {\n      if (slots[slotIdx] == null) {\n        slots[slotIdx] = row;\n        return;\n      }\n    }\n  });\n\n  let nextFreeSlot = 0;\n  orderedRows\n    .filter((row) => row.gridPenalty <= 0)\n    .forEach((row) => {\n      while (slots[nextFreeSlot] != null) nextFreeSlot++;\n      if (nextFreeSlot < slots.length) {\n        slots[nextFreeSlot] = row;\n        nextFreeSlot++;\n      }\n    });\n\n  const positionByDriverId = new Map();\n  slots.forEach((row, idx) => {\n    if (!row) return;\n    positionByDriverId.set(row.driverId, idx + 1);\n  });\n\n  return positionByDriverId;\n}\n\nexport function fetchSessionResults(raceId, sessionKey, gameYear = \"24\") {\n  const raceIdNum = Number(raceId);\n  const key = String(sessionKey || \"\").toLowerCase();\n  const gy = String(gameYear || \"\").trim();\n\n  const raceMeta = queryDB(`SELECT TrackID, WeekendType FROM Races WHERE RaceID = ?`, [raceIdNum], 'singleRow') || [];\n  const trackId = Number(raceMeta[0]);\n  const weekendType = Number(raceMeta[1]);\n\n  const meta = {\n    raceId: raceIdNum,\n    trackId,\n    weekendType,\n    sessionKey: key\n  };\n  const driverRaceNumberCache = new Map();\n  const getDriverRaceNumber = (driverId) => {\n    const id = Number(driverId);\n    if (id <= 0) return 0;\n    if (!driverRaceNumberCache.has(id)) {\n      const [raceNumber] = fetchDriverNumberDetails(id);\n      driverRaceNumberCache.set(id, Number(raceNumber) || 0);\n    }\n    return driverRaceNumberCache.get(id) ?? 0;\n  };\n\n  if (key === \"quali\" || key === \"sprintquali\") {\n    const pointsInfo = fetchPointsRegulations();\n    meta.hasPolePositionPoints = Number(pointsInfo?.poleBonusPoint) === 1 ? 1 : 0;\n  }\n\n  if (key === \"race\") {\n    try {\n      const seasonId = queryDB(`SELECT SeasonID FROM Races WHERE RaceID = ?`, [raceIdNum], 'singleValue');\n      if (seasonId != null) {\n        ensureCustomDoDRankingTable();\n        let dotdDriverId = queryDB(\n          `SELECT DriverID\n           FROM Custom_DriverOfTheDay_Ranking\n           WHERE Season = ? AND RaceID = ? AND Rank = 1`,\n          [seasonId, raceIdNum],\n          'singleValue'\n        );\n\n        if (dotdDriverId == null) {\n          const teamRows = queryDB(\n            `SELECT TeamID, Position\n             FROM Races_TeamStandings\n             WHERE SeasonID = ? AND RaceFormula = 1`,\n            [seasonId],\n            'allRows'\n          ) || [];\n\n          const teamRankByTeamId = new Map();\n          for (const r of teamRows) teamRankByTeamId.set(Number(r?.[0]), Number(r?.[1]));\n\n          const rawRaceRows = queryDB(\n            `SELECT DriverID, TeamID, StartingPos, FinishingPos, DNF, Time, Laps\n             FROM Races_Results\n             WHERE RaceID = ?`,\n            [raceIdNum],\n            'allRows'\n          ) || [];\n\n          const raceRows = rawRaceRows.map((r) => ([\n            null, null,\n            Number(r?.[0]), Number(r?.[1]),\n            Number(r?.[3]), Number(r?.[2]),\n            null, Number(r?.[4]),\n            null, null,\n            Number(r?.[5]), Number(r?.[6])\n          ])).sort((a, b) => Number(a[4]) - Number(b[4]));\n\n          const leaderboard = computeDriverOfTheDayLeaderboardFromRows(raceRows, raceIdNum, { teamRankByTeamId });\n          if (leaderboard?.length) {\n            upsertDoDRanking(Number(seasonId), raceIdNum, leaderboard, 3);\n            dotdDriverId = Number(leaderboard[0].driverId);\n          }\n        }\n\n        if (dotdDriverId != null) meta.dotdDriverId = Number(dotdDriverId);\n      }\n    } catch (e) {\n      // ignore DoD lookup failures\n    }\n\n    const rows = fetchRaceResultsRows(raceIdNum);\n    const results = rows.map((row) => {\n      const [nameFormatted, driverId, teamId] = formatNamesSimple(row);\n      return {\n        pos: row[4],\n        grid: row[5],\n        points: row[6],\n        dnf: row[7],\n        safetyCar: row[8],\n        virtualSafetyCar: row[9],\n        time: row[10],\n        laps: row[11],\n        driverId,\n        teamId,\n        raceNumber: getDriverRaceNumber(driverId),\n        name: nameFormatted,\n        fastestLap: row[12],\n        nationality: gy ? fetchNationality(driverId, gy) : \"\",\n      };\n    });\n    return { meta, results };\n  }\n\n  if (key === \"sprintrace\") {\n    const rows = fetchSprintResultsRows(raceIdNum);\n    const results = rows.map((row) => {\n      const [nameFormatted, driverId, teamId] = formatNamesSimple(row);\n      return {\n        pos: row[4],\n        points: row[5],\n        dnf: row[6],\n        time: row[7],\n        laps: row[8],\n        driverId,\n        teamId,\n        raceNumber: getDriverRaceNumber(driverId),\n        name: nameFormatted,\n        fastestLap: row[9],\n        nationality: gy ? fetchNationality(driverId, gy) : \"\",\n      };\n    });\n    return { meta, results };\n  }\n\n  if (key === \"quali\" || key === \"sprintquali\") {\n    const shootout = key === \"sprintquali\" ? 1 : 0;\n    const rows = fetchQualifyingResultsRows(raceIdNum, shootout);\n    const qualifyingGridPositions = buildQualifyingGridPositionMap(rows);\n    const results = rows.map((row) => {\n      const [nameFormatted, driverId, teamId] = formatNamesSimple(row);\n      const qualifyingPos = Number(row[4]);\n      const gridPenalty = Number(row[9]);\n      return {\n        pos: qualifyingPos,\n        q1FastestLap: row[5],\n        q2FastestLap: row[6],\n        q3FastestLap: row[7],\n        driverId,\n        teamId,\n        raceNumber: getDriverRaceNumber(driverId),\n        name: nameFormatted,\n        points: row[8],\n        gridPenalty,\n        gridPosition: Number(qualifyingGridPositions.get(driverId) ?? 0),\n        laps: Number(row[10]) || 0,\n        nationality: gy ? fetchNationality(driverId, gy) : \"\",\n      };\n    });\n    return { meta, results };\n  }\n\n  if (key === \"fp\" || key === \"fp1\" || key === \"fp2\" || key === \"fp3\") {\n    const practiceSession = key === \"fp2\" ? 2 : (key === \"fp3\" ? 3 : 1);\n    const { rows, error } = fetchPracticeResultsRows(raceIdNum, practiceSession);\n    if (error) return { meta: { ...meta, error }, results: [] };\n    const results = rows.map((row, idx) => {\n      const [nameFormatted, driverId, teamId] = formatNamesSimple(row);\n      return {\n        pos: idx + 1,\n        fastestLap: row[4],\n        laps: row[5],\n        driverId,\n        teamId,\n        raceNumber: getDriverRaceNumber(driverId),\n        name: nameFormatted,\n        nationality: gy ? fetchNationality(driverId, gy) : \"\",\n      };\n    });\n    return { meta, results };\n  }\n\n  return { meta: { ...meta, error: \"Unknown session key\" }, results: [] };\n}\n\n\n\n\n\nfunction formatDriverName(driverName) {\n  let nombre = \"\", apellido = \"\";\n  const firstName = driverName ? driverName[0] : \"\";\n  const lastName = driverName ? driverName[1] : \"\";\n  if (!firstName.includes(\"STRING_LITERAL\")) {\n    const m = firstName.match(/StaffName_Forename_(Male|Female)_(\\w+)/);\n    nombre = m ? removeNumber(m[2]) : \"\";\n  } else {\n    const m = firstName.match(/\\|([^|]+)\\|/);\n    nombre = m ? m[1] : \"\";\n  }\n  if (!lastName.includes(\"STRING_LITERAL\")) {\n    const m = lastName.match(/StaffName_Surname_(\\w+)/);\n    apellido = m ? removeNumber(m[1]) : \"\";\n  } else {\n    const m = lastName.match(/\\|([^|]+)\\|/);\n    apellido = m ? m[1] : \"\";\n  }\n  return `${nombre} ${apellido}`.trim();\n}\n\nfunction formatSeasonResultsF2F3(\n  results,\n  driverName,\n  teamID,\n  driver,\n  year,\n  sprints,\n  formula\n) {\n  const driverID = Array.isArray(driver) ? driver[0] : driver;\n  const season = Array.isArray(year) ? year[0] : year;\n  const nameFormatted = formatDriverName(driverName);\n\n  const raceObjects = [];\n  const byRace = new Map();\n\n  results.forEach((row) => {\n    const raceID = row[0];\n    const teamId = row[1] ?? teamID;\n    const finishingPos = row[2];\n    const points = row[3];\n    const dnf = Number(row[4]) === 1;\n\n    const base = {\n      raceId: raceID,\n      finishingPos: finishingPos ?? 99,\n      points: points ?? 0,\n      dnf: dnf,\n      fastestLap: false,\n      qualifyingPos: 99,\n      qualifyingPoints: 0,\n      gapToWinner: null,\n      gapToPole: null,\n      startingPos: 99,\n      gapAhead: null,\n      gapBehind: null,\n      sprintPoints: 0,\n      sprintPos: null,\n      sprintQualiPos: null,\n      teamId: teamId,\n      driverOfTheDay: false\n    };\n\n    if (base.dnf) {\n      base.finishingPos = -1;\n      base.points = -1;\n    }\n\n    const qualiRow = queryDB(`\n        SELECT FinishingPos, ChampionshipPoints\n        FROM Races_QualifyingResults\n        WHERE RaceFormula = ?\n          AND RaceID = ?\n          AND SeasonID = ?\n          AND DriverID = ?\n          AND QualifyingStage = 1\n      `, [formula, raceID, season, driverID], \"singleRow\") || [];\n\n    const qualiPos = qualiRow[0] ?? 99;\n    base.qualifyingPos = qualiPos;\n    base.qualifyingPoints = qualiRow[1] ?? 0;\n    base.startingPos = qualiPos;\n    const invertLimit = Number(formula) === 2 ? 10 : (Number(formula) === 3 ? 12 : 0);\n    if (invertLimit > 0) {\n      const qPos = Number(qualiPos);\n      base.sprintQualiPos = (qPos > 0 && qPos <= invertLimit) ? (invertLimit + 1 - qPos) : qPos;\n    } else {\n      base.sprintQualiPos = qualiPos;\n    }\n\n    const fastestLapDriver = queryDB(`\n        SELECT DriverID\n        FROM Races_FeatureRaceResults\n        WHERE FastestLap > 0\n          AND RaceID = ?\n          AND SeasonID = ?\n          AND RaceFormula = ?\n        ORDER BY FastestLap\n        LIMIT 1\n      `, [raceID, season, formula], \"singleValue\");\n\n    base.fastestLap = parseInt(fastestLapDriver) === parseInt(driverID);\n\n    raceObjects.push(base);\n    byRace.set(raceID, base);\n  });\n\n  if (Array.isArray(sprints)) {\n    for (const sprintRow of sprints) {\n      const [sprintRaceID, sprintPos, sprintPoints] = sprintRow;\n      const obj = byRace.get(sprintRaceID);\n      if (obj) {\n        obj.sprintPoints = sprintPoints ?? 0;\n        obj.sprintPos = sprintPos ?? null;\n      }\n    }\n  }\n\n  const latestTeamId =\n    raceObjects.length ? raceObjects[raceObjects.length - 1].teamId : teamID;\n\n  const standingsRow =\n    queryDB(`\n      SELECT Position, LastPositionChange\n      FROM Races_Driverstandings\n      WHERE RaceFormula = ?\n        AND SeasonID = ?\n        AND DriverID = ?\n    `, [formula, season, driverID], \"singleRow\") || [0, 0];\n\n  const championshipPosition = Number(standingsRow[0]) || 0;\n  const lastPositionChange = Number(standingsRow[1]) || 0;\n\n  return {\n    driverName: nameFormatted,\n    latestTeamId,\n    driverId: driverID[0] || driverID,\n    championshipPosition,\n    lastPositionChange,\n    races: raceObjects\n  };\n}\n\nexport function formatSeasonResults(\n  results,\n  driverName,\n  teamID,\n  driver,\n  year,\n  sprints,\n  isCurrentYear = true,\n  formula = 1\n) {\n  if (Number(formula) !== 1) {\n    return formatSeasonResultsF2F3(results, driverName, teamID, driver, year, sprints, formula);\n  }\n  const driverID = Array.isArray(driver) ? driver[0] : driver;\n  const season = Array.isArray(year) ? year[0] : year;\n\n  const toSeconds = (t) => {\n    if (t == null) return null;\n    if (typeof t === \"number\") return t;\n    const s = String(t).trim();\n    if (s === \"\" || s.toUpperCase() === \"NR\") return null;\n    const numberRe = /^[+-]?\\d+(\\.\\d+)?$/;\n    const clean = s.startsWith(\"(\") && s.endsWith(\")\") ? s.slice(1, -1) : s;\n    if (clean.includes(\":\")) {\n      const [mm, rest] = clean.split(\":\");\n      const mmStr = String(mm).trim();\n      const secsStr = String(rest).trim();\n      if (!/^\\d+$/.test(mmStr)) return null;\n      if (!numberRe.test(secsStr)) return null;\n      return parseInt(mmStr, 10) * 60 + parseFloat(secsStr);\n    }\n    const nStr = String(clean).trim();\n    if (!numberRe.test(nStr)) return null;\n    return parseFloat(nStr);\n  };\n  const formatGap = (delta) => {\n    if (delta == null) return null;\n    return `+${delta.toFixed(3)}`;\n  };\n\n  const nameFormatted = formatDriverName(driverName);\n\n  // ---- carreras del piloto ----\n  const racesParticipated =\n    queryDB(`\n      SELECT RaceID\n      FROM Races_Results\n      WHERE DriverID = ?\n        AND Season = ?\n      ORDER BY RaceID\n    `, [driverID, season], \"allRows\") || [];\n  const raceObjects = [];\n  const myBasicsRows = queryDB(`\n      SELECT RaceID, TeamID, FinishingPos, Points, StartingPos, DNF\n      FROM Races_Results\n      WHERE Season = ?\n        AND DriverID = ?\n      ORDER BY RaceID\n    `, [season, driverID], \"allRows\") || [];\n  const myBasicsByRace = new Map();\n  myBasicsRows.forEach((r) => {\n    myBasicsByRace.set(Number(r[0]), {\n      teamId: r[1] ?? teamID,\n      finishingPos: r[2],\n      points: r[3],\n      startingPos: r[4],\n      dnf: Number(r[5]) === 1\n    });\n  });\n\n  for (let i = 0; i < racesParticipated.length; i++) {\n    const raceID = racesParticipated[i][0];\n\n    // Traemos resultados completos de la carrera para calcular gaps/startingPos en una sola query\n    const raceResults =\n      queryDB(`\n        SELECT DriverID, FinishingPos, Points, Time, StartingPos, DNF\n        FROM Races_Results\n        WHERE Season = ?\n          AND RaceID = ?\n      `, [season, raceID], \"allRows\") || [];\n\n    // info específica del piloto\n    const myRow = raceResults.find(r => Number(r[0]) === Number(driverID));\n    const myBasic = myBasicsByRace.get(Number(raceID)) || null;\n    const myDNF = myBasic ? (myBasic.dnf ? 1 : 0) : (myRow ? (Number(myRow[5]) === 1) : 0);\n    const myStartingPos = myBasic ? (myBasic.startingPos ?? 99) : (myRow ? (myRow[4] ?? 99) : 99);\n\n    // vuelta rápida (tu lógica)\n    const driverWithFastestLap = queryDB(`\n        SELECT DriverID\n        FROM Races_Results\n        WHERE FastestLap > 0\n          AND RaceID = ?\n          AND Season = ?\n        ORDER BY FastestLap\n        LIMIT 1\n      `, [raceID, season], \"singleValue\");\n\n    // objeto base\n    const base = {\n      raceId: raceID,\n      finishingPos: myBasic ? (myBasic.finishingPos ?? 99) : (myRow ? (myRow[1] ?? 99) : 99),\n      points: myDNF ? -1 : (myBasic ? (myBasic.points ?? 0) : (myRow ? (myRow[2] ?? 0) : 0)),\n      dnf: myDNF,\n      fastestLap: parseInt(driverWithFastestLap) === parseInt(driverID),\n      qualifyingPos: 99,\n      qualifyingPoints: 0,\n      gapToWinner: null,\n      gapToPole: null,\n      // NUEVOS CAMPOS:\n      startingPos: myStartingPos,\n      gapAhead: null,\n      gapBehind: null,\n      // sprint/equipo\n      sprintPoints: 0,\n      sprintPos: null,\n      teamId: 0,\n      driverOfTheDay: false\n    };\n\n    if (base.dnf) {\n      base.finishingPos = -1;\n      base.points = -1;\n    }\n\n    // Quali / parrilla (como antes)\n    let QRes;\n    let QPts = 0;\n    if (isCurrentYear) {\n      const QStage =\n        queryDB(`\n          SELECT MAX(QualifyingStage)\n          FROM Races_QualifyingResults\n          WHERE RaceFormula = 1\n            AND RaceID = ?\n            AND SeasonID = ?\n            AND DriverID = ?\n        `, [raceID, season, driverID], \"singleValue\") || 0;\n\n      const qRow =\n        queryDB(`\n          SELECT FinishingPos, ChampionshipPoints\n          FROM Races_QualifyingResults\n          WHERE RaceFormula = 1\n            AND RaceID = ?\n            AND SeasonID = ?\n            AND DriverID = ?\n            AND QualifyingStage = ?\n        `, [raceID, season, driverID, QStage], \"singleRow\") || [];\n      QRes = qRow[0] ?? 99;\n      QPts = qRow[1] ?? 0;\n    } else {\n      QRes =\n        queryDB(`\n          SELECT StartingPos\n          FROM Races_Results\n          WHERE RaceID = ?\n            AND DriverID = ?\n        `, [raceID, driverID], \"singleValue\") || 99;\n\n      const QStage =\n        queryDB(`\n          SELECT MAX(QualifyingStage)\n          FROM Races_QualifyingResults\n          WHERE RaceFormula = 1\n            AND RaceID = ?\n            AND SeasonID = ?\n            AND DriverID = ?\n        `, [raceID, season, driverID], \"singleValue\") || 0;\n\n      QPts =\n        queryDB(`\n          SELECT ChampionshipPoints\n          FROM Races_QualifyingResults\n          WHERE RaceFormula = 1\n            AND RaceID = ?\n            AND SeasonID = ?\n            AND DriverID = ?\n            AND QualifyingStage = ?\n        `, [raceID, season, driverID, QStage], \"singleValue\") || 0;\n    }\n    base.qualifyingPos = QRes;\n    base.qualifyingPoints = QPts ?? 0;\n\n    // Gaps generales (tus funciones existentes)\n    base.gapToWinner = calculateTimeDifference(driverID, raceID);\n    base.gapToPole = calculateTimeToPole(driverID, raceID);\n\n    // --- NUEVO: calcular gapAhead / gapBehind con todos los clasificados ---\n    if (!base.dnf && raceResults.length > 0) {\n      // clasificados con tiempo interpretable\n      const classified = raceResults\n        .filter(r => Number(r[1]) > 0) // FinishingPos > 0\n        .sort((a, b) => Number(a[1]) - Number(b[1])); // por posición\n\n      const idx = classified.findIndex(r => Number(r[0]) === Number(driverID));\n      if (idx !== -1) {\n        const myTime = toSeconds(classified[idx][3]); // Time\n        // delante\n        if (idx > 0) {\n          const aheadTime = toSeconds(classified[idx - 1][3]);\n          if (myTime != null && aheadTime != null) {\n            base.gapAhead = formatGap(myTime - aheadTime);\n          }\n        }\n        // detrás\n        if (idx < classified.length - 1) {\n          const behindTime = toSeconds(classified[idx + 1][3]);\n          if (myTime != null && behindTime != null) {\n            base.gapBehind = formatGap(behindTime - myTime);\n          }\n        }\n      }\n    }\n\n    // gaps listos\n    // equipo por carrera\n    const teamInRace =\n      queryDB(`\n        SELECT TeamID\n        FROM Races_Results\n        WHERE RaceID = ?\n          AND DriverID = ?\n      `, [raceID, driverID], \"singleValue\") || 0;\n\n    base.teamId = teamInRace;\n\n    raceObjects.push(base);\n  }\n\n  // Sprints\n  if (Array.isArray(sprints)) {\n    const byRace = new Map(raceObjects.map(o => [o.raceId, o]));\n    for (const sprintRow of sprints) {\n      const [sprintRaceID, sprintPos, sprintPoints] = sprintRow;\n      const obj = byRace.get(sprintRaceID);\n      if (obj) {\n        obj.sprintPoints = sprintPoints ?? 0;\n        obj.sprintPos = sprintPos ?? null;\n      }\n    }\n  }\n\n  // último equipo / posición campeonato\n  const latestTeamId =\n    raceObjects.length ? raceObjects[raceObjects.length - 1].teamId : teamID;\n\n  const standingsRow =\n    queryDB(`\n        SELECT Position, LastPositionChange\n        FROM Races_Driverstandings\n        WHERE RaceFormula = ?\n          AND SeasonID = ?\n          AND DriverID = ?\n      `, [formula, season, driverID], \"singleRow\") || [0, 0];\n\n  const championshipPosition = Number(standingsRow[0]) || 0;\n  const lastPositionChange = Number(standingsRow[1]) || 0;\n\n  const payload = {\n    driverName: nameFormatted,\n    latestTeamId,\n    driverId: driverID[0] || driverID,\n    championshipPosition,\n    lastPositionChange,\n    races: raceObjects\n  };\n\n  return payload;\n}\n\n\n\nexport function calculateTimeToPole(driverID, raceID) {\n  const QStage = queryDB(`\n      SELECT MAX(QualifyingStage)\n      FROM Races_QualifyingResults\n      WHERE RaceFormula = 1\n        AND RaceID = ?\n        AND DriverID = ?\n    `, [raceID, driverID], 'singleValue') || 0;\n\n  const poleTime = queryDB(`\n      SELECT MIN(FastestLap)\n      FROM Races_QualifyingResults\n      WHERE RaceFormula = 1\n        AND RaceID = ?\n        AND QualifyingStage = 3\n        AND FastestLap IS NOT 0\n    `, [raceID], 'singleValue') || 9999;\n\n  const driverTime = queryDB(`\n      SELECT FastestLap\n      FROM Races_QualifyingResults\n      WHERE RaceFormula = 1\n        AND RaceID = ?\n        AND QualifyingStage = ?\n        AND DriverID = ?\n    `, [raceID, QStage, driverID], 'singleValue') || 9999;\n\n  if (driverTime < poleTime) {\n    return \"NR\";\n  } else {\n    const difference = Number((driverTime - poleTime).toFixed(2));\n    return `+${difference}s`;\n  }\n}\n\nexport function calculateTimeDifference(driverID, raceID) {\n  const totalLaps = queryDB(`\n      SELECT MAX(Laps)\n      FROM Races_Results\n      WHERE RaceID = ?\n    `, [raceID], 'singleValue') || 0;\n\n  const driverLaps = queryDB(`\n      SELECT Laps\n      FROM Races_Results\n      WHERE RaceID = ?\n        AND DriverID = ?\n    `, [raceID, driverID], 'singleValue') || 0;\n\n  if (driverLaps < totalLaps) {\n    return `+${totalLaps - driverLaps} L`;\n  } else {\n    const winnerID = queryDB(`\n        SELECT DriverID\n        FROM Races_Results\n        WHERE RaceID = ?\n          AND FinishingPos = 1\n      `, [raceID], 'singleValue');\n\n    const winnerTime = queryDB(`\n        SELECT Time\n        FROM Races_Results\n        WHERE RaceID = ?\n          AND DriverID = ?\n      `, [raceID, winnerID], 'singleValue') || 0;\n\n    const driverTime = queryDB(`\n        SELECT Time\n        FROM Races_Results\n        WHERE RaceID = ?\n          AND DriverID = ?\n      `, [raceID, driverID], 'singleValue') || 0;\n\n    const timeDiff = Number((driverTime - winnerTime).toFixed(1));\n    return `+${timeDiff}s`;\n  }\n}\n\n\n\n\n\nexport function fetchDriverNumbers() {\n  const numbers = queryDB(`SELECT DISTINCT Number\n       FROM Staff_DriverNumbers dn \n        `, [], 'allRows');\n\n  return numbers.map(n => n[0]);\n}\n\nexport function fetchDriverContracts(id) {\n  // Obtener el contrato actual\n  const currentContract = queryDB(`\n        SELECT Salary, EndSeason, StartingBonus, RaceBonus, RaceBonusTargetPos, TeamID\n        FROM Staff_Contracts\n        WHERE ContractType = 0 AND StaffID = ?\n        AND (TeamID BETWEEN 1 AND 10 OR TeamID = 32)\n    `, [id], 'singleRow');\n  //teamID between 1 and 1 10 (10 included) and alsoc na be 32\n  // Obtener el contrato futuro\n  const futureContract = queryDB(`\n        SELECT Salary, EndSeason, StartingBonus, RaceBonus, RaceBonusTargetPos, PosInTeam, TeamID\n        FROM Staff_Contracts\n        WHERE ContractType = 3 AND StaffID = ?\n    `, [id], 'singleRow');\n\n  // Obtener el día y la temporada actual\n  const daySeason = queryDB(`\n        SELECT Day, CurrentSeason\n        FROM Player_State\n    `, [], 'singleRow');\n\n  const juniorFormulasContract = queryDB(`\n        SELECT Salary, EndSeason, StartingBonus, RaceBonus, RaceBonusTargetPos, PosInTeam, TeamID\n        FROM Staff_Contracts\n        WHERE ContractType = 0 AND StaffID = ?\n        AND (TeamID > 10 AND TeamID <> 32)\n    `, [id], 'singleRow');\n\n  let isDriver = queryDB(`\n        SELECT COUNT(*)\n        FROM Staff_DriverData\n        WHERE StaffID = ?\n    `, [id], 'singleValue');\n  //isDriver has to be true or false\n  isDriver = isDriver > 0 ? true : false;\n\n  // Retornar los resultados\n  return [currentContract, futureContract, juniorFormulasContract, isDriver, daySeason ? daySeason[1] : null];\n}\n\nfunction formatStaffNameFromLocKeys(firstNameLocKey, lastNameLocKey) {\n  let firstName = \"\";\n  let lastName = \"\";\n\n  if (typeof firstNameLocKey === \"string\") {\n    if (!firstNameLocKey.includes(\"STRING_LITERAL\")) {\n      const m = firstNameLocKey.match(/StaffName_Forename_(?:Male|Female)_(\\w+)/);\n      firstName = m ? removeNumber(m[1]) : \"\";\n    } else {\n      const m = firstNameLocKey.match(/\\|([^|]+)\\|/);\n      firstName = m ? m[1] : \"\";\n    }\n  }\n\n  if (typeof lastNameLocKey === \"string\") {\n    if (!lastNameLocKey.includes(\"STRING_LITERAL\")) {\n      const m = lastNameLocKey.match(/StaffName_Surname_(\\w+)/);\n      lastName = m ? removeNumber(m[1]) : \"\";\n    } else {\n      const m = lastNameLocKey.match(/\\|([^|]+)\\|/);\n      lastName = m ? m[1] : \"\";\n    }\n  }\n\n  return `${firstName} ${lastName}`.trim();\n}\n\nexport function fetchJuniorTeamDriverNames(teamId) {\n  const maxCars = (teamId >= 11 && teamId <= 21) ? 2 : (teamId >= 22 && teamId <= 31) ? 3 : 0;\n  if (!maxCars) return [];\n\n  const rows = queryDB(`\n      SELECT bas.FirstName, bas.LastName, con.PosInTeam\n      FROM Staff_BasicData bas\n      JOIN Staff_DriverData dri ON bas.StaffID = dri.StaffID\n      JOIN Staff_Contracts con ON bas.StaffID = con.StaffID\n      WHERE con.ContractType = 0\n        AND con.TeamID = ?\n      ORDER BY con.PosInTeam, bas.LastName, bas.FirstName\n    `, [teamId], 'allRows') || [];\n\n  const byPos = new Map();\n\n  rows.forEach(([firstName, lastName, posInTeam]) => {\n    const pos = Number(posInTeam);\n    if (pos < 1 || pos > maxCars) return;\n    if (byPos.has(pos)) return;\n\n    const name = formatStaffNameFromLocKeys(firstName, lastName);\n    byPos.set(pos, name || \"Free driver\");\n  });\n\n  const result = [];\n  for (let pos = 1; pos <= maxCars; pos++) {\n    result.push({ name: byPos.get(pos) || \"Free driver\", posInTeam: pos });\n  }\n\n  return result;\n}\n\nexport function checkCustomTables(year) {\n  let createdEnginesList = false;\n  let createdEnginesStats = false;\n  let createdEnginesAllocations = false;\n  let createdCustomSaveConfig = false;\n  let createdEngineRegulationState = false;\n\n  const tablesToCheck = [\n    {\n      name: 'Custom_Engines_List',\n      createSQL: `\n          CREATE TABLE Custom_Engines_List (\n            engineId INTEGER PRIMARY KEY,\n            name TEXT\n          )\n        `\n    },\n    {\n      name: 'Custom_Engines_Stats',\n      createSQL: `\n        CREATE TABLE Custom_Engines_Stats (\n            engineId INTEGER,\n            designId INTEGER,\n            partStat INTEGER,\n            unitValue REAL,\n            Value REAL,\n            PRIMARY KEY (engineId, designId, partStat)\n        )\n        `\n    },\n    {\n      name: 'Custom_Save_Config',\n      createSQL: `\n          CREATE TABLE Custom_Save_Config (\n            key TEXT PRIMARY KEY,\n            value TEXT\n          )\n        `\n    },\n    {\n      name: 'Custom_Engine_Allocations',\n      createSQL: `\n          CREATE TABLE Custom_Engine_Allocations (\n            teamId INTEGER,\n            engineId INTEGER\n            \n          )\n        `\n    },\n    {\n      name: 'Custom_Engine_Regulation_State',\n      createSQL: `\n            CREATE TABLE IF NOT EXISTS Custom_Engine_Regulation_State (\n              id INTEGER PRIMARY KEY CHECK (id = 1),\n              lastSeasonApplied INTEGER\n            );\n        `\n    },\n    {\n      name: 'Custom_Engine_Progression',\n      createSQL: `\n        CREATE TABLE Custom_Engine_Progression (\n          SeasonID INTEGER NOT NULL,\n          RaceID INTEGER NOT NULL,\n          EngineID INTEGER NOT NULL,\n          Power REAL NOT NULL,\n          Source TEXT NULL,\n          PRIMARY KEY (SeasonID, RaceID, EngineID)\n        )\n      `\n    }\n  ];\n\n  tablesToCheck.forEach((table) => {\n    const tableExists = queryDB(`\n        SELECT name\n        FROM sqlite_master\n        WHERE type='table'\n          AND name=?\n      `, [table.name], 'singleValue');\n\n\n    if (!tableExists) {\n      queryDB(table.createSQL, [], 'run');\n\n\n      if (table.name === 'Custom_Engines_List') {\n        createdEnginesList = true;\n      }\n      else if (table.name === 'Custom_Engines_Stats') {\n        createdEnginesStats = true;\n      }\n      else if (table.name === 'Custom_Engine_Allocations') {\n        createdEnginesAllocations = true;\n      }\n      else if (table.name === 'Custom_Save_Config') {\n        createdCustomSaveConfig = true;\n      }\n      else if (table.name === 'Custom_Engine_Regulation_State') {\n        createdEngineRegulationState = true;\n      }\n    }\n  });\n\n  fixCustomEnginesStatsTable();\n\n  insertDefualtEnginesData(createdEnginesList, createdEnginesStats, createdEnginesAllocations, createdCustomSaveConfig, createdEngineRegulationState, year);\n\n  createEngineMigrationTrigger();\n\n  ensureCustomEngineProgressionTable();\n}\n\nexport function fixCustomEnginesStatsTable() {\n  // Verificar si la tabla tiene la PRIMARY KEY\n  const hasPrimaryKey = queryDB(`\n    PRAGMA table_info(Custom_Engines_Stats);\n  `, [], 'allRows'); // PRAGMA returns rows\n\n  let primaryKeyExists = hasPrimaryKey.some(\n    (column) => column[5] > 0 // Column index 5 is pk\n  );\n\n  if (!primaryKeyExists) {\n    queryDB(`\n      CREATE TABLE Custom_Engines_Stats_TEMP (\n        engineId INTEGER,\n        designId INTEGER,\n        partStat INTEGER,\n        unitValue REAL,\n        Value REAL,\n        PRIMARY KEY (engineId, designId, partStat)\n      );\n    `, [], 'run');\n\n    queryDB(`\n      INSERT INTO Custom_Engines_Stats_TEMP (engineId, designId, partStat, unitValue, Value)\n      SELECT engineId, designId, partStat, unitValue, Value\n      FROM Custom_Engines_Stats\n      WHERE rowid IN (\n        SELECT MAX(rowid) \n        FROM Custom_Engines_Stats\n        GROUP BY engineId, designId, partStat\n      );\n    `, [], 'run');\n\n    queryDB(`DROP TABLE Custom_Engines_Stats;`, [], 'run');\n\n    queryDB(`ALTER TABLE Custom_Engines_Stats_TEMP RENAME TO Custom_Engines_Stats;`, [], 'run');\n\n\n  }\n}\n\nexport function wipeTableAndRefill(tableName, data){\n  queryDB(`DELETE FROM ${tableName};`, [], 'run');\n  data.forEach(row => {\n    const placeholders = Object.keys(row).map(() => '?').join(', ');\n    const sql = `INSERT INTO ${tableName} (${Object.keys(row).join(', ')}) VALUES (${placeholders});`;\n    queryDB(sql, Object.values(row), 'run');\n  });\n}\n\nexport function insertDefualtEnginesData(list, stats, allocations, customSave, engineRegulationState, year) {\n  const engines = [\n    {\n      id: 1,\n      name: 'Ferrari',\n      stats: [\n        { partStat: 6, value: 500, unitValue: 75, designId: 1 },\n        { partStat: 10, value: 750, unitValue: 95, designId: 1 },\n        { partStat: 11, value: 250, unitValue: 80, designId: 1 },\n        { partStat: 12, value: 500, unitValue: 77.5, designId: 1 },\n        { partStat: 14, value: 400, unitValue: 68, designId: 1 },\n        { partStat: 15, value: 350, unitValue: 57, designId: 2 },\n        { partStat: 15, value: 0, unitValue: 50, designId: 3 }\n      ]\n    },\n    {\n      id: 4,\n      name: 'Red Bull',\n      stats: [\n        { partStat: 6, value: 300, unitValue: 65, designId: 4 },\n        { partStat: 10, value: 1000, unitValue: 100, designId: 4 },\n        { partStat: 11, value: 0, unitValue: 85, designId: 4 },\n        { partStat: 12, value: 0, unitValue: 70, designId: 4 },\n        { partStat: 14, value: 0, unitValue: 60, designId: 4 },\n        { partStat: 15, value: 0, unitValue: 50, designId: 5 },\n        { partStat: 15, value: 600, unitValue: 62, designId: 6 }\n      ]\n    },\n    {\n      id: 7,\n      name: 'Mercedes',\n      stats: [\n        { partStat: 6, value: 0, unitValue: 50, designId: 7 },\n        { partStat: 10, value: 500, unitValue: 90, designId: 7 },\n        { partStat: 11, value: 1000, unitValue: 65, designId: 7 },\n        { partStat: 12, value: 850, unitValue: 82.75, designId: 7 },\n        { partStat: 14, value: 1000, unitValue: 80, designId: 7 },\n        { partStat: 15, value: 1000, unitValue: 70, designId: 8 },\n        { partStat: 15, value: 1000, unitValue: 70, designId: 9 }\n      ]\n    },\n    {\n      id: 10,\n      name: 'Renault',\n      stats: [\n        { partStat: 6, value: 1000, unitValue: 100, designId: 10 },\n        { partStat: 10, value: 0, unitValue: 80, designId: 10 },\n        { partStat: 11, value: 500, unitValue: 75, designId: 10 },\n        { partStat: 12, value: 1000, unitValue: 85, designId: 10 },\n        { partStat: 14, value: 650, unitValue: 73, designId: 10 },\n        { partStat: 15, value: 500, unitValue: 75, designId: 11 },\n        { partStat: 15, value: 1000, unitValue: 100, designId: 12 }\n      ]\n    }\n  ];\n\n  const teams = {\n    alphatauri: {\n      23: \"alphatauri\",\n      24: \"visarb\"\n    },\n    alfa: {\n      23: \"alfa\",\n      24: \"stake\"\n    },\n    alpine: {\n      23: \"alpine\",\n      24: \"alpine\"\n    }\n  }\n\n  if (customSave) {\n    for (let key in teams) {\n      const newTeam = teams[key][year];\n      queryDB(`INSERT OR REPLACE INTO Custom_Save_Config (key, value) VALUES (?, ?)`, [key, newTeam], 'run');\n    }\n\n    queryDB(\n      `INSERT OR IGNORE INTO Custom_Save_Config (key, value) VALUES ('turningPointsFrequencyPreset', ?)`,\n      [String(defaultTurningPointsFrequencyPreset)],\n      'run'\n    );\n  }\n\n\n  if (list && stats) {\n    engines.forEach(engine => {\n      queryDB(`\n        INSERT OR REPLACE INTO Custom_Engines_List (engineId, Name)\n        VALUES (?, ?)\n      `, [engine.id, engine.name], 'run');\n\n      engine.stats.forEach(stat => {\n        queryDB(`\n          INSERT OR REPLACE INTO Custom_Engines_Stats (engineId, designId, partStat, Value, unitValue)\n          VALUES (?, ?, ?, ?, ?)\n        `, [engine.id, stat.designId, stat.partStat, stat.value, stat.unitValue], 'run');\n      });\n    });\n  }\n\n  if (allocations) {\n    const maxYear = queryDB(`SELECT MAX(SeasonID) FROM Parts_TeamHistory`, [], 'singleValue');\n    const actualEngineAllocations = queryDB(`\n      SELECT th.TeamID, em.EngineDesignID\n      FROM Parts_TeamHistory th\n      JOIN Parts_Enum_EngineManufacturers em\n        ON th.EngineManufacturer = em.Value\n      WHERE SeasonID = ?`,\n      [maxYear], 'allRows');\n\n\n    actualEngineAllocations.forEach(engine => {\n      queryDB(`\n        INSERT OR REPLACE INTO Custom_Engine_Allocations (teamId, engineId)\n        VALUES (?, ?)\n      `, [engine[0], engine[1]], 'run');\n    });\n  }\n  if (engineRegulationState) {\n    queryDB(`\n      INSERT OR IGNORE INTO Custom_Engine_Regulation_State (id, lastSeasonApplied)\n      VALUES (1, -1);\n    `, [], 'run');\n  }\n\n\n}\n\nexport function updateCustomEngines(engineData) {\n  for (let engineId in engineData) {\n    const nameCapitalized = engineData[engineId].name.charAt(0).toUpperCase() + engineData[engineId].name.slice(1);\n    queryDB(`INSERT OR REPLACE INTO Custom_Engines_List (engineId, Name) VALUES (?, ?)`, [engineId, nameCapitalized], 'run');\n    for (let stat in engineData[engineId].stats) {\n      const untiValue = engineData[engineId].stats[stat];\n      const value = engine_unitValueToValue[stat](untiValue);\n      if (parseInt(stat) !== 18 && parseInt(stat) !== 19) {\n        queryDB(`INSERT OR REPLACE INTO Custom_Engines_Stats (engineId, designId, partStat, Value, unitValue)\n            VALUES (?, ?, ?, ?, ?)`, [engineId, engineId, stat, value, untiValue], 'run');\n      }\n      else if (parseInt(stat) === 18) {\n        let designId = parseInt(engineId) + 1;\n        queryDB(`INSERT OR REPLACE INTO Custom_Engines_Stats (engineId, designId, partStat, Value, unitValue)\n            VALUES (?, ?, ?, ?, ?)`, [engineId, designId, 15, value, untiValue], 'run');\n      }\n      else if (parseInt(stat) === 19) {\n        let designId = parseInt(engineId) + 2;\n        queryDB(`INSERT OR REPLACE INTO Custom_Engines_Stats (engineId, designId, partStat, Value, unitValue)\n            VALUES (?, ?, ?, ?, ?)`, [engineId, designId, 15, value, untiValue], 'run');\n      }\n    }\n    updateTeamsSuppliedByEngine(engineId, engineData[engineId].stats);\n\n  }\n}\n\nexport function editEngines(engineData) {\n  for (let engineId in engineData) {\n    for (let stat in engineData[engineId]) {\n      const untiValue = engineData[engineId][stat];\n      const value = engine_unitValueToValue[stat](untiValue);\n      if (parseInt(stat) !== 18 && parseInt(stat) !== 19) {\n        queryDB(`INSERT OR REPLACE INTO Custom_Engines_Stats (engineId, designId, partStat, Value, unitValue)\n            VALUES (?, ?, ?, ?, ?)`, [engineId, engineId, stat, value, untiValue], 'run');\n      }\n      else if (parseInt(stat) === 18) {\n        let designId = parseInt(engineId) + 1;\n        queryDB(`INSERT OR REPLACE INTO Custom_Engines_Stats (engineId, designId, partStat, Value, unitValue)\n            VALUES (?, ?, ?, ?, ?)`, [engineId, designId, 15, value, untiValue], 'run');\n      }\n      else if (parseInt(stat) === 19) {\n        let designId = parseInt(engineId) + 2;\n        queryDB(`INSERT OR REPLACE INTO Custom_Engines_Stats (engineId, designId, partStat, Value, unitValue)\n            VALUES (?, ?, ?, ?, ?)`, [engineId, designId, 15, value, untiValue], 'run');\n      }\n    }\n    updateTeamsSuppliedByEngine(engineId, engineData[engineId]);\n\n  }\n}\n\nexport function check2025ModCompatibility(year_version) {\n  ensureSeasonModTable('Custom_2025_SeasonMod', defaultSeasonModKeys2025);\n\n  const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n  const currentDay = daySeason[0];\n  const currentSeason = daySeason[1];\n\n  const minDay2024 = queryDB(`SELECT MIN(Day) FROM Races WHERE SeasonID = 2024`, [], 'singleValue');\n  const firstRaceState2024 = queryDB(`SELECT State FROM Races WHERE Day = ? AND SeasonID = 2024`, [minDay2024], 'singleValue');\n\n  const maxDay2024 = queryDB(`SELECT MAX(Day) FROM Races WHERE SeasonID = 2024`, [], 'singleValue');\n  const lastRaceState2024 = queryDB(`SELECT State FROM Races WHERE Day = ? AND SeasonID = 2024`, [maxDay2024], 'singleValue');\n\n  const minDay2025 = queryDB(`SELECT MIN(Day) FROM Races WHERE SeasonID = 2025`, [], 'singleValue');\n  const firstRaceState2025 = queryDB(`SELECT State FROM Races WHERE Day = ? AND SeasonID = 2025`, [minDay2025], 'singleValue');\n\n\n  if (year_version !== \"24\") {\n    return \"NotCompatible\";\n  }\n\n  const edited = queryDB(`SELECT * FROM Custom_2025_SeasonMod WHERE value = 1`, [], 'allRows');\n  if (edited.length > 0) {\n    return \"AlreadyEdited\";\n  }\n\n  if (firstRaceState2024 === 0 && currentSeason === 2024) {\n    return \"Start2024\";\n  }\n\n  if (lastRaceState2024 === 2 && currentSeason === 2024) {\n    // return \"End2024\";\n    return \"NotCompatible\";\n  }\n\n  if (currentSeason === 2025 && firstRaceState2025 === 0) {\n    // return \"Direct2025\";\n    return \"NotCompatible\";\n  }\n\n  return \"NotCompatible\";\n}\n\nexport function check2026ModCompatibility(year_version) {\n  ensureSeasonModTable('Custom_2026_SeasonMod', defaultSeasonModKeys2026);\n\n  const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n  const currentDay = daySeason[0];\n  const currentSeason = daySeason[1];\n\n  const minDay2024 = queryDB(`SELECT MIN(Day) FROM Races WHERE SeasonID = 2024`, [], 'singleValue');\n  const firstRaceState2024 = queryDB(`SELECT State FROM Races WHERE Day = ? AND SeasonID = 2024`, [minDay2024], 'singleValue');\n\n  const maxDay2024 = queryDB(`SELECT MAX(Day) FROM Races WHERE SeasonID = 2024`, [], 'singleValue');\n  const lastRaceState2024 = queryDB(`SELECT State FROM Races WHERE Day = ? AND SeasonID = 2024`, [maxDay2024], 'singleValue');\n\n  const minDay2025 = queryDB(`SELECT MIN(Day) FROM Races WHERE SeasonID = 2025`, [], 'singleValue');\n  const firstRaceState2025 = queryDB(`SELECT State FROM Races WHERE Day = ? AND SeasonID = 2025`, [minDay2025], 'singleValue');\n\n  const maxDay2025 = queryDB(`SELECT MAX(Day) FROM Races WHERE SeasonID = 2025`, [], 'singleValue');\n  const lastRaceState2025 = queryDB(`SELECT State FROM Races WHERE Day = ? AND SeasonID = 2025`, [maxDay2025], 'singleValue');\n\n  const minDay2026 = queryDB(`SELECT MIN(Day) FROM Races WHERE SeasonID = 2026`, [], 'singleValue');\n  const firstRaceState2026 = queryDB(`SELECT State FROM Races WHERE Day = ? AND SeasonID = 2026`, [minDay2026], 'singleValue');\n\n  if (year_version !== \"24\") {\n    return \"NotCompatible\";\n  }\n\n  const edited = queryDB(`SELECT * FROM Custom_2026_SeasonMod WHERE value = 1`, [], 'allRows');\n  if (edited.length > 0) {\n    return \"AlreadyEdited\";\n  }\n\n  //get staffID's from Staff_BasicData that have IsGeneratedForCustomTeam = 1 and StaffIDs are not 552 and 553\n  const generatedStaff = queryDB(`SELECT StaffID FROM Staff_BasicData WHERE IsGeneratedForCustomTeam = 1 AND StaffID NOT IN (552, 553)`, [], 'allRows');\n  if (generatedStaff.length > 0) {\n    return \"NotCompatible\";\n  }\n\n  if (firstRaceState2024 === 0 && currentSeason === 2024) {\n    return \"Start2024\";\n  }\n  \n  if (lastRaceState2024 === 2 && currentSeason === 2024) {\n    return \"End2024\";\n  }\n\n  if (firstRaceState2025 === 0 && currentSeason === 2025) {\n    return \"Start2025\";\n  }\n  if (lastRaceState2025 === 2 && currentSeason === 2025) {\n    return \"End2025\";\n  }\n\n  if (currentSeason === 2026 && firstRaceState2026 === 0) {\n    return \"Direct2026\";\n  }\n\n  return \"NotCompatible\";\n}\n\nconst defaultSeasonModKeys2025 = [\n  'time-travel',\n  'extra-drivers',\n  'change-line-ups',\n  'change-stats',\n  'change-calendar',\n  'change-regulations',\n  'change-cfd',\n  'change-performance'\n];\n\nconst defaultSeasonModKeys2026 = [\n  'time-travel-2026',\n  'extra-drivers-2026',\n  'change-line-ups-2026',\n  'change-stats-2026',\n  'change-calendar-2026',\n  'change-regulations-2026',\n  'change-cfd-2026',\n  'change-performance-2026'\n];\n\nfunction ensureSeasonModTable(tableName, defaultKeys) {\n  const tableExists = queryDB(`SELECT name FROM sqlite_master WHERE type='table' AND name=?`, [tableName], \"singleRow\");\n  if (!tableExists) {\n    // Table name cannot be parameterized\n    queryDB(`CREATE TABLE ${tableName} (key TEXT PRIMARY KEY, value TEXT)`, [], 'run');\n  }\n\n  if (Array.isArray(defaultKeys) && defaultKeys.length > 0) {\n    const valuesSql = defaultKeys.map((k) => `('${k}', '0')`).join(\", \");\n    // Default keys are fixed constants; safe to inline.\n    queryDB(`INSERT OR IGNORE INTO ${tableName} (key, value) VALUES ${valuesSql}`, [], 'run');\n  }\n}\n\n\nexport function updateTeamsSuppliedByEngine(engineId, stats) {\n  const teamsSupplied = queryDB(`SELECT teamID FROM Custom_Engine_Allocations WHERE engineId = ?`, [engineId], 'allRows');\n  teamsSupplied.forEach(team => {\n    const teamEngineId = queryDB(`SELECT DesignID FROM Parts_Designs WHERE TeamID = ? AND PartType = 0`, [team[0]], 'singleValue');\n    const teamERSId = queryDB(`SELECT DesignID FROM Parts_Designs WHERE TeamID = ? AND PartType = 1`, [team[0]], 'singleValue');\n    const teamGearboxId = queryDB(`SELECT DesignID FROM Parts_Designs WHERE TeamID = ? AND PartType = 2`, [team[0]], 'singleValue');\n    for (let stat in stats) {\n      if (parseInt(stat) < 18) {\n        const untiValue = stats[stat];\n        const value = engine_unitValueToValue[stat](untiValue);\n        queryDB(`UPDATE Parts_Designs_StatValues SET Value = ?, UnitValue = ? WHERE DesignID = ? AND PartStat = ?`, [value, untiValue, teamEngineId, stat], 'run');\n      }\n\n    }\n    const valueERS = engine_unitValueToValue[18](stats[18]);\n    const unitValueERS = stats[18];\n    const valueGearbox = engine_unitValueToValue[19](stats[19]);\n    const unitValueGearbox = stats[19];\n    queryDB(`UPDATE Parts_Designs_StatValues SET Value = ?, UnitValue = ? WHERE DesignID = ? AND PartStat = 15`, [valueERS, unitValueERS, teamERSId], 'run');\n    queryDB(`UPDATE Parts_Designs_StatValues SET Value = ?, UnitValue = ? WHERE DesignID = ? AND PartStat = 15`, [valueGearbox, unitValueGearbox, teamGearboxId], 'run');\n  });\n\n\n}\n\nexport function updateCustomConfig(data) {\n  const alfaRomeo = data.alfa;\n  const alphaTauri = data.alphatauri;\n  const alpine = data.alpine;\n  const williams = data.williams;\n  const haas = data.haas;\n  const redbull = data.redbull;\n  const aston = data.aston;\n  const primaryColor = data.primaryColor;\n  const secondaryColor = data.secondaryColor;\n  const difficulty = data.difficulty\n  const playerTeam = data.playerTeam\n  const turningPointsFrequencyPreset = data.turningPointsFrequencyPreset;\n  const forceEditorMinimapColors = data.forceEditorMinimapColors;\n  console.log(\"Updating custom config with data:\", data);\n\n  const replacableTeamsDict = { 9: 'alfa', 8: 'alphatauri', 5: 'alpine', 7: 'haas', 3: 'redbull', 10: 'aston', 6: 'williams', }\n\n  const teamValues = {\n    alfa: alfaRomeo,\n    alphatauri: alphaTauri,\n    alpine: alpine,\n    williams: williams,\n    haas: haas,\n    redbull: redbull,\n    aston: aston,\n  };\n\n  queryDB(`\n    INSERT OR REPLACE INTO Custom_Save_Config (key, value)\n    VALUES ('alfa', ?)\n  `, [alfaRomeo], 'run');\n\n  queryDB(`\n    INSERT OR REPLACE INTO Custom_Save_Config (key, value)\n    VALUES ('alphatauri', ?)\n  `, [alphaTauri], 'run');\n\n  queryDB(`\n    INSERT OR REPLACE INTO Custom_Save_Config (key, value)\n    VALUES ('alpine', ?)\n  `, [alpine], 'run');\n\n  queryDB(`\n    INSERT OR REPLACE INTO Custom_Save_Config (key, value)\n    VALUES ('williams', ?)\n  `, [williams], 'run');\n\n  queryDB(`\n    INSERT OR REPLACE INTO Custom_Save_Config (key, value)\n    VALUES ('haas', ?)\n  `, [haas], 'run');\n\n  queryDB(`\n    INSERT OR REPLACE INTO Custom_Save_Config (key, value)\n    VALUES ('redbull', ?)\n  `, [redbull], 'run');\n\n  queryDB(`\n    INSERT OR REPLACE INTO Custom_Save_Config (key, value)\n    VALUES ('aston', ?)\n  `, [aston], 'run');\n\n  if (primaryColor) {\n    queryDB(`\n      INSERT OR REPLACE INTO Custom_Save_Config (key, value)\n      VALUES ('primaryColor', ?)\n    `, [primaryColor], 'run');\n  }\n\n  if (secondaryColor) {\n    queryDB(`\n      INSERT OR REPLACE INTO Custom_Save_Config (key, value)\n      VALUES ('secondaryColor', ?)\n    `, [secondaryColor], 'run');\n  }\n\n  queryDB(`\n    INSERT OR REPLACE INTO Custom_Save_Config (key, value)\n    VALUES ('turningPointsFrequencyPreset', ?)\n  `, [turningPointsFrequencyPreset], 'run');\n\n  queryDB(`\n    INSERT OR REPLACE INTO Custom_Save_Config (key, value)\n    VALUES ('forceEditorMinimapColors', ?)\n  `, [String(forceEditorMinimapColors)], 'run');\n\n\n  // for (let teamId in replacableTeamsDict) {\n  //   const teamKey = replacableTeamsDict[teamId]; \n\n  //   const hexValue = teamValues[teamKey]; \n  //   const color = forceEditorMinimapColors\n  //     ? hexToArgb(hexValue)\n  //     : defaultColors[teamId];\n\n\n\n  //   queryDB(\n  //     `UPDATE Teams_Colours SET Colour = ? WHERE TeamID = ?`,\n  //     [color, teamId],\n  //     'run'\n  //   );\n  // }\n\n  if (alfaRomeo === \"audi\") {\n    let color = customColors[\"audi\"];\n    color = hexToDbArgb(color);\n    const teamId = 9;\n    queryDB(\n      `UPDATE Teams_Colours SET Colour = ? WHERE TeamID = ?`,\n      [color, teamId],\n      'run'\n    );\n  }\n  else {\n    const teamId = 9;\n    let color = defaultColors[teamId];\n    console.log(\"Reverting Alfa Romeo color to default:\", color);\n    queryDB(\n      `UPDATE Teams_Colours SET Colour = ? WHERE TeamID = ?`,\n      [color, teamId],\n      'run'\n    );\n  }\n\n\n  //delete the difficulty key from Custom_Save_Config every time\n  queryDB(`DELETE FROM Custom_Save_Config WHERE key = 'difficulty'`, [], 'run');\n\n\n  if (parseInt(playerTeam) !== -1) {\n    updateTeam(playerTeam)\n  }\n\n  manageDifficultyTriggers(data.triggerList)\n  manageRefurbishTrigger(data.refurbish)\n  const freezeDevelopment = (data.freezeDevelopment !== undefined && data.freezeDevelopment !== null)\n    ? data.freezeDevelopment\n    : (queryDB(\"SELECT name FROM sqlite_master WHERE type='trigger' AND name='freeze_development';\", [], \"singleValue\") ? 1 : 0);\n  editFreezeDevelopment(freezeDevelopment)\n  const globals = getGlobals()\n  if (globals.yearIteration === \"24\") {\n    editFreezeMentality(data.frozenMentality)\n  }\n\n\n\n}\n\nfunction updateTeam(teamID) {\n  const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n  const currentDay = daySeason[0];\n  const metadata = getMetadata()\n\n  const metaProperty = metadata.gvasMeta.Properties.Properties\n    .filter(p => p.Name === \"MetaData\")[0];\n\n  queryDB(`UPDATE Player SET TeamID = ?`, [teamID], 'run');\n  queryDB(`UPDATE Staff_NarrativeData SET TeamID = ? WHERE GenSource = 0`, [teamID], 'run');\n  queryDB(`UPDATE Player_History SET EndDay = ? WHERE EndDay IS NULL`, [currentDay - 1], 'run');\n  queryDB(`DELETE FROM Player_History WHERE EndDay < StartDay`, [], 'run');\n  queryDB(`INSERT INTO Player_History VALUES (?, ?, NULL)`, [teamID, currentDay], 'run');\n}\n\n\nexport function fetchCustomConfig() {\n  const rows = queryDB(`SELECT key, value FROM Custom_Save_Config`, [], 'allRows') || [];\n  const config = {\n    teams: {},\n    primaryColor: null,\n    secondaryColor: null,\n    turningPointsFrequencyPreset: defaultTurningPointsFrequencyPreset,\n    forceEditorMinimapColors: 0,\n    renaultEngine: 'renault'\n  };\n\n  rows.forEach(row => {\n    const key = row[0];\n    const value = row[1];\n    if (key === 'alphatauri' || key === 'alpine' || key === 'williams' || key === 'haas' || key === 'alfa' || key === 'redbull' || key === 'aston') {\n      config.teams[key] = value;\n    } else if (key === 'primaryColor') {\n      config.primaryColor = value;\n    } else if (key === 'secondaryColor') {\n      config.secondaryColor = value;\n    }\n    else if (key === 'difficulty') {\n      config.difficulty = value;\n    } else if (key === 'turningPointsFrequencyPreset') {\n      config.turningPointsFrequencyPreset = parseInt(value, 10);\n    } else if (key === 'renaultEngine') {\n      if (String(value).toLowerCase() === 'honda') {\n        config.renaultEngine = 'honda';\n      } else {\n        config.renaultEngine = 'renault';\n      }\n    } else if (key === 'forceEditorMinimapColors') {\n      config.forceEditorMinimapColors = parseInt(value, 10) === 1 ? 1 : 0;\n    }\n  });\n\n  const engine10Name = config.renaultEngine === 'honda' ? 'Honda' : 'Renault';\n  queryDB(`UPDATE Custom_Engines_List SET name = ? WHERE engineId = 10`, [engine10Name], 'run');\n\n  const triggers = fetchExistingTriggers()\n  const playerTeam = fetchPlayerTeam()\n  config.playerTeam = playerTeam\n  config.triggerList = triggers.triggerList\n  config.refurbish = triggers.refurbish\n  config.frozenMentality = triggers.frozenMentality\n  config.freezeDevelopment = triggers.freezeDevelopment\n\n  if (!config.teams.williams) {\n    config.teams.williams = 'williams';\n  }\n\n  if (!config.teams.haas) {\n    config.teams.haas = 'haas';\n  }\n\n  if (!config.teams.redbull) {\n    config.teams.redbull = 'redbull';\n  }\n\n  if (!config.teams.aston) {\n    config.teams.aston = 'aston';\n  }\n\n  return config;\n}\n\nexport function setCustomSaveConfig(key, value) {\n  queryDB(`\n    INSERT OR REPLACE INTO Custom_Save_Config (key, value)\n    VALUES (?, ?)\n  `, [key, value], 'run');\n}\n\nfunction fetchPlayerTeam() {\n  const playerTeam = queryDB(`\n      SELECT TeamID\n      FROM Player\n    `, [], 'singleValue') || 0;\n\n  return playerTeam;\n}\n\nexport function fetch2025ModData() {\n  ensureSeasonModTable('Custom_2025_SeasonMod', defaultSeasonModKeys2025);\n\n  const rows = queryDB(`SELECT key, value FROM Custom_2025_SeasonMod`, [], 'allRows') || [];\n  const config = {};\n\n  rows.forEach(row => {\n    const key = row[0];\n    const value = row[1];\n    config[key] = value;\n  });\n\n  return config;\n\n}\n\nexport function fetch2026ModData() {\n  ensureSeasonModTable('Custom_2026_SeasonMod', defaultSeasonModKeys2026);\n\n  const rows = queryDB(`SELECT key, value FROM Custom_2026_SeasonMod`, [], 'allRows') || [];\n  const config = {};\n\n  rows.forEach(row => {\n    const key = row[0];\n    const value = row[1];\n    config[key] = value;\n  });\n\n  // Also return the aduo turning points flag so the 2026 mods UI can restore the toggle state.\n  const aduoEnabled = queryDB(\n    `SELECT value FROM Custom_Save_Config WHERE key = 'aduo_tp_enabled'`,\n    [],\n    'singleValue'\n  );\n  config.aduo_tp_enabled = aduoEnabled ?? \"0\";\n\n  return config;\n}\n\nfunction createEngineMigrationTrigger() {\n  const sql = `\n  DROP TRIGGER IF EXISTS trg_sync_engine_stats_on_first_full_season_day;\n\n  CREATE TRIGGER trg_sync_engine_stats_on_first_full_season_day\n  AFTER UPDATE OF Day ON Player_State\n  WHEN\n    NEW.CurrentSeason = OLD.CurrentSeason\n    AND NEW.CurrentSeason >\n        (SELECT lastSeasonApplied FROM Custom_Engine_Regulation_State WHERE id = 1)\n  BEGIN\n    --------------------------------------------------------------------\n    -- Marca la season como ya aplicada (LO PRIMERO)\n    --------------------------------------------------------------------\n    UPDATE Custom_Engine_Regulation_State\n    SET lastSeasonApplied = NEW.CurrentSeason\n    WHERE id = 1;\n    --------------------------------------------------------------------\n    -- 1) MOTOR (PartType = 0): copia todas las stats PartStat tal cual\n    --------------------------------------------------------------------\n    UPDATE Parts_Designs_StatValues\n    SET\n      Value = (\n        SELECT ces.Value\n        FROM Parts_Designs pd\n        JOIN Custom_Engine_Allocations cea ON cea.TeamID = pd.TeamID\n        JOIN Custom_Engines_Stats ces\n          ON ces.EngineID = cea.EngineID\n        AND ces.DesignID = cea.EngineID               -- motor base\n        AND ces.PartStat = Parts_Designs_StatValues.PartStat\n        WHERE pd.DesignID = Parts_Designs_StatValues.DesignID\n          AND pd.PartType = 0\n        LIMIT 1\n      ),\n      UnitValue = (\n        SELECT ces.UnitValue\n        FROM Parts_Designs pd\n        JOIN Custom_Engine_Allocations cea ON cea.TeamID = pd.TeamID\n        JOIN Custom_Engines_Stats ces\n          ON ces.EngineID = cea.EngineID\n        AND ces.DesignID = cea.EngineID\n        AND ces.PartStat = Parts_Designs_StatValues.PartStat\n        WHERE pd.DesignID = Parts_Designs_StatValues.DesignID\n          AND pd.PartType = 0\n        LIMIT 1\n      )\n    WHERE EXISTS (\n      SELECT 1\n      FROM Parts_Designs pd\n      JOIN Custom_Engine_Allocations cea ON cea.TeamID = pd.TeamID\n      JOIN Custom_Engines_Stats ces\n        ON ces.EngineID = cea.EngineID\n      AND ces.DesignID = cea.EngineID\n      AND ces.PartStat = Parts_Designs_StatValues.PartStat\n      WHERE pd.DesignID = Parts_Designs_StatValues.DesignID\n        AND pd.PartType = 0\n    );\n\n    --------------------------------------------------------------------\n    -- 2) CAJA DE CAMBIOS (PartType = 1): copia stats desde designId=engineId+2\n    --------------------------------------------------------------------\n    UPDATE Parts_Designs_StatValues\n    SET\n      Value = (\n        SELECT ces.Value\n        FROM Parts_Designs pd\n        JOIN Custom_Engine_Allocations cea ON cea.TeamID = pd.TeamID\n        JOIN Custom_Engines_Stats ces\n          ON ces.EngineID = cea.EngineID\n        AND ces.DesignID = cea.EngineID + 2           -- gearbox\n        AND ces.PartStat = Parts_Designs_StatValues.PartStat\n        WHERE pd.DesignID = Parts_Designs_StatValues.DesignID\n          AND pd.PartType = 1\n        LIMIT 1\n      ),\n      UnitValue = (\n        SELECT ces.UnitValue\n        FROM Parts_Designs pd\n        JOIN Custom_Engine_Allocations cea ON cea.TeamID = pd.TeamID\n        JOIN Custom_Engines_Stats ces\n          ON ces.EngineID = cea.EngineID\n        AND ces.DesignID = cea.EngineID + 2\n        AND ces.PartStat = Parts_Designs_StatValues.PartStat\n        WHERE pd.DesignID = Parts_Designs_StatValues.DesignID\n          AND pd.PartType = 1\n        LIMIT 1\n      )\n    WHERE EXISTS (\n      SELECT 1\n      FROM Parts_Designs pd\n      JOIN Custom_Engine_Allocations cea ON cea.TeamID = pd.TeamID\n      JOIN Custom_Engines_Stats ces\n        ON ces.EngineID = cea.EngineID\n      AND ces.DesignID = cea.EngineID + 2\n      AND ces.PartStat = Parts_Designs_StatValues.PartStat\n      WHERE pd.DesignID = Parts_Designs_StatValues.DesignID\n        AND pd.PartType = 1\n    );\n\n    --------------------------------------------------------------------\n    -- 3) ERS (PartType = 2): copia stats desde designId=engineId+1\n    --------------------------------------------------------------------\n    UPDATE Parts_Designs_StatValues\n    SET\n      Value = (\n        SELECT ces.Value\n        FROM Parts_Designs pd\n        JOIN Custom_Engine_Allocations cea ON cea.TeamID = pd.TeamID\n        JOIN Custom_Engines_Stats ces\n          ON ces.EngineID = cea.EngineID\n        AND ces.DesignID = cea.EngineID + 1           -- ERS\n        AND ces.PartStat = Parts_Designs_StatValues.PartStat\n        WHERE pd.DesignID = Parts_Designs_StatValues.DesignID\n          AND pd.PartType = 2\n        LIMIT 1\n      ),\n      UnitValue = (\n        SELECT ces.UnitValue\n        FROM Parts_Designs pd\n        JOIN Custom_Engine_Allocations cea ON cea.TeamID = pd.TeamID\n        JOIN Custom_Engines_Stats ces\n          ON ces.EngineID = cea.EngineID\n        AND ces.DesignID = cea.EngineID + 1\n        AND ces.PartStat = Parts_Designs_StatValues.PartStat\n        WHERE pd.DesignID = Parts_Designs_StatValues.DesignID\n          AND pd.PartType = 2\n        LIMIT 1\n      )\n    WHERE EXISTS (\n      SELECT 1\n      FROM Parts_Designs pd\n      JOIN Custom_Engine_Allocations cea ON cea.TeamID = pd.TeamID\n      JOIN Custom_Engines_Stats ces\n        ON ces.EngineID = cea.EngineID\n      AND ces.DesignID = cea.EngineID + 1\n      AND ces.PartStat = Parts_Designs_StatValues.PartStat\n      WHERE pd.DesignID = Parts_Designs_StatValues.DesignID\n        AND pd.PartType = 2\n    );\n\n  END;\n  `\n  queryDB(sql, [], 'exec');\n  console.log(\"INSERTING TRIGGER FOR ENGINE STATS SYNC ON SEASON CHANGE\");\n}\n"
  },
  {
    "path": "src/js/backend/scriptUtils/editTeamUtils.js",
    "content": "import { queryDB } from \"../dbManager\";\n\nexport function fetchTeamData(teamID){\n    const levCon = queryDB(`\n        SELECT BuildingID, DegradationValue\n        FROM Buildings_HQ\n        WHERE TeamID = ?\n      `, [teamID], 'allRows') || [];\n\n      const data = levCon.map(row => [row[0], parseFloat(Number(row[1]).toFixed(2))]);\n      if (teamID == \"32\") data.push([\"160\", 1]);\n    \n      const daySeason = queryDB(`\n        SELECT Day, CurrentSeason\n        FROM Player_State\n      `, [], 'singleRow');\n    \n      const days = queryDB(`\n        SELECT MIN(Day), MAX(Day)\n        FROM Seasons_Deadlines\n        WHERE SeasonID = ?\n      `, [daySeason[1]], 'singleRow');\n    \n      const costCap = queryDB(`\n        SELECT SUM(value) AS Value\n        FROM Finance_Transactions\n        WHERE Day >= ?\n          AND Day < ?\n          AND AffectsCostCap = 1\n          AND TeamID = ?\n      `, [days[0], days[1], teamID], 'allRows');\n    \n      const teamBalance = queryDB(`\n        SELECT Balance\n        FROM Finance_TeamBalance\n        WHERE TeamID = ?\n      `, [teamID], 'singleRow');\n    \n      const seasonObj = queryDB(`\n        SELECT TargetPos\n        FROM Board_SeasonObjectives\n        WHERE TeamID = ?\n          AND SeasonID = ?\n      `, [teamID, daySeason[1]], 'singleRow');\n    \n      const maxTargetYear = queryDB(`\n        SELECT MAX(TargetEndYear)\n        FROM Board_Objectives\n        WHERE TeamID = ?\n      `, [teamID], 'singleRow');\n    \n      const longTermObj = queryDB(`\n        SELECT Type, TargetEndYear\n        FROM Board_Objectives\n        WHERE TeamID = ?\n          AND TargetEndYear = ?\n      `, [teamID, maxTargetYear[0]], 'singleRow');\n    \n      const playerTeam = queryDB(`\n        SELECT TeamID\n        FROM Player\n      `, [], 'singleRow');\n    \n      let confidence;\n      if (playerTeam[0] == Number(teamID)) {\n        confidence = queryDB(`\n          SELECT Confidence\n          FROM Board_Confidence\n          WHERE Season = ?\n        `, [daySeason[1]], 'singleRow') || [-1];\n      } else {\n        confidence = [-1];\n      }\n    \n      const pitStats = queryDB(`\n        SELECT StatID, Val\n        FROM Staff_PitCrew_PerformanceStats\n        WHERE TeamID = ?\n      `, [teamID], 'allRows') || [];\n    \n      const pitDict = {};\n      pitStats.forEach(stat => {\n        pitDict[stat[0]] = parseFloat(Number(stat[1]).toFixed(2));\n      });\n\n      const engineId = queryDB(`SELECT engineId FROM Custom_Engine_Allocations WHERE teamId = ?`, [teamID], 'singleValue');\n      const allEngines = queryDB(`SELECT * FROM Custom_Engine_Allocations`, [], 'allRows');\n    \n      data.push(seasonObj, longTermObj, teamBalance, costCap, confidence, daySeason[1], pitDict, engineId);\n      return data;\n}\n\n// manageCostCap(teamID, amount)\nexport function manageCostCap(teamID, amount) {\n  let remaining = parseInt(amount, 10);\n\n  if (remaining > 0) {\n    while (remaining > 0) {\n      // Obtenemos la transacción negativa más reciente\n      const transaction = queryDB(`\n        SELECT ROWID, Value, Reference\n        FROM Finance_Transactions\n        WHERE TeamID = ?\n          AND AffectsCostCap = 1\n          AND Value < 0\n        ORDER BY Day DESC, ROWID DESC\n        LIMIT 1\n      `, [teamID], 'singleRow');\n\n      if (!transaction) {\n        break; \n      } else {\n        const rowid = transaction[0];\n        const value = transaction[1];\n        // reference = transaction[2]; // no se usa directamente\n\n        let amountToAdd;\n        if ((value + remaining) <= 0) {\n          amountToAdd = remaining;\n        } else {\n          amountToAdd = -value;\n        }\n\n        queryDB(`\n          UPDATE Finance_Transactions\n          SET Value = Value + ?\n          WHERE ROWID = ?\n        `, [amountToAdd, rowid], 'run');\n\n        remaining -= amountToAdd;\n      }\n    }\n  } \n  // Si remaining <= 0, insertamos una transacción que incremente el CostCap (o lo modifique negativamente)\n  else {\n    const daySeason = queryDB(`\n      SELECT Day, CurrentSeason\n      FROM Player_State\n    `, [], 'singleRow');\n    \n    queryDB(`\n      INSERT INTO Finance_Transactions\n      VALUES (?, ?, ?, 9, -1, 1)\n    `, [teamID, daySeason[0], amount], 'run');\n  }\n}\n\nexport function editTeam(info) {\n  const daySeason = queryDB(`\n    SELECT Day, CurrentSeason\n    FROM Player_State\n  `, [], 'singleRow');\n\n  const teamID = info.teamID;\n\n  // Actualización de Buildings_HQ\n  info.facilities.forEach(facility => {\n    const id = facility[0].slice(0, -1); \n    // facility[0] podría ser \"160a\", por ejemplo, y con slice(0, -1) quitas el último carácter\n    \n    queryDB(`\n      UPDATE Buildings_HQ\n      SET BuildingID = ?,\n          DegradationValue = ?\n      WHERE TeamID = ?\n        AND BuildingType = ?\n    `, [facility[0], facility[1], teamID, id], 'run');\n  });\n\n  // Board_SeasonObjectives\n  queryDB(`\n    UPDATE Board_SeasonObjectives\n    SET TargetPos = ?\n    WHERE TeamID = ?\n      AND SeasonID = ?\n  `, [info.seasonObj, teamID, daySeason[1]], 'run');\n\n  // Board_Objectives (objetivo a largo plazo)\n  const maxTargetYear = queryDB(`\n    SELECT MAX(TargetEndYear)\n    FROM Board_Objectives\n    WHERE TeamID = ?\n  `, [teamID], 'singleRow');\n  \n  queryDB(`\n    UPDATE Board_Objectives\n    SET Type = ?,\n        TargetEndYear = ?\n    WHERE TeamID = ?\n      AND TargetEndYear = ?\n  `, [info.longTermObj, info.longTermYear, teamID, maxTargetYear[0]], 'run');\n\n  // Board_Confidence\n  if (info.confidence !== \"-1\") {\n    queryDB(`\n      UPDATE Board_Confidence\n      SET Confidence = ?\n      WHERE Season = ?\n    `, [info.confidence, daySeason[1]], 'run');\n  }\n\n  // Finance_TeamBalance\n  queryDB(`\n    UPDATE Finance_TeamBalance\n    SET Balance = ?\n    WHERE TeamID = ?\n  `, [info.teamBudget, teamID], 'run');\n\n  // Ajuste de CostCap\n  manageCostCap(teamID, info.costCapEdit);\n\n  // Actualizar Staff_PitCrew_PerformanceStats\n  Object.keys(info.pitCrew).forEach(statID => {\n    queryDB(`\n      UPDATE Staff_PitCrew_PerformanceStats\n      SET Val = ?\n      WHERE TeamID = ?\n        AND StatID = ?\n    `, [info.pitCrew[statID], teamID, statID], 'run');\n  });\n\n  // La parte de manage_engine_change la manejas tú\n  manage_engine_change(teamID, info.engine);\n}\n\nexport function manage_engine_change(teamID, engineId) {\n\n  const oldEngineId = queryDB(`SELECT DesignID FROM Parts_Designs WHERE TeamID = ? AND PartType = 0`, [teamID], 'singleValue');\n  const oldERSId = queryDB(`SELECT DesignID FROM Parts_Designs WHERE TeamID = ? AND PartType = 1`, [teamID], 'singleValue');\n  const oldGearboxId = queryDB(`SELECT DesignID FROM Parts_Designs WHERE TeamID = ? AND PartType = 2`, [teamID], 'singleValue');\n\n  const nmewERSId = parseInt(engineId, 10) + 1;\n  const newGearboxId = parseInt(engineId, 10) + 2;\n\n  const newEngineStats = queryDB(`SELECT partStat, unitValue, Value FROM Custom_Engines_Stats WHERE designId = ?`, [engineId], 'allRows');\n  const newERSStats = queryDB(`SELECT partStat, unitValue, Value FROM Custom_Engines_Stats WHERE designId = ?`, [nmewERSId], 'singleRow');\n  const newGearboxStats = queryDB(`SELECT partStat, unitValue, Value FROM Custom_Engines_Stats WHERE designId = ?`, [newGearboxId], 'singleRow');\n\n  const engineStats = queryDB(`SELECT PartStat FROM Parts_Designs_StatValues WHERE DesignID = ?`, [oldEngineId], 'allRows');\n\n  engineStats.forEach(stat => {\n    const newStat = newEngineStats.find(newStat => newStat[0] === stat[0]);\n    if (newStat) {\n      queryDB(`UPDATE Parts_Designs_StatValues SET Value = ?, UnitValue =  ? WHERE DesignID = ? AND PartStat = ?`, [newStat[2], newStat[1], oldEngineId, stat[0]], 'run');\n    }\n  });\n\n  queryDB(`UPDATE Parts_Designs_StatValues SET Value = ?, UnitValue =  ? WHERE DesignID = ? AND PartStat = 15`, [newERSStats[2], newERSStats[1], oldERSId], 'run');\n  queryDB(`UPDATE Parts_Designs_StatValues SET Value = ?, UnitValue =  ? WHERE DesignID = ? AND PartStat = 15`, [newGearboxStats[2], newGearboxStats[1], oldGearboxId], 'run');\n\n  if (parseInt(engineId) <= 10){\n    const year = queryDB(`SELECT CurrentSeason FROM Player_State`, [], 'singleValue');\n    const newEngineManufacturer = queryDB(`SELECT Value FROM Parts_Enum_EngineManufacturers WHERE EngineDesignID = ?`, [engineId], 'singleValue');\n    queryDB(`UPDATE Parts_TeamHistory SET EngineManufacturer = ? WHERE TeamID = ? AND SeasonID = ?`, [newEngineManufacturer, teamID, year], 'run');\n  }\n\n  const existingAlloc = queryDB(`SELECT COUNT(1) FROM Custom_Engine_Allocations WHERE teamId = ?`, [teamID], 'singleValue');\n  if (Number(existingAlloc) > 0) {\n    queryDB(`UPDATE Custom_Engine_Allocations SET engineId = ? WHERE teamId = ?`, [engineId, teamID], 'run');\n  }\n  else {\n    queryDB(`INSERT INTO Custom_Engine_Allocations (teamId, engineId) VALUES (?, ?)`, [teamID, engineId], 'run');\n  }\n}\n"
  },
  {
    "path": "src/js/backend/scriptUtils/eidtStatsUtils.js",
    "content": "import { queryDB } from \"../dbManager\";\n\n// Constantes para referencias en la edición de mentalidad\nexport const driverStats = [2, 3, 4, 5, 6, 7, 8, 9, 10];\n\nexport const mentalityAreas = {\n  0: [5, 11, 13, 9],\n  1: [0, 2, 6, 7, 8, 14],\n  2: [1, 3, 4, 12, 10]\n};\n\nexport const mentalityEvents = {\n  0: [1, 7, 10, 13, 15, 19],\n  1: [2, 11, 12, 14, 16, 20, 21],\n  2: [0, 3, 4, 5, 6, 8, 9, 17, 18]\n};\n\nexport const mentalityOpinions = {\n  0: 10,\n  1: 3,\n  2: 0,\n  3: -4,\n  4: -10\n};\n\nexport const mentalityOverall = {\n  0: 95,\n  1: 79,\n  2: 59,\n  3: 24,\n  4: 5\n};\n\n// Editar estadísticas de un Staff (driver o staff general)\nexport function editStats(driverID, type, stats, retirement, driverNum, wants1) {\n  //creat sttasParasm from stats string to an array\n  const statsParams = stats.split(\" \");\n\n\n  if (type === \"0\") {\n    const isStats = queryDB(`\n      SELECT *\n      FROM Staff_performanceStats\n      WHERE StaffID = ?\n    `, [driverID], 'singleRow');\n\n    if (isStats) {\n      queryDB(`\n        UPDATE Staff_performanceStats\n        SET Val = CASE StatID\n          WHEN 2  THEN ?\n          WHEN 3  THEN ?\n          WHEN 4  THEN ?\n          WHEN 5  THEN ?\n          WHEN 6  THEN ?\n          WHEN 7  THEN ?\n          WHEN 8  THEN ?\n          WHEN 9  THEN ?\n          WHEN 10 THEN ?\n          ELSE Val\n        END\n        WHERE StaffID = ?\n      `, [\n        statsParams[0],\n        statsParams[1],\n        statsParams[2],\n        statsParams[3],\n        statsParams[4],\n        statsParams[5],\n        statsParams[6],\n        statsParams[7],\n        statsParams[8],\n        driverID\n      ], 'run');\n    } else {\n      const statsArray = statsParams.slice(2, 11);\n      statsArray.forEach((newStat, i) => {\n        const statID = driverStats[i];\n        queryDB(`\n          INSERT INTO Staff_performanceStats (StaffID, StatID, Val, Max)\n          VALUES (?, ?, ?, 100)\n        `, [driverID, statID, newStat], 'run');\n      });\n    }\n    queryDB(`\n      UPDATE Staff_DriverData\n      SET Improvability = ?, Aggression = ?\n      WHERE StaffID = ?\n    `, [statsParams[9], statsParams[10], driverID], 'run');\n    queryDB(`\n      UPDATE Staff_GameData\n      SET RetirementAge = ?\n      WHERE StaffID = ?\n    `, [retirement, driverID], 'run');\n\n    changeDriverNumber(driverID, driverNum);\n\n    queryDB(`\n      UPDATE Staff_DriverData\n      SET WantsChampionDriverNumber = ?\n      WHERE StaffID = ?\n    `, [wants1, driverID], 'run');\n  }\n  else if (type === \"1\") {\n    queryDB(`\n      UPDATE Staff_performanceStats\n      SET Val = CASE StatID\n        WHEN 0  THEN ?\n        WHEN 1  THEN ?\n        WHEN 14 THEN ?\n        WHEN 15 THEN ?\n        WHEN 16 THEN ?\n        WHEN 17 THEN ?\n        ELSE Val\n      END\n      WHERE StaffID = ?\n    `, [\n        statsParams[0],\n        statsParams[1],\n        statsParams[2],\n        statsParams[3],\n        statsParams[4],\n        statsParams[5],\n        driverID\n    ], 'run');\n    queryDB(`\n      UPDATE Staff_GameData\n      SET RetirementAge = ?\n      WHERE StaffID = ?\n    `, [retirement, driverID], 'run');\n  }\n  else if (type === \"2\") {\n    queryDB(`\n      UPDATE Staff_performanceStats\n      SET Val = CASE StatID\n        WHEN 13 THEN ?\n        WHEN 25 THEN ?\n        WHEN 43 THEN ?\n        ELSE Val\n      END\n      WHERE StaffID = ?\n    `, [\n        statsParams[0],\n        statsParams[1],\n        statsParams[2],\n        driverID\n    ], 'run');\n    queryDB(`\n      UPDATE Staff_GameData\n      SET RetirementAge = ?\n      WHERE StaffID = ?\n    `, [retirement, driverID], 'run');\n  }\n  else if (type === \"3\") {\n    queryDB(`\n      UPDATE Staff_performanceStats\n      SET Val = CASE StatID\n        WHEN 19 THEN ?\n        WHEN 20 THEN ?\n        WHEN 26 THEN ?\n        WHEN 27 THEN ?\n        WHEN 28 THEN ?\n        WHEN 29 THEN ?\n        WHEN 30 THEN ?\n        WHEN 31 THEN ?\n        ELSE Val\n      END\n      WHERE StaffID = ?\n    `, [\n        statsParams[0],\n        statsParams[1],\n        statsParams[2],\n        statsParams[3],\n        statsParams[4],\n        statsParams[5],\n        statsParams[6],\n        statsParams[7],\n        driverID\n    ], 'run');\n    queryDB(`\n      UPDATE Staff_GameData\n      SET RetirementAge = ?\n      WHERE StaffID = ?\n    `, [retirement, driverID], 'run');\n  }\n  else if (type === \"4\") {\n    queryDB(`\n      UPDATE Staff_performanceStats\n      SET Val = CASE StatID\n        WHEN 11 THEN ?\n        WHEN 22 THEN ?\n        WHEN 23 THEN ?\n        WHEN 24 THEN ?\n        ELSE Val\n      END\n      WHERE StaffID = ?\n    `, [\n        statsParams[0],\n        statsParams[1],\n        statsParams[2],\n        statsParams[3],\n        driverID\n    ], 'run');\n    queryDB(`\n      UPDATE Staff_GameData\n      SET RetirementAge = ?\n      WHERE StaffID = ?\n    `, [retirement, driverID], 'run');\n  }\n}\n\nexport function changeDriverNumber(driverID, newNumber) {\n  const oldNum = queryDB(`\n    SELECT Number\n    FROM Staff_DriverNumbers\n    WHERE CurrentHolder = ?\n  `, [driverID], 'singleValue');\n  if (oldNum) {\n    queryDB(`\n      UPDATE Staff_DriverNumbers\n      SET CurrentHolder = NULL\n      WHERE Number = ?\n    `, [oldNum], 'run');\n  }\n  const oldHolderOfNum = queryDB(`\n    SELECT CurrentHolder\n    FROM Staff_DriverNumbers\n    WHERE Number = ?\n  `, [newNumber], 'singleValue');\n  if (oldHolderOfNum) {\n    const emptyNumbers = queryDB(`\n      SELECT Number FROM Staff_DriverNumbers \n      WHERE CurrentHolder IS NULL\n    `, [], 'allRows');\n    if (emptyNumbers.length) {\n      const randomNum = emptyNumbers[Math.floor(Math.random() * emptyNumbers.length)][0];\n\n      queryDB(`\n        UPDATE Staff_DriverNumbers SET CurrentHolder = ? WHERE Number = ?\n      `, [oldHolderOfNum, randomNum], 'run');\n    }\n  }\n  queryDB(`\n    UPDATE Staff_DriverNumbers\n    SET CurrentHolder = ?\n    WHERE Number = ?\n  `, [driverID, newNumber], 'run');\n}\n\nexport function editName(driverID, newName) {\n  const parts = newName.split(\" \");\n  const newFirstName = parts[0];\n  const newLastName = parts.slice(1).join(\" \");\n  const stringLiteralFirstName = `[STRING_LITERAL:Value=|${newFirstName}|]`;\n  const stringLiteralLastName = `[STRING_LITERAL:Value=|${newLastName}|]`;\n  queryDB(`\n    UPDATE Staff_BasicData\n    SET FirstName = ?,\n        LastName = ?\n    WHERE StaffID = ?\n  `, [stringLiteralFirstName, stringLiteralLastName, driverID], 'run');\n}\n\nexport function editCode(driverID, newCode) {\n  const stringLiteralCode = `[STRING_LITERAL:Value=|${newCode}|]`;\n  queryDB(`\n    UPDATE Staff_DriverData\n    SET DriverCode = ?\n    WHERE StaffID = ?\n  `, [stringLiteralCode, driverID], 'run');\n}\n\n// Helpers de fechas\nexport function excelToDate(excelDate) {\n  const baseUTC = Date.UTC(1899, 11, 30); // 1899-12-30 UTC\n  return new Date(baseUTC + excelDate * 86400000);\n}\n\nexport function dateToExcel(date) {\n  const baseUTC = Date.UTC(1899, 11, 30);\n  const utcMidnight = Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());\n  return Math.floor((utcMidnight - baseUTC) / 86400000);\n}\n\nexport function excelFromYMD(year, month, day) {\n  const d = new Date(Date.UTC(year, month - 1, day));\n  return dateToExcel(d);\n}\n\nexport function changeYearsInExcelDate(excelDate, years) {\n  const oldDate = excelToDate(excelDate);\n  let newYear = oldDate.getFullYear() + years;\n  let newDate = new Date(oldDate.getTime());\n  newDate.setFullYear(newYear);\n  if (newDate.getMonth() !== oldDate.getMonth()) {\n    newDate = new Date(newYear, 1, 28);\n  }\n  const newExcelDate = dateToExcel(newDate);\n  return { newDate, newExcelDate };\n}\n\nexport function editAge(driverID, ageGap) {\n  const driverBirthdate = queryDB(`\n    SELECT DOB\n    FROM Staff_BasicData\n    WHERE StaffID = ?\n  `, [driverID], 'singleValue');\n  const { newDate, newExcelDate } = changeYearsInExcelDate(driverBirthdate, parseInt(ageGap, 10));\n  const y = newDate.getFullYear();\n  const m = newDate.getMonth() + 1;\n  const d = newDate.getDate();\n  queryDB(`\n    UPDATE Staff_BasicData\n    SET DOB = ?,\n        DOB_ISO = ?\n    WHERE StaffID = ?\n  `, [newExcelDate, `${y}-${m}-${d}`, driverID], 'run');\n}\n\nexport function editMentality(driverID, mentalityStr) {\n  if (mentalityStr !== -1) {\n    const mentalityArray = mentalityStr.split(\" \");\n    let sum = 0;\n    mentalityArray.forEach((value, area) => {\n      queryDB(`\n      UPDATE Staff_Mentality_AreaOpinions\n      SET Opinion = ?\n      WHERE StaffID = ?\n        AND Category = ?\n    `, [value, driverID, area], 'run');\n      const statuses = mentalityAreas[area];\n      const events = mentalityEvents[area];\n      sum += parseInt(value, 10);\n      statuses.forEach(status => {\n        queryDB(`\n        UPDATE Staff_Mentality_Statuses\n        SET Opinion = ?,\n            Value = ?\n        WHERE StaffID = ?\n          AND Status = ?\n      `, [value, mentalityOpinions[value], driverID, status], 'run');\n      });\n      events.forEach(ev => {\n        queryDB(`\n        UPDATE Staff_Mentality_Events\n        SET Opinion = ?,\n            Value = ?\n        WHERE StaffID = ?\n          AND Event = ?\n      `, [value, mentalityOpinions[value], driverID, ev], 'run');\n      });\n    });\n    const average = Math.floor(sum / 3);\n    queryDB(`\n    UPDATE Staff_State\n    SET Mentality = ?,\n        MentalityOpinion = ?\n    WHERE StaffID = ?\n  `, [mentalityOverall[average], average, driverID], 'run');\n  }\n}\n\nexport function editRetirement(driverID, value) {\n  queryDB(`\n    UPDATE Staff_GameData\n    SET Retired = ?\n    WHERE StaffID = ?\n  `, [value, driverID], 'run');\n}\n\nexport function editSuperlicense(driverID, value) {\n  queryDB(`\n    UPDATE Staff_DriverData\n    SET HasSuperLicense = ?,\n        HasRacedEnoughToJoinF1 = ?\n    WHERE StaffID = ?\n  `, [value, value, driverID], 'run');\n}\n\nexport function editMarketability(driverID, value) {\n  queryDB(`\n    UPDATE Staff_DriverData\n    SET Marketability = ?\n    WHERE StaffID = ?\n  `, [value, driverID], 'run');\n}\n\nexport function setAllDriversStatsTo85() {\n  queryDB(`\n    UPDATE Staff_performanceStats\n    SET Val = 85\n    WHERE StaffID IN (SELECT StaffID FROM Staff_DriverData)\n  `, [], 'run');\n}\n"
  },
  {
    "path": "src/js/backend/scriptUtils/head2head.js",
    "content": "import { queryDB } from \"../dbManager\";\n\n// Helpers para estadísticos:\nconst mean = (arr) => {\n  if (!arr.length) return 0;\n  const total = arr.reduce((acc, n) => acc + n, 0);\n  return total / arr.length;\n};\n\nconst median = (arr) => {\n  if (!arr.length) return 0;\n  const sorted = [...arr].sort((a, b) => a - b);\n  const mid = Math.floor(sorted.length / 2);\n  return (sorted.length % 2 === 1)\n    ? sorted[mid]\n    : (sorted[mid - 1] + sorted[mid]) / 2;\n};\n\nexport function fetchHead2Head(driver1ID, driver2ID, year, isCurrentYear = true) {\n\n  // 1) Obtenemos todas las carreras en las que participaron ambos pilotos\n  const racesBoth = queryDB(`\n      SELECT RaceID\n      FROM Races_Results\n      WHERE Season = ?\n        AND DriverID IN (?, ?)\n      GROUP BY RaceID\n      HAVING COUNT(DISTINCT DriverID) = 2\n    `, [year, driver1ID, driver2ID], 'allRows') || [];\n\n\n  const raceIDs = racesBoth.map(row => row[0]);\n\n  const stats = {\n    raceH2H: [0, 0],\n    qualiH2H: [0, 0],\n    dnfH2H: [0, 0],\n    podiumsH2H: [0, 0],\n    polesH2H: [0, 0],\n    winsH2H: [0, 0],\n    sprintWinsH2H: [0, 0],\n    top10H2H: [0, 0],\n    q3H2H: [0, 0],\n    frontRowH2H: [0, 0],\n\n    pointsH2H: null,\n    bestRace: null,\n    bestQuali: null,\n    raceDiffs: null,\n    qualiDiffs: null,\n    racePositionsMean: null,\n    racePositionsMedian: null,\n    qualiPositionsMean: null,\n    qualiPositionsMedian: null,\n\n    driver1: {\n      bestRace: 21,\n      bestQuali: 21,\n      avgPace: [],\n      avgQPace: [],\n      RPositions: [],\n      QPositions: [],\n      startPositions: [],\n      posGains: []\n    },\n    driver2: {\n      bestRace: 21,\n      bestQuali: 21,\n      avgPace: [],\n      avgQPace: [],\n      RPositions: [],\n      QPositions: [],\n      startPositions: [],\n      posGains: []\n    }\n  };\n\n  // 3) Iteramos en cada carrera en la que compitieron ambos\n  for (const raceID of raceIDs) {\n    const d1_QStage = queryDB(`\n        SELECT MAX(QualifyingStage)\n        FROM Races_QualifyingResults\n        WHERE RaceFormula = 1\n          AND RaceID = ?\n          AND SeasonID = ?\n          AND DriverID = ?\n      `, [raceID, year, driver1ID], 'singleValue') || 0;\n\n    const d2_QStage = queryDB(`\n        SELECT MAX(QualifyingStage)\n        FROM Races_QualifyingResults\n        WHERE RaceFormula = 1\n          AND RaceID = ?\n          AND SeasonID = ?\n          AND DriverID = ?\n      `, [raceID, year, driver2ID], 'singleValue') || 0;\n\n    let d1_QRes, d2_QRes;\n\n    if (isCurrentYear) {\n      d1_QRes = queryDB(`\n        SELECT FinishingPos\n        FROM Races_QualifyingResults\n        WHERE RaceFormula = 1\n          AND RaceID = ?\n          AND SeasonID = ?\n          AND DriverID = ?\n          AND QualifyingStage = ?\n      `, [raceID, year, driver1ID, d1_QStage], 'singleValue') || 99;\n\n      d2_QRes = queryDB(`\n        SELECT FinishingPos\n        FROM Races_QualifyingResults\n        WHERE RaceFormula = 1\n          AND RaceID = ?\n          AND SeasonID = ?\n          AND DriverID = ?\n          AND QualifyingStage = ?\n      `, [raceID, year, driver2ID, d2_QStage], 'singleValue') || 99;\n    } else {\n      d1_QRes = queryDB(`SELECT StartingPos FROM Races_Results WHERE RaceID = ? AND Season = ? AND DriverID = ?`, [raceID, year, driver1ID], 'singleValue') || 99;\n      d2_QRes = queryDB(`SELECT StartingPos FROM Races_Results WHERE RaceID = ? AND Season = ? AND DriverID = ?`, [raceID, year, driver2ID], 'singleValue') || 99;\n    }\n\n    // --- 3.3) Quién ganó el “duelo” de qualy\n    if (d1_QStage < d2_QStage) {\n      stats.qualiH2H[1] += 1;\n    } else if (d1_QStage > d2_QStage) {\n      stats.qualiH2H[0] += 1;\n    } else {\n      // misma fase de qualy\n      if (d1_QRes < d2_QRes) {\n        stats.qualiH2H[0] += 1;\n      } else if (d1_QRes > d2_QRes) {\n        stats.qualiH2H[1] += 1;\n      }\n    }\n\n    // Guardar posiciones de qualy para estadísticas finales\n    stats.driver1.QPositions.push(d1_QRes);\n    stats.driver2.QPositions.push(d2_QRes);\n\n    // --- 3.4) Lap más rápida comparando la misma fase “mínima”\n    const minStage = Math.min(d1_QStage, d2_QStage);\n\n    const d1_qLap = queryDB(`\n        SELECT FastestLap\n        FROM Races_QualifyingResults\n        WHERE RaceFormula = 1\n          AND RaceID = ?\n          AND SeasonID = ?\n          AND DriverID = ?\n          AND QualifyingStage = ?\n      `, [raceID, year, driver1ID, minStage], 'singleValue') || 0;\n\n    const d2_qLap = queryDB(`\n        SELECT FastestLap\n        FROM Races_QualifyingResults\n        WHERE RaceFormula = 1\n          AND RaceID = ?\n          AND SeasonID = ?\n          AND DriverID = ?\n          AND QualifyingStage = ?\n      `, [raceID, year, driver2ID, minStage], 'singleValue') || 0;\n\n    if (d1_qLap !== 0 && d2_qLap !== 0) {\n      stats.driver1.avgQPace.push(d1_qLap);\n      stats.driver2.avgQPace.push(d2_qLap);\n    }\n\n    // --- 3.5) Poles: Q3 y posición 1\n    if (d1_QRes === 1 && (!isCurrentYear || d1_QStage === 3)) {\n      stats.polesH2H[0] += 1;\n    }\n    if (d2_QRes === 1 && (!isCurrentYear || d2_QStage === 3)) {\n      stats.polesH2H[1] += 1;\n    }\n    if (d1_QStage === 3) {\n      stats.q3H2H[0] += 1;\n    }\n    if (d2_QStage === 3) {\n      stats.q3H2H[1] += 1;\n    }\n    if (d1_QRes <= 2) {\n      stats.frontRowH2H[0] += 1;\n    }\n    if (d2_QRes <= 2) {\n      stats.frontRowH2H[1] += 1;\n    }\n\n    // Mejor qualifying\n    if (d1_QRes < stats.driver1.bestQuali) {\n      stats.driver1.bestQuali = d1_QRes;\n    }\n    if (d2_QRes < stats.driver2.bestQuali) {\n      stats.driver2.bestQuali = d2_QRes;\n    }\n\n    // --- 3.6) Resultados de carrera\n    const d1_RRes = queryDB(`\n        SELECT FinishingPos\n        FROM Races_Results\n        WHERE RaceID = ?\n          AND Season = ?\n          AND DriverID = ?\n      `, [raceID, year, driver1ID], 'singleValue') || 99;\n\n    const d2_RRes = queryDB(`\n        SELECT FinishingPos\n        FROM Races_Results\n        WHERE RaceID = ?\n          AND Season = ?\n          AND DriverID = ?\n      `, [raceID, year, driver2ID], 'singleValue') || 99;\n    const d1_StartPos = queryDB(`\n        SELECT StartingPos\n        FROM Races_Results\n        WHERE RaceID = ?\n          AND Season = ?\n          AND DriverID = ?\n      `, [raceID, year, driver1ID], 'singleValue') || 99;\n    const d2_StartPos = queryDB(`\n        SELECT StartingPos\n        FROM Races_Results\n        WHERE RaceID = ?\n          AND Season = ?\n          AND DriverID = ?\n      `, [raceID, year, driver2ID], 'singleValue') || 99;\n\n    // ¿Quién terminó por delante?\n    if (d1_RRes < d2_RRes) {\n      stats.raceH2H[0] += 1;\n    } else if (d1_RRes > d2_RRes) {\n      stats.raceH2H[1] += 1;\n    }\n\n    // Wins\n    if (d1_RRes === 1) stats.winsH2H[0] += 1;\n    if (d2_RRes === 1) stats.winsH2H[1] += 1;\n\n    // Podios\n    if (d1_RRes <= 3) stats.podiumsH2H[0] += 1;\n    if (d2_RRes <= 3) stats.podiumsH2H[1] += 1;\n\n    // Mejor posición en carrera\n    if (d1_RRes < stats.driver1.bestRace) {\n      stats.driver1.bestRace = d1_RRes;\n    }\n    if (d2_RRes < stats.driver2.bestRace) {\n      stats.driver2.bestRace = d2_RRes;\n    }\n\n    // Guardamos posición de carrera\n    stats.driver1.RPositions.push(d1_RRes);\n    stats.driver2.RPositions.push(d2_RRes);\n    stats.driver1.startPositions.push(d1_StartPos);\n    stats.driver2.startPositions.push(d2_StartPos);\n\n    // --- 3.7) DNFs\n    const d1_RDNF = queryDB(`\n        SELECT DNF\n        FROM Races_Results\n        WHERE RaceID = ?\n          AND Season = ?\n          AND DriverID = ?\n      `, [raceID, year, driver1ID], 'singleValue') || 0;\n\n    const d2_RDNF = queryDB(`\n        SELECT DNF\n        FROM Races_Results\n        WHERE RaceID = ?\n          AND Season = ?\n          AND DriverID = ?\n      `, [raceID, year, driver2ID], 'singleValue') || 0;\n\n    if (d1_RDNF === 1) stats.dnfH2H[0] += 1;\n    if (d2_RDNF === 1) stats.dnfH2H[1] += 1;\n    if (d1_RDNF !== 1 && d1_RRes <= 10) stats.top10H2H[0] += 1;\n    if (d2_RDNF !== 1 && d2_RRes <= 10) stats.top10H2H[1] += 1;\n    if (d1_RDNF !== 1) {\n      stats.driver1.posGains.push(Number((d1_StartPos - d1_RRes).toFixed(1)));\n    }\n    if (d2_RDNF !== 1) {\n      stats.driver2.posGains.push(Number((d2_StartPos - d2_RRes).toFixed(1)));\n    }\n\n    // --- 3.8) Ritmo en carrera (avg pace) si ninguno hizo DNF\n    if (d1_RDNF !== 1 && d2_RDNF !== 1) {\n      const d1_time = queryDB(`\n          SELECT Time\n          FROM Races_Results\n          WHERE RaceID = ?\n            AND Season = ?\n            AND DriverID = ?\n        `, [raceID, year, driver1ID], 'singleValue') || 0;\n\n      const d2_time = queryDB(`\n          SELECT Time\n          FROM Races_Results\n          WHERE RaceID = ?\n            AND Season = ?\n            AND DriverID = ?\n        `, [raceID, year, driver2ID], 'singleValue') || 0;\n\n      const d1_laps = queryDB(`\n          SELECT Laps\n          FROM Races_Results\n          WHERE RaceID = ?\n            AND Season = ?\n            AND DriverID = ?\n        `, [raceID, year, driver1ID], 'singleValue') || 1;\n\n      const d2_laps = queryDB(`\n          SELECT Laps\n          FROM Races_Results\n          WHERE RaceID = ?\n            AND Season = ?\n            AND DriverID = ?\n        `, [raceID, year, driver2ID], 'singleValue') || 1;\n\n      const d1_pace = Number((d1_time / d1_laps).toFixed(3));\n      const d2_pace = Number((d2_time / d2_laps).toFixed(3));\n\n      stats.driver1.avgPace.push(d1_pace);\n      stats.driver2.avgPace.push(d2_pace);\n    }\n\n    // --- 3.9) SPRINT results\n    const d1_SRes = queryDB(`\n        SELECT FinishingPos\n        FROM Races_Sprintresults\n        WHERE RaceID = ?\n          AND SeasonID = ?\n          AND DriverID = ?\n      `, [raceID, year, driver1ID], 'singleValue');\n\n    const d2_SRes = queryDB(`\n        SELECT FinishingPos\n        FROM Races_Sprintresults\n        WHERE RaceID = ?\n          AND SeasonID = ?\n          AND DriverID = ?\n      `, [raceID, year, driver2ID], 'singleValue');\n\n    if (d1_SRes === 1) stats.sprintWinsH2H[0] += 1;\n    if (d2_SRes === 1) stats.sprintWinsH2H[1] += 1;\n  }\n\n  // 4) Puntos totales en el campeonato (no por carrera)\n  const d1_Pts = queryDB(`\n      SELECT Points\n      FROM Races_DriverStandings\n      WHERE RaceFormula = 1\n        AND SeasonID = ?\n        AND DriverID = ?\n    `, [year, driver1ID], 'singleValue') || 0;\n\n  const d2_Pts = queryDB(`\n      SELECT Points\n      FROM Races_DriverStandings\n      WHERE RaceFormula = 1\n        AND SeasonID = ?\n        AND DriverID = ?\n    `, [year, driver2ID], 'singleValue') || 0;\n\n  stats.pointsH2H = [d1_Pts, d2_Pts];\n\n  const meanRd1 = Number(mean(stats.driver1.RPositions).toFixed(1));\n  const meanRd2 = Number(mean(stats.driver2.RPositions).toFixed(1));\n  const medianRd1 = median(stats.driver1.RPositions);\n  const medianRd2 = median(stats.driver2.RPositions);\n\n  const meanQd1 = Number(mean(stats.driver1.QPositions).toFixed(1));\n  const meanQd2 = Number(mean(stats.driver2.QPositions).toFixed(1));\n  const medianQd1 = median(stats.driver1.QPositions);\n  const medianQd2 = median(stats.driver2.QPositions);\n  const meanGrid1 = Number(mean(stats.driver1.startPositions).toFixed(1));\n  const meanGrid2 = Number(mean(stats.driver2.startPositions).toFixed(1));\n  const meanGain1 = Number(mean(stats.driver1.posGains).toFixed(1));\n  const meanGain2 = Number(mean(stats.driver2.posGains).toFixed(1));\n\n  const rDifferences = stats.driver1.avgPace.map((val, i) => (stats.driver2.avgPace[i] ?? 0) - val);\n  const avg_racediff = Number(mean(rDifferences).toFixed(3));\n\n  const qDifferences = stats.driver1.avgQPace.map((val, i) => (stats.driver2.avgQPace[i] ?? 0) - val);\n  const avg_qualidiff = Number(mean(qDifferences).toFixed(3));\n\n  // 3) Armamos el array final en el mismo orden que en tu Python:\n  const resultList = [\n    stats.raceH2H,                           // 0) (raceH2H)\n    stats.qualiH2H,                          // 1) (qualiH2H)\n    stats.pointsH2H,                         // 2) (pointsH2H)\n    stats.podiumsH2H,                        // 3) (podiumsH2H)\n    [stats.driver1.bestRace, stats.driver2.bestRace],    // 4) (bestRace)\n    [stats.driver1.bestQuali, stats.driver2.bestQuali],  // 5) (bestQuali)\n    stats.dnfH2H,                            // 6) (dnfH2H)\n    stats.winsH2H,                           // 7) (winsH2H)\n    stats.polesH2H,                          // 8) (polesH2H)\n    stats.sprintWinsH2H,                     // 9) (sprintWinsH2H)\n    [-avg_racediff, avg_racediff],           // 10) (-avg_racediff, avg_racediff)\n    [-avg_qualidiff, avg_qualidiff],         // 11) (-avg_qualidiff, avg_qualidiff)\n    [meanRd1, meanRd2],                      // 12) (meanRd1, meanRd2)\n    [medianRd1, medianRd2],                  // 13) (medianRd1, medianRd2)\n    [meanQd1, meanQd2],                      // 14) (meanQd1, meanQd2)\n    [medianQd1, medianQd2],                  // 15) (medianQd1, medianQd2)\n    [meanGrid1, meanGrid2],                  // 16) (meanGrid1, meanGrid2)\n    [meanGain1, meanGain2],                  // 17) (meanGain1, meanGain2)\n    stats.top10H2H,                          // 18) (top10H2H)\n    stats.q3H2H,                             // 19) (q3H2H)\n    stats.frontRowH2H                        // 20) (frontRowH2H)\n  ];\n\n  // 4) Retornamos este array en vez de 'stats'\n  return resultList;\n}\n\nexport function fetchHead2HeadTeam(teamID1, teamID2, year, isCurrentYear = true) {\n  const t1 = teamID1;\n  const t2 = teamID2;\n  const season = year;\n\n  // 1) Obtenemos todas las carreras en las que participaron ambos equipos\n  const racesBoth = queryDB(`\n      SELECT RaceID\n      FROM Races_Results\n      WHERE Season = ?\n        AND TeamID IN (?, ?)\n      GROUP BY RaceID\n      HAVING COUNT(DISTINCT TeamID) = 2\n    `, [season, t1, t2], 'allRows') || [];\n\n  const raceIDs = racesBoth.map(row => row[0]);\n\n  // 2) Inicializamos contadores / arreglos\n  const raceH2H = [0, 0];\n  const qualiH2H = [0, 0];\n  const dnfH2H = [0, 0];\n  const bestRace = [0, 0];\n  const bestQuali = [0, 0];\n  const pointsH2H = [0, 0];\n  const podiumsH2H = [0, 0];\n  const polesH2H = [0, 0];\n  const winsH2H = [0, 0];\n  const sprintWinsH2H = [0, 0];\n  const top10H2H = [0, 0];\n  const q3H2H = [0, 0];\n  const frontRowH2H = [0, 0];\n\n  let d1_BestRace = 21;\n  let d2_BestRace = 21;\n  let d1_BestQauli = 21;\n  let d2_BestQauli = 21;\n\n  const d1_avgPace = [];\n  const d2_avgPace = [];\n  const d1_avgQPace = [];\n  const d2_avgQPace = [];\n  const d1_RPositions = [];\n  const d2_RPositions = [];\n  const d1_QPositions = [];\n  const d2_QPositions = [];\n  const d1_startPositions = [];\n  const d2_startPositions = [];\n  const d1_posGains = [];\n  const d2_posGains = [];\n\n  // 3) Iteramos por cada carrera encontrada\n  for (const raceID of raceIDs) {\n\n    // 3.1) Obtenemos todos los DriverIDs de cada equipo en Quali\n    //      (En Python, se guardan como tuples y luego se hace \"IN (drivers1_str)\").\n    //      En JS, construiremos la string manualmente.\n\n    // Pilotos del team1\n    const drivers1 = queryDB(`\n        SELECT DISTINCT DriverID\n        FROM Races_Results\n        WHERE RaceID = ?\n          AND TeamID = ?\n      `, [raceID, t1], 'allRows') || [];\n\n    // Pilotos del team2\n    const drivers2 = queryDB(`\n        SELECT DISTINCT DriverID\n        FROM Races_Results\n        WHERE RaceID = ?\n          AND TeamID = ?\n      `, [raceID, t2], 'allRows') || [];\n\n    // Transformamos el array de arrays/tuplas en un array de IDs\n    const drivers1IDs = drivers1.map(d => d[0]);\n    const drivers2IDs = drivers2.map(d => d[0]);\n\n    // Si no hay pilotos, podemos continuar a la siguiente carrera (para evitar queries \"IN ()\")\n    if (!drivers1IDs.length || !drivers2IDs.length) {\n      // Team 1 o Team 2 no participa en esta carrera, saltamos\n      continue;\n    }\n\n    // 3.2) Fase de Qualy más alta para cada equipo\n    // Note: cannot easily parameterize IN clause with array directly in all SQL dialects,\n    // but sql.js/sqlite supports `IN (?, ?, ...)`\n    // We will construct the placeholders string.\n    const d1Placeholders = drivers1IDs.map(() => '?').join(',');\n    const d2Placeholders = drivers2IDs.map(() => '?').join(',');\n\n    const d1_QStage = queryDB(`\n        SELECT MAX(QualifyingStage)\n        FROM Races_QualifyingResults\n        WHERE RaceFormula = 1\n          AND RaceID = ?\n          AND SeasonID = ?\n          AND DriverID IN (${d1Placeholders})\n      `, [raceID, season, ...drivers1IDs], 'singleValue') || 0;\n\n    const d2_QStage = queryDB(`\n        SELECT MAX(QualifyingStage)\n        FROM Races_QualifyingResults\n        WHERE RaceFormula = 1\n          AND RaceID = ?\n          AND SeasonID = ?\n          AND DriverID IN (${d2Placeholders})\n      `, [raceID, season, ...drivers2IDs], 'singleValue') || 0;\n\n    let d1_QRes, d2_QRes;\n\n    // 3.3) Posición mínima en esa fase de Qualy (equivalente a \"SELECT MIN(FinishingPos)\")\n    if (isCurrentYear) {\n      d1_QRes = queryDB(`\n        SELECT MIN(FinishingPos)\n        FROM Races_QualifyingResults\n        WHERE RaceFormula = 1\n          AND RaceID = ?\n          AND SeasonID = ?\n          AND DriverID IN (${d1Placeholders})\n          AND QualifyingStage = ?\n      `, [raceID, season, ...drivers1IDs, d1_QStage], 'singleValue') || 99;\n\n      d2_QRes = queryDB(`\n        SELECT MIN(FinishingPos)\n        FROM Races_QualifyingResults\n        WHERE RaceFormula = 1\n          AND RaceID = ?\n          AND SeasonID = ?\n          AND DriverID IN (${d2Placeholders})\n          AND QualifyingStage = ?\n      `, [raceID, season, ...drivers2IDs, d2_QStage], 'singleValue') || 99;\n    } else {\n      d1_QRes = queryDB(`SELECT MIN(StartingPos) FROM Races_Results WHERE RaceID = ? AND Season = ? AND DriverID IN (${d1Placeholders})`, [raceID, season, ...drivers1IDs], 'singleValue') || 99;\n      d2_QRes = queryDB(`SELECT MIN(StartingPos) FROM Races_Results WHERE RaceID = ? AND Season = ? AND DriverID IN (${d2Placeholders})`, [raceID, season, ...drivers2IDs], 'singleValue') || 99;\n    }\n\n    // 3.4) Comparativa H2H de qualy\n    if (d1_QStage < d2_QStage) {\n      qualiH2H[1] += 1;\n    } else if (d1_QStage > d2_QStage) {\n      qualiH2H[0] += 1;\n    } else {\n      // misma fase de qualy\n      if (d1_QRes < d2_QRes) {\n        qualiH2H[0] += 1;\n      } else if (d1_QRes > d2_QRes) {\n        qualiH2H[1] += 1;\n      }\n    }\n\n    // 3.5) Lap más rápida comparando la misma fase mínima\n    const minQ = Math.min(d1_QStage, d2_QStage);\n\n    const d1_qLap = queryDB(`\n        SELECT FastestLap\n        FROM Races_QualifyingResults\n        WHERE RaceFormula = 1\n          AND RaceID = ?\n          AND SeasonID = ?\n          AND DriverID IN (${d1Placeholders})\n          AND QualifyingStage = ?\n      `, [raceID, season, ...drivers1IDs, minQ], 'singleValue') || 0;\n\n    const d2_qLap = queryDB(`\n        SELECT FastestLap\n        FROM Races_QualifyingResults\n        WHERE RaceFormula = 1\n          AND RaceID = ?\n          AND SeasonID = ?\n          AND DriverID IN (${d2Placeholders})\n          AND QualifyingStage = ?\n      `, [raceID, season, ...drivers2IDs, minQ], 'singleValue') || 0;\n\n    if (d1_qLap !== 0 && d2_qLap !== 0) {\n      d1_avgQPace.push(d1_qLap);\n      d2_avgQPace.push(d2_qLap);\n    }\n\n    // Poles: si QStage = 3 y la \"mejor\" posición = 1\n    if (d1_QRes === 1 && (!isCurrentYear || d1_QStage === 3)) {\n      polesH2H[0] += 1;\n    }\n    if (d2_QRes === 1 && (!isCurrentYear || d2_QStage === 3)) {\n      polesH2H[1] += 1;\n    }\n    if (d1_QStage === 3) {\n      q3H2H[0] += 1;\n    }\n    if (d2_QStage === 3) {\n      q3H2H[1] += 1;\n    }\n    if (d1_QRes <= 2) {\n      frontRowH2H[0] += 1;\n    }\n    if (d2_QRes <= 2) {\n      frontRowH2H[1] += 1;\n    }\n\n    // Best Quali\n    if (d1_QRes < d1_BestQauli) {\n      d1_BestQauli = d1_QRes;\n    }\n    if (d2_QRes < d2_BestQauli) {\n      d2_BestQauli = d2_QRes;\n    }\n\n    // 3.6) Resultados de carrera (usamos MIN(FinishingPos))\n    const d1_RRes = queryDB(`\n        SELECT MIN(FinishingPos)\n        FROM Races_Results\n        WHERE RaceID = ?\n          AND Season = ?\n          AND DriverID IN (${d1Placeholders})\n      `, [raceID, season, ...drivers1IDs], 'singleValue') || 99;\n\n    const d2_RRes = queryDB(`\n        SELECT MIN(FinishingPos)\n        FROM Races_Results\n        WHERE RaceID = ?\n          AND Season = ?\n          AND DriverID IN (${d2Placeholders})\n      `, [raceID, season, ...drivers2IDs], 'singleValue') || 99;\n    const d1_StartPos = queryDB(`\n        SELECT MIN(StartingPos)\n        FROM Races_Results\n        WHERE RaceID = ?\n          AND Season = ?\n          AND DriverID IN (${d1Placeholders})\n      `, [raceID, season, ...drivers1IDs], 'singleValue') || 99;\n    const d2_StartPos = queryDB(`\n        SELECT MIN(StartingPos)\n        FROM Races_Results\n        WHERE RaceID = ?\n          AND Season = ?\n          AND DriverID IN (${d2Placeholders})\n      `, [raceID, season, ...drivers2IDs], 'singleValue') || 99;\n\n    // Wins\n    if (d1_RRes === 1) winsH2H[0] += 1;\n    if (d2_RRes === 1) winsH2H[1] += 1;\n\n    // Race H2H\n    if (d1_RRes < d2_RRes) {\n      raceH2H[0] += 1;\n    } else if (d1_RRes > d2_RRes) {\n      raceH2H[1] += 1;\n    }\n    d1_RPositions.push(d1_RRes);\n    d2_RPositions.push(d2_RRes);\n    d1_startPositions.push(d1_StartPos);\n    d2_startPositions.push(d2_StartPos);\n\n    // Podios\n    if (d1_RRes <= 3) podiumsH2H[0] += 1;\n    if (d2_RRes <= 3) podiumsH2H[1] += 1;\n    if (d1_RRes <= 10) top10H2H[0] += 1;\n    if (d2_RRes <= 10) top10H2H[1] += 1;\n\n    // Best Race\n    if (d1_RRes < d1_BestRace) {\n      d1_BestRace = d1_RRes;\n    }\n    if (d2_RRes < d2_BestRace) {\n      d2_BestRace = d2_RRes;\n    }\n\n    // 3.7) DNF => sumamos\n    const d1_RDNF = queryDB(`\n        SELECT SUM(DNF)\n        FROM Races_Results\n        WHERE RaceID = ?\n          AND Season = ?\n          AND DriverID IN (${d1Placeholders})\n      `, [raceID, season, ...drivers1IDs], 'singleValue') || 0;\n\n    const d2_RDNF = queryDB(`\n        SELECT SUM(DNF)\n        FROM Races_Results\n        WHERE RaceID = ?\n          AND Season = ?\n          AND DriverID IN (${d2Placeholders})\n      `, [raceID, season, ...drivers2IDs], 'singleValue') || 0;\n\n    dnfH2H[0] += d1_RDNF;\n    dnfH2H[1] += d2_RDNF;\n    if (d1_RDNF === 0) {\n      d1_posGains.push(Number((d1_StartPos - d1_RRes).toFixed(1)));\n    }\n    if (d2_RDNF === 0) {\n      d2_posGains.push(Number((d2_StartPos - d2_RRes).toFixed(1)));\n    }\n\n\n    // 3.8) Ritmo de carrera (si al menos un piloto del equipo no hizo DNF)\n    const d1_racePaceStats = queryDB(`\n        SELECT COUNT(*), AVG(Time), AVG(Laps)\n        FROM Races_Results\n        WHERE RaceID = ?\n          AND Season = ?\n          AND DriverID IN (${d1Placeholders})\n          AND DNF = 0\n      `, [raceID, season, ...drivers1IDs], 'singleRow') || [0, 0, 0];\n\n    if (d1_racePaceStats[0] > 0) { // [0] is COUNT\n      const avgTime = d1_racePaceStats[1];\n      const avgLaps = d1_racePaceStats[2];\n      if (avgLaps && avgTime) {\n        const pace = Number((avgTime / avgLaps).toFixed(3));\n        d1_avgPace.push(pace);\n      }\n    }\n\n    const d2_racePaceStats = queryDB(`\n        SELECT COUNT(*), AVG(Time), AVG(Laps)\n        FROM Races_Results\n        WHERE RaceID = ?\n          AND Season = ?\n          AND DriverID IN (${d2Placeholders})\n          AND DNF = 0\n      `, [raceID, season, ...drivers2IDs], 'singleRow') || [0, 0, 0];\n\n    if (d2_racePaceStats[0] > 0) { // [0] is COUNT\n      const avgTime = d2_racePaceStats[1];\n      const avgLaps = d2_racePaceStats[2];\n      if (avgLaps && avgTime) {\n        const pace = Number((avgTime / avgLaps).toFixed(3));\n        d2_avgPace.push(pace);\n      }\n    }\n\n    // 3.9) Sprint results (MIN FinishingPos)\n    const d1_SRes = queryDB(`\n        SELECT MIN(FinishingPos)\n        FROM Races_Sprintresults\n        WHERE RaceID = ?\n          AND SeasonID = ?\n          AND DriverID IN (${d1Placeholders})\n      `, [raceID, season, ...drivers1IDs], 'singleValue');\n\n    const d2_SRes = queryDB(`\n        SELECT MIN(FinishingPos)\n        FROM Races_Sprintresults\n        WHERE RaceID = ?\n          AND SeasonID = ?\n          AND DriverID IN (${d2Placeholders})\n      `, [raceID, season, ...drivers2IDs], 'singleValue');\n\n    if (d1_SRes === 1) {\n      sprintWinsH2H[0] += 1;\n    }\n    if (d2_SRes === 1) {\n      sprintWinsH2H[1] += 1;\n    }\n    d1_QPositions.push(d1_QRes);\n    d2_QPositions.push(d2_QRes);\n  }\n\n  // 4) Puntos de cada equipo en el campeonato (TeamStandings)\n  const d1_Pts = queryDB(`\n      SELECT Points\n      FROM Races_TeamStandings\n      WHERE RaceFormula = 1\n        AND SeasonID = ?\n        AND TeamID = ?\n    `, [season, t1], 'singleValue') || 0;\n\n  const d2_Pts = queryDB(`\n      SELECT Points\n      FROM Races_TeamStandings\n      WHERE RaceFormula = 1\n        AND SeasonID = ?\n        AND TeamID = ?\n    `, [season, t2], 'singleValue') || 0;\n\n  pointsH2H[0] = d1_Pts;\n  pointsH2H[1] = d2_Pts;\n\n  bestRace[0] = d1_BestRace;\n  bestRace[1] = d2_BestRace;\n  bestQuali[0] = d1_BestQauli;\n  bestQuali[1] = d2_BestQauli;\n\n  // 5) Calculamos la diferencia media de ritmo (race y quali).\n  //    rDifferences = (d2_avg - d1_avg) para cada par\n  const rDifferences = d1_avgPace.map((val, i) => {\n    const d2Val = d2_avgPace[i] || 0;\n    return d2Val - val;\n  });\n\n  const qDifferences = d1_avgQPace.map((val, i) => {\n    const d2Val = d2_avgQPace[i] || 0;\n    return d2Val - val;\n  });\n\n  // Helpers para la media\n  const mean = (arr) => {\n    if (!arr.length) return 0;\n    const sum = arr.reduce((acc, num) => acc + num, 0);\n    return sum / arr.length;\n  };\n\n  const avg_racediff = Number(mean(rDifferences).toFixed(3));\n  const avg_qualidiff = Number(mean(qDifferences).toFixed(3));\n  const meanRd1 = Number(mean(d1_RPositions).toFixed(1));\n  const meanRd2 = Number(mean(d2_RPositions).toFixed(1));\n  const medianRd1 = median(d1_RPositions);\n  const medianRd2 = median(d2_RPositions);\n  const meanQd1 = Number(mean(d1_QPositions).toFixed(1));\n  const meanQd2 = Number(mean(d2_QPositions).toFixed(1));\n  const medianQd1 = median(d1_QPositions);\n  const medianQd2 = median(d2_QPositions);\n  const meanGrid1 = Number(mean(d1_startPositions).toFixed(1));\n  const meanGrid2 = Number(mean(d2_startPositions).toFixed(1));\n  const meanGain1 = Number(mean(d1_posGains).toFixed(1));\n  const meanGain2 = Number(mean(d2_posGains).toFixed(1));\n\n\n  const resultList = [\n    raceH2H,\n    qualiH2H,\n    pointsH2H,\n    podiumsH2H,\n    bestRace,\n    bestQuali,\n    dnfH2H,\n    winsH2H,\n    polesH2H,\n    sprintWinsH2H,\n    [-avg_racediff, avg_racediff],\n    [-avg_qualidiff, avg_qualidiff],\n    [meanRd1, meanRd2],\n    [medianRd1, medianRd2],\n    [meanQd1, meanQd2],\n    [medianQd1, medianQd2],\n    [meanGrid1, meanGrid2],\n    [meanGain1, meanGain2],\n    top10H2H,\n    q3H2H,\n    frontRowH2H\n  ];\n\n  // 7) Retornamos el array final\n  return resultList;\n}\n"
  },
  {
    "path": "src/js/backend/scriptUtils/modUtils.js",
    "content": "import { getGlobals } from \"../commandGlobals.js\";\nimport { queryDB, setMetaData, getMetadata } from \"../dbManager.js\";\nimport { excelToDate, dateToExcel, changeDriverNumber, excelFromYMD } from \"./eidtStatsUtils.js\";\nimport { editContract, fireDriver, hireDriver, rearrangeDriverEngineerPairings, removeFutureContract } from \"./transferUtils.js\";\nimport { editSuperlicense } from \"./eidtStatsUtils.js\";\nimport { getBestParts, applyBoostToCarStats, getTyreDegStats, updateTyreDegStats, getPerformanceAllTeams, applyExpertiseBoost } from \"./carAnalysisUtils.js\";\nimport contracts from \"../../../data/contracts_2025.json\"\nimport changes from \"../../../data/2025_changes.json\"\nimport changes2026 from \"../../../data/2026_changes.json\"\nimport tables2026 from \"../../../data/tables_2026.json\"\nimport { editEngines, fetchEngines, setCustomSaveConfig, updateCustomEngines, wipeTableAndRefill } from \"./dbUtils.js\";\nimport { update } from \"idb-keyval\";\nimport { manage_engine_change } from \"./editTeamUtils.js\";\n\nlet staffIDChanges = {};\nlet newStaffIDCounter = 800;\n\nexport function resetStaffIDChanges() {\n    staffIDChanges = {};\n    newStaffIDCounter = 800;\n}\n\nexport function timeTravelWithData(dayNumber, extend = false, mod = \"2025\") {\n    let metadata, version;\n    metadata = getMetadata();\n    version = metadata.gvasHeader.SaveGameVersion;\n    let yearIteration = getGlobals().yearIteration;\n\n    const daySeasonRow = queryDB(`\n    SELECT Day, CurrentSeason\n    FROM Player_State\n  `, [], 'singleRow');\n\n    const vanillaSeason = daySeasonRow[1]; // ORIGINAL SEASON\n    const VanillaDay = daySeasonRow[0];\n\n    const wayBackSeason = excelToDate(dayNumber).getFullYear(); // SEASON TO TIME TRAVEL TO\n    let moddedDayNumber;\n    if (mod === \"2025\") {\n        moddedDayNumber = dateToExcel(new Date(`${wayBackSeason}-12-29`));\n    }\n    else if (mod === \"2026\") {\n        moddedDayNumber = dateToExcel(new Date(`${wayBackSeason}-12-28`));\n    }\n\n    const seasonStartDayNumber = excelFromYMD(wayBackSeason, 1, 1);\n    const vanillaDayNumber = excelFromYMD(vanillaSeason, 1, 1);\n\n    let dd = vanillaDayNumber - seasonStartDayNumber; // DAY DIFFERENCE BETWEEN THE START OF THE VANILLA SEASON AND THE START OF THE WAY BACK SEASON\n    const yd = vanillaSeason - wayBackSeason;\n\n    const metaProperty = metadata.gvasMeta.Properties.Properties\n        .filter(p => p.Name === \"MetaData\")[0];\n\n    metaProperty.Properties[0].Properties.forEach(x => {\n        if (x.Name === \"Day\") {\n            x.Property = moddedDayNumber;\n        }\n    });\n\n    queryDB(`UPDATE Player_State SET Day = ?`, [moddedDayNumber], 'run');\n    queryDB(`UPDATE Player_State SET CurrentSeason = ?`, [wayBackSeason], 'run');\n\n    queryDB(`\n        UPDATE Calendar_LastActivityDates\n        SET\n          LastScoutDate = ?,\n          LastEngineerDate = ?,\n          LastDesignProjectDate = ?,\n          LastResearchProjectDate = ?\n      `, [seasonStartDayNumber, seasonStartDayNumber, seasonStartDayNumber, seasonStartDayNumber], 'run');\n\n    // Ajuste en las tablas de partes/diseños\n    queryDB(`UPDATE Parts_Designs SET DayCreated = DayCreated - ? WHERE DayCreated > 0`, [dd], 'run');\n    queryDB(`UPDATE Parts_Designs SET DayCompleted = DayCompleted - ? WHERE DayCompleted > 0`, [dd], 'run');\n    queryDB(`UPDATE Parts_Designs SET ValidFrom = ValidFrom - ?`, [yd], 'run');\n\n    // Elimino Sponsorship_GuaranteesAndIncentives\n    if (yearIteration === \"23\") {\n        queryDB(`DELETE FROM Sponsorship_GuaranteesAndIncentives`, [], 'run');\n    }\n\n    // Elimino temporadas y carreras de otros años\n    queryDB(`DELETE FROM Races WHERE SeasonID != ?`, [vanillaSeason], 'run');\n    queryDB(`DELETE FROM Seasons WHERE SeasonID != ?`, [vanillaSeason], 'run');\n\n    // Si extiendo, cambio el estado de la temporada\n    if (extend) {\n        queryDB(`\n          UPDATE Races\n          SET\n            SeasonID = ?,\n            State = 2\n          WHERE SeasonID = ?\n        `, [wayBackSeason, vanillaSeason], 'run');\n    } else {\n        //with State = 2 we move the races to the actual days of the new season but mark them as completed\n        queryDB(`UPDATE Races SET SeasonID = ?, Day = Day - ?, State = 2 WHERE SeasonID = ?`, [wayBackSeason, dd, vanillaSeason], 'run')\n    }\n\n    // ============================================================\n    // FIX GOD BISESTOS: Seasons_Deadlines (NO usar dd para Day)\n    // ============================================================\n    // Primero leo las filas ANTES de actualizar SeasonID, para saber qué mover\n    const deadlinesRows = queryDB(\n        `SELECT rowid AS _rowid_, SeasonID, Day FROM Seasons_Deadlines WHERE SeasonID = ?`,\n        [vanillaSeason],\n        'allRows'\n    );\n\n    // Actualizo SeasonID como antes (esto sí puede ir con yd)\n    queryDB(`\n        UPDATE Seasons_Deadlines\n        SET\n          SeasonID = SeasonID - ?\n        WHERE SeasonID = ?\n      `, [yd, vanillaSeason], 'run');\n\n    // Recalculo Day preservando mes/día (UTC) para evitar off-by-one por bisiestos\n    const excelEpochUTC = Date.UTC(1899, 11, 30);\n    for (const row of deadlinesRows) {\n        const rowid = row._rowid_ ?? row[0];\n        const originalDay = row.Day ?? row[2];\n\n        if (originalDay == null || Number(originalDay) <= 0) continue;\n\n        const d = new Date(excelEpochUTC + Number(originalDay) * 86400000);\n\n        // Mantener mes/día, pero cambiar el año relativo al salto de temporadas\n        const targetYear = d.getUTCFullYear() - yd; // equivalente a + (wayBackSeason - vanillaSeason)\n\n        // Clamp por si existiera 29 feb -> 28 feb en año no bisiesto\n        const maxDayInTargetMonth = new Date(Date.UTC(targetYear, d.getUTCMonth() + 1, 0)).getUTCDate();\n        const safeDay = Math.min(d.getUTCDate(), maxDayInTargetMonth);\n\n        const remappedUTC = Date.UTC(targetYear, d.getUTCMonth(), safeDay);\n        const remappedExcel = Math.floor((remappedUTC - excelEpochUTC) / 86400000);\n\n        queryDB(\n            `UPDATE Seasons_Deadlines SET Day = ? WHERE rowid = ?`,\n            [remappedExcel, rowid],\n            'run'\n        );\n    }\n\n    // Ajustes para versiones >= 3\n    if (version >= 3) {\n        queryDB(`UPDATE Player SET FirstGameDay = ?`, [moddedDayNumber], 'run');\n        queryDB(`UPDATE Player_Record SET StartSeason = ?`, [wayBackSeason], 'run');\n        queryDB(`UPDATE Player_History SET StartDay = ?`, [seasonStartDayNumber], 'run');\n        queryDB(`UPDATE Staff_PitCrew_DevelopmentPlan SET Day = Day - ? WHERE Day > 40000`, [dd], 'run');\n        queryDB(`UPDATE Onboarding_Tutorial_RestrictedActions SET TutorialIsActiveSetting = 0`, [], 'run');\n    }\n\n    // Ajustes para versión === 2\n    if (version === 2) {\n        queryDB(`UPDATE Onboarding_Tutorial_RestrictedActions SET Allowed = 0`, [], 'run');\n    }\n\n    let prestigeTableName = \"Board_Prestige\";\n    if (yearIteration === \"24\") {\n        prestigeTableName = \"Board_TeamRating\";\n    }\n\n    // Pares de tablas y columnas a modificar\n    const moddingPairs = [\n        {\n            table: [\"Staff_Contracts\"],\n            modDay: [\"StartDay\"],\n            modSeason: [\"EndSeason\"],\n        },\n        {\n            table: [\"Staff_CareerHistory\"],\n            modDay: [\"StartDay\", \"EndDay\"],\n            modSeason: [],\n        },\n        {\n            table: [\"Mail_EventPool_Cooldown\"],\n            modDay: [\"NextTriggerDay\"],\n            modSeason: [],\n            versions: [3],\n        },\n        {\n            table: [\"Board_Confidence\"],\n            modDay: [],\n            modSeason: [\"Season\"],\n        },\n        {\n            table: [\"Board_Objectives\"],\n            modDay: [],\n            modSeason: [\"StartYear\", \"TargetEndYear\"],\n        },\n        {\n            table: [\n                prestigeTableName,\n                \"Board_SeasonObjectives\",\n                \"Seasons\",\n                \"Parts_TeamHistory\",\n                \"Races_Strategies\",\n                \"Staff_Driver_RaceRecordPerSeason\"\n            ],\n            modDay: [],\n            modSeason: [\"SeasonID\"],\n        },\n        {\n            table: [\"Mail_Inbox\"],\n            modDay: [\"Day\"],\n            modSeason: [],\n        },\n        {\n            table: [\"Races_DriverStandings\", \"Races_TeamStandings\"],\n            modDay: [],\n            modSeason: [\"SeasonID\"],\n        },\n        {\n            table: [\"Races_PitCrewStandings\"],\n            modDay: [],\n            modSeason: [\"SeasonID\"],\n            versions: [3],\n        },\n    ];\n\n    // Aplico modificaciones en masa\n    for (const pair of moddingPairs) {\n        if (pair.versions && !pair.versions.includes(version)) {\n            continue;\n        }\n        for (const table of pair.table) {\n            for (const md of pair.modDay) {\n                queryDB(`UPDATE ${table} SET ${md} = ${md} - ?`, [dd], 'run');\n            }\n            for (const ms of pair.modSeason) {\n                queryDB(`UPDATE ${table} SET ${ms} = ${ms} - ? WHERE ${ms} = ?`, [yd, vanillaSeason], 'run');\n            }\n        }\n    }\n\n    // Obtengo la lista de tablas\n    const allTables = queryDB(\n        \"SELECT name FROM sqlite_master WHERE type='table' ORDER BY name ASC\",\n        [],\n        \"allRows\"\n    );\n\n    for (const row of allTables) {\n        const table = row[0];\n\n        if (table.startsWith(\"Teams_RaceRecord\")) {\n            queryDB(`DELETE FROM ${table}`, [], 'run');\n        }\n\n        if (table === \"Races_Results\") {\n            queryDB(`DELETE FROM ${table} WHERE Season != ?`, [vanillaSeason], 'run');\n            queryDB(`UPDATE ${table} SET Season = Season - ? WHERE Season = ?`, [yd, vanillaSeason], 'run');\n        } else if (table.startsWith(\"Races\") && table.endsWith(\"Results\")) {\n            queryDB(`DELETE FROM ${table} WHERE SeasonID != ?`, [vanillaSeason], 'run');\n            queryDB(`UPDATE ${table} SET SeasonID = SeasonID - ? WHERE SeasonID = ?`, [yd, vanillaSeason], 'run');\n        }\n    }\n\n    if (extend) {\n        queryDB(`UPDATE Staff_Contracts SET EndSeason = EndSeason + 1`, [], 'run');\n    }\n\n    setMetaData(metadata)\n    if (mod === \"2025\") {\n        updateSeasonModTable(\"time-travel\", 1, \"2025\");\n    }\n    else if (mod === \"2026\") {\n        updateSeasonModTable(\"time-travel-2026\", 1, \"2026\");\n    }\n}\n\nexport function changeDriverLineUps() {\n    if (contracts.Updates && Array.isArray(contracts.Updates)) {\n        contracts.Updates.forEach((update) => {\n            const hasContractWithTeam32 = queryDB(`SELECT * FROM Staff_Contracts WHERE StaffID = ? AND TeamID = 32`, [update.DriverID], \"singleRow\");\n            if (!hasContractWithTeam32) {\n                const {\n                    DriverID,\n                    salary,\n                    EndSeason,\n                    StartingBonus,\n                    RaceBonus,\n                    RaceBonusTargetPos\n                } = update;\n\n                editContract(\n                    DriverID,\n                    salary,\n                    EndSeason,\n                    StartingBonus,\n                    RaceBonus,\n                    RaceBonusTargetPos\n                );\n            }\n        });\n    }\n\n    if (contracts.Fires && Array.isArray(contracts.Fires)) {\n        contracts.Fires.forEach((fire) => {\n            const { DriverID, TeamID, ExtraTeamID, Retire, PosInTeam } = fire;\n\n            if (TeamID !== null && TeamID !== undefined) {\n                modFire(DriverID, TeamID, PosInTeam);\n            }\n            if (Retire !== null && Retire !== undefined) {\n                queryDB(`UPDATE Staff_GameData SET Retired = 0 WHERE StaffID = ?`, [DriverID], 'run');\n            }\n        });\n    }\n\n    if (contracts.Hires && Array.isArray(contracts.Hires)) {\n        contracts.Hires.forEach((hire) => {\n            const hasContractWithTeam32 = queryDB(`SELECT * FROM Staff_Contracts WHERE StaffID = ? AND TeamID = 32`, [hire.DriverID], \"singleRow\");\n            if (!hasContractWithTeam32) {\n                const {\n                    DriverID,\n                    TeamID,\n                    PosInTeam,\n                    Salary,\n                    StartingBonus,\n                    RaceBonus,\n                    RaceBonusTargetPos,\n                    EndSeason,\n                    BreakoutClause,\n                    GrantsSuperLicense\n                } = hire;\n\n                if (GrantsSuperLicense) {\n                    editSuperlicense(DriverID, GrantsSuperLicense);\n                }\n\n                const contractExists = queryDB(`SELECT * FROM Staff_Contracts WHERE StaffID = ? AND TeamID = ? AND ContractType = 0`, [DriverID, TeamID], \"singleRow\");\n                if (!contractExists) {\n                    hireDriver(\n                        \"manual\",\n                        DriverID,\n                        TeamID,\n                        PosInTeam,\n                        Salary,\n                        StartingBonus,\n                        RaceBonus,\n                        RaceBonusTargetPos,\n                        EndSeason,\n                        \"24\"\n                    );\n                }\n            }\n        });\n\n    }\n\n    if (contracts.StaffHires && Array.isArray(contracts.StaffHires)) {\n        contracts.StaffHires.forEach((hire) => {\n            const hasContractWithTeam32 = queryDB(`SELECT * FROM Staff_Contracts WHERE StaffID = ? AND TeamID = 32`, [hire.StaffID], \"singleRow\");\n            if (!hasContractWithTeam32) {\n                const {\n                    StaffID,\n                    TeamID,\n                    PosInTeam,\n                    Salary,\n                    StartingBonus,\n                    RaceBonus,\n                    RaceBonusTargetPos,\n                    EndSeason,\n                    BreakoutClause\n                } = hire;\n\n                hireDriver(\n                    \"manual\",\n                    StaffID,\n                    TeamID,\n                    PosInTeam,\n                    Salary,\n                    StartingBonus,\n                    RaceBonus,\n                    RaceBonusTargetPos,\n                    EndSeason,\n                    \"24\"\n                );\n            }\n        });\n\n    }\n\n\n    const f1Workers = queryDB(`SELECT StaffID FROM Staff_Contracts WHERE TeamID <= 10 AND PosInTeam <= 2`, [], \"allRows\");\n    f1Workers.forEach((worker) => {\n        removeFutureContract(worker[0]);\n    });\n    changeDriverNumber(95, 30);\n\n    updateSeasonModTable(\"change-line-ups\", 1, \"2025\");\n\n}\n\nexport function modFire(driverID, teamID, PosInTeam) {\n    const isInTeam = queryDB(`SELECT * FROM Staff_Contracts WHERE StaffID = ? AND TeamID = ? AND ContractType = 0`, [driverID, teamID], \"singleRow\");\n    if (isInTeam) {\n        const position = queryDB(`SELECT PosInTeam FROM Staff_Contracts WHERE StaffID = ?`, [driverID], \"singleValue\");\n        queryDB(`DELETE FROM Staff_Contracts WHERE StaffID = ? AND ContractType = 0 AND TeamID = ?`, [driverID, teamID], 'run');\n        if (position < 3) {\n            queryDB(`UPDATE Staff_DriverData SET AssignedCarNumber = NULL WHERE StaffID = ?`, [driverID], 'run');\n        }\n        const engineerID = queryDB(\n            `SELECT RaceEngineerID FROM Staff_RaceEngineerDriverAssignments WHERE IsCurrentAssignment = 1 AND DriverID = ?`,\n            [driverID], \"singleValue\"\n        );\n        if (engineerID) {\n            queryDB(`UPDATE Staff_RaceEngineerDriverAssignments SET IsCurrentAssignment = 0 WHERE RaceEngineerID = ? AND DriverID = ?`, [engineerID, driverID], 'run');\n        }\n    }\n    else {\n        const staffType = queryDB(`SELECT StaffType FROM Staff_GameData WHERE StaffID = ?`, [driverID], \"singleValue\");\n        const replacement = queryDB(`SELECT con.StaffID FROM Staff_Contracts con\n            JOIN Staff_GameData gd ON con.StaffID = gd.StaffID\n            WHERE gd.StaffType = ? AND\n            con.TeamID = ? AND con.PosInTeam = ? AND con.ContractType = 0`, [staffType, teamID, PosInTeam], \"singleValue\");\n        if (replacement) {\n            queryDB(`DELETE FROM Staff_Contracts WHERE StaffID = ? AND ContractType = 0 AND TeamID = ?`, [replacement, teamID], 'run');\n            if (PosInTeam < 3) {\n                queryDB(`UPDATE Staff_DriverData SET AssignedCarNumber = NULL WHERE StaffID = ?`, [replacement], 'run');\n            }\n            const engineerID = queryDB(\n                `SELECT RaceEngineerID FROM Staff_RaceEngineerDriverAssignments WHERE IsCurrentAssignment = 1 AND DriverID = ?`,\n                [replacement], \"singleValue\"\n            );\n            if (engineerID) {\n                queryDB(`UPDATE Staff_RaceEngineerDriverAssignments SET IsCurrentAssignment = 0 WHERE RaceEngineerID = ? AND DriverID = ?`, [engineerID, replacement], 'run');\n            }\n        }\n    }\n}\n\nexport function changeStats() {\n    if (!changes.Stats || !Array.isArray(changes.Stats)) {\n        console.log(\"No stats found\");\n    }\n    else {\n        for (const entry of changes.Stats) {\n            const { StaffID, StatID, Val, Max } = entry;\n\n            queryDB(`\n            UPDATE Staff_PerformanceStats\n            SET Val = ?, Max = ?\n            WHERE StaffID = ? AND StatID = ?\n          `, [Val, Max, StaffID, StatID], 'run');\n\n        }\n    }\n    updateSeasonModTable(\"change-stats\", 1, \"2025\");\n\n}\n\nexport function changeDriverEngineerPairs() {\n    if (!changes.TeamLineUps || !Array.isArray(changes.TeamLineUps)) {\n        console.error(\"No driver-engineer pairs\");\n    } else {\n        for (const entry of changes.TeamLineUps) {\n            const { TeamID, Driver1, Engineer1, Driver2, Engineer2 } = entry;\n\n            const areAllInSameTeam =\n                queryDB(`SELECT * FROM Staff_Contracts WHERE StaffID = ? AND TeamID = ? AND PosInTeam <= 2 AND ContractType = 0`, [Driver1, TeamID], \"singleRow\") &&\n                queryDB(`SELECT * FROM Staff_Contracts WHERE StaffID = ? AND TeamID = ? AND PosInTeam <= 2 AND ContractType = 0`, [Driver2, TeamID], \"singleRow\") &&\n                queryDB(`SELECT * FROM Staff_Contracts WHERE StaffID = ? AND TeamID = ? AND PosInTeam <= 2 AND ContractType = 0`, [Engineer1, TeamID], \"singleRow\") &&\n                queryDB(`SELECT * FROM Staff_Contracts WHERE StaffID = ? AND TeamID = ? AND PosInTeam <= 2 AND ContractType = 0`, [Engineer2, TeamID], \"singleRow\");\n\n\n            if (areAllInSameTeam) {\n                queryDB(`UPDATE Staff_RaceEngineerDriverAssignments SET IsCurrentAssignment = 0 WHERE DriverID = ? OR DriverID = ?`, [Driver1, Driver2], 'run');\n                queryDB(`UPDATE Staff_RaceEngineerDriverAssignments SET IsCurrentAssignment = 0 WHERE RaceEngineerID = ? OR RaceEngineerID = ?`, [Engineer1, Engineer2], 'run');\n\n                let driver1Engineer1 = queryDB(`SELECT * FROM Staff_RaceEngineerDriverAssignments WHERE DriverID = ? AND RaceEngineerID = ?`, [Driver1, Engineer1], \"singleRow\");\n                let driver2Engineer2 = queryDB(`SELECT * FROM Staff_RaceEngineerDriverAssignments WHERE DriverID = ? AND RaceEngineerID = ?`, [Driver2, Engineer2], \"singleRow\");\n\n                if (driver1Engineer1 && driver1Engineer1.length > 0) {\n                    queryDB(`UPDATE Staff_RaceEngineerDriverAssignments SET IsCurrentAssignment = 1 WHERE DriverID = ? AND RaceEngineerID = ?`, [Driver1, Engineer1], 'run');\n                } else {\n                    queryDB(`INSERT INTO Staff_RaceEngineerDriverAssignments (RaceEngineerID, DriverID, DaysTogether, RelationshipLevel, IsCurrentAssignment) VALUES (?, ?, 0, 0, 1)`, [Engineer1, Driver1], 'run');\n                }\n\n                if (driver2Engineer2 && driver2Engineer2.length > 0) {\n                    queryDB(`UPDATE Staff_RaceEngineerDriverAssignments SET IsCurrentAssignment = 1 WHERE DriverID = ? AND RaceEngineerID = ?`, [Driver2, Engineer2], 'run');\n                } else {\n                    queryDB(`INSERT INTO Staff_RaceEngineerDriverAssignments (RaceEngineerID, DriverID, DaysTogether, RelationshipLevel, IsCurrentAssignment) VALUES (?, ?, 0, 0, 1)`, [Engineer2, Driver2], 'run');\n                }\n            }\n            else {\n                rearrangeDriverEngineerPairings(TeamID)\n            }\n\n\n        }\n    }\n}\n\nexport function change2024Standings(mod = \"2025\") {\n    if (!changes.DriverStandings || !Array.isArray(changes.DriverStandings)) {\n        console.error(\"No driver standings found\");\n    } else {\n        for (const entry of changes.DriverStandings) {\n            const { DriverID, LastPointsChange, LastPositionChange, Points, Position, RaceFormula, SeasonID } = entry;\n\n\n            queryDB(`\n            UPDATE Races_DriverStandings SET LastPointsChange = ?, LastPositionChange = ?, Points = ?, Position = ?\n            WHERE DriverID = ? AND RaceFormula = ? AND SeasonID = ?\n            `, [LastPointsChange, LastPositionChange, Points, Position, DriverID, RaceFormula, SeasonID], 'run');\n        }\n    }\n\n    if (!changes.TeamStandings || !Array.isArray(changes.TeamStandings)) {\n        console.error(\"No team standings found\");\n    } else {\n        queryDB(`DELETE FROM Races_TeamStandings WHERE RaceFormula = 1 AND SeasonID = 2024`, [], 'run');\n        for (const entry of changes.TeamStandings) {\n            const { LastPointsChange, LastPositionChange, Points, Position, RaceFormula, SeasonID, TeamID } = entry;\n\n            queryDB(`\n            INSERT INTO Races_TeamStandings (TeamID, LastPointsChange, LastPositionChange, Points, Position, RaceFormula, SeasonID)\n            VALUES (?, ?, ?, ?, ?, ?, ?)\n            `, [TeamID, LastPointsChange, LastPositionChange, Points, Position, RaceFormula, SeasonID], 'run');\n        }\n    }\n    if (mod === \"2025\") {\n        updateSeasonModTable(\"change-cfd\", 1, \"2025\");\n    }\n}\n\nexport function manageFeederSeries() {\n    if (!contracts.FeederSeries || !Array.isArray(contracts.FeederSeries)) {\n        console.error(\"No feeder series found\");\n    } else {\n        queryDB(`DELETE FROM Staff_Contracts WHERE PosInTeam <= 3 AND StaffID IN (SELECT StaffID FROM Staff_DriverData) AND TeamID BETWEEN 11 AND 31`, [], 'run');\n        queryDB(`UPDATE Staff_DriverData SET FeederSeriesAssignedCarNumber = NULL`, [], 'run')\n        const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], \"singleRow\");\n        const day = daySeason[0];\n        for (const entry of contracts.FeederSeries) {\n            const { DriverID, TeamID, PosInTeam, Salary, EndSeason } = entry;\n            queryDB(`INSERT INTO Staff_Contracts (StaffID, ContractType, TeamID, PosInTeam, StartDay, EndSeason, Salary, StartingBonus, RaceBonus, RaceBonusTargetPos, BreakoutClause, AffiliateDualRoleClause)\n                 VALUES (?, 0, ?, ?, ?, ?, ?, 0, 0, 1, 0.5, 0)`, [DriverID, TeamID, PosInTeam, day, EndSeason, Salary], 'run');\n            queryDB(`UPDATE Staff_DriverData SET FeederSeriesAssignedCarNumber = ?, AssignedCarNumber = NULL, LastKnownDriverNumber = NULL WHERE StaffID = ?`, [PosInTeam, DriverID], 'run');\n            const driverTeamRaceEngineers = queryDB(`SELECT gd.StaffID FROM Staff_GameData gd\n                JOIN Staff_Contracts sc ON gd.StaffID = sc.StaffID\n                WHERE gd.StaffType = 2\n                AND gd.StaffID IN (SELECT StaffID FROM Staff_Contracts WHERE TeamID = ?)`, [TeamID], \"allRows\");\n            let newRaceEngineer = driverTeamRaceEngineers[0][0];\n            let pairExists = queryDB(`SELECT * FROM Staff_RaceEngineerDriverAssignments WHERE RaceEngineerID = ? AND DriverID = ?`, [newRaceEngineer, DriverID], \"singleRow\");\n            if (pairExists && pairExists.length > 0) {\n                queryDB(`UPDATE Staff_RaceEngineerDriverAssignments SET IsCurrentAssignment = 1 WHERE RaceEngineerID = ? AND DriverID = ?`, [newRaceEngineer, DriverID], 'run');\n            } else {\n                queryDB(`UPDATE Staff_RaceEngineerDriverAssignments SET IsCurrentAssignment = 0 WHERE RaceEngineerID = ?`, [newRaceEngineer], 'run');\n                queryDB(`INSERT INTO Staff_RaceEngineerDriverAssignments (RaceEngineerID, DriverID, DaysTogether, RelationshipLevel, IsCurrentAssignment) VALUES (?, ?, 0, 0, 1)`, [newRaceEngineer, DriverID], 'run');\n            }\n        }\n    }\n}\n\nexport function manageAffiliates() {\n\n    queryDB(`\n        DELETE FROM Staff_Contracts\n        WHERE PosInTeam > 2\n        AND StaffID IN (SELECT StaffID FROM Staff_DriverData)\n    `, [], 'run');\n\n    if (contracts.Affiliates && Array.isArray(contracts.Affiliates)) {\n        contracts.Affiliates.forEach((affiliate) => {\n            const hasContractWithTeam32 = queryDB(`SELECT * FROM Staff_Contracts WHERE StaffID = ? AND TeamID = 32`, [affiliate.DriverID], \"singleRow\");\n            const isFullTimeDriver = queryDB(`SELECT * FROM Staff_Contracts WHERE StaffID = ? AND PosInTeam <= 2 AND (TeamID <= 10 OR TeamID == 32)`, [affiliate.DriverID], \"singleRow\");\n            if (!hasContractWithTeam32 && !isFullTimeDriver) {\n                const {\n                    DriverID,\n                    TeamID,\n                    PosInTeam,\n                    Salary,\n                    StartingBonus,\n                    RaceBonus,\n                    RaceBonusTargetPos,\n                    EndSeason,\n                    BreakoutClause\n                } = affiliate;\n\n                hireDriver(\n                    \"manual\",\n                    DriverID,\n                    TeamID,\n                    PosInTeam,\n                    Salary,\n                    StartingBonus,\n                    RaceBonus,\n                    RaceBonusTargetPos,\n                    EndSeason,\n                    \"24\"\n                );\n            }\n        });\n\n\n    }\n}\n\nexport function manageStandings() {\n    queryDB(`DELETE FROM Races_DriverStandings WHERE RaceFormula = 2 AND SeasonID = 2025`, [], 'run');\n    queryDB(`DELETE FROM Races_DriverStandings WHERE RaceFormula = 3 AND SeasonID = 2025`, [], 'run');\n    queryDB(`\n            DELETE FROM Races_DriverStandings\n            WHERE SeasonID = 2025\n              AND RaceFormula = 1\n              AND NOT EXISTS (\n                SELECT 1\n                FROM Staff_Contracts sc\n                WHERE sc.StaffID = Races_DriverStandings.DriverID\n                  AND sc.PosInTeam <= 2\n              );\n          `, [], 'run');\n\n    let position = 1;\n    let f1_grid = queryDB(`SELECT DriverID FROM Races_DriverStandings WHERE RaceFormula = 1 AND SeasonID = 2025`, [], \"allRows\");\n    f1_grid.forEach((driver) => {\n        queryDB(`UPDATE Races_DriverStandings SET Position = ? WHERE DriverID = ? AND RaceFormula = 1 AND SeasonID = 2025`, [position, driver[0]], 'run');\n        position++;\n    });\n\n\n\n    queryDB(`\n            INSERT INTO Races_DriverStandings (\n                SeasonID,\n                DriverID,\n                Points,\n                Position,\n                LastPointsChange,\n                LastPositionChange,\n                RaceFormula\n            )\n            SELECT \n                2025 AS SeasonID,\n                sc.StaffID AS DriverID,\n                0 AS Points,\n                0 AS Position,\n                0 AS LastPointsChange,\n                0 AS LastPositionChange,\n                2 AS RaceFormula\n            FROM Staff_Contracts sc\n            INNER JOIN Staff_GameData sgd ON sc.StaffID = sgd.StaffID\n            WHERE sgd.StaffType = 0\n              AND sc.TeamID BETWEEN 11 AND 21\n        `, [], 'run');\n\n    position = 1;\n    let f2_grid = queryDB(`SELECT DriverID FROM Races_DriverStandings WHERE RaceFormula = 2 AND SeasonID = 2025`, [], \"allRows\");\n    f2_grid.forEach((driver) => {\n        queryDB(`UPDATE Races_DriverStandings SET Position = ? WHERE DriverID = ? AND RaceFormula = 2 AND SeasonID = 2025`, [position, driver[0]], 'run');\n        queryDB(`INSERT INTO Races_DriverStandings (SeasonID, DriverID, Points, Position, LastPointsChange, LastPositionChange, RaceFormula) VALUES (2024, ?, 0, ?, 0, 0, 2)`, [driver[0], position], 'run');\n        position++;\n    });\n\n    // 2) TeamID entre 22 y 31 => RaceFormula = 3\n    queryDB(`\n            INSERT INTO Races_DriverStandings (\n                SeasonID,\n                DriverID,\n                Points,\n                Position,\n                LastPointsChange,\n                LastPositionChange,\n                RaceFormula\n            )\n            SELECT \n                2025 AS SeasonID,\n                sc.StaffID AS DriverID,\n                0 AS Points,\n                0 AS Position,\n                0 AS LastPointsChange,\n                0 AS LastPositionChange,\n                3 AS RaceFormula\n            FROM Staff_Contracts sc\n            INNER JOIN Staff_GameData sgd ON sc.StaffID = sgd.StaffID\n            WHERE sgd.StaffType = 0\n              AND sc.TeamID BETWEEN 22 AND 31\n        `, [], 'run');\n\n    position = 1;\n    let f3_grid = queryDB(`SELECT DriverID FROM Races_DriverStandings WHERE RaceFormula = 3 AND SeasonID = 2025`, [], \"allRows\");\n    f3_grid.forEach((driver) => {\n        queryDB(`UPDATE Races_DriverStandings SET Position = ? WHERE DriverID = ? AND RaceFormula = 3 AND SeasonID = 2025`, [position, driver[0]], 'run');\n        queryDB(`INSERT INTO Races_DriverStandings (SeasonID, DriverID, Points, Position, LastPointsChange, LastPositionChange, RaceFormula) VALUES (2024, ?, 0, ?, 0, 0, 3)`, [driver[0], position], 'run');\n        position++;\n    });\n\n    position = 1;\n    let f2_teams = queryDB(`SELECT TeamID FROM Races_TeamStandings WHERE RaceFormula = 2 AND SeasonID = 2025`, [], \"allRows\");\n    f2_teams.forEach((team) => {\n        queryDB(`UPDATE Races_TeamStandings SET Position = ? WHERE TeamID = ? AND RaceFormula = 2 AND SeasonID = 2025`, [position, team[0]], 'run');\n        queryDB(`INSERT INTO Races_TeamStandings (SeasonID, TeamID, Points, Position, LastPointsChange, LastPositionChange, RaceFormula) VALUES (2024, ?, 0, ?, 0, 0, 2)`, [team[0], position], 'run');\n        position++;\n    });\n\n    position = 1;\n    let f3_teams = queryDB(`SELECT TeamID FROM Races_TeamStandings WHERE RaceFormula = 3 AND SeasonID = 2025`, [], \"allRows\");\n    f3_teams.forEach((team) => {\n        queryDB(`UPDATE Races_TeamStandings SET Position = ? WHERE TeamID = ? AND RaceFormula = 3 AND SeasonID = 2025`, [position, team[0]], 'run');\n        queryDB(`INSERT INTO Races_TeamStandings (SeasonID, TeamID, Points, Position, LastPointsChange, LastPositionChange, RaceFormula) VALUES (2024, ?, 0, ?, 0, 0, 3)`, [team[0], position], 'run');\n        position++;\n    });\n\n    //copy all races_pitcrewstandings form 2025 to 2024\n    queryDB(`INSERT INTO Races_PitCrewStandings (SeasonID, TeamID, Points, Position, LastPointsChange, LastPositionChange, RaceFormula)\n             SELECT 2024, TeamID, Points, Position, LastPointsChange, LastPositionChange, RaceFormula FROM Races_PitCrewStandings WHERE SeasonID = 2025`, [], 'run');\n}\n\n\nexport function changeRaces(type) {\n    if (!changes.Calendar || !Array.isArray(changes.Calendar)) {\n        console.log(\"No calendar data found\");\n    }\n    else {\n        if (type === \"Start2024\" || type === \"End2024\") {\n            let maxRaceId = queryDB(`SELECT MAX(RaceID) FROM Races`, [], \"singleRow\")[0];\n            let newRaceId = maxRaceId + 1;\n            for (const entry of changes.Calendar) {\n                const { TrackID, Day, WeekendType } = entry;\n\n                queryDB(`\n                INSERT INTO Races (\n                RaceID,\n                SeasonID,\n                TrackID,\n                Day,\n                State,\n                RainPractice,\n                TemperaturePractice,\n                WeatherStatePractice,\n                RainQualifying,\n                TemperatureQualifying,\n                WeatherStateQualifying,\n                RainRace,\n                TemperatureRace,\n                WeatherStateRace,\n                WeekendType\n                )\n                SELECT\n                ? AS RaceID,\n                2025 AS SeasonID,\n                r.TrackID,\n                ? AS Day,\n                0 AS State,                          \n                r.RainPractice,\n                r.TemperaturePractice,\n                r.WeatherStatePractice,\n                r.RainQualifying,\n                r.TemperatureQualifying,\n                r.WeatherStateQualifying,\n                r.RainRace,\n                r.TemperatureRace,\n                r.WeatherStateRace,\n                ? AS WeekendType\n                FROM Races r\n                WHERE r.SeasonID = 2024\n                AND r.TrackID = ?\n                LIMIT 1\n            `, [newRaceId, Day, WeekendType, TrackID], 'run');\n\n                newRaceId++;\n            }\n\n            queryDB(`CREATE TRIGGER IF NOT EXISTS delete_duplicate_2025\n            AFTER INSERT ON Races\n            WHEN NEW.SeasonID = 2025\n            AND EXISTS (\n                SELECT 1\n                FROM Races\n                WHERE SeasonID = 2025\n                AND TrackID = NEW.TrackID\n                AND RaceID <> NEW.RaceID\n            )\n            BEGIN\n            DELETE FROM Races\n            WHERE RaceID = NEW.RaceID;\n            END;`, [], 'run');\n            updateSeasonModTable(\"change-calendar\", 1, \"2025\");\n        }\n        else if (type === \"Direct2025\") {\n            let maxRaceId = queryDB(`SELECT MAX(RaceID) FROM Races`, [], \"singleRow\")[0];\n            let newRaceId = maxRaceId + 1;\n            let firstNewRaceID = newRaceId;\n\n            for (const entry of changes.Calendar) {\n                const { TrackID, Day, WeekendType } = entry;\n\n                queryDB(`\n                INSERT INTO Races (\n                    RaceID,\n                    SeasonID,\n                    TrackID,\n                    Day,\n                    State,\n                    RainPractice,\n                    TemperaturePractice,\n                    WeatherStatePractice,\n                    RainQualifying,\n                    TemperatureQualifying,\n                    WeatherStateQualifying,\n                    RainRace,\n                    TemperatureRace,\n                    WeatherStateRace,\n                    WeekendType\n                )\n                SELECT\n                    ? AS RaceID,\n                    2025 AS SeasonID,\n                    r.TrackID,\n                    ? AS Day,\n                    0 AS State,                          \n                    r.RainPractice,\n                    r.TemperaturePractice,\n                    r.WeatherStatePractice,\n                    r.RainQualifying,\n                    r.TemperatureQualifying,\n                    r.WeatherStateQualifying,\n                    r.RainRace,\n                    r.TemperatureRace,\n                    r.WeatherStateRace,\n                    ? AS WeekendType\n                FROM Races r\n                WHERE r.SeasonID = 2025\n                AND r.TrackID = ?\n                LIMIT 1\n            `, [newRaceId, Day, WeekendType, TrackID], 'run');\n\n                newRaceId++;\n            }\n\n            // Borra las filas antiguas de la temporada 2025\n            queryDB(`\n            DELETE FROM Races \n            WHERE SeasonID = 2025 \n            AND RaceID < ?\n        `, [firstNewRaceID], 'run');\n\n        }\n    }\n\n}\n\nexport function updateCalendar2026(type) {\n    if (!changes2026.Calendar || !Array.isArray(changes2026.Calendar)) {\n        console.log(\"No calendar data found\");\n    }\n    else {\n        if (type === \"Start2024\" || type === \"End2024\" || type === \"Start2025\" || type === \"End2025\") {\n            const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], \"singleRow\");\n            const season = daySeason[1];\n            let maxRaceId = queryDB(`SELECT MAX(RaceID) FROM Races`, [], \"singleRow\")[0];\n            let newRaceId = maxRaceId + 1;\n            for (const entry of changes2026.Calendar) {\n                const { TrackID, Day, WeekendType, deleteIfGameAdds, isF2Weekend } = entry;\n                if (TrackID === null) {\n                    continue;\n                }\n                //if it's either true or false, but not undefinded or null, then\n                if (isF2Weekend !== null && isF2Weekend !== undefined) {\n                    if (isF2Weekend) {\n                        queryDB(`UPDATE Races_Tracks SET IsF2Race = 1 WHERE TrackID = ?`, [TrackID], 'run');\n                    }\n                    else {\n                        queryDB(`UPDATE Races_Tracks SET IsF2Race = 0 WHERE TrackID = ?`, [TrackID], 'run');\n                    }\n                }\n\n                //if deleteIfGameAdds is true, skip the manual insert and let the trigger remove it if the game adds it\n                if (!deleteIfGameAdds) {\n                    queryDB(`\n                    INSERT INTO Races (\n                    RaceID,\n                    SeasonID,\n                    TrackID,\n                    Day,\n                    State,\n                    RainPractice,\n                    TemperaturePractice,\n                    WeatherStatePractice,\n                    RainQualifying,\n                    TemperatureQualifying,\n                    WeatherStateQualifying,\n                    RainRace,\n                    TemperatureRace,\n                    WeatherStateRace,\n                    WeekendType\n                    )\n                    SELECT\n                    ? AS RaceID,\n                    2026 AS SeasonID,\n                    r.TrackID,\n                    ? AS Day,\n                    0 AS State,                          \n                    r.RainPractice,\n                    r.TemperaturePractice,\n                    r.WeatherStatePractice,\n                    r.RainQualifying,\n                    r.TemperatureQualifying,\n                    r.WeatherStateQualifying,\n                    r.RainRace,\n                    r.TemperatureRace,\n                    r.WeatherStateRace,\n                    ? AS WeekendType\n                    FROM Races r\n                    WHERE r.SeasonID = ?\n                    AND r.TrackID = ?\n                    LIMIT 1\n                `, [newRaceId, Day, WeekendType, season, TrackID], 'run');\n\n                    newRaceId++;\n                }\n            }\n\n            queryDB(`DROP TRIGGER IF EXISTS delete_duplicate_2026`, [], 'run');\n            queryDB(`CREATE TRIGGER delete_duplicate_2026\n            AFTER INSERT ON Races\n            WHEN NEW.SeasonID = 2026\n            AND (\n                NEW.TrackID IN (2, 11, 24)\n                OR EXISTS (\n                    SELECT 1\n                    FROM Races\n                    WHERE SeasonID = 2026\n                    AND TrackID = NEW.TrackID\n                    AND RaceID <> NEW.RaceID\n                )\n            )\n            BEGIN\n            DELETE FROM Races\n            WHERE RaceID = NEW.RaceID;\n            END;`, [], 'run');\n            updateSeasonModTable(\"change-calendar-2026\", 1, \"2026\");\n        }\n        else if (type === \"Direct2026\") {\n            let maxRaceId = queryDB(`SELECT MAX(RaceID) FROM Races`, [], \"singleRow\")[0];\n            let newRaceId = maxRaceId + 1;\n            let firstNewRaceID = newRaceId;\n\n            for (const entry of changes.Calendar) {\n                const { TrackID, Day, WeekendType } = entry;\n\n                queryDB(`\n                INSERT INTO Races (\n                    RaceID,\n                    SeasonID,\n                    TrackID,\n                    Day,\n                    State,\n                    RainPractice,\n                    TemperaturePractice,\n                    WeatherStatePractice,\n                    RainQualifying,\n                    TemperatureQualifying,\n                    WeatherStateQualifying,\n                    RainRace,\n                    TemperatureRace,\n                    WeatherStateRace,\n                    WeekendType\n                )\n                SELECT\n                    ? AS RaceID,\n                    2026 AS SeasonID,\n                    r.TrackID,\n                    ? AS Day,\n                    0 AS State,                          \n                    r.RainPractice,\n                    r.TemperaturePractice,\n                    r.WeatherStatePractice,\n                    r.RainQualifying,\n                    r.TemperatureQualifying,\n                    r.WeatherStateQualifying,\n                    r.RainRace,\n                    r.TemperatureRace,\n                    r.WeatherStateRace,\n                    ? AS WeekendType\n                FROM Races r\n                WHERE r.SeasonID = 2026\n                AND r.TrackID = ?\n                LIMIT 1\n            `, [newRaceId, Day, WeekendType, TrackID], 'run');\n\n                newRaceId++;\n            }\n\n            // Borra las filas antiguas de la temporada 2026\n            queryDB(`\n                DELETE FROM Races \n                WHERE SeasonID = 2026\n                AND RaceID < ?\n            `, [firstNewRaceID], 'run');\n            updateSeasonModTable(\"change-calendar-2026\", 1, \"2026\");\n        }\n    }\n}\n\nexport function insertStaff2025() {\n    let tables = [\"Staff_BasicData\", \"Staff_PerformanceStats\", \"Staff_State\", \"Staff_DriverData\", \"Staff_GameData\"];\n    tables.forEach((table) => {\n        if (changes[table] && Array.isArray(changes[table])) {\n            changes[table].forEach((entry) => {\n                let columns = Object.keys(entry).join(\", \");\n                let values = Object.values(entry);\n\n                // Generate placeholders for values\n                let placeholders = values.map(() => \"?\").join(\", \");\n\n                // Filter null values for SQL\n                let sqlValues = values.map(value => value === null ? null : value);\n\n                // Table names cannot be parameterized, but values can\n                queryDB(`INSERT INTO ${table} (${columns}) VALUES (${placeholders})`, sqlValues, 'run');\n            });\n        }\n    });\n    changeBudgets();\n    updateSeasonModTable(\"extra-drivers\", 1, \"2025\");\n}\n\nfunction changeBudgets(amount = 15000000) {\n    queryDB(`UPDATE Finance_TeamBalance SET Balance = Balance + ?`, [amount], 'run');\n}\n\n\nexport function removeFastestLap(mod = \"2025\") {\n    queryDB(`UPDATE Regulations_Enum_Changes SET CurrentValue = 0, PreviousValue = 1 WHERE ChangeID = 9`, [], 'run');\n    if (mod === \"2025\") {\n        updateSeasonModTable(\"change-regulations\", 1, \"2025\");\n    }\n}\n\nfunction updateSeasonModTable(edit, value, mod = \"2025\") {\n    const table = mod === \"2026\" ? \"Custom_2026_SeasonMod\" : \"Custom_2025_SeasonMod\";\n    queryDB(`INSERT OR REPLACE INTO ${table} (key, value) VALUES (?, ?)`, [edit, value], 'run');\n}\n\nexport function updatePerofmrnace2025() {\n    const globals = getGlobals();\n    const teamDict = getBestParts(globals.isCreateATeam);\n    let tyreDegDict = {};\n\n\n    for (let team of Object.keys(teamDict).filter(key => key !== \"0\")) {\n        //remove the part 0 from teamDict[team]\n        delete teamDict[team][\"0\"];\n        let teamboost = changes.Performance.find(x => x.TeamID === Number(team));\n        applyBoostToCarStats(teamDict[team], teamboost.Boost, teamboost.TeamID);\n        const tyreDegStatsTemas = getTyreDegStats(teamDict[team]);\n        tyreDegDict[team] = tyreDegStatsTemas;\n    }\n\n    for (let team of Object.keys(teamDict).filter(key => key !== \"0\")) {\n        let teamGivingTyreDeg = changes.Performance.find(x => x.TeamID === Number(team)).TyreDeg;\n        let tyreDegStats = tyreDegDict[teamGivingTyreDeg];\n        updateTyreDegStats(teamDict[team], tyreDegStats, team, teamGivingTyreDeg);\n    }\n\n    updateSeasonModTable(\"change-performance\", 1, \"2025\");\n\n}\n\nexport function fixes_mod() {\n    let error = false;\n    const extraDrivers = queryDB(`SELECT value FROM Custom_2025_SeasonMod WHERE key = 'extra-drivers'`, [], \"singleValue\");\n    if (extraDrivers === \"1\") {\n        if (!changes.Fixes || !Array.isArray(changes.Fixes)) {\n            console.log(\"No fixes found\");\n        }\n        else {\n            for (const fix of changes.Fixes) {\n                const { StaffID, Table, Column, Value } = fix;\n                // console.log(`SELECT ${Column} FROM ${Table} WHERE StaffID = ${StaffID}`);\n                // Column and Table cannot be parameterized\n                const value = queryDB(`SELECT ${Column} FROM ${Table} WHERE StaffID = ?`, [StaffID], \"singleValue\");\n                if (value !== undefined && value !== Value) {\n                    queryDB(`UPDATE ${Table} SET ${Column} = ? WHERE StaffID = ?`, [Value, StaffID], 'run');\n                    error = true;\n                }\n\n            }\n\n        }\n    }\n\n    return error;\n}\n\nexport function updateEditsWithModData(data) {\n    const selectorAliases = {\n        \"change-cfd-2026\": [\".add-results-2026\"]\n    };\n\n    for (let key in data) {\n        if (data[key] === \"1\") {\n            const selectors = [`.${key}`, ...(selectorAliases[key] || [])];\n            selectors.forEach((sel) => {\n                const elem = document.querySelector(sel);\n                if (!elem) return;\n                elem.classList.add(\"completed\")\n                elem.classList.remove(\"disabled\")\n                const span = elem.querySelector(\"span\");\n                if (span) span.textContent = \"Applied\"\n            });\n        }\n    }\n}\n\nexport function updateRenaultToHonda(isHonda) {\n    const newName = isHonda ? 'Honda' : 'Renault';\n    queryDB(`UPDATE Custom_Engines_List SET name = ? WHERE engineId = 10`, [newName], 'run');\n    setCustomSaveConfig('renaultEngine', isHonda ? 'honda' : 'renault');\n}\n\nexport function addAudiCustomEngine(unitValue = 80) {\n    const [customEngines] = fetchEngines();\n    const normalizedName = (val) => String(val || \"\").trim().toLowerCase();\n\n    let audiEngineId = null;\n    const existingAudi = customEngines.find((engine) => normalizedName(engine?.[2]) === \"audi\");\n    if (existingAudi) {\n        audiEngineId = existingAudi[0];\n    }\n    else {\n        const maxEngineId = customEngines.reduce((max, engine) => {\n            const id = Number(engine?.[0]);\n            if (!Number.isFinite(id)) return max;\n            return Math.max(max, id);\n        }, 0);\n        audiEngineId = maxEngineId ? (maxEngineId + 3) : 14;\n    }\n\n    updateCustomEngines({\n        [audiEngineId]: {\n            name: \"audi\",\n            stats: {\n                6: unitValue,\n                10: unitValue,\n                11: unitValue,\n                12: unitValue,\n                14: unitValue,\n                18: unitValue,\n                19: unitValue\n            }\n        }\n    });\n\n    return audiEngineId;\n}\n\n\nexport function apply2026EnginePerformanceChanges() {\n    updateRenaultToHonda(true);\n\n    let audiEngineId = null;\n    try {\n        audiEngineId = addAudiCustomEngine(80);\n    }\n    catch (e) {\n        console.warn(\"Failed to add custom Audi engine:\", e);\n    }\n\n    try {\n        manage_engine_change(10, 10);\n        if (audiEngineId != null) {\n            manage_engine_change(9, audiEngineId);\n        }\n        manage_engine_change(5, 7);\n    }\n    catch (e) {\n        console.warn(\"Failed to update engine allocations:\", e);\n    }\n\n    const enginePerformance = changes2026?.EnginePerformance || {};\n    const engineStatsById = {\n        1: enginePerformance.ferrari,\n        4: enginePerformance.rbpt,\n        7: enginePerformance.mercedes,\n        10: enginePerformance.honda\n    };\n\n    if (audiEngineId != null) {\n        engineStatsById[audiEngineId] = enginePerformance.audi;\n    }\n\n    const enginesToEdit = Object.fromEntries(\n        Object.entries(engineStatsById).filter(([, stats]) => !!stats)\n    );\n\n    if (Object.keys(enginesToEdit).length > 0) {\n        editEngines(enginesToEdit);\n    }\n}\n\nexport function insertStaff2026() {\n    let tables = [\"Staff_BasicData\", \"Staff_State\", \"Staff_DriverData\", \"Staff_GameData\"];\n\n    tables.forEach((table) => {\n        if (tables2026[table] && Array.isArray(tables2026[table])) {\n            tables2026[table].forEach((entry) => {\n                const entryKeys = Object.keys(entry);\n\n                let columns = entryKeys.join(\", \");\n                let values = Object.values(entry);\n\n                let placeholders = values.map(() => \"?\").join(\", \");\n                let sqlValues = [...values];\n\n                let primaryKeyColumn = \"StaffID\";\n                let staffID = entry[primaryKeyColumn];\n\n                const existingEntry = queryDB(\n                    `SELECT 1 FROM ${table} WHERE ${primaryKeyColumn} = ?`,\n                    [staffID],\n                    \"singleRow\"\n                );\n\n                if (!existingEntry || staffIDChanges[staffID]) {\n                    if (staffIDChanges[staffID]) {\n                        const pkIndex = entryKeys.findIndex(key => key === primaryKeyColumn);\n                        sqlValues[pkIndex] = staffIDChanges[staffID];\n                    }\n\n                    // En Staff_DriverData, forzar estos campos a NULL en INSERT\n                    if (table === \"Staff_DriverData\") {\n                        const assignedCarIndex = entryKeys.findIndex(key => key === \"AssignedCarNumber\");\n                        const feederAssignedCarIndex = entryKeys.findIndex(key => key === \"FeederSeriesAssignedCarNumber\");\n\n                        if (assignedCarIndex !== -1) {\n                            sqlValues[assignedCarIndex] = null;\n                        }\n                        if (feederAssignedCarIndex !== -1) {\n                            sqlValues[feederAssignedCarIndex] = null;\n                        }\n                    }\n\n                    queryDB(\n                        `INSERT INTO ${table} (${columns}) VALUES (${placeholders})`,\n                        sqlValues,\n                        \"run\"\n                    );\n                } else {\n                    let isGeneratedForCustomTeam = queryDB(\n                        `SELECT IsGeneratedForCustomTeam FROM Staff_BasicData WHERE StaffID = ?`,\n                        [staffID],\n                        \"singleValue\"\n                    );\n\n                    if (isGeneratedForCustomTeam !== 1) {\n                        // En UPDATE, excluir estas columnas de Staff_DriverData\n                        let keysToUpdate = entryKeys.filter(key => key !== primaryKeyColumn);\n\n                        if (table === \"Staff_DriverData\") {\n                            keysToUpdate = keysToUpdate.filter(\n                                key => key !== \"AssignedCarNumber\" &&\n                                    key !== \"FeederSeriesAssignedCarNumber\"\n                            );\n                        }\n\n                        let setClause = keysToUpdate.map(key => `${key} = ?`).join(\", \");\n                        let updateValues = keysToUpdate.map(key => entry[key]);\n                        updateValues.push(entry[primaryKeyColumn]);\n\n                        queryDB(\n                            `UPDATE ${table} SET ${setClause} WHERE ${primaryKeyColumn} = ?`,\n                            updateValues,\n                            \"run\"\n                        );\n                    } else {\n                        let staffID = entry[primaryKeyColumn];\n                        staffIDChanges[staffID] = newStaffIDCounter;\n\n                        const pkIndex = entryKeys.findIndex(key => key === primaryKeyColumn);\n                        sqlValues[pkIndex] = staffIDChanges[staffID];\n\n                        // También aquí, si es Staff_DriverData, forzar NULL en INSERT\n                        if (table === \"Staff_DriverData\") {\n                            const assignedCarIndex = entryKeys.findIndex(key => key === \"AssignedCarNumber\");\n                            const feederAssignedCarIndex = entryKeys.findIndex(key => key === \"FeederSeriesAssignedCarNumber\");\n\n                            if (assignedCarIndex !== -1) {\n                                sqlValues[assignedCarIndex] = null;\n                            }\n                            if (feederAssignedCarIndex !== -1) {\n                                sqlValues[feederAssignedCarIndex] = null;\n                            }\n                        }\n\n                        queryDB(\n                            `INSERT INTO ${table} (${columns}) VALUES (${placeholders})`,\n                            sqlValues,\n                            \"run\"\n                        );\n\n                        newStaffIDCounter++;\n                    }\n                }\n            });\n        }\n    });\n\n    updateSeasonModTable(\"extra-drivers-2026\", 1, \"2026\");\n}\n\nexport function changeStats2026() {\n    if (!tables2026.Staff_PerformanceStats || !Array.isArray(tables2026.Staff_PerformanceStats)) {\n        console.log(\"No stats found\");\n    }\n    else {\n        tables2026.Staff_PerformanceStats.forEach((entry) => {\n            let staffID = entry.StaffID;\n            if (staffIDChanges[staffID]) {\n                staffID = staffIDChanges[staffID];\n            }\n            //check if the driver already has performance stats\n            let existingStats = queryDB(`SELECT 1 FROM Staff_PerformanceStats WHERE StaffID = ? AND StatID = ?`, [staffID, entry.StatID], \"singleRow\");\n            if (existingStats) {\n                //update where staffid = entry.staffid and statid = entry.statid\n                let setClause = Object.keys(entry).filter(key => key !== \"StaffID\" && key !== \"StatID\").map(key => `${key} = ?`).join(\", \");\n                let values = Object.keys(entry).filter(key => key !== \"StaffID\" && key !== \"StatID\").map(key => entry[key]);\n                //if all of the values[1] are 0, skip\n                if (values.slice(1).every(v => v === 0)) {\n                    // console.log(\"Skipping update for StaffID:\", entry.StaffID, \"StatID:\", entry.StatID);\n                    return;\n                }\n                values.push(staffID); // Add StaffID at the end for the WHERE clause\n                values.push(entry.StatID); // Add StatID at the end for the WHERE clause\n                queryDB(`UPDATE Staff_PerformanceStats SET ${setClause} WHERE StaffID = ? AND StatID = ?`, values, 'run');\n            }\n            else {\n                //check if the staff ID exists in staff_basicData, if not, skip\n                const staffExists = queryDB(`SELECT 1 FROM Staff_BasicData WHERE StaffID = ?`, [staffID], \"singleRow\");\n                if (!staffExists) {\n                    console.log(\"StaffID:\", staffID, \"does not exist in Staff_BasicData. Skipping performance stats insertion.\");\n                    return;\n                }\n                let columns = Object.keys(entry).join(\", \");\n                let values = Object.values(entry);\n                // Generate placeholders for values\n                let placeholders = values.map(() => \"?\").join(\", \");\n                // Filter null values for SQL\n                let sqlValues = values.map(value => value === null ? null : value);\n                //change the staffID in sqlValues if it is in staffIDChanges\n                if (staffIDChanges[entry.StaffID]) {\n                    sqlValues[sqlValues.findIndex((_, index) => Object.keys(entry)[index] === \"StaffID\")] = staffIDChanges[entry.StaffID];\n                }\n                queryDB(`INSERT INTO Staff_PerformanceStats (${columns}) VALUES (${placeholders})`, sqlValues, 'run');\n            }\n\n        });\n        updateSeasonModTable(\"change-stats-2026\", 1, \"2026\");\n    }\n    if (!tables2026.Staff_Performancestats_StartOfMonth || !Array.isArray(tables2026.Staff_Performancestats_StartOfMonth)) {\n        console.log(\"No performance stats start of month data found\");\n    }\n    else {\n        tables2026.Staff_Performancestats_StartOfMonth.forEach((entry) => {\n            const { StaffID, StatID, Val } = entry;\n            let staffID = StaffID;\n\n            if (staffIDChanges[staffID]) {\n                staffID = staffIDChanges[staffID];\n            }\n\n            const existingStart = queryDB(\n                `SELECT 1 FROM Staff_Performancestats_StartOfMonth WHERE StaffID = ? AND StatID = ?`,\n                [staffID, StatID],\n                \"singleRow\"\n            );\n\n            if (existingStart) {\n                queryDB(\n                    `UPDATE Staff_Performancestats_StartOfMonth SET Val = ? WHERE StaffID = ? AND StatID = ?`,\n                    [Val, staffID, StatID],\n                    \"run\"\n                );\n            } else {\n                queryDB(\n                    `INSERT INTO Staff_Performancestats_StartOfMonth (StaffID, StatID, Val) VALUES (?, ?, ?)`,\n                    [staffID, StatID, Val],\n                    \"run\"\n                );\n            }\n        });\n    }\n    console.log(\"staffIDChanges at the end:\", staffIDChanges);\n\n}\n\nexport function changeLineUps2026() {\n    if (!tables2026.Staff_Contracts || !Array.isArray(tables2026.Staff_Contracts)) {\n        console.log(\"No contracts found\");\n    }\n    else {\n        wipeTableAndRefill(\"Staff_Contracts\", tables2026.Staff_Contracts);\n        updateSeasonModTable(\"change-line-ups-2026\", 1, \"2026\");\n        const globals = getGlobals();\n        if (!globals.isCreateATeam) {\n            queryDB(`DELETE FROM Staff_Contracts WHERE TeamID = 32`, [], 'run');\n        }\n    }\n\n    if (!tables2026.Staff_RaceEngineerDriverAssignments || !Array.isArray(tables2026.Staff_RaceEngineerDriverAssignments)) {\n        console.log(\"No race engineer driver assignments found\");\n    }\n    else {\n        wipeTableAndRefill(\"Staff_RaceEngineerDriverAssignments\", tables2026.Staff_RaceEngineerDriverAssignments);\n    }\n\n    if (!tables2026.Staff_NarrativeData || !Array.isArray(tables2026.Staff_NarrativeData)) {\n        console.log(\"No narrative data found\");\n    }\n    else {\n        queryDB(\n            `UPDATE Staff_NarrativeData\n         SET IsActive = 0\n         WHERE TeamID BETWEEN 1 AND 10\n           AND JobTitle = '[STAFF_TYPE_5]'`,\n            [],\n            \"run\"\n        );\n\n        tables2026.Staff_NarrativeData.forEach((entry) => {\n            const { StaffID, GenSource, JobTitle, TeamID, IsActive } = entry;\n\n            let staffID = StaffID;\n            if (staffIDChanges[staffID]) {\n                staffID = staffIDChanges[staffID];\n            }\n\n            const existingNarrative = queryDB(\n                `SELECT 1\n             FROM Staff_NarrativeData\n             WHERE StaffID = ?`,\n                [staffID],\n                \"singleRow\"\n            );\n\n            if (existingNarrative) {\n                queryDB(\n                    `UPDATE Staff_NarrativeData\n                 SET GenSource = ?, JobTitle = ?, TeamID = ?, IsActive = ?\n                 WHERE StaffID = ?`,\n                    [GenSource, JobTitle, TeamID, IsActive, staffID],\n                    \"run\"\n                );\n            } else {\n                queryDB(\n                    `INSERT INTO Staff_NarrativeData (StaffID, GenSource, JobTitle, TeamID, IsActive)\n                 VALUES (?, ?, ?, ?, ?)`,\n                    [staffID, GenSource, JobTitle, TeamID, IsActive],\n                    \"run\"\n                );\n            }\n        });\n\n        queryDB(\n            `DELETE FROM Staff_NarrativeData\n         WHERE TeamID BETWEEN 1 AND 10\n           AND JobTitle = '[STAFF_TYPE_5]'\n           AND IsActive = 0`,\n            [],\n            \"run\"\n        );\n\n        queryDB(`DELETE FROM Staff_NarrativeData WHERE StaffID = ?`, [396], \"run\");\n        queryDB(`DELETE FROM Staff_BasicData WHERE StaffID = ?`, [396], \"run\");\n\n        queryDB(`DELETE FROM Staff_GameData WHERE StaffID IN (290, 291, 295, 396)`, [], \"run\");\n        queryDB(`DELETE FROM Staff_State WHERE StaffID IN (290, 291, 295, 396)`, [], \"run\");\n        queryDB(`DELETE FROM Staff_PerformanceStats WHERE StaffID IN (290, 291, 295, 396)`, [], \"run\");\n        queryDB(`DELETE FROM Staff_Performancestats_StartOfMonth WHERE StaffID IN (290, 291, 295, 396)`, [], \"run\");\n        queryDB(`DELETE FROM Staff_ContractPatience WHERE StaffID IN (290, 291, 295, 396)`, [], \"run\");\n        queryDB(`DELETE FROM Staff_Mentality_AreaOpinions WHERE StaffID IN (290, 291, 295, 396)`, [], \"run\");\n        queryDB(`DELETE FROM Staff_Mentality_Statuses WHERE StaffID IN (290, 291, 295, 396)`, [], \"run\");\n        queryDB(`DELETE FROM Staff_RaceRecord WHERE StaffID IN (290, 291, 295, 396)`, [], \"run\");\n    }\n\n    //get all StaffID from Staff_DriverData\n    const driverIDs = queryDB(`SELECT StaffID FROM Staff_DriverData`, [], \"allRows\")\n    //for each driver, get its AssignedCarNumber and FeederSeriesAssignedCarNumber from tables2026.Staff_DriverData and update the corresponding driver in the database with those values\n    driverIDs.forEach((driverID) => {\n        const driverData = tables2026.Staff_DriverData.find(driver => driver.StaffID === driverID[0]);\n        if (driverData) {\n            const { AssignedCarNumber, FeederSeriesAssignedCarNumber } = driverData;\n            queryDB(`UPDATE Staff_DriverData SET AssignedCarNumber = ?, FeederSeriesAssignedCarNumber = ? WHERE StaffID = ?`, [AssignedCarNumber, FeederSeriesAssignedCarNumber, driverID[0]], 'run');\n        }\n    });\n\n    // fixStandings(\"2025\");\n\n}\n\nexport function changeDriverNumbers2026() {\n    if (!tables2026.Staff_DriverNumbers || !Array.isArray(tables2026.Staff_DriverNumbers)) {\n        console.log(\"No driver numbers found\");\n    }\n    else {\n        tables2026.Staff_DriverNumbers.forEach((entry) => {\n            const { CurrentHolder, Number } = entry;\n            let driverExists = queryDB(`SELECT 1 FROM Staff_DriverData WHERE StaffID = ?`, [CurrentHolder], \"singleRow\");\n            if (driverExists) {\n                queryDB(`UPDATE Staff_DriverNumbers SET CurrentHolder = ? WHERE Number = ?`, [CurrentHolder, Number], 'run');\n            }\n            else if (CurrentHolder !== null) {\n                console.log(\"Driver with StaffID:\", CurrentHolder, \"does not exist. Skipping driver number update for number:\", Number);\n            }\n        });\n    }\n}\n\nexport function updatePerofmrnace2026() {\n    const globals = getGlobals();\n    const customTeam = globals.isCreateATeam;\n\n    const perf = getPerformanceAllTeams(null, null, customTeam);\n    const ovr32 = perf[32];\n\n    const teamDict = getBestParts(customTeam);\n    let tyreDegDict = {};\n\n    for (let team of Object.keys(teamDict)) {\n        delete teamDict[team][\"0\"];\n\n        const teamId = Number(team);\n        let teamboost = changes2026.Performance.find(x => x.TeamID === teamId);\n\n        if (teamId === 32) {\n            const objective = teamboost?.Objective ?? 23.4;\n\n            const dynamicBoost =\n                (typeof ovr32 === \"number\" && ovr32 > 0)\n                    ? (objective / ovr32)\n                    : (teamboost?.Boost ?? 1);\n\n            applyBoostToCarStats(teamDict[team], dynamicBoost, teamId);\n        } else {\n            applyBoostToCarStats(teamDict[team], teamboost.Boost, teamId);\n        }\n\n        const tyreDegStatsTemas = getTyreDegStats(teamDict[team]);\n        tyreDegDict[team] = tyreDegStatsTemas;\n    }\n\n\n    for (let team of Object.keys(teamDict)) {\n        let teamGivingTyreDeg = changes2026.Performance.find(x => x.TeamID === Number(team)).TyreDeg;\n        let tyreDegStats = tyreDegDict[teamGivingTyreDeg];\n        updateTyreDegStats(teamDict[team], tyreDegStats, team, teamGivingTyreDeg);\n    }\n\n    for (let team of Object.keys(teamDict)) {\n        if (changes2026.Performance.find(x => x.TeamID === Number(team))?.Expertise) {\n            let expertiseBoost = changes2026.Performance.find(x => x.TeamID === Number(team)).Expertise;\n            applyExpertiseBoost(expertiseBoost, team);\n        }\n    }\n\n    updateSeasonModTable(\"change-performance-2026\", 1, \"2026\");\n}\n\nexport function fixStandings(forSeason = \"2025\") {\n    //driverids that are in staff_driverdata and have a contract with teamids between 0 and 10 or 32 and posInTeam <= 2\n    const f1Drivers = queryDB(`SELECT StaffID FROM Staff_Contracts WHERE (TeamID <= 10 OR TeamID = 32) AND PosInTeam <= 2 AND StaffID IN (SELECT StaffID FROM Staff_DriverData)`, [], \"allRows\");\n    //delete all from that season\n    queryDB(`DELETE FROM Races_DriverStandings WHERE SeasonID = ? AND RaceFormula = 1`, [forSeason], 'run');\n    let position = 1;\n    f1Drivers.forEach((driver) => {\n        queryDB(`INSERT INTO Races_DriverStandings (SeasonID, DriverID, Points, Position, LastPointsChange, LastPositionChange, RaceFormula) VALUES (?, ?, 0, ?, 0, 0, 1)`, [forSeason, driver[0], position], 'run');\n        position++;\n    });\n}\n\n\nexport function changeAdditionalRegulations2026() {\n    if (!changes2026.Regulations || !Array.isArray(changes2026.Regulations)) {\n        console.log(\"No regulations changes found\");\n    }\n    else {\n        changes2026.Regulations.forEach((reg) => {\n            const { Name, CurrentValue, MinValue, MaxValue } = reg;\n            queryDB(`UPDATE Regulations_Enum_Changes SET CurrentValue = ?, MinValue = ?, MaxValue = ? WHERE Name = ?`, [CurrentValue, MinValue, MaxValue, Name], 'run');\n        });\n        changeBudgets(20000000);\n        updateFacilities2026();\n        updateSeasonModTable(\"change-regulations-2026\", 1, \"2026\");\n    }\n}\n\nexport function change2025Standings(mod = \"2026\") {\n    if (!changes2026.DriverStandings || !Array.isArray(changes2026.DriverStandings)) {\n        console.error(\"No driver standings found\");\n    } else {\n        for (const entry of changes2026.DriverStandings) {\n            const { DriverID, LastPointsChange, LastPositionChange, Points, Position, RaceFormula, SeasonID } = entry;\n            const existingEntry = queryDB(`SELECT * FROM Races_DriverStandings WHERE DriverID = ? AND RaceFormula = ? AND SeasonID = ?`, [DriverID, RaceFormula, SeasonID], \"singleRow\");\n            if (!existingEntry) {\n                queryDB(`INSERT INTO Races_DriverStandings (DriverID, LastPointsChange, LastPositionChange, Points, Position, RaceFormula, SeasonID)\n                VALUES (?, ?, ?, ?, ?, ?, ?)`, [DriverID, LastPointsChange, LastPositionChange, Points, Position, RaceFormula, SeasonID], 'run');\n                console.log(\"Inserted new driver standing for DriverID:\", DriverID);\n            } else {\n                queryDB(`\n                UPDATE Races_DriverStandings SET LastPointsChange = ?, LastPositionChange = ?, Points = ?, Position = ?\n                WHERE DriverID = ? AND RaceFormula = ? AND SeasonID = ?\n                `, [LastPointsChange, LastPositionChange, Points, Position, DriverID, RaceFormula, SeasonID], 'run');\n            }\n        }\n    }\n\n    if (!changes2026.TeamStandings || !Array.isArray(changes2026.TeamStandings)) {\n        console.error(\"No team standings found\");\n    } else {\n        queryDB(`DELETE FROM Races_TeamStandings WHERE RaceFormula = 1 AND SeasonID = 2025`, [], 'run');\n        for (const entry of changes2026.TeamStandings) {\n            const { LastPointsChange, LastPositionChange, Points, Position, RaceFormula, SeasonID, TeamID } = entry;\n\n            queryDB(`\n            INSERT INTO Races_TeamStandings (TeamID, LastPointsChange, LastPositionChange, Points, Position, RaceFormula, SeasonID)\n            VALUES (?, ?, ?, ?, ?, ?, ?)\n            `, [TeamID, LastPointsChange, LastPositionChange, Points, Position, RaceFormula, SeasonID], 'run');\n        }\n        const globals = getGlobals();\n        if (!globals.isCreateATeam) {\n            queryDB(`DELETE FROM Races_TeamStandings WHERE TeamID = 32`, [], 'run');\n        }\n    }\n    updateRecordsTo2026();\n    if (mod === \"2026\") {\n        updateSeasonModTable(\"change-cfd-2026\", 1, \"2026\");\n    }\n}\n\n\nexport function fixesMod2026() {\n    //if has trhe extra drivers\n    let wasError = false;\n    let badStandings = false;\n    const extraDrivers = queryDB(`SELECT value FROM Custom_2026_SeasonMod WHERE key = 'extra-drivers-2026'`, [], \"singleValue\");\n    const isWrong = queryDB(`SELECT Gender FROM Staff_BasicData WHERE StaffID = 654`, [], \"singleValue\");\n    if (extraDrivers === \"1\" && isWrong === 0) {\n        queryDB(`UPDATE Staff_BasicData SET Gender = 1 WHERE StaffID = 654`, [], \"run\")\n        wasError = true;\n    }\n\n    let errorDict = {\n        \"standings\": badStandings,\n        \"newStandings\": null,\n        \"extraDrivers\": isWrong === 0,\n        \"generalWasError\": wasError\n    };\n\n\n    return errorDict;\n}\n\nfunction updateRecordsTo2026() {\n    if (!changes2026.Records || !Array.isArray(changes2026.Records)) {\n        console.log(\"No records changes found\");\n    }\n    else {\n        changes2026.Records.forEach((record) => {\n            const { StaffID, Wins, Poles, Podiums, FastestLaps, Championships } = record;\n            const points2025 = changes2026.DriverStandings.find(x => x.DriverID === StaffID)?.Points || 0;\n            const points2024 = changes.DriverStandings.find(x => x.DriverID === StaffID)?.Points || 0;\n            const points = points2025 - points2024;\n            queryDB(`UPDATE Staff_Driver_RaceRecordBeforeGameStart SET TotalWins = TotalWins + ?, TotalPoles = TotalPoles + ?, TotalPodiums = TotalPodiums + ?, TotalFastestLaps = TotalFastestLaps + ?, TotalChampionshipWins = TotalChampionshipWins + ?, TotalPointsScored = TotalPointsScored + ? WHERE StaffID = ?`, [Wins, Poles, Podiums, FastestLaps, Championships, points, StaffID], 'run');\n        });\n    }\n}\n\nfunction updateFacilities2026() {\n    if (!changes2026.Facilities || !Array.isArray(changes2026.Facilities)) {\n        console.log(\"No teams HQ changes found\");\n    }\n    else {\n        changes2026.Facilities.forEach((fac) => {\n            const { TeamID, UpgradeBy } = fac;\n            //add one if it doesn't en in 5\n            queryDB(`\n                UPDATE Buildings_HQ\n                SET BuildingID = BuildingID + CASE\n                    WHEN (BuildingID % 10) = 5 THEN 0\n                    ELSE ?\n                END\n                WHERE TeamID = ?\n            `, [UpgradeBy, TeamID], \"run\");\n        });\n    }\n}\n"
  },
  {
    "path": "src/js/backend/scriptUtils/newsUtils.js",
    "content": "import { fetchEventsDoneFrom, formatNamesSimple, fetchEventsDoneBefore, fetchPointsRegulations, computeDriverOfTheDayFromRows, getDoDTopNForRace, editEngines, fetchEngines, ensureCustomEngineProgressionTable, snapshotEnginePowerProgression } from \"./dbUtils\";\nimport { races_names, countries_dict, countries_data, getParamMap, team_dict, combined_dict, opinionDict, part_full_names, continentDict, contintntRacesRegions, defaultTurningPointsFrequencyPreset, turningPointsTuningByType } from \"../../frontend/config\";\nimport newsTitleTemplates from \"../../../data/news/news_titles_templates.json\";\nimport turningPointsTitleTemplates from \"../../../data/news/turning_points_titles_templates.json\";\nimport { fetchSeasonResults, fetchQualiResults } from \"./dbUtils\";\nimport { queryDB } from \"../dbManager\";\nimport { excelToDate, dateToExcel, driverStats } from \"./eidtStatsUtils\";\nimport { getTier, getDriverOverall, fireDriver, hireDriver, swapDrivers } from \"./transferUtils\";\nimport { getPerformanceAllTeamsSeason, getAllPartsFromTeam, getPerformanceAllTeams } from \"./carAnalysisUtils\";\nimport { getGlobals } from \"../commandGlobals\";\nimport { unitValueToValue } from \"./carConstants\";\nimport { track } from \"@vercel/analytics\";\nimport LZString from \"lz-string\";\nimport { enrichDriversWithHistory, fetchDriverHistoryRecords } from \"./recordUtils\";\nconst USE_COMPRESSION = false;\n\nconst _seasonResultsCache = new Map();\nexport const _standingsCache = new Map();\nconst _dropsCache = new Map();\n\nfunction isTimeTravel2026Enabled() {\n    try {\n        const exists = queryDB(\n            `SELECT name FROM sqlite_master WHERE type='table' AND name='Custom_2026_SeasonMod'`,\n            [],\n            'singleRow'\n        );\n        if (!exists) return false;\n        const value = queryDB(\n            `SELECT value FROM Custom_2026_SeasonMod WHERE key = 'time-travel-2026'`,\n            [],\n            'singleValue'\n        );\n        return value === \"1\" || value === 1;\n    } catch {\n        return false;\n    }\n}\n\nfunction loadTurningPointsFrequencyConfig() {\n    try {\n        const presetRaw = queryDB(\n            `SELECT value FROM Custom_Save_Config WHERE key = 'turningPointsFrequencyPreset'`,\n            [],\n            'singleValue'\n        );\n        let presetIndex = defaultTurningPointsFrequencyPreset;\n        if (presetRaw !== null && presetRaw !== undefined) {\n            presetIndex = parseInt(presetRaw, 10);\n        }\n        return { presetIndex };\n    } catch {\n        return { presetIndex: defaultTurningPointsFrequencyPreset };\n    }\n}\n\nfunction getTurningPointChance(tpType, tpConfig) {\n    let presetIndex = tpConfig?.presetIndex;\n    if (presetIndex === undefined || presetIndex === null) {\n        presetIndex = defaultTurningPointsFrequencyPreset;\n    }\n    return turningPointsTuningByType[tpType].chance[presetIndex];\n}\n\nfunction getTurningPointMax(tpType, tpConfig) {\n    let presetIndex = tpConfig?.presetIndex;\n    if (presetIndex === undefined || presetIndex === null) {\n        presetIndex = defaultTurningPointsFrequencyPreset;\n    }\n    return turningPointsTuningByType[tpType].max[presetIndex];\n}\n\n\n\n\nfunction fetchSeasonResultsCached(season) {\n    if (_seasonResultsCache.has(season)) return _seasonResultsCache.get(season);\n    const res = fetchSeasonResults(season);\n    _seasonResultsCache.set(season, res);\n    return res;\n}\n\nexport function rebuildStandingsUntilCached(season, seasonResults, raceId, includeCurrentRacePrevResults = false, includeCurrentRacePoints = true) {\n    const key = `${season}:${raceId}:${includeCurrentRacePrevResults}:${includeCurrentRacePoints}`;\n    if (_standingsCache.has(key)) return _standingsCache.get(key);\n    const res = rebuildStandingsUntil(seasonResults, raceId, includeCurrentRacePrevResults, includeCurrentRacePoints);\n    _standingsCache.set(key, res);\n    return res;\n}\n\nexport function generate_news(savednews, turningPointState) {\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    if (isTimeTravel2026Enabled() && Number(daySeason?.[1]) < 2026) {\n        const existingList = Object.entries(savednews || {}).map(([id, n]) => ({ id, ...n }));\n        existingList.sort((a, b) => (Number(b.date) || 0) - (Number(a.date) || 0));\n        return { newsList: existingList, turningPointState };\n    }\n\n    const racesDone = fetchEventsDoneFrom(daySeason[1]);\n    const tpConfig = loadTurningPointsFrequencyConfig();\n    // const potentialChampionTestRaceId = 216; // Set to null for normal operation.\n\n    const potentialChampionNewsList = generateChampionMilestones(racesDone, savednews);\n\n    const currentDate = excelToDate(daySeason[0]);\n    const currentMonth = currentDate.getMonth() + 1;\n    const rumorMonths = [4, 5, 6, 7];\n    const comparisonMonths = [4, 5, 6, 7, 8, 9, 10];\n    const monthsDone = rumorMonths.filter(m => m <= currentMonth);\n\n    const raceNews = generateRaceResultsNews(racesDone, savednews);\n    const qualiNews = generateQualifyingResultsNews(racesDone, savednews);\n\n    const raceReactions = generateRaceReactionsNews(racesDone, savednews);\n\n    const comparisonNews = generateComparisonNews(comparisonMonths, savednews);\n\n    const transferRumors = getTrueTransferRumors();\n\n    const sillySeasonNews = generateTransferRumorsNews(transferRumors, savednews);\n\n    const contractRenewals = getContractExtensions();\n\n    const bigConfirmedTransfersNews = generateBigConfirmedTransferNews(savednews, currentMonth);\n    const fakeTransferNews = generateFakeTransferNews(monthsDone, savednews, bigConfirmedTransfersNews);\n    const contractRenewalsNews = generateContractRenewalsNews(savednews, contractRenewals, currentMonth);\n\n    const seasonReviews = generateSeasonReviewNews(savednews);\n\n    const nextSeasonGridNews = generateNextSeasonGridNews(savednews, currentMonth);\n\n    const juniorSeasonReviewNews = generateF2AndF3ReviewNews(currentMonth, savednews);\n\n    const dsqTurningPointNews = generateDSQTurningPointNews(racesDone, savednews, turningPointState, tpConfig);\n\n    const midSeasonTransfersTurningPointNews = generateMidSeasonTransfersTurningPointNews(monthsDone, currentMonth, savednews, turningPointState, tpConfig);\n\n    const technicalDirectiveTurningPointNews = generateTechnicalDirectiveTurningPointNews(currentMonth, savednews, turningPointState, tpConfig);\n\n    const investmentTurningPointNews = generateInvestmentTurningPointNews(currentMonth, savednews, turningPointState, tpConfig);\n\n    const raceSubstitutionTurningPointNews = generateRaceSubstitutionTurningPointNews(currentMonth, savednews, turningPointState, tpConfig);\n\n    const driverInjuryTurningPointNews = generateDriverInjuryTurningPointNews(currentMonth, savednews, turningPointState, tpConfig);\n\n    const enginesTurningPointNews = generateEnginesTurningPointNews(currentMonth, savednews, turningPointState, tpConfig);\n    const youngDriversTurningPointNews = generateYoungDriversTurningPointNews(currentMonth, savednews, turningPointState, tpConfig);\n\n    let aduoTPsEnabled = queryDB(`SELECT value FROM Custom_Save_Config WHERE key = 'aduo_tp_enabled'`, [], 'singleValue');\n    aduoTPsEnabled = aduoTPsEnabled === \"1\" || aduoTPsEnabled === 1;\n\n    const aduoTurningPointNews = generateAduoTurningPointsNews(currentMonth, savednews, turningPointState, tpConfig, aduoTPsEnabled);\n\n    let turningPointOutcomes = [];\n    if (Object.keys(savednews).length > 0) {\n        turningPointOutcomes = Object.entries(savednews)\n            .filter(([_, n]) => n.type && n.type.startsWith(\"turning_point_outcome\"))\n            .map(([id, n]) => ({ id, ...n }));\n    }\n\n    let newsList = [...raceNews || [], ...qualiNews || [], ...fakeTransferNews || [],\n    ...bigConfirmedTransfersNews || [], ...contractRenewalsNews || [], ...comparisonNews || [], ...seasonReviews || [],\n    ...potentialChampionNewsList || [], ...sillySeasonNews || [], ...juniorSeasonReviewNews || [], ...dsqTurningPointNews || [], \n    ...midSeasonTransfersTurningPointNews || [], ...turningPointOutcomes || [], ...technicalDirectiveTurningPointNews || [], ...investmentTurningPointNews || [],\n    ...raceSubstitutionTurningPointNews || [], ...driverInjuryTurningPointNews || [], ...raceReactions || [], ...nextSeasonGridNews || [],\n    ...enginesTurningPointNews || [], ...youngDriversTurningPointNews || [], ...aduoTurningPointNews || []];\n\n    // Include saved news entries that are not produced by the current generation logic (e.g. custom-created entries).\n    // Otherwise, those entries would exist in the DB but not appear in the current-season view.\n    const seenIds = new Set(newsList.map(n => n?.id).filter(Boolean));\n    for (const [id, n] of Object.entries(savednews || {})) {\n        if (!id || seenIds.has(id) || !n) continue;\n        if (n.type && typeof n.type === \"string\" && n.type.startsWith(\"turning_point_outcome\")) continue;\n        newsList.push({ id, ...n });\n        seenIds.add(id);\n    }\n\n    //order by date descending\n    newsList.sort((a, b) => b.date - a.date);\n\n    upsertNews(newsList);\n    upsertTurningPoints(turningPointState);\n\n    return {\n        newsList,\n        turningPointState\n    };\n}\n\nexport function generateTurningResponse(turningPointData, type, maxDate, outcome) {\n    let newEntry;\n    if (type === \"turning_point_transfer\") {\n        if (outcome === \"positive\") {\n            executeMidSeasonTransfer(turningPointData);\n        }\n        const entryId = `turning_point_outcome_transfer_${turningPointData.month}`;\n        const title = generateTurningPointTitle(turningPointData, 101, outcome);\n        const image = getImagePath(null, turningPointData.driver_in.id, \"transfer\");\n\n        newEntry = {\n            id: entryId,\n            title,\n            image,\n            data: turningPointData,\n            date: maxDate + 1,\n            turning_point_type: outcome,\n            type: \"turning_point_outcome_transfer\"\n        }\n    }\n    else if (type === \"turning_point_dsq\") {\n        if (outcome === \"positive\") {\n            const pointsReg = fetchPointsRegulations();\n\n            disqualifyTeamInRace({\n                raceId: turningPointData.race_id,\n                teamId: turningPointData.teamId,\n                queryDB,\n                pointsReg\n            });\n        }\n\n        const entryId = `turning_point_outcome_dsq_${turningPointData.race_id}`;\n        const title = generateTurningPointTitle(turningPointData, 103, outcome);\n        const image = getImagePath(null, null, \"dsq\");\n\n\n        newEntry = {\n            id: entryId,\n            title,\n            image,\n            data: turningPointData,\n            date: maxDate + 1,\n            turning_point_type: outcome,\n            type: \"turning_point_outcome_dsq\"\n        }\n        maxDate += 1;\n\n    }\n    else if (type === \"turning_point_technical_directive\") {\n        if (outcome === \"positive\") {\n            applyTechnicalDirectiveEffect(turningPointData);\n        }\n        const entryId = `turning_point_outcome_technical_directive_${turningPointData.month}`;\n        const title = generateTurningPointTitle(turningPointData, 100, outcome);\n        const image = getImagePath(null, turningPointData.componentId, \"technical\");\n        newEntry = {\n            id: entryId,\n            title,\n            image,\n            data: turningPointData,\n            date: maxDate + 1,\n            turning_point_type: outcome,\n            type: \"turning_point_outcome_technical_directive\"\n        }\n        maxDate += 1;\n    }\n    else if (type === \"turning_point_investment\") {\n        if (outcome === \"positive\") {\n            //apply investment effects: add the money and improve key facilities\n            applyInvestmentEffect(turningPointData);\n        }\n        const entryId = `turning_point_outcome_investment_${turningPointData.month}`;\n        const title = generateTurningPointTitle(turningPointData, 102, outcome);\n        const image = getImagePath(null, turningPointData.investmentId, \"investment\") || \"null.png\";\n\n        newEntry = {\n            id: entryId,\n            title,\n            image,\n            data: turningPointData,\n            date: maxDate + 1,\n            turning_point_type: outcome,\n            type: \"turning_point_outcome_investment\"\n        }\n        maxDate += 1;\n    }\n    else if (type === \"turning_point_race_substitution\") {\n        if (outcome === \"positive\") {\n            applyRaceSubstitution(turningPointData);\n        }\n        const entryId = `turning_point_outcome_race_substitution_${turningPointData.month}`;\n        const title = generateTurningPointTitle(turningPointData, 105, outcome);\n        const code = races_names[Number(turningPointData.newRaceTrackId)].toLowerCase()\n        const image = getImagePath(null, code, \"race_substitution\") || \"null.png\";\n        newEntry = {\n            id: entryId,\n            title,\n            image,\n            data: turningPointData,\n            date: maxDate + 1,\n            turning_point_type: outcome,\n            type: \"turning_point_outcome_race_substitution\"\n        }\n        maxDate += 1;\n    }\n    else if (type === \"turning_point_injury\") {\n        if (outcome === \"positive\") {\n            applyDriverInjury(turningPointData);\n        }\n        const entryId = `turning_point_outcome_injury_${turningPointData.month}`;\n        const title = generateTurningPointTitle(turningPointData, 106, outcome);\n        const image = getImagePath(null, null, \"injury\") || \"null.png\";\n        newEntry = {\n            id: entryId,\n            title,\n            image,\n            data: turningPointData,\n            date: maxDate + 1,\n            turning_point_type: outcome,\n            type: \"turning_point_outcome_injury\"\n        }\n        maxDate += 1;\n    }\n    else if (type === \"turning_point_engine_regulation\") {\n        if (outcome === \"positive\") {\n            editEngines(turningPointData.engineData);\n        }\n        const entryId = `turning_point_outcome_engine_regulation_${turningPointData.season}`;\n        const title = generateTurningPointTitle(turningPointData, 107, outcome);\n        const image = getImagePath(null, \"engine\", \"engine\") || \"null.png\";     \n        newEntry = {\n            id: entryId,\n            title,\n            image,\n            data: turningPointData,\n            date: maxDate + 1,\n            turning_point_type: outcome,\n            type: \"turning_point_outcome_engine_regulation\"\n        }\n        maxDate += 1;\n    }\n    else if (type === \"turning_point_young_drivers\") {\n        if (outcome === \"positive\") {\n            applyYoungDriversBoost(turningPointData);\n        }\n    }\n    else if(type === \"turning_point_aduo\") {\n        if (outcome === \"positive\") {\n            applyAduoEffect(turningPointData);\n        }\n\n    }\n\n    return newEntry;\n}\n\nfunction applyAduoEffect(turningPointData) {\n    const engineImprovements = turningPointData?.engineImprovements || [];\n    if (!engineImprovements.length) {\n        return;\n    }\n\n    ensureCustomEngineProgressionTable();\n\n    const [enginesData] = fetchEngines();\n    const enginesById = {};\n    for (const engineRow of enginesData || []) {\n        enginesById[String(engineRow[0])] = engineRow;\n    }\n\n    const readStat = (stats, statId) => {\n        if (!stats) return null;\n        const raw = stats[statId] !== undefined ? stats[statId] : stats[String(statId)];\n        if (raw === undefined || raw === null) return null;\n        return Number(raw);\n    };\n\n    snapshotEnginePowerProgression(\n        (enginesData || []).map((row) => row?.[0]).filter((id) => id !== null && id !== undefined),\n        'pre_aduo_tp',\n        turningPointData?.season\n    );\n\n    const clamp = (n, min, max) => Math.max(min, Math.min(max, n));\n    const engineDataToEdit = {};\n\n    for (const engineChange of engineImprovements) {\n        const engineId = String(engineChange.engineId);\n        const engineRow = enginesById[engineId];\n        if (!engineRow) continue;\n\n        const baseStats = engineRow[1] || {};\n        const improvements = engineChange.improvements || {};\n        const newStats = {};\n\n        for (const statId of Object.keys(baseStats)) {\n            newStats[statId] = Number(baseStats[statId]) || 0;\n        }\n\n        for (const statId of Object.keys(improvements)) {\n            if (improvements[statId] === undefined || improvements[statId] === null) continue;\n            const pct = improvements[statId];\n\n            const current = newStats[statId];\n            if (current === undefined || current === null) continue;\n\n            const next = (current * (100 + pct)) / 100;\n            newStats[statId] = clamp(next, 0, 100);\n        }\n\n        engineDataToEdit[engineId] = newStats;\n    }\n\n    console.log(\"[Aduo TP] Applying engine improvements:\", engineImprovements);\n    editEngines(engineDataToEdit);\n}\n\n\nfunction applyRaceSubstitution(turningPointData) {\n    const raceId = turningPointData.raceId;\n    const newTrackId = turningPointData.newRaceTrackId;\n    const newDay = turningPointData.newRaceDay;\n    queryDB(`UPDATE Races SET TrackID = ?, Day = ? WHERE RaceID = ?`, [newTrackId, newDay, raceId], 'run');\n}\n\nfunction applyInvestmentEffect(turningPointData) {\n    const teamId = turningPointData.teamId;\n    const investmentAmount = turningPointData.investmentAmount;\n    const keyBuildings = [1, 2, 3, 4, 5, 6, 7, 8, 9, 15];\n    const level4Buildings = [2, 3, 5, 6, 7, 8];\n\n    for (const buildingId of keyBuildings) {\n        //buildingID is a number that first has the actual id and the last number represents its level\n        if (level4Buildings.includes(buildingId)) {\n            //put it to at least level4, if its already at 4, improve to 5\n            const current = queryDB(`SELECT BuildingID FROM Buildings_HQ WHERE TeamID = ? AND BuildingType = ?`, [teamId, buildingId], 'singleValue');\n            let newLevel = 4;\n            if (current) {\n                 //get last digit\n                 const currentLevel = parseInt(current.toString().slice(-1), 10);\n                 const safeLevel = Math.min(5, Math.max(0, currentLevel));\n                 if (safeLevel >= 4) {\n                     newLevel = 5;\n                 }\n                 const newBuildingId = parseInt(current.toString().slice(0, -1) + newLevel.toString(), 10);\n                 queryDB(`UPDATE Buildings_HQ SET BuildingID = ?, DegradationValue = 1 WHERE BuildingType = ? AND TeamID = ?`, [newBuildingId, buildingId, teamId], 'run');\n             }\n\n        }\n        else {//set to at least level 4\n            const current = queryDB(`SELECT BuildingID FROM Buildings_HQ WHERE TeamID = ? AND BuildingType = ?`, [teamId, buildingId], 'singleValue');    \n             if (current) {\n                 const currentStr = current.toString();\n                 const currentLevel = parseInt(currentStr.slice(-1), 10);\n                 const safeLevel = Math.min(5, Math.max(0, currentLevel));\n                 const newLevel = safeLevel >= 5 ? 5 : 4;\n                 const newBuildingId = parseInt(currentStr.slice(0, -1) + newLevel.toString(), 10);\n                 queryDB(`UPDATE Buildings_HQ SET BuildingID = ?, DegradationValue = 1 WHERE BuildingType = ? AND TeamID = ?`, [newBuildingId, buildingId, teamId], 'run');\n             }\n\n        }\n\n    }\n\n    //multiply investment amount by 1 million\n    const moneyToAdd = investmentAmount * 1000000;\n    queryDB(`UPDATE Finance_TeamBalance SET Balance = Balance + ? WHERE TeamID = ?`, [moneyToAdd, teamId], 'run');\n}\n\nfunction executeMidSeasonTransfer(turningPointData) {\n    const { teamId, driver_out, driver_in, driver_substitute } = turningPointData;\n\n    // Red Bull special case: Swap drivers\n    if (teamId === 3 && (combined_dict[8] === \"Alpha Tauri\" || combined_dict[8] === \"Visa Cashapp RB\") && driver_in.teamId === 8) {\n        // Fire both drivers\n        fireDriver(driver_out.id, driver_out.teamId);\n        fireDriver(driver_in.id, driver_in.teamId);\n\n        // Hire them in their new teams\n        const existingDrivers = queryDB(`SELECT con.PosInTeam FROM Staff_Contracts con JOIN Staff_DriverData dri ON con.StaffID = dri.StaffID WHERE con.TeamID = ? AND con.ContractType = 0 AND con.PosInTeam <= 2`, [driver_out.teamId], 'allRows').map(r => r[0]);\n        const posInTeamForDriverIn = existingDrivers.includes(1) ? 2 : 1;\n        hireDriver(\"auto\", driver_in.id, driver_out.teamId, posInTeamForDriverIn);\n\n        const existingDriversSubTeam = queryDB(`SELECT con.PosInTeam FROM Staff_Contracts con JOIN Staff_DriverData dri ON con.StaffID = dri.StaffID WHERE con.TeamID = ? AND con.ContractType = 0 AND con.PosInTeam <= 2`, [driver_in.teamId], 'allRows').map(r => r[0]);\n        const posInTeamForDriverOut = existingDriversSubTeam.includes(1) ? 2 : 1;\n        hireDriver(\"auto\", driver_out.id, driver_in.teamId, posInTeamForDriverOut);\n        return;\n    }\n\n    // --- Standard Transfer ---\n\n    // 1. Fire all involved drivers from their current teams\n    fireDriver(driver_out.id, driver_out.teamId);\n    if (driver_in.teamId) {\n        fireDriver(driver_in.id, driver_in.teamId);\n    }\n    if (driver_substitute && driver_substitute.teamId) {\n        fireDriver(driver_substitute.id, driver_substitute.teamId);\n    }\n\n    // 2. Hire drivers into their new teams\n    // Hire driver_in to the main team (teamId)\n    const existingDrivers = queryDB(`SELECT con.PosInTeam FROM Staff_Contracts con JOIN Staff_DriverData dri ON con.StaffID = dri.StaffID WHERE con.TeamID = ? AND con.ContractType = 0 AND con.PosInTeam <= 2`, [teamId], 'allRows').map(r => r[0]);\n    const posInTeamForDriverIn = existingDrivers.includes(1) ? 2 : 1;\n    hireDriver(\"auto\", driver_in.id, teamId, posInTeamForDriverIn);\n\n    // Hire driver_substitute to driver_in's original team (if applicable)\n    if (driver_substitute && driver_in.teamId) {\n        const existingDriversSubTeam = queryDB(`SELECT con.PosInTeam FROM Staff_Contracts con JOIN Staff_DriverData dri ON con.StaffID = dri.StaffID WHERE con.TeamID = ? AND con.ContractType = 0 AND con.PosInTeam <= 2`, [driver_in.teamId], 'allRows').map(r => r[0]);\n        const posInTeamForSubstitute = existingDriversSubTeam.includes(1) ? 2 : 1;\n        hireDriver(\"auto\", driver_substitute.id, driver_in.teamId, posInTeamForSubstitute);\n    }\n}\n\nfunction applyTechnicalDirectiveEffect(turningPointData) {\n    //iterate through the object turningPointData.effectOnEachteam\n    const componentId = turningPointData.componentId;\n    for (const [teamIdStr, effect] of Object.entries(turningPointData.effectOnEachteam)) {\n        const teamId = Number(teamIdStr);\n        const performanceChange = Number(effect.performanceGainLoss);\n        const designs = queryDB(`SELECT DesignID FROM Parts_Designs WHERE TeamID = ? AND PartType = ?`, [teamId, componentId], 'allRows');\n        for (const designRow of designs) {\n            const designId = designRow[0];\n            const unitValues = queryDB(`SELECT UnitValue, PartStat FROM Parts_Designs_StatValues WHERE DesignID = ? AND  PartStat != 15`, [designId], 'allRows');\n            for (const valueRow of unitValues) {\n                const partStat = valueRow[1];\n                const currentUnitValue = Number(valueRow[0]);\n                const newRelative = 100 + performanceChange;\n                const newUnitValue = (currentUnitValue * newRelative) / 100;\n                const newValue = unitValueToValue[partStat](newUnitValue);\n                queryDB(`UPDATE Parts_Designs_StatValues SET Value = ?, UnitValue = ? WHERE DesignID = ? AND PartStat = ?`, [newValue, newUnitValue, designId, partStat], 'run');\n            }\n        }\n        //now the expertise\n        const expertise = queryDB(`SELECT Expertise, PartStat FROM Parts_TeamExpertise WHERE TeamID = ? AND PartType = ? AND PartStat != 15`, [teamId, componentId], 'allRows');\n        for (const expRow of expertise) {\n            const currentExpertise = Number(expRow[0]);\n            const partStat = expRow[1];\n            const newRelative = 100 + performanceChange;\n            const newExpertise = (currentExpertise * newRelative) / 100;\n            queryDB(`UPDATE Parts_TeamExpertise SET Expertise = ? WHERE TeamID = ? AND PartType = ? AND PartStat = ?`, [newExpertise, teamId, componentId, partStat], 'run');\n        }\n    }\n}\n\nfunction generateRaceSubstitutionTurningPointNews(currentMonth, savednews = {}, turningPointState = {}, tpConfig = null) {\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const months = [4, 5, 6, 7, 8, 9, 10, 11];\n    let newsList = [];\n    for (let month of months) {\n        const entryId = `turning_point_race_substitution_${month}`;\n        if (savednews[entryId]) {\n            newsList.push({ id: entryId, ...savednews[entryId] });\n        }\n    }\n\n    const maxPerSeason = Math.min(months.length, getTurningPointMax(\"raceSubstitution\", tpConfig));\n    if (newsList.length >= maxPerSeason) {\n        return newsList;\n    }\n\n    if (turningPointState.raceSubstitutionOpportunities[currentMonth] !== null) {\n        return newsList;\n    }\n\n    const chance = getTurningPointChance(\"raceSubstitution\", tpConfig);\n    if (Math.random() > chance) {\n        turningPointState.raceSubstitutionOpportunities[currentMonth] = \"None\";\n        return newsList;\n    }\n\n    //get races that are still to be done\n    const calendar = queryDB(`SELECT RaceID, TrackID, Day FROM Races WHERE SeasonID = ? AND State = 0 ORDER BY Day`, [daySeason[1]], 'allRows');\n    //remove the first 4\n    const potentialRaces = calendar.slice(4);\n\n    if (potentialRaces.length < 2) { //too little races\n        return newsList;\n    }\n\n    //pick one randomly between nber 5 and 9 of the remaining races\n    const potentialCancellations = potentialRaces.slice(0, Math.min(5, potentialRaces.length - 1));\n    const cancellationRace = randomPick(potentialCancellations);\n    const originalTrackId = Number(String(cancellationRace[1]).trim());\n    let originalRaceId = cancellationRace[0];\n    let availableRaceBefore = false, availableRaceAfter = false;\n    let newRaceTrackId = null;\n    let newRaceDay = null;\n    let typeOfSubstitution = null;\n\n    //check if the race before is more than 7 days before or the race after is more than 7 days after\n    const cancellationIndex = calendar.findIndex(r => r[0] === cancellationRace[0]);\n    if (cancellationIndex > 0) {\n        const previousRace = calendar[cancellationIndex - 1];\n        const dayDiff = cancellationRace[2] - previousRace[2];\n        if (dayDiff > 7) {\n            availableRaceBefore = true;\n        }\n    }\n    if (cancellationIndex < calendar.length - 1) {\n        const nextRace = calendar[cancellationIndex + 1];\n        const dayDiff = nextRace[2] - cancellationRace[2];\n        if (dayDiff > 7) {\n            availableRaceAfter = true;\n        }\n    }\n\n    if (availableRaceAfter) {\n        //50% chance\n        if (Math.random() < 0.5) { //put the same race that the race after but 7 days before\n            const nextRace = calendar[cancellationIndex + 1];\n            newRaceTrackId = nextRace[1];\n            newRaceDay = nextRace[2] - 7;\n            typeOfSubstitution = \"same_as_next\";\n        }\n        else {\n            let region = continentDict[originalTrackId] || \"Europe\";\n            let racesPool = contintntRacesRegions[region].filter(tid => tid !== originalTrackId);\n            newRaceTrackId = randomPick(racesPool);\n            newRaceDay = cancellationRace[2]; //same day\n            typeOfSubstitution = \"different_race\";\n        }\n    }\n    else if (availableRaceBefore) {\n        //50% chance\n        if (Math.random() < 0.5) { //put the same race that the race before but 7 days after\n            const previousRace = calendar[cancellationIndex - 1];\n            newRaceTrackId = previousRace[1];\n            newRaceDay = previousRace[2] + 7;\n            typeOfSubstitution = \"same_as_previous\";\n        }\n        else {\n            let region = continentDict[originalTrackId] || \"Europe\";\n            let racesPool = contintntRacesRegions[region].filter(tid => tid !== originalTrackId);\n            newRaceTrackId = randomPick(racesPool);\n            newRaceDay = cancellationRace[2]; //same day\n            typeOfSubstitution = \"different_race\";\n        }\n    }\n    else {\n        let region = continentDict[originalTrackId] || \"Europe\";\n        let racesPool = contintntRacesRegions[region].filter(tid => tid !== originalTrackId);\n        newRaceTrackId = randomPick(racesPool);\n        newRaceDay = cancellationRace[2];\n        typeOfSubstitution = \"different_race\";\n    }\n    const originalCountry = countries_data[races_names[originalTrackId]]?.adjective || \"Unknown Country\";\n    const substituteCountry = countries_data[races_names[newRaceTrackId]]?.country || \"Unknown Country\";\n\n    const reasons_pool = [\n        \"infrastructure delays\",\n        \"contractual disputes\",\n        \"financial uncertainty\",\n        \"logistical challenges\",\n        \"homologation issues\",\n        \"political instability\",\n        \"travel restrictions\",\n        \"calendar restructuring\",\n        \"environmental concerns\",\n        \"permit complications with local authorities\"\n    ];\n    const reason = randomPick(reasons_pool);\n\n    const newEntryId = `turning_point_race_substitution_${currentMonth}`;\n    const code = races_names[Number(originalTrackId)].toLowerCase()\n    const image = getImagePath(null, code, \"race_substitution\");\n\n    const titleData = {\n        originalCountry: originalCountry,\n        substituteCountry: substituteCountry,\n        reason: reason,\n        originalTrackId: originalTrackId,\n        newRaceTrackId: newRaceTrackId,\n        newRaceDay: newRaceDay,\n        raceId: originalRaceId,\n        month: currentMonth,\n        season: daySeason[1],\n        typeOfSubstitution: typeOfSubstitution\n    };\n\n    const title = generateTurningPointTitle(titleData, 105, \"original\");\n    const excelDate = dateToExcel(new Date(daySeason[1], currentMonth - 1, Math.floor(Math.random() * 28) + 1));\n    turningPointState.raceSubstitutionOpportunities[currentMonth] = titleData;\n    const newsEntry = {\n        id: newEntryId,\n        title: title,\n        image: image,\n        date: excelDate,\n        data: titleData,\n        turning_point_type: \"original\",\n        type: \"turning_point_race_substitution\"\n    }\n\n    newsList.push(newsEntry);\n\n\n    return newsList;\n}\n\nfunction generateInvestmentTurningPointNews(currentMonth, savednews = {}, turningPointState = {}, tpConfig = null) {\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const months = [4, 5, 6, 7, 8, 9, 10, 11];\n    let newsList = [];\n    for (let month of months) {\n        const entryId = `turning_point_investment_${month}`;\n        if (savednews[entryId]) {\n            newsList.push({ id: entryId, ...savednews[entryId] });\n        }\n    }\n\n    const maxPerSeason = Math.min(months.length, getTurningPointMax(\"investment\", tpConfig));\n    if (newsList.length >= maxPerSeason) {\n        return newsList;\n    }\n\n    //if season is odd, return empty array\n    if (daySeason[1] % 2 === 1) {\n        return newsList;\n    }\n    //if that month has already been calculated then skip chance\n    if (turningPointState.investmentOpportunities[currentMonth] !== null) {\n        return newsList;\n    }\n\n    const chance = getTurningPointChance(\"investment\", tpConfig);\n    if (Math.random() >= chance) {\n        turningPointState.investmentOpportunities[currentMonth] = \"None\";       \n        return newsList;\n    }\n\n    //rich countries with interest in motorsport, especially middle eastern\n    const investmentCountries = [\"China\", \"Saudi Arabia\", \"United Arab Emirates\", \"India\", \"Russia\", \"South Africa\", \"Qatar\", \"Bahrain\", \"Singapore\", \"Vietnam\"];\n    const countryName = randomPick(investmentCountries);\n\n    const countryCode = countryName.slice(0, 3).toLowerCase();\n\n\n    const globals = getGlobals();\n    let teamIds = [2, 3, 5, 6, 7, 8, 9, 10] //exclude ferrari abd mercedes\n    if (globals.isCreateATeam) {\n        teamIds.push(32);\n    }\n    const randomTeamId = randomPick(teamIds);\n    const randomTeamName = combined_dict[randomTeamId] || \"Unknown Team\";\n\n    const investmentRanges = [\n        { share: 10, amounts: [30, 40, 50, 60] },\n        { share: 15, amounts: [40, 50, 60, 70] },\n        { share: 20, amounts: [50, 60, 75, 90] },\n        { share: 25, amounts: [70, 80, 90, 100] },\n        { share: 30, amounts: [80, 100, 120, 140] },\n        { share: 35, amounts: [100, 120, 150] },\n        { share: 40, amounts: [120, 150, 180] },\n        { share: 51, amounts: [150, 180, 200, 220] },\n        { share: 65, amounts: [200, 250, 300] },\n        { share: 80, amounts: [250, 300, 350, 400] }\n    ];\n\n    const selectedRange = randomPick(investmentRanges);\n    const investmentShare = selectedRange.share;\n    const investmentAmount = randomPick(selectedRange.amounts);\n\n    const titleData = {\n        country: countryName,\n        teamId: randomTeamId,\n        teamName: randomTeamName,\n        investmentAmount: investmentAmount,\n        investmentShare: investmentShare,\n        season: daySeason[1],\n        month: currentMonth,\n    };\n\n    const title = generateTurningPointTitle(titleData, 102, \"original\");\n\n    const image = getImagePath(null, countryCode, \"investment\");\n    const excelDate = dateToExcel(new Date(daySeason[1], currentMonth - 1, Math.floor(Math.random() * 28) + 1));\n\n    turningPointState.investmentOpportunities[currentMonth] = {\n        country: countryName,\n        teamId: randomTeamId,\n        teamName: randomTeamName,\n        investmentAmount: investmentAmount,\n        investmentShare: investmentShare,\n        season: daySeason[1],\n        month: currentMonth,\n    }\n\n    const entryId = `turning_point_investment_${currentMonth}`;\n\n    const newsEntry = {\n        id: entryId,\n        title: title,\n        image: image,\n        date: excelDate,\n        data: titleData,\n        turning_point_type: \"original\",\n        type: \"turning_point_investment\"\n    }\n    newsList.push(newsEntry);\n\n    return newsList;\n}\n\nfunction generateDriverInjuryTurningPointNews(currentMonth, savednews = {}, turningPointState = {}, tpConfig = null) {\n    turningPointState.injuries = turningPointState.injuries || {};\n\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const todayExcel = Number(daySeason[0]);\n    const seasonYear = Number(daySeason[1]);\n\n    const months = [4, 5, 6];\n    const maxPerSeason = Math.min(months.length, getTurningPointMax(\"injury\", tpConfig));\n\n    const newsList = [];\n    for (const m of months) { //should only be april, may and june, else is for testing\n        const id = `turning_point_injury_${m}`;\n        if (savednews[id]) newsList.push({ id, ...savednews[id] });\n        if (newsList.length >= maxPerSeason) {\n            return newsList;\n        }\n    }\n\n    //should only be april, may and june, else is for testing\n    if (![4, 5, 6].includes(currentMonth) || turningPointState.injuries[currentMonth]) {\n        return newsList;\n    }\n\n    const nRemainingRaces = queryDB(`\n        SELECT COUNT(*) FROM Races\n        WHERE SeasonID = ? AND State = 0\n    `, [seasonYear], 'singleValue');\n\n    // Need at least 5 races remaining to consider an injury\n    if (nRemainingRaces < 5) {\n        turningPointState.injuries[currentMonth] = \"None\";\n        return newsList;\n    }\n\n    const chance = getTurningPointChance(\"injury\", tpConfig);\n    if (Math.random() >= chance) {\n        turningPointState.injuries[currentMonth] = \"None\";\n        return newsList;\n    }\n\n    const INJURY_CATALOG = [\n        {\n            share: 35,\n            type: \"illness\",\n            condition: \"an illness\",\n            durations: [7, 10, 14],\n            reasons: [\n                \"a strong viral infection requiring rest\",\n                \"high fever and fatigue from a viral infection\",\n                \"a severe stomach flu affecting performance\"\n            ]\n        },\n        {\n            share: 20,\n            type: \"minor_injury\",\n            condition: \"a sprained wrist\",\n            durations: [14, 21, 28],\n            reasons: [\n                \"a minor wrist sprain during strength training\",\n                \"an awkward twist of the wrist in a reaction drill\",\n                \"a wrist knock after a training fall on the bike\"\n            ]\n        },\n        {\n            share: 15,\n            type: \"back_pain\",\n            condition: \"a back-pain flare-up\",\n            durations: [14, 21, 28, 35],\n            reasons: [\n                \"a back-pain flare-up after long simulator sessions\",\n                \"a lower-back muscle strain requiring physiotherapy\",\n                \"persistent lumbar discomfort requiring medical rest\"\n            ]\n        },\n        {\n            share: 15,\n            type: \"concussion\",\n            condition: \"a concussion\",\n            durations: [21, 28, 35, 42],\n            reasons: [\n                \"a light crash during private testing (concussion protocol)\",\n                \"mild concussion symptoms requiring medical clearance\",\n                \"dizziness and headache after an impact (FIA protocol)\"\n            ]\n        },\n        {\n            share: 10,\n            type: \"fracture\",\n            condition: \"a small fracture\",\n            durations: [28, 42, 56],\n            reasons: [\n                \"a small collarbone fracture from cycling\",\n                \"a hairline rib fracture during a bike session\",\n                \"a minor hand fracture requiring immobilization\"\n            ]\n        },\n        {\n            share: 5,\n            type: \"surgery\",\n            condition: \"a recent minor surgery\",\n            durations: [35, 49, 63],\n            reasons: [\n                \"a scheduled minor procedure with ongoing recovery\",\n                \"a successful minor intervention followed by rehabilitation\",\n                \"a preventive procedure to address recurring pain\"\n            ]\n        }\n    ];\n\n\n    // Weighted random pick helper\n    function weightedPick(arr, key = \"share\") {\n        const total = arr.reduce((s, it) => s + (it[key] || 0), 0);\n        let r = Math.random() * total;\n        for (const it of arr) {\n            r -= (it[key] || 0);\n            if (r <= 0) return it;\n        }\n        return arr[arr.length - 1];\n    }\n\n    const pickedInjury = weightedPick(INJURY_CATALOG);\n    const baseDuration = randomPick(pickedInjury.durations);\n\n\n    // --- Get teams with two official drivers ---\n    const pairs = queryDB(`\n    SELECT con.TeamID, con.StaffID\n    FROM Staff_Contracts con\n    JOIN Staff_DriverData d ON d.StaffID = con.StaffID\n    WHERE con.ContractType = 0 AND con.PosInTeam <= 2 AND (con.TeamID <= 10 OR con.TeamID = 32)\n    `, [], 'allRows');\n\n    if (!pairs || !pairs.length) {\n        turningPointState.injuries[currentMonth] = \"None\";\n        return newsList;\n    }\n\n    const teamToDrivers = {};\n    for (const row of pairs) {\n        const teamId = Number(row[0]);\n        const driverId = Number(row[1]);\n        (teamToDrivers[teamId] ||= []).push(driverId);\n    }\n    const eligibleTeams = Object.keys(teamToDrivers).filter(t => teamToDrivers[t].length >= 2).map(Number);\n    if (!eligibleTeams.length) {\n        turningPointState.injuries[currentMonth] = \"None\";\n        return newsList;\n    }\n\n    // Pick random team and driver\n    const teamId = randomPick(eligibleTeams);\n    const teamDrivers = teamToDrivers[teamId];\n    const driverId = randomPick(teamDrivers);\n    const teamName = combined_dict[teamId] || \"Unknown Team\";\n\n    // Get driver name\n    let nameRow = queryDB(`SELECT FirstName, LastName FROM Staff_BasicData WHERE StaffID = ?`, [driverId], 'singleRow') || [\"Unknown\", \"Driver\"];\n    const driverName = formatNamesSimple([...nameRow, driverId]);\n\n    // --- Injury dates ---\n    const startExcel = todayExcel;\n    const startDate = excelToDate(startExcel);\n\n\n    // Get next race after start date\n    const nextRaceDay = queryDB(`\n        SELECT MIN(Day) FROM Races\n        WHERE Day > ?\n    `, [startExcel], 'singleValue');\n    const nextRaceExcel = nextRaceDay ? Number(nextRaceDay) + 2 : null;\n\n    // Compute end date (extended to cover at least the next race)\n    let endDate = new Date(startDate.getTime());\n    endDate.setDate(endDate.getDate() + baseDuration);\n\n    if (nextRaceExcel) {\n        const nextRaceDate = excelToDate(nextRaceExcel);\n        if (endDate < nextRaceDate) {\n            endDate = new Date(nextRaceDate.getTime());\n        }\n    }\n\n    const endExcel = dateToExcel(endDate);\n\n\n    // Find affected races between start and end\n    const racesAffected = queryDB(`\n        SELECT RaceID, Day, TrackID\n        FROM Races\n        WHERE Day >= ? AND Day <= ?\n        ORDER BY Day ASC\n    `, [startExcel, endExcel], 'allRows') || [];\n\n\n    const expectedRaceReturn = queryDB(`\n        SELECT MIN(Day), RaceID, TrackID FROM Races\n        WHERE Day > ?\n    `, [endExcel], 'singleRow');\n    const expectedReturnRaceId = expectedRaceReturn ? Number(expectedRaceReturn[1]) : null;\n    const expectedReturnCountry = countries_data[races_names[Number(expectedRaceReturn[2])]]?.country\n\n    const reason = randomPick(pickedInjury.reasons);\n\n\n    let reserve = {}\n    let reserveCandidates = [];\n    const reserveDrivers = queryDB(`SELECT bas.FirstName, bas.LastName, dri.StaffID, con.TeamID\n    FROM Staff_Contracts con\n    JOIN Staff_BasicData bas ON con.StaffID = bas.StaffID\n    JOIN Staff_DriverData dri ON con.StaffID = dri.StaffID\n    WHERE con.TeamID = ? AND con.ContractType = 0 AND con.PosInTeam > 2`, [teamId], 'allRows');\n    if (reserveDrivers.length) {\n        reserveCandidates = [];\n        for (const rd of reserveDrivers) {\n            const overall = getDriverOverall(rd[2]);\n            reserveCandidates.push({ driverId: rd[2], teamId: rd[3], rating: overall, name: formatNamesSimple([rd[0], rd[1], rd[4]])[0] });\n        }\n        reserveCandidates.sort((a, b) => b.rating - a.rating);\n    }\n    else {\n        return newsList;\n    }\n    //get the reserve driver with highest rating\n    reserve.name = reserveCandidates[0].name;\n    reserve.id = reserveCandidates[0].driverId;\n    reserve.teamId = reserveCandidates[0].teamId;\n    reserve.overall = reserveCandidates[0].rating;\n\n    //if reserve overall is lower than 70 and fallback\n    if (reserve.overall < 70 || !reserve.overall || !reserve.id) {\n        let freeCandidates = [];\n        const freeAgents = queryDB(`SELECT bas.FirstName, bas.LastName, dri.StaffID\n                    FROM Staff_BasicData bas\n                    JOIN Staff_DriverData dri ON bas.StaffID = dri.StaffID\n                    JOIN Staff_GameData gd ON bas.StaffID = gd.StaffID\n                    WHERE dri.StaffID NOT IN (SELECT StaffID FROM Staff_Contracts)\n                    AND gd.Retired = 0`, [], 'allRows');\n        if (freeAgents.length) {\n            for (const fa of freeAgents) {\n                const overall = getDriverOverall(fa[2]);\n                freeCandidates.push({ driverId: fa[2], rating: overall, name: formatNamesSimple([fa[0], fa[1], fa[2]])[0] });\n            }\n            freeCandidates.sort((a, b) => b.rating - a.rating);\n            reserve.name = freeCandidates[0].name;\n            reserve.id = freeCandidates[0].driverId;\n            reserve.teamId = null;\n            reserve.overall = freeCandidates[0].rating;\n            reserve.isFreeAgent = true;\n            reserve.futureTeamId = teamId;\n        }\n    }\n\n    // Build data object\n    const entryId = `turning_point_injury_${currentMonth}`;\n    if (savednews[entryId]) return newsList;\n\n    const newData = {\n        team: teamName,\n        teamId,\n        driver_affected: {\n            id: driverId,\n            name: driverName[0],\n            teamId\n        },\n        condition: {\n            type: pickedInjury.type,\n            condition: pickedInjury.condition,\n            reason,\n            start_date: startExcel,\n            end_date: endExcel,\n            next_race_min_enforced: !!nextRaceExcel,\n            races_affected: racesAffected.map(r => ({\n                raceId: Number(r[0]),\n                country: countries_data[races_names[Number(r[2])]]?.country,\n                day: Number(r[1])\n            })),\n            expectedReturnRaceId: expectedReturnRaceId,\n            expectedReturnCountry: expectedReturnCountry\n        },\n        reserve_driver: reserve,\n        month: currentMonth,\n        season: seasonYear\n    };\n\n    turningPointState.injuries[currentMonth] = newData;\n\n    const title = generateTurningPointTitle(newData, 106, \"original\")\n\n    const image = getImagePath(null, driverId, \"injury\");\n\n    const entry = {\n        id: entryId,\n        title,\n        image,\n        data: newData,\n        date: startExcel,\n        turning_point_type: \"original\",\n        type: \"turning_point_injury\"\n    };\n\n    newsList.push(entry);\n    return newsList;\n}\n\n\nfunction generateEnginesTurningPointNews(currentMonth, savednews = {}, turningPointState = {}, tpConfig = null) {\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], \"singleRow\");\n    const season = daySeason[1];\n    const newsList = [];\n\n    const allRacesDone = queryDB(\n        `SELECT COUNT(*) FROM Races WHERE SeasonID = ? AND State = 2`,\n        [season],\n        \"singleValue\"\n    );\n    const totalRaces = queryDB(\n        `SELECT COUNT(*) FROM Races WHERE SeasonID = ?`,\n        [season],\n        \"singleValue\"\n    );\n\n    // Solo último mes + temporada terminada\n    if (currentMonth < 11 || allRacesDone < totalRaces) {\n        return newsList;\n    }\n\n    const entryId = `turning_point_engine_regulation_${season}`;\n    if (savednews[entryId]) {\n        newsList.push({ id: entryId, ...savednews[entryId] });\n        return newsList;\n    }\n\n    const chance = getTurningPointChance(\"engineRegulation\", tpConfig);\n    if (Math.random() >= chance) {\n        return newsList;\n    }\n\n    // --- Lectura DB ---\n    const engines = queryDB(`SELECT * FROM Custom_Engines_list`, [], \"allRows\");\n    const engineStats = queryDB(`SELECT * FROM Custom_Engines_stats`, [], \"allRows\");\n\n    // --- Tipo de regulación ---\n    let changeType = \"minor\";\n    if (Math.random() < 0.1) changeType = \"major\";\n\n    const minorChangeAreas = [\n        \"fuel flow monitoring\",\n        \"ERS deployment limits\",\n        \"MGU-K usage rules\",\n        \"cooling system allowances\",\n        \"gearbox durability limits\",\n        \"turbo efficiency limits\",\n        \"oil consumption rules\"\n    ];\n    const majorChangeAreas = [\n        \"hybrid system architecture\",\n        \"engine architecture layout\",\n        \"combustion concept rules\",\n        \"turbocharger design limits\",\n        \"energy recovery system redesign\",\n        \"fuel system design rules\",\n        \"power unit packaging regulations\"\n    ];\n    const changeAreasPool = changeType === \"major\" ? majorChangeAreas : minorChangeAreas;\n    const mainChangeArea = randomPick(changeAreasPool);\n\n    const VAR = changeType === \"major\" ? 0.28 : 0.13; // major changes can cause up to ±28% change, minor up to ±15%\n\n    const randBetween = (min, max) => min + Math.random() * (max - min);\n    const clamp = (n, min, max) => Math.max(min, Math.min(max, n));\n\n\n    const currentStats = {};\n    for (const row of engineStats) {\n        const engineId = String(row[0]);\n        const designId = Number(row[1]);\n        const partStat = Number(row[2]);\n        const unitValue = Number(row[3]); // 4º valor = unitValue (según tu tabla)\n\n        if (!currentStats[engineId]) currentStats[engineId] = {};\n\n        const eNum = Number(engineId);\n        if (partStat === 15 && designId === eNum + 1) {\n            currentStats[engineId][18] = unitValue; // ERS\n        } else if (partStat === 15 && designId === eNum + 2) {\n            currentStats[engineId][19] = unitValue; // Gearbox\n        } else {\n            currentStats[engineId][partStat] = unitValue;\n        }\n    }\n\n    // --- 2) Decide beneficiado/perjudicado ANTES (Opción A) ---\n    // Distribución:\n    // minor: 35% win, 35% lose, 30% neutral\n    // major: 45% win, 45% lose, 10% neutral\n    const engineBias = {}; // engineId -> -1 | 0 | +1\n    const winners = [];\n    const losers = [];\n    const neutrals = [];\n\n    for (const engineId of Object.keys(currentStats)) {\n        const r = Math.random();\n        let bias;\n\n        if (changeType === \"major\") {\n            bias = r < 0.45 ? 1 : r < 0.90 ? -1 : 0;\n        } else {\n            bias = r < 0.35 ? 1 : r < 0.70 ? -1 : 0;\n        }\n\n        engineBias[engineId] = bias;\n        if (bias === 1) winners.push(engineId);\n        else if (bias === -1) losers.push(engineId);\n        else neutrals.push(engineId);\n    }\n\n    // --- 3) Genera engineData aplicando variación SOLO en dirección del bias ---\n    // engineData[engineId][stat] = nuevo unitValue\n    const engineData = {};\n    const engineImpact = {}; // engineId -> % medio (ej 0.032 = +3.2%) para ordenar si quieres\n\n    for (const engineId of Object.keys(currentStats)) {\n        engineData[engineId] = {};\n\n        let sumPct = 0;\n        let count = 0;\n\n        for (const statKey of Object.keys(currentStats[engineId])) {\n            const stat = Number(statKey);\n            const cur = Number(currentStats[engineId][stat]);\n\n            // No tocar 11 y 12\n            if (stat === 11 || stat === 12) {\n                engineData[engineId][stat] = cur;\n                continue;\n            }\n\n            const bias = engineBias[engineId];\n\n            let mult = 1;\n            if (bias === 1) mult = 1 + randBetween(0, VAR);          // solo sube\n            else if (bias === -1) mult = 1 - randBetween(0, VAR);    // solo baja\n            else mult = 1 + randBetween(-VAR, VAR);                  // neutro: libre\n\n            let next = Math.round(cur * mult);\n\n            next = Math.max(0, next);\n            next = clamp(next, 0, 100);\n\n            engineData[engineId][stat] = next;\n\n            if (cur > 0) {\n                sumPct += (next - cur) / cur;\n                count++;\n            }\n        }\n\n        engineImpact[engineId] = count ? sumPct / count : 0;\n\n        const eNum = Number(engineId);\n\n        if (engineData[engineId][18] === undefined) {\n            const ersUnit = queryDB(\n                `SELECT UnitValue FROM Custom_Engines_Stats WHERE engineId = ? AND designId = ? AND partStat = 15`,\n                [engineId, eNum + 1],\n                \"singleValue\"\n            );\n            engineData[engineId][18] = ersUnit != null ? clamp(Math.max(0, Number(ersUnit)), 0, 100) : 0;\n        }\n\n        if (engineData[engineId][19] === undefined) {\n            const gbUnit = queryDB(\n                `SELECT UnitValue FROM Custom_Engines_Stats WHERE engineId = ? AND designId = ? AND partStat = 15`,\n                [engineId, eNum + 2],\n                \"singleValue\"\n            );\n            engineData[engineId][19] = gbUnit != null ? clamp(Math.max(0, Number(gbUnit)), 0, 100) : 0;\n        }\n    }\n\n    // --- 4) Mapea nombres de motores para news (opcional pero útil) ---\n    // engines viene tipo: [[1,\"Ferrari\"], [4,\"Red Bull\"], ...]\n    const engineNameById = {};\n    engines.forEach(row => {\n        engineNameById[String(row[0])] = row[1];\n    });\n\n    const winnerNames = winners.map(id => engineNameById[id] ?? id);\n    const loserNames = losers.map(id => engineNameById[id] ?? id);\n    const neutralNames = neutrals.map(id => engineNameById[id] ?? id);\n\n    const titleData = {\n        changeType,\n        mainChangeArea,\n        variability: VAR,\n        engineData,       // <- lo pasas a editEngines(engineData)\n        engineBias,       // <- +1/-1/0 por motor\n        engineImpact,     // <- % medio por motor\n        winners,\n        losers,\n        neutrals,\n        winnerNames,\n        loserNames,\n        neutralNames,\n        season\n    };\n\n\n    turningPointState.engineRegulation = titleData;\n\n    const title = generateTurningPointTitle(titleData, 107, \"original\");\n    const image = getImagePath(null, \"engine\", \"engine\");\n    const newsDate = new Date(season, 11, Math.floor(Math.random() * 8) + 13);\n    const excelDate = dateToExcel(newsDate);\n\n    const newsEntry = {\n        id: entryId,\n        title,\n        image,\n        date: excelDate,\n        data: titleData,\n        turning_point_type: \"original\",\n        type: \"turning_point_engine_regulation\"\n    };\n\n    newsList.push(newsEntry);\n\n    return newsList;\n}\n\nfunction generateAduoTurningPointsNews(currentMonth, savednews = {}, turningPointState = {}, tpConfig = null, aduoTPsEnabled = false) {\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const season = daySeason?.[1];\n    const newsList = [];\n\n    if (!season) {\n        return newsList;\n    }\n\n    const nRacesThisSeasonRaw = queryDB(`SELECT COUNT(*) FROM Races WHERE SeasonID = ?`, [season], 'singleValue');\n    const nRacesDoneRaw = queryDB(`SELECT COUNT(*) FROM Races WHERE SeasonID = ? AND State = 2`, [season], 'singleValue');\n\n    const totalRaces = Number(nRacesThisSeasonRaw) || 0;\n    const racesDone = Number(nRacesDoneRaw) || 0;\n\n    if (totalRaces <= 0) {\n        return newsList;\n    }\n\n    turningPointState.aduoTurningPoints = turningPointState.aduoTurningPoints || {};\n\n    // Turning points are unlocked after each quarter of the season (25%, 50%, 75%),\n    // excluding the final quarter (100%).\n    const quarterThresholds = [\n        { quarter: 1, minRacesDone: Math.ceil(totalRaces * 0.25), string: \"1st\" },\n        { quarter: 2, minRacesDone: Math.ceil(totalRaces * 0.50), string: \"2nd\" },\n        { quarter: 3, minRacesDone: Math.ceil(totalRaces * 0.75), string: \"3rd\" }\n    ];\n\n    let enginesData = null;\n\n\n    for (const { quarter, minRacesDone, string } of quarterThresholds) {\n        if (racesDone < minRacesDone) continue;\n\n        const entryId = `turning_point_aduo_q${quarter}_${season}`;\n\n        //get the month from that race\n        const raceInfo = queryDB(`SELECT Day FROM Races WHERE SeasonID = ? AND State = 2 ORDER BY Day ASC LIMIT ?, 1`, [season, minRacesDone - 1], 'singleRow');\n        const raceDay = raceInfo ? Number(raceInfo[0]) : null;\n        const raceDate = raceDay ? excelToDate(raceDay) : null;\n        const raceMonth = raceDate ? raceDate.getMonth() : null;\n\n        // Already saved in DB -> just surface it again.\n        if (savednews[entryId]) {\n            newsList.push({ id: entryId, ...savednews[entryId] });\n            continue;\n        }\n\n        // Already generated this session (but not persisted yet) -> surface it again.\n        if (turningPointState.aduoTurningPoints[entryId]) {\n            newsList.push({ id: entryId, ...turningPointState.aduoTurningPoints[entryId] });\n            continue;\n        }\n\n        if (!aduoTPsEnabled) {\n            continue;\n        }\n\n        if (!enginesData) {\n            const engines = fetchEngines();\n            enginesData = engines?.[0] || [];\n        }\n\n        const getEngineStat10 = engineRow => {\n            const stats = engineRow?.[1] || {};\n            const raw = stats[10] !== undefined ? stats[10] : stats[\"10\"];\n            if (raw === undefined || raw === null) return null;\n            return Number(raw);\n        };\n\n        let bestEngine = null;\n        let bestStat10 = -Infinity;\n        for (const engineRow of enginesData) {\n            const stat10 = getEngineStat10(engineRow);\n            if (stat10 === null) continue;\n            if (stat10 > bestStat10) {\n                bestStat10 = stat10;\n                bestEngine = engineRow;\n            }\n        }\n\n        const threshold = bestStat10 * 0.92; // >8% underperformance to be affected\n        const underperformers = enginesData.filter(engineRow => {\n            const stat10 = getEngineStat10(engineRow);\n            return stat10 !== null && stat10 < threshold;\n        });\n\n        const randomImprovementPct = () => {\n            const r = Math.random();\n            if (r < 0.05) {\n                // Rare regression: -5% to 0%\n                return Math.round(((-5 + (Math.random() * 5)) * 100)) / 100;\n            }\n            if (r < 0.87) {\n                // Usual case: 1% to 7%\n                return Math.round(((1 + (Math.random() * 6)) * 100)) / 100;\n            }\n            // Very rare breakout: 7% to 18%\n            return Math.round(((7 + (Math.random() * 9)) * 100)) / 100;\n        };\n\n        const getUpgradeTuningForEngine = (stat10) => {\n            const best = Number(bestStat10);\n            const current = Number(stat10);\n            if (best <= 0) {\n                return { minBonusPct: 0, multiplier: 1 };\n            }\n            const behindPct = ((best - current) / best) * 100;\n            if (behindPct > 35) {\n                return { minBonusPct: 5, multiplier: 1.5 };\n            }\n            if (behindPct >= 20) {\n                return { minBonusPct: 0, multiplier: 1.25 };\n            }\n            return { minBonusPct: 0, multiplier: 1 };\n        };\n\n        const engineImprovements = underperformers.map(engineRow => {\n            const engineId = engineRow[0];\n            const name = engineRow[2];\n            const stats = engineRow[1] || {};\n            const improvements = {};\n            const tuning = getUpgradeTuningForEngine(getEngineStat10(engineRow));\n\n            for (const statId of Object.keys(stats)) {\n                let pct = randomImprovementPct();\n                if (tuning.minBonusPct) {\n                    pct += tuning.minBonusPct;\n                }\n                if (tuning.multiplier !== 1) {\n                    pct *= tuning.multiplier;\n                }\n                improvements[statId] = Math.round(pct * 100) / 100;\n            }\n\n            return { engineId, name, improvements };\n        });\n\n        let titleData = {\n            season,\n            quarter,\n            leader: { engineId: bestEngine?.[0], name: bestEngine?.[2], stat10: bestStat10 },\n            thresholdStat10: threshold,\n            engineImprovements\n        };\n\n        let manufacutrersAffectedStriing = \"\";\n        if (titleData.engineImprovements.length > 0) {\n            manufacutrersAffectedStriing = titleData.engineImprovements.map(e => e.name).join(\", \");\n            //the last one should have \"and\" if there are more than 1\n            if (titleData.engineImprovements.length > 1) {\n                const lastCommaIndex = manufacutrersAffectedStriing.lastIndexOf(\", \");\n                manufacutrersAffectedStriing = manufacutrersAffectedStriing.substring(0, lastCommaIndex) + \" and\" + manufacutrersAffectedStriing.substring(lastCommaIndex + 1);\n            }\n        } else {\n            return newsList; // No underperformers, no turning point\n        }\n\n        titleData.quarterString = string;\n        titleData.manufacturers = manufacutrersAffectedStriing;\n\n        const title = generateTurningPointTitle(titleData, 109, \"original\");\n        const image = getImagePath(null, \"engine\", \"engine\");\n\n        const newsEntry = {\n            id: entryId,\n            title,\n            image,\n            date: dateToExcel(new Date(season, raceMonth, 8 + quarter)), // Mid-month date for the news\n            data: titleData,\n            turning_point_type: \"original\",\n            type: \"turning_point_aduo\"\n        };\n\n        newsList.push(newsEntry);\n\n    }\n\n    return newsList;\n}\n\n\nfunction generateYoungDriversTurningPointNews(currentMonth, savednews = {}, turningPointState = {}, tpConfig = null) {\n    const FREE_AGENT_MAX_AGE = 19;\n    const YOUNG_DRIVER_MAX_PER_SERIES = 3;\n    const FREE_AGENT_MAX = 3;\n\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const season = daySeason?.[1];\n    const newsList = [];\n\n    if (!season) {\n        return newsList;\n    }\n\n    const allRacesDone = queryDB(\n        `SELECT COUNT(*) FROM Races WHERE SeasonID = ? AND State = 2`,\n        [season],\n        \"singleValue\"\n    );\n    const totalRaces = queryDB(\n        `SELECT COUNT(*) FROM Races WHERE SeasonID = ?`,\n        [season],\n        \"singleValue\"\n    );\n\n    if (currentMonth < 11 || allRacesDone < totalRaces) {\n        return newsList;\n    }\n\n    const entryId = `turning_point_young_drivers_${season}`;\n    if (savednews[entryId]) {\n        newsList.push({ id: entryId, ...savednews[entryId] });\n        return newsList;\n    }\n\n    const chance = getTurningPointChance(\"youngDrivers\", tpConfig);\n    console.log(\"Young Drivers Turning Point Chance:\", chance);\n    if (Math.random() >= chance) {\n        return newsList;\n    }\n\n    const currentDay = daySeason?.[0] ?? 0;\n\n    const f2Rows = queryDB(\n        `SELECT bas.FirstName, bas.LastName, dri.StaffID, bas.DOB, con.TeamID, sta.Position, sta.Points\n         FROM Staff_Contracts con\n         JOIN Staff_DriverData dri\n           ON con.StaffID = dri.StaffID\n         JOIN Staff_BasicData bas\n           ON bas.StaffID = dri.StaffID\n         LEFT JOIN Races_DriverStandings sta\n           ON sta.DriverID = dri.StaffID\n          AND sta.SeasonID = ?\n          AND sta.RaceFormula = 2\n         WHERE con.ContractType = 0\n           AND con.TeamID BETWEEN 11 AND 21`,\n        [season],\n        \"allRows\"\n    );\n\n    const f2Map = new Map();\n    f2Rows.forEach(row => {\n        const [firstName, lastName, driverId, dob, teamId, position, points] = row;\n        const age = (dob != null && currentDay != null) ? Math.floor((currentDay - dob) / 365.25) : null;\n\n        const driverNum = Number(driverId);\n        if (f2Map.has(driverNum)) return;\n\n        const [nameFormatted] = formatNamesSimple([firstName, lastName, driverId]);\n        const teamName = teamId ? combined_dict[teamId] : null;\n        const overall = getDriverOverall(driverId);\n\n        f2Map.set(driverNum, {\n            driverId: driverNum,\n            name: nameFormatted,\n            age,\n            position: position != null ? Number(position) : null,\n            points: points != null ? Number(points) : null,\n            teamId: teamId != null ? Number(teamId) : null,\n            team: teamName || \"\",\n            series: \"F2\",\n            overall: Number(overall || 0)\n        });\n    });\n\n    const f2AllDrivers = Array.from(f2Map.values());\n    const f2AgeValues = f2AllDrivers.map(p => p.age).filter(age => typeof age === \"number\");\n    const f2AverageAge = f2AgeValues.length\n        ? f2AgeValues.reduce((sum, age) => sum + age, 0) / f2AgeValues.length\n        : null;\n    const f2AgeCut = f2AverageAge != null ? f2AverageAge : Number.POSITIVE_INFINITY;\n    const f2Eligible = f2AllDrivers.filter(p => typeof p.age === \"number\" && p.age <= f2AgeCut);\n    const f2Prospects = f2Eligible\n        .sort((a, b) => (b.overall - a.overall) || (a.age - b.age))\n        .slice(0, YOUNG_DRIVER_MAX_PER_SERIES);\n\n    const f3Rows = queryDB(\n        `SELECT bas.FirstName, bas.LastName, dri.StaffID, bas.DOB, con.TeamID, sta.Position, sta.Points\n         FROM Staff_Contracts con\n         JOIN Staff_DriverData dri\n           ON con.StaffID = dri.StaffID\n         JOIN Staff_BasicData bas\n           ON bas.StaffID = dri.StaffID\n         LEFT JOIN Races_DriverStandings sta\n           ON sta.DriverID = dri.StaffID\n          AND sta.SeasonID = ?\n          AND sta.RaceFormula = 3\n         WHERE con.ContractType = 0\n           AND con.TeamID BETWEEN 22 AND 31`,\n        [season],\n        \"allRows\"\n    );\n\n    const f3Map = new Map();\n    f3Rows.forEach(row => {\n        const [firstName, lastName, driverId, dob, teamId, position, points] = row;\n        const age = (dob != null && currentDay != null) ? Math.floor((currentDay - dob) / 365.25) : null;\n\n        const driverNum = Number(driverId);\n        if (f3Map.has(driverNum)) return;\n\n        const [nameFormatted] = formatNamesSimple([firstName, lastName, driverId]);\n        const teamName = teamId ? combined_dict[teamId] : null;\n        const overall = getDriverOverall(driverId);\n\n        f3Map.set(driverNum, {\n            driverId: driverNum,\n            name: nameFormatted,\n            age,\n            position: position != null ? Number(position) : null,\n            points: points != null ? Number(points) : null,\n            teamId: teamId != null ? Number(teamId) : null,\n            team: teamName || \"\",\n            series: \"F3\",\n            overall: Number(overall || 0)\n        });\n    });\n\n    const f3AllDrivers = Array.from(f3Map.values());\n    const f3AgeValues = f3AllDrivers.map(p => p.age).filter(age => typeof age === \"number\");\n    const f3AverageAge = f3AgeValues.length\n        ? f3AgeValues.reduce((sum, age) => sum + age, 0) / f3AgeValues.length\n        : null;\n    const f3AgeCut = f3AverageAge != null ? f3AverageAge : Number.POSITIVE_INFINITY;\n    const f3Eligible = f3AllDrivers.filter(p => typeof p.age === \"number\" && p.age <= f3AgeCut);\n    const f3Prospects = f3Eligible\n        .sort((a, b) => (b.overall - a.overall) || (a.age - b.age))\n        .slice(0, YOUNG_DRIVER_MAX_PER_SERIES);\n\n    const usedIds = new Set([...f2Prospects, ...f3Prospects].map(p => p.driverId));\n\n    const extraRows = queryDB(\n        `SELECT bas.FirstName, bas.LastName, bas.DOB, dri.StaffID\n         FROM Staff_BasicData bas\n         JOIN Staff_DriverData dri\n           ON bas.StaffID = dri.StaffID\n         JOIN Staff_GameData gd\n           ON bas.StaffID = gd.StaffID\n         WHERE gd.Retired = 0\n           AND dri.StaffID NOT IN (SELECT StaffID FROM Staff_Contracts WHERE ContractType = 0)`,\n        [],\n        \"allRows\"\n    );\n\n    const extraCandidates = [];\n    extraRows.forEach(row => {\n        const [firstName, lastName, dob, driverId] = row;\n        const driverNum = Number(driverId);\n        if (usedIds.has(driverNum)) return;\n\n        const age = (dob != null && currentDay != null) ? Math.floor((currentDay - dob) / 365.25) : null;\n        if (age == null || age > FREE_AGENT_MAX_AGE) return;\n\n        const [nameFormatted] = formatNamesSimple([firstName, lastName, driverId]);\n        const overall = getDriverOverall(driverId);\n\n        extraCandidates.push({\n            driverId: driverNum,\n            name: nameFormatted,\n            age,\n            position: null,\n            points: null,\n            teamId: null,\n            team: \"\",\n            series: \"Regional formulas\",\n            overall: Number(overall || 0)\n        });\n    });\n\n    const freeAgentProspects = extraCandidates\n        .sort((a, b) => (b.overall - a.overall) || (a.age - b.age))\n        .slice(0, FREE_AGENT_MAX);\n\n\n    const titleProspects = [];\n    const titleSeen = new Set();\n    const pushTitleProspect = (prospect) => {\n        if (!prospect || titleSeen.has(prospect.driverId)) return;\n        titleProspects.push(prospect);\n        titleSeen.add(prospect.driverId);\n    };\n\n    if (f2Prospects.length > 0) {\n        pushTitleProspect(f2Prospects[0]);\n    }\n    if (f3Prospects.length > 0) {\n        pushTitleProspect(f3Prospects[0]);\n    }\n    if (f2Prospects.length === 0 || f3Prospects.length === 0) {\n        freeAgentProspects.forEach(pushTitleProspect);\n    }\n\n    if (titleProspects.length < 2) {\n        f2Prospects.slice(1).forEach(pushTitleProspect);\n        f3Prospects.slice(1).forEach(pushTitleProspect);\n    }\n\n    const titleNames = titleProspects.slice(0, 2).map(p => p.name);\n\n    const titleData = {\n        season,\n        driver1: titleNames[0] || \"\",\n        driver2: titleNames[1] || \"\",\n        driver3: titleNames[2] || \"\",\n        f2Prospects,\n        f3Prospects,\n        freeAgentProspects,\n        prospects: [...f2Prospects, ...f3Prospects, ...freeAgentProspects]\n    };\n\n    turningPointState.youngDrivers = titleData;\n\n    const title = generateTurningPointTitle(titleData, 108, \"original\");\n    const image = getImagePath(null, null, \"young\");\n    const newsDate = new Date(season, 11, Math.floor(Math.random() * 8) + 13);\n    const excelDate = dateToExcel(newsDate);\n\n    const newsEntry = {\n        id: entryId,\n        title,\n        image,\n        date: excelDate,\n        data: titleData,\n        turning_point_type: \"original\",\n        type: \"turning_point_young_drivers\"\n    };\n\n    newsList.push(newsEntry);\n\n    return newsList;\n}\n\nfunction applyYoungDriversBoost(turningPointData) {\n    const prospects = turningPointData?.prospects || [];\n    if (!prospects.length) return;\n\n    const uniqueDriverIds = [...new Set(prospects.map(p => p.driverId).filter(Boolean))];\n    uniqueDriverIds.forEach(driverId => {\n        boostDriverStats(driverId);\n        boostDriverGrowth(driverId);\n    });\n}\n\nfunction boostDriverStats(driverId) {\n    const YOUNG_DRIVER_STAT_BOOST_MIN = 1;\n    const YOUNG_DRIVER_STAT_BOOST_MAX = 4;\n\n    driverStats.forEach(statId => {\n        const currentValue = queryDB(\n            `SELECT Val FROM Staff_performanceStats WHERE StaffID = ? AND StatID = ?`,\n            [driverId, statId],\n            \"singleValue\"\n        );\n        const boost = randomIntBetween(YOUNG_DRIVER_STAT_BOOST_MIN, YOUNG_DRIVER_STAT_BOOST_MAX);\n        const baseValue = currentValue != null ? Number(currentValue) : 50;\n        const nextValue = clampValue(baseValue + boost, 0, 100);\n\n        if (currentValue == null) {\n            queryDB(\n                `INSERT INTO Staff_performanceStats (StaffID, StatID, Val, Max)\n                 VALUES (?, ?, ?, 100)`,\n                [driverId, statId, nextValue],\n                \"run\"\n            );\n        } else {\n            queryDB(\n                `UPDATE Staff_performanceStats\n                 SET Val = ?\n                 WHERE StaffID = ? AND StatID = ?`,\n                [nextValue, driverId, statId],\n                \"run\"\n            );\n        }\n    });\n}\n\nfunction boostDriverGrowth(driverId) {\n    const YOUNG_DRIVER_GROWTH_BOOST_MIN = 1;\n    const YOUNG_DRIVER_GROWTH_BOOST_MAX = 4;\n    \n    const currentValue = queryDB(\n        `SELECT Improvability FROM Staff_DriverData WHERE StaffID = ?`,\n        [driverId],\n        \"singleValue\"\n    );\n    const boost = randomIntBetween(YOUNG_DRIVER_GROWTH_BOOST_MIN, YOUNG_DRIVER_GROWTH_BOOST_MAX);\n    const baseValue = currentValue != null ? Number(currentValue) : 0;\n    const nextValue = clampValue(baseValue + boost, 0, 100);\n\n    queryDB(\n        `UPDATE Staff_DriverData\n         SET Improvability = ?\n         WHERE StaffID = ?`,\n        [nextValue, driverId],\n        \"run\"\n    );\n}\n\nfunction clampValue(value, min, max) {\n    return Math.max(min, Math.min(max, value));\n}\n\nfunction randomIntBetween(min, max) {\n    const minVal = Math.ceil(min);\n    const maxVal = Math.floor(max);\n    return Math.floor(Math.random() * (maxVal - minVal + 1)) + minVal;\n}\n\n\nfunction generateTechnicalDirectiveTurningPointNews(currentMonth, savednews = {}, turningPointState = {}, tpConfig = null) {\n    let newsList = [];\n    //get previous technical directive turning point news\n    const months = [6, 9];\n    for (let month of months) {\n        const entryId = `turning_point_technical_directive_${month}`;\n        if (savednews[entryId]) {\n            newsList.push({ id: entryId, ...savednews[entryId] });\n        }\n    }\n\n    const maxPerSeason = Math.min(months.length, getTurningPointMax(\"technicalDirective\", tpConfig));\n    if (newsList.length >= maxPerSeason) {\n        return newsList;\n    }\n\n    if ((currentMonth !== 6 && currentMonth !== 9) || turningPointState.technicalDirectives[currentMonth] === \"None\") {\n        return newsList;\n    }\n\n    const entryId = `turning_point_technical_directive_${currentMonth}`;\n\n    if (savednews[entryId]) {\n        return newsList;\n    }\n\n    const chance = getTurningPointChance(\"technicalDirective\", tpConfig);\n    if (Math.random() >= chance) {\n        turningPointState.technicalDirectives[currentMonth] = \"None\";\n        return newsList;\n    }\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n\n\n    const parts = [3, 4, 5, 6, 7, 8]\n    const partId = randomPick(parts);\n    const partName = part_full_names[partId].toLowerCase() || \"Unknown Part\";\n\n    const globals = getGlobals();\n    let teamIds = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n    if (globals.isCreateATeam) {\n        teamIds.push(32);\n    }\n\n    const excelDate = dateToExcel(new Date(daySeason[1], currentMonth - 1, Math.floor(Math.random() * 28) + 1));\n\n\n    const performance = getPerformanceAllTeams(excelDate, null, globals.isCreateATeam)\n    const championship = queryDB(`SELECT TeamID, Points, Position FROM Races_TeamStandings WHERE SeasonID = ? AND RaceFormula = 1 ORDER BY Position`, [daySeason[1]], 'allRows');\n\n    const constructorsStandings = {};\n    for (const row of championship) {\n        const teamId = Number(row[0]);\n        constructorsStandings[teamId] = {\n            points: Number(row[1]),\n            rank: Number(row[2])\n        };\n    }\n\n    const capsByPart = {\n        3: 7.5, //chasis\n        4: 4, //front wing\n        5: 4, //rear wing\n        6: 4, //underfloor\n        7: 7, //suspension\n        8: 5  //sidepod\n    }\n\n    const cap = capsByPart[partId] || 5;               // máximo +/-\n    const standingsWeight = 0.25;   // 0 = ignora standings; prueba 0.2–0.3 si quieres mezclar un poco\n    const zeroSum = true;          // intenta balance neto ~0 en compresión\n    const spreadCapMultiplier = 1.45; // Higher = more \"spread\" in spread mode\n    let effectOnEachteam = {};\n\n    // Normaliza tipos de teamIds por si vienen como strings\n    const ids = teamIds.map(id => Number(id));\n\n    // Helper clamp\n    const clamp = (v, lo, hi) => Math.max(lo, Math.min(hi, v));\n\n    const modeRoll = Math.random();\n    const mode = modeRoll < 0.30 ? \"random\" : modeRoll < 0.40 ? \"compact\" : \"spread\"; // 30% / 10% / 60%\n\n    if (mode === \"random\") {\n        // --- MODO RANDOM PURO (30%) ---\n        for (const teamId of ids) {\n            const v = (Math.random() * 2 * cap) - cap; // [-cap, cap]\n            effectOnEachteam[teamId] = {\n                performanceGainLoss: v.toFixed(2),\n                teamName: combined_dict[teamId] || \"Unknown Team\"\n            };\n        }\n    } else {\n        const isSpread = mode === \"spread\";\n        const direction = isSpread ? 1 : -1; // compact: better teams lose, spread: better teams gain\n        const effectiveCap = isSpread ? (cap * spreadCapMultiplier) : cap;\n\n        // --- MODO COMPACT (10%) / SPREAD (60%) basado en rendimiento (+ opcional standings) ---\n        const vals = ids\n            .map(id => performance[id])\n            .filter(v => typeof v === \"number\");\n        const mean = vals.length ? (vals.reduce((a, b) => a + b, 0) / vals.length) : 0;\n\n        let maxAbsDev = 1e-9; // evita div/0\n        for (const id of ids) {\n            const dev = ((performance[id] ?? mean) - mean);\n            if (Math.abs(dev) > maxAbsDev) maxAbsDev = Math.abs(dev);\n        }\n\n        // Precompute máximo de puntos para normalizar standings si se usa\n        const maxPts = Math.max(...ids.map(id => constructorsStandings[id]?.points ?? 0), 1);\n\n        // Calcula efectos crudos\n        const raw = ids.map(teamId => {\n            const score = performance[teamId] ?? mean;\n            const norm = (score - mean) / maxAbsDev; // [-1, 1]\n\n            // efecto por rendimiento (compact/spread)\n            let eff = direction * norm * effectiveCap;\n\n            // mezcla ligera con standings (compact/spread)\n            if (standingsWeight > 0) {\n                const pts = constructorsStandings[teamId]?.points ?? 0;\n                const ptsNorm = (pts / maxPts);                // 0..1\n                const standingsEff = direction * (ptsNorm - 0.5) * effectiveCap;   // centra en 0.5\n                eff = (1 - standingsWeight) * eff + standingsWeight * standingsEff;\n            }\n\n            // un pelín de ruido para que no sea tan lineal\n            eff += (Math.random() * 0.3) - 0.15;\n\n            return { teamId, eff };\n        });\n\n        // Cero-suma (opcional)\n        let adjusted = raw;\n        if (zeroSum && adjusted.length) {\n            const avg = adjusted.reduce((a, r) => a + r.eff, 0) / adjusted.length;\n            adjusted = adjusted.map(r => ({ teamId: r.teamId, eff: r.eff - avg }));\n        }\n\n        // clamp + salida\n        for (const { teamId, eff } of adjusted) {\n            effectOnEachteam[teamId] = {\n                performanceGainLoss: clamp(eff, -effectiveCap, effectiveCap).toFixed(2),\n                teamName: combined_dict[teamId] || \"Unknown Team\",\n                teamId: teamId\n            };\n        }\n    }\n\n    const possibleReasons = [\"improve safety\", \"reduce costs\", \"standardize components\", \"enhance performance parity\", \"improve racing\", \"address a grey area in the regulations\"];\n    const reason = randomPick(possibleReasons);\n\n    const titleData = {\n        component: partName,\n        componentId: partId,\n        effectOnEachteam: effectOnEachteam,\n        month: currentMonth,\n        reason: reason,\n        season: daySeason[1]\n    }\n\n    const title = generateTurningPointTitle(titleData, 100, \"original\");\n    const image = getImagePath(null, partId, \"technical\");\n    //generate a RANDOM date in the current month\n\n    turningPointState.technicalDirectives[currentMonth] = {\n        component: partName,\n        componentId: partId,\n        effectOnEachteam: effectOnEachteam\n    }\n\n    const newData = {\n        id: entryId,\n        title: title,\n        image: image,\n        date: excelDate,\n        data: titleData,\n        turning_point_type: \"original\",\n        type: \"turning_point_technical_directive\"\n    }\n\n    newsList.push(newData);\n\n    return newsList;\n}\n\nfunction generateMidSeasonTransfersTurningPointNews(monthsDone, currentMonth, savednews = {}, turningPointState = {}, tpConfig = null) {\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    let newsList = [];\n    const months = [5, 6, 7];\n    for (let month of months) {\n        const entryId = `turning_point_transfer_${month}`;\n        if (savednews[entryId]) {\n            newsList.push({ id: entryId, ...savednews[entryId] });\n        }\n    }\n\n    const maxPerSeason = Math.min(months.length, getTurningPointMax(\"midSeasonTransfers\", tpConfig));\n    if (newsList.length >= maxPerSeason) {\n        return newsList;\n    }\n\n    if (![5, 6, 7].includes(currentMonth) || turningPointState.transfers[currentMonth]) {\n        return newsList;\n    }\n\n    const chance = getTurningPointChance(\"midSeasonTransfers\", tpConfig);\n    if (Math.random() >= chance) {\n        turningPointState.transfers[currentMonth] = \"None\";\n        return newsList;\n    }\n\n    const driversTeamPoints = queryDB(`\n    SELECT\n      res.DriverID,\n      con.TeamID,\n      res.Points AS TotalPoints\n    FROM Races_DriverStandings res\n    JOIN Staff_Contracts con\n      ON res.DriverID = con.StaffID\n     AND con.ContractType = 0\n     AND con.PosInTeam <= 2\n    WHERE res.SeasonID = ?\n      AND res.RaceFormula = 1\n    `, [daySeason[1]], \"allRows\");\n\n\n    const teamsById = {};\n    for (const row of driversTeamPoints) {\n        const teamId = Number(row[1]);\n        const driverId = Number(row[0]);\n        const pts = Number(row[2]) || 0;\n\n        if (!teamsById[teamId]) {\n            teamsById[teamId] = { total: 0, drivers: {} };\n        }\n        teamsById[teamId].total += pts;\n        teamsById[teamId].drivers[driverId] = (teamsById[teamId].drivers[driverId] || 0) + pts;\n    }\n\n    const teamsWithImbalance = [];\n    for (const [teamIdStr, data] of Object.entries(teamsById)) {\n        const teamId = Number(teamIdStr);\n        const total = data.total || 0;\n        if (total <= 0) continue;\n\n        const hasCarry = Object.values(data.drivers).some(pts => (pts / total) > 0.70);\n        if (hasCarry) teamsWithImbalance.push(teamId);\n    }\n\n    const usedTeams = new Set();\n\n    if (turningPointState?.transfers) {\n        for (const m of [5, 6, 7]) {\n            const tp = turningPointState.transfers[m];\n            if (tp && tp !== \"None\" && tp?.teamId != null) {\n                usedTeams.add(Number(tp.teamId));\n            }\n        }\n    }\n\n    const candidateTeams = teamsWithImbalance.filter(tid => !usedTeams.has(tid));\n\n    if (candidateTeams.length === 0) {\n        turningPointState.transfers[currentMonth] = \"None\";\n        return newsList;\n    }\n\n    const randomTeam = randomPick(candidateTeams);\n    const randomTeamName = combined_dict[randomTeam] || \"Unknown Team\";\n\n    const entryId = `turning_point_transfer_${currentMonth}`;\n\n    if (savednews[entryId]) {\n        return newsList;\n    }\n\n    //the driver from the randomteam with less points\n    let driverOut = teamsById[randomTeam] ? Object.entries(teamsById[randomTeam].drivers).sort((a, b) => a[1] - b[1])[0] : null;\n    let driverIn, driverSubstitute, driverInTeamId, driverSubstituteTeamId;\n\n    if (randomTeam === 3) {\n        if (combined_dict[8] === \"Alpha Tauri\" || combined_dict[8] === \"Visa Cashapp RB\") { //red bull special case\n            driverIn = Object.entries(teamsById[8].drivers).sort((a, b) => b[1] - a[1])[0];\n            driverInTeamId = 8;\n        } else {\n            const teamsByTotalPoints = Object.entries(teamsById).sort((a, b) => a[1].total - b[1].total);\n            const lowerTeams = teamsByTotalPoints.filter(entry => entry[1].total < teamsById[3].total).map(entry => entry[0]);\n            //get all the drivers from those teams and order them by rating\n            const candidates = [];\n            for (const tId of lowerTeams) {\n                if (teamsById[tId]) {\n                    for (const [dId, pts] of Object.entries(teamsById[tId].drivers)) {\n                        let rating = getDriverOverall(dId);\n                        candidates.push({ driverId: dId, points: pts, teamId: tId, rating });\n                    }\n                }\n            }\n            candidates.sort((a, b) => b.rating - a.rating);\n            if (candidates.length > 0) {\n                driverIn = [candidates[0].driverId, candidates[0].points];\n                driverInTeamId = candidates[0].teamId;\n            }\n\n            //fallback if not driverIn, get the best free agent\n            if (!driverIn) {\n                const freeAgents = queryDB(`SELECT bas.FirstName, bas.LastName, dri.StaffID\n                    FROM Staff_BasicData bas\n                    JOIN Staff_DriverData dri ON bas.StaffID = dri.StaffID\n                    JOIN Staff_GameData gd ON bas.StaffID = gd.StaffID\n                    WHERE dri.StaffID NOT IN (SELECT StaffID FROM Staff_Contracts)\n                    AND gd.Retired = 0`, [], 'allRows');\n                if (freeAgents.length) {\n                    for (const fa of freeAgents) {\n                        const overall = getDriverOverall(fa[2]);\n                        fa.push(overall);\n                    }\n                    freeAgents.sort((a, b) => b[3] - a[3]);\n                    driverIn = [freeAgents[0][2], freeAgents[0][3]];\n                }\n            }\n        }\n    } else {\n        const teamsByTotalPoints = Object.entries(teamsById).sort((a, b) => a[1].total - b[1].total);\n        const bottom3Teams = teamsByTotalPoints.slice(0, 3).map(entry => entry[0]);\n        const top4Teams = teamsByTotalPoints.slice(-4).map(entry => entry[0]);\n\n\n        const teamToCompare = String(randomTeam);\n\n        if (bottom3Teams.includes(teamToCompare)) {\n            const reserveDrivers = queryDB(`SELECT bas.FirstName, bas.LastName, dri.StaffID, con.TeamID\n                FROM Staff_Contracts con\n                JOIN Staff_BasicData bas ON con.StaffID = bas.StaffID\n                JOIN Staff_DriverData dri ON con.StaffID = dri.StaffID\n                WHERE con.TeamID = ? AND con.ContractType = 0 AND con.PosInTeam > 2`, [randomTeam], 'allRows');\n            if (reserveDrivers.length) {\n                //get the best reserve driver by overall\n                const reserveCandidates = [];\n                for (const rd of reserveDrivers) {\n                    const overall = getDriverOverall(rd[2]);\n                    reserveCandidates.push({ driverId: rd[2], teamId: rd[3], rating: overall });\n                }\n                reserveCandidates.sort((a, b) => b.rating - a.rating);\n                driverIn = [reserveCandidates[0].driverId, reserveCandidates[0].rating];\n                driverInTeamId = reserveCandidates[0].teamId;\n            }\n        } else if (top4Teams.includes(teamToCompare)) {\n            const teamsByTotalPoints = Object.entries(teamsById).sort((a, b) => a[1].total - b[1].total);\n            const lowerTeams = teamsByTotalPoints.filter(entry => entry[1].total < teamsById[randomTeam].total).map(entry => entry[0]);\n            //get all the drivers from those teams and order them by rating\n            const candidates = [];\n            for (const tId of lowerTeams) {\n                if (teamsById[tId]) {\n                    for (const [dId, pts] of Object.entries(teamsById[tId].drivers)) {\n                        let rating = getDriverOverall(dId);\n                        candidates.push({ driverId: dId, points: pts, teamId: tId, rating });\n                    }\n                }\n            }\n            candidates.sort((a, b) => b.rating - a.rating);\n            if (candidates.length > 0) {\n                //get a random pick from the top 5 candidates\n                const topCandidates = candidates.slice(0, 5);\n                const selectedCandidate = randomPick(topCandidates);\n                driverIn = [selectedCandidate.driverId, selectedCandidate.points];\n                driverInTeamId = selectedCandidate.teamId;\n\n                const freeAgents = queryDB(`SELECT bas.FirstName, bas.LastName, dri.StaffID\n                        FROM Staff_BasicData bas\n                        JOIN Staff_DriverData dri ON bas.StaffID = dri.StaffID\n                        JOIN Staff_GameData gd ON bas.StaffID = gd.StaffID\n                        WHERE dri.StaffID NOT IN (SELECT StaffID FROM Staff_Contracts)\n                        AND gd.Retired = 0`, [], 'allRows');\n                if (freeAgents.length) {\n                    for (const fa of freeAgents) {\n                        const overall = getDriverOverall(fa[2]);\n                        fa.push(overall);\n                    }\n                    freeAgents.sort((a, b) => b[3] - a[3]);\n                    driverSubstitute = [freeAgents[0][2], freeAgents[0][3]];\n                }\n            }\n        } else {\n            const candidates = [];\n            for (const tId of bottom3Teams.filter(tid => tid != randomTeam)) {\n                if (teamsById[tId]) {\n                    for (const [dId, pts] of Object.entries(teamsById[tId].drivers)) {\n                        candidates.push({ driverId: dId, points: pts, teamId: tId });\n                    }\n                }\n            }\n            candidates.sort((a, b) => b.points - a.points);\n            if (candidates.length > 0) {\n                driverIn = [candidates[0].driverId, candidates[0].points];\n                driverInTeamId = candidates[0].teamId;\n\n                const reserveDrivers = queryDB(`SELECT bas.FirstName, bas.LastName, dri.StaffID, con.TeamID\n                    FROM Staff_Contracts con\n                    JOIN Staff_BasicData bas ON con.StaffID = bas.StaffID\n                    JOIN Staff_DriverData dri ON con.StaffID = dri.StaffID\n                    WHERE con.TeamID = ? AND con.ContractType = 0 AND con.PosInTeam > 2`, [driverInTeamId], 'allRows');\n\n                if (reserveDrivers.length) {\n                    const reserveCandidates = [];\n                    for (const rd of reserveDrivers) {\n                        const overall = getDriverOverall(rd[2]);\n                        reserveCandidates.push({ driverId: rd[2], teamId: rd[3], rating: overall });\n                    }\n                    reserveCandidates.sort((a, b) => b.rating - a.rating);\n                    driverSubstitute = [reserveCandidates[0].driverId, reserveCandidates[0].rating];\n                    driverSubstituteTeamId = reserveCandidates[0].teamId;\n                } else {\n                    const freeAgents = queryDB(`SELECT bas.FirstName, bas.LastName, dri.StaffID\n                        FROM Staff_BasicData bas\n                        JOIN Staff_DriverData dri ON bas.StaffID = dri.StaffID\n                        JOIN Staff_GameData gd ON bas.StaffID = gd.StaffID\n                        WHERE dri.StaffID NOT IN (SELECT StaffID FROM Staff_Contracts)\n                        AND gd.Retired = 0`, [], 'allRows');\n                    if (freeAgents.length) {\n                        for (const fa of freeAgents) {\n                            const overall = getDriverOverall(fa[2]);\n                            fa.push(overall);\n                        }\n                        freeAgents.sort((a, b) => b[3] - a[3]);\n                        driverSubstitute = [freeAgents[0][2], freeAgents[0][3]];\n                    }\n                }\n            }\n        }\n    }\n\n    const excelDate = dateToExcel(new Date(daySeason[1], currentMonth - 1, Math.floor(Math.random() * 28) + 1));\n\n    let driverOutName = driverOut ? queryDB(`SELECT FirstName, LastName FROM Staff_BasicData WHERE StaffID = ?`, [driverOut[0]], 'singleRow') : null;\n    driverOutName.push(driverOut[0], driverOut[1]);\n    driverOutName = formatNamesSimple(driverOutName || [\"Unknown\", \"Driver\"]);\n\n    let driverInName = driverIn ? queryDB(`SELECT FirstName, LastName FROM Staff_BasicData WHERE StaffID = ?`, [driverIn[0]], 'singleRow') : null;\n    driverInName.push(driverIn[0], driverIn[1]);\n    driverInName = formatNamesSimple(driverInName || [\"Unknown\", \"Driver\"]);\n\n    let driverSubstituteName = [];\n    if (driverSubstitute) {\n        driverSubstituteName = queryDB(`SELECT FirstName, LastName FROM Staff_BasicData WHERE StaffID = ?`, [driverSubstitute[0]], 'singleRow');\n        driverSubstituteName.push(driverSubstitute[0], driverSubstitute[1]);\n        driverSubstituteName = formatNamesSimple(driverSubstituteName || [\"Unknown\", \"Driver\"]);\n    }\n\n    const newData = {\n        team: randomTeamName,\n        teamId: randomTeam,\n        driver_out: {\n            id: driverOutName[1],\n            name: driverOutName[0],\n            teamId: randomTeam\n        },\n        driver_in: {\n            id: driverInName[1],\n            name: driverInName[0],\n            teamId: driverInTeamId\n        },\n        driver_substitute: driverSubstitute ? {\n            id: driverSubstituteName[1],\n            name: driverSubstituteName[0],\n            teamId: driverSubstituteTeamId\n        } : null,\n        month: currentMonth,\n        season: daySeason[1]\n    };\n\n    turningPointState.transfers[currentMonth] = newData; //tendria que ser currentMonth, pero para pruebas lo dejo fijo en junio\n\n    const title = generateTurningPointTitle(newData, 101, \"original\");\n    const image = getImagePath(null, driverOutName[1], \"transfer\");\n\n    const newEntry = {\n        id: entryId,\n        title,\n        image,\n        data: newData,\n        date: excelDate,\n        turning_point_type: \"original\",\n        type: \"turning_point_transfer\"\n    };\n\n    newsList.push(newEntry);\n\n    return newsList;\n}\n\nfunction generateDSQTurningPointNews(racesDone, savednews = {}, turningPointState = {}, tpConfig = null) {\n    const last3Races = racesDone.slice(-3);\n    let newsList = [];\n    let forcedCleanSeason = false;\n    const maxPerSeason = getTurningPointMax(\"dsq\", tpConfig);\n\n    // Populate newsList with existing news from savednews that correspond to illegal races\n    if (turningPointState.ilegalRaces) {\n        turningPointState.ilegalRaces.forEach(raceData => {\n            const entryId = `turning_point_dsq_${raceData.race_id}`;\n            if (savednews[entryId]) {\n                newsList.push({ id: entryId, ...savednews[entryId] });\n                //if there is alredy two ilegal races, the rest of the season will be clean\n                if (turningPointState.ilegalRaces.length >= maxPerSeason) forcedCleanSeason = true;\n            }\n        });\n    }\n\n    const racesNotChecked = [];\n    for (const r of last3Races) {\n        if (!turningPointState.checkedRaces.includes(r)) {\n            racesNotChecked.push(r);\n            turningPointState.checkedRaces.push(r);\n        }\n    }\n\n    if (racesNotChecked.length === 0) {\n        return newsList; // All recent races checked, return existing news\n    }\n\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n\n    const chance = getTurningPointChance(\"dsq\", tpConfig);\n    if (Math.random() > chance || forcedCleanSeason) { //testing, should be 0.08  \n        return newsList; // Random chance to not generate\n    }\n\n    const raceId = randomPick(racesNotChecked); // Pick from only the new races to check\n    const raceDate = queryDB(`SELECT Day FROM Races WHERE RaceID = ?`, [raceId], 'singleValue');\n    const teamsWithPoints = queryDB(`SELECT TeamID, SUM(Points) FROM Races_Results WHERE RaceID = ? AND Points > 0 GROUP BY TeamID`, [raceId], 'allRows');\n\n    if (!teamsWithPoints.length) {\n        return newsList;\n    }\n    const teamRow = randomPick(teamsWithPoints);\n\n    const teamId = teamRow[0];\n    const teamName = combined_dict[teamId] || \"Unknown Team\";\n\n    const entryId = `turning_point_dsq_${raceId}`;\n    if (savednews[entryId]) {\n        // This case should ideally not be hit if logic is correct, but as a safeguard:\n        if (!newsList.some(item => item.id === entryId)) {\n            newsList.push({ id: entryId, ...savednews[entryId] });\n        }\n        return newsList;\n    }\n\n    const components = [\"engine brake map\", \"fuel flow\", \"front wing\", \"rear wing\", \"diffuser\", \"floor\", \"brake ducts\", \"suspension\", \"gearbox\", \"cooling system\", \"hydraulics\", \"clutch\", \"plank wear\"];\n    const component = randomPick(components);\n\n    let driver1, driver2;\n    const drivers = queryDB(`SELECT bas.FirstName, bas.LastName, res.TeamID, res.Points, bas.StaffID, res.FinishingPos FROM Races_Results res JOIN Staff_BasicData bas ON res.DriverID = bas.StaffID WHERE res.RaceID = ?  AND res.TeamID = ?`, [raceId, teamId], 'allRows');\n    drivers.forEach((d, idx) => {\n        const nameFormatted = formatNamesSimple(d);\n        if (idx === 0) {\n            driver1 = { name: nameFormatted[0], points: d[3], position: d[5], driverId: d[4] };\n        } else if (idx === 1) {\n            driver2 = { name: nameFormatted[0], points: d[3], position: d[5], driverId: d[4] };\n        }\n    });\n\n    const titleData = {\n        team: teamName,\n        adjective: getCircuitInfo(raceId).adjective,\n        circuit: getCircuitInfo(raceId).circuit,\n        country: getCircuitInfo(raceId).country,\n        race_id: raceId,\n        component: component,\n        teamId: teamId,\n        currentSeason: daySeason[1],\n        driver_1: driver1,\n        driver_2: driver2\n    }\n\n    turningPointState.ilegalRaces.push(titleData);\n\n    const title = generateTurningPointTitle(titleData, 103, \"original\");\n    const image = getImagePath(null, null, \"dsq\");\n\n    const newEntry = {\n        id: entryId,\n        title,\n        image,\n        data: titleData,\n        date: raceDate + 2,\n        turning_point_type: \"original\",\n        type: \"turning_point_dsq\"\n    }\n\n    newsList.push(newEntry);\n\n    return newsList;\n}\n\nfunction getMaxPointsForRace(raceId, pointsSchema, seasonId = null) {\n    let maxPoints = parseInt(pointsSchema.twoBiggestPoints[0])\n    let fastestLapPoint = parseInt(pointsSchema.fastestLapBonusPoint)\n    let polePositionPoint = parseInt(pointsSchema.polePositionBonusPoint)\n    let isLastraceDouble = parseInt(pointsSchema.isLastraceDouble)\n    const isSprint = queryDB(`SELECT WeekendType FROM Races WHERE RaceID = ?`, [raceId], 'singleValue') === 1;\n    const maxSprintPoints = 8;\n    const isLastRaceOfSeason = queryDB(`SELECT MAX(RaceID) FROM Races WHERE SeasonID = ?`, [seasonId], 'singleValue') === raceId;\n\n    if (isLastRaceOfSeason && isLastraceDouble) {\n        maxPoints *= 2;\n    }\n\n    if (isSprint) {\n        maxPoints += parseInt(maxSprintPoints);\n    }\n\n    if (fastestLapPoint) {\n        maxPoints += parseInt(fastestLapPoint);\n    }\n\n    if (polePositionPoint) {\n        maxPoints += parseInt(polePositionPoint);\n    }\n\n    return parseInt(maxPoints);\n}\n\nfunction championshipStatus(\n    raceIdToCheck,\n    pointsSchema,\n    allSeasonRaces,\n    leader,\n    rival,\n    currentSeason\n) {\n    const raceInfo = allSeasonRaces.find(r => r.id === raceIdToCheck);\n    if (!raceInfo) throw new Error(\"Carrera no encontrada\");\n\n    // 2) Lista de todas las carreras desde esta (incluida) en adelante\n    const remainingRaces = allSeasonRaces\n        .filter(r => r.day >= raceInfo.day)\n        .map(r => r.id);\n\n    // 3) Suma de puntos máximos que puede conseguir el rival\n    const maxPointsForRival = remainingRaces\n        .reduce((sum, id) =>\n            sum + getMaxPointsForRace(id, pointsSchema, currentSeason)\n            , 0);\n\n    // === COMPROBACIÓN A: ¿YA es campeón antes de la carrera? ===\n    // Si rival.points + maxPointsForRival < leader.points entonces no le alcanzan ni sumando TODO\n    const alreadyChampion = (rival.points + maxPointsForRival) < leader.points;\n\n    // === COMPROBACIÓN B: ¿Se corona EN esta carrera? ===\n    // Puntos máximos que puede sumar el líder en esta carrera\n    const maxPointsThisRace = getMaxPointsForRace(\n        raceIdToCheck,\n        pointsSchema,\n        currentSeason\n    );\n\n    // Puntos máximos que puede sumar el rival **solo en las posteriores** a esta carrera\n    const futureRaces = allSeasonRaces\n        .filter(r => r.day > raceInfo.day)\n        .map(r => r.id);\n\n    const maxPointsFutureOnly = futureRaces\n        .reduce((sum, id) =>\n            sum + getMaxPointsForRace(id, pointsSchema, currentSeason)\n            , 0);\n\n    // Si líder + maxPointsThisRace > rival + maxPointsFutureOnly, se corona EN esta carrera\n    const clinchThisRace =\n        (leader.points + maxPointsThisRace) > (rival.points + maxPointsFutureOnly);\n\n\n    return { alreadyChampion, clinchThisRace };\n}\n\nfunction generateChampionMilestones(racesDone, savednews = {}) {\n    const pointsSchema = fetchPointsRegulations();\n\n    const ps = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    if (!ps) return [];\n    const currentSeason = ps[1];\n\n    const allSeasonRacesQuery = queryDB(\n        `SELECT RaceID, Day, TrackID FROM Races WHERE SeasonID = ? ORDER BY Day ASC`, [currentSeason],\n        'allRows'\n    );\n    if (!allSeasonRacesQuery || allSeasonRacesQuery.length === 0) return [];\n\n    const allRaces = allSeasonRacesQuery.map(r => ({ id: r[0], day: r[1], trackId: r[2] }));\n    const totalRaces = allRaces.length;\n    const halfIndex = Math.floor(totalRaces / 2);\n\n    const seasonResults = fetchSeasonResults(currentSeason);\n    if (!seasonResults) return [];\n\n    const doneSet = new Set(racesDone ?? []);\n    let lastDoneIdx = -1;\n    for (let i = 0; i < allRaces.length; i++) {\n        if (doneSet.has(allRaces[i].id)) lastDoneIdx = i;\n    }\n\n    if (lastDoneIdx < halfIndex) return [];\n\n    const out = [];\n\n    const iStart = halfIndex;\n    const prevRaceIdStart = iStart > 0 ? allRaces[iStart - 1].id : 0;\n    const standingsBeforeStart = rebuildStandingsUntil(seasonResults, prevRaceIdStart);\n    let wasAlreadyChampionBeforeThisRace = false;\n    if (standingsBeforeStart?.driverStandings?.length >= 2) {\n        const leaderS = standingsBeforeStart.driverStandings[0];\n        const rivalS = standingsBeforeStart.driverStandings[1];\n        if (leaderS && rivalS) {\n            const statusAtStart = championshipStatus(\n                allRaces[iStart].id,\n                pointsSchema,\n                allRaces,\n                leaderS,\n                rivalS,\n                currentSeason\n            );\n            wasAlreadyChampionBeforeThisRace = !!statusAtStart?.alreadyChampion;\n        }\n    }\n\n    const iEnd = Math.min(lastDoneIdx + 1, allRaces.length - 1);\n    for (let i = iStart; i <= iEnd; i++) {\n        const race = allRaces[i];\n        const prevRaceId = i > 0 ? allRaces[i - 1].id : 0;\n\n        const standingsBefore = rebuildStandingsUntil(seasonResults, prevRaceId);\n        if (standingsBefore?.driverStandings?.length >= 2) {\n            const leaderB = standingsBefore.driverStandings[0];\n            const rivalB = standingsBefore.driverStandings[1];\n\n            if (leaderB && rivalB && leaderB.points != null && rivalB.points != null) {\n                const statusAtRace = championshipStatus(\n                    race.id,\n                    pointsSchema,\n                    allRaces,\n                    leaderB,\n                    rivalB,\n                    currentSeason\n                );\n\n                if (statusAtRace?.clinchThisRace && !wasAlreadyChampionBeforeThisRace) {\n                    const newsId = `${currentSeason}_potential_champion_${race.id}`;\n                    if (savednews && savednews[newsId]) {\n                        out.push({ id: newsId, ...savednews[newsId] });\n                    } else {\n                        const raceInfo = getCircuitInfo(race.id);\n                        const jsDate = excelToDate(race.day); jsDate.setDate(jsDate.getDate() - 2);\n                        const finalNewsDateExcel = dateToExcel(jsDate);\n\n                        const code = races_names[Number(race.trackId)].toLowerCase();\n                        const image = getImagePath(leaderB.teamId, code, \"champion\");\n\n                        const title = generateTitle({\n                            driver_name: leaderB.name,\n                            circuit: raceInfo.circuit,\n                            country: raceInfo.country,\n                            adjective: raceInfo.adjective,\n                            season_year: currentSeason\n                        }, 8);\n\n                        out.push({\n                            id: newsId,\n                            type: \"potential_champion\",\n                            title,\n                            date: finalNewsDateExcel,\n                            image,\n                            overlay: null,\n                            text: null,\n                            data: {\n                                raceId: race.id,\n                                season_year: currentSeason,\n                                driver_id: leaderB.driverId,\n                                driver_team_id: leaderB.teamId,\n                                driver_name: leaderB.name,\n                                driver_points: leaderB.points,\n                                rival_driver_id: rivalB.driverId,\n                                rival_driver_name: rivalB.name,\n                                rival_points: rivalB.points,\n                                circuit_name: raceInfo.circuit,\n                                country_name: raceInfo.country,\n                                adjective: raceInfo.adjective\n                            }\n                        });\n                    }\n                }\n            }\n        }\n\n\n        const standingsAfter = rebuildStandingsUntil(seasonResults, race.id);\n        let alreadyChampionBeforeNext = false;\n        if (standingsAfter?.driverStandings?.length >= 2) {\n            const leaderA = standingsAfter.driverStandings[0];\n            const rivalA = standingsAfter.driverStandings[1];\n\n            if (leaderA && rivalA && leaderA.points != null && rivalA.points != null) {\n                const hasNext = i + 1 < allRaces.length;\n                if (hasNext) {\n                    const nextRace = allRaces[i + 1];\n                    const statusBeforeNext = championshipStatus(\n                        nextRace.id,\n                        pointsSchema,\n                        allRaces,\n                        leaderA,\n                        rivalA,\n                        currentSeason\n                    );\n                    alreadyChampionBeforeNext = !!statusBeforeNext?.alreadyChampion;\n                } else {\n                    alreadyChampionBeforeNext = (leaderA.points >= rivalA.points);\n                }\n\n                if (alreadyChampionBeforeNext && !wasAlreadyChampionBeforeThisRace) {\n                    const newsId = `${currentSeason}_world_champion`;\n                    const doneRace = queryDB(`SELECT State FROM Races WHERE RaceID = ?`, [race.id], 'singleValue');\n                    if (doneRace !== 2) {\n                        // Si la carrera no está marcada como \"hecha\", no generar la noticia\n                        continue;\n                    }\n                    if (savednews && savednews[newsId]) {\n                        out.push({ id: newsId, ...savednews[newsId] });\n                    } else {\n                        const raceInfo = getCircuitInfo(race.id);\n                        const finalNewsDateExcel = race.day + 1;\n\n                        const code = races_names[Number(race.trackId)];\n                        const image = getImagePath(leaderA.teamId, code, \"champion\");\n\n                        const title = generateTitle({\n                            driver_name: leaderA.name,\n                            circuit: raceInfo.circuit,\n                            country: raceInfo.country,\n                            adjective: raceInfo.adjective,\n                            season_year: currentSeason\n                        }, 9);\n\n                        out.push({\n                            id: newsId,\n                            type: \"world_champion\",\n                            title,\n                            date: finalNewsDateExcel,\n                            image,\n                            overlay: null,\n                            text: null,\n                            data: {\n                                raceId: race.id,\n                                season_year: currentSeason,\n                                driver_id: leaderA.driverId,\n                                driver_team_id: leaderA.teamId,\n                                driver_name: leaderA.name,\n                                driver_points: leaderA.points,\n                                rival_driver_id: rivalA.driverId,\n                                rival_driver_name: rivalA.name,\n                                rival_points: rivalA.points,\n                                circuit_name: raceInfo.circuit,\n                                country_name: raceInfo.country,\n                                adjective: raceInfo.adjective\n                            }\n                        });\n                    }\n                }\n            }\n        }\n\n        // Avanza el flag para el próximo i\n        wasAlreadyChampionBeforeThisRace = alreadyChampionBeforeNext;\n    }\n\n    return out;\n}\n\n\n\n\n\n\nexport function getCircuitInfo(raceId) {\n    const trackId = queryDB(`SELECT TrackID FROM Races WHERE RaceID = ?`, [raceId], 'singleRow');\n    const code = races_names[parseInt(trackId)];\n    if (!code) return \"Unknown Circuit\";\n    return countries_data[code] || code;\n}\n\nexport function getCustomNewsOptions() {\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const currentDay = Number(daySeason?.[0] ?? 0);\n    const seasonYear = Number(daySeason?.[1] ?? 0);\n\n    const races = queryDB(\n        `SELECT RaceID, TrackID, Day, State, WeekendType\n         FROM Races\n         WHERE SeasonID = ?\n         ORDER BY RaceID`,\n        [seasonYear],\n        'allRows'\n    ).map(([raceId, trackId, day, state, weekendType]) => {\n        const code = races_names?.[Number(trackId)];\n        const info = code ? countries_data?.[code] : null;\n        const jsDate = excelToDate(Number(day));\n        const iso = new Date(jsDate.getFullYear(), jsDate.getMonth(), jsDate.getDate()).toISOString().slice(0, 10);\n        return {\n            id: Number(raceId),\n            trackId: Number(trackId),\n            day: Number(day),\n            state: Number(state),\n            weekendType: Number(weekendType),\n            code: code || null,\n            label: info?.adjective ? `${seasonYear} ${info.adjective} GP` : (code ? `${seasonYear} ${code} GP` : `Race ${raceId}`),\n            dateIso: iso\n        };\n    });\n\n    const isCreateATeam = !!getGlobals()?.isCreateATeam;\n    const teamIds = isCreateATeam ? [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 32] : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n    const teams = teamIds.map(id => ({ id, name: combined_dict[id] || `Team ${id}` }));\n\n    const drivers = queryDB(\n        `SELECT bas.FirstName, bas.LastName, dri.StaffID, con.TeamID\n         FROM Staff_BasicData bas\n         JOIN Staff_DriverData dri ON bas.StaffID = dri.StaffID\n         JOIN Staff_Contracts con ON bas.StaffID = con.StaffID\n         WHERE con.ContractType = 0\n           AND con.PosInTeam <= 2\n           AND bas.FirstName != 'Placeholder'`,\n        [],\n        'allRows'\n    ).map(row => {\n        const [nameFormatted, driverId, teamId] = formatNamesSimple(row);\n        return {\n            id: Number(driverId),\n            name: news_insert_space(nameFormatted),\n            teamId: Number(teamId),\n            teamName: combined_dict[teamId] || `Team ${teamId}`\n        };\n    });\n\n    const allDrivers = queryDB(\n        `SELECT bas.FirstName, bas.LastName, dri.StaffID, con.TeamID\n         FROM Staff_BasicData bas\n         JOIN Staff_DriverData dri ON bas.StaffID = dri.StaffID\n         LEFT JOIN Staff_Contracts con ON bas.StaffID = con.StaffID AND con.ContractType = 0\n         LEFT JOIN Staff_GameData gd ON bas.StaffID = gd.StaffID\n         WHERE bas.FirstName != 'Placeholder'\n           AND IFNULL(gd.Retired, 0) = 0`,\n        [],\n        'allRows'\n    ).map(row => {\n        const [nameFormatted, driverId, teamId] = formatNamesSimple(row);\n        const teamNum = Number(teamId) || 0;\n        return {\n            id: Number(driverId),\n            name: news_insert_space(nameFormatted),\n            teamId: teamNum || null,\n            teamName: teamNum ? (combined_dict[teamNum] || `Team ${teamNum}`) : \"Free Agent\"\n        };\n    });\n\n    const engines = (fetchEngines()?.[0] || []).map(([engineId, _, engineName]) => ({\n        id: Number(engineId),\n        name: String(engineName || `Engine ${engineId}`)\n    }));\n\n    return { seasonYear, currentDay, teams, races, drivers, allDrivers, engines };\n}\n\nfunction getOfficialF1DriverIdsForCustomNews(teamId = null) {\n    const params = [];\n    let sql = `\n        SELECT con.StaffID\n        FROM Staff_Contracts con\n        JOIN Staff_DriverData dri ON con.StaffID = dri.StaffID\n        WHERE con.ContractType = 0\n          AND con.PosInTeam <= 2\n    `;\n\n    if (teamId != null) {\n        sql += ` AND con.TeamID = ?`;\n        params.push(Number(teamId));\n    }\n\n    return (queryDB(sql, params, 'allRows') || []).map(row => Number(row[0]));\n}\n\nfunction assertOfficialF1DriverForCustomNews(driverId, label = \"Driver\") {\n    const exists = queryDB(\n        `SELECT 1\n         FROM Staff_Contracts con\n         JOIN Staff_DriverData dri ON con.StaffID = dri.StaffID\n         WHERE con.StaffID = ?\n           AND con.ContractType = 0\n           AND con.PosInTeam <= 2\n         LIMIT 1`,\n        [Number(driverId)],\n        'singleValue'\n    );\n    if (!exists) {\n        throw new Error(`${label} must be a current Formula 1 driver`);\n    }\n}\n\nfunction isOfficialF1DriverForCustomNews(driverId) {\n    const exists = queryDB(\n        `SELECT 1\n         FROM Staff_Contracts con\n         JOIN Staff_DriverData dri ON con.StaffID = dri.StaffID\n         WHERE con.StaffID = ?\n           AND con.ContractType = 0\n           AND con.PosInTeam <= 2\n         LIMIT 1`,\n        [Number(driverId)],\n        'singleValue'\n    );\n    return !!exists;\n}\n\nfunction assertActiveDriverForCustomNews(driverId, label = \"Driver\") {\n    const exists = queryDB(\n        `SELECT 1\n         FROM Staff_BasicData bas\n         JOIN Staff_DriverData dri ON bas.StaffID = dri.StaffID\n         LEFT JOIN Staff_GameData gd ON bas.StaffID = gd.StaffID\n         WHERE bas.StaffID = ?\n           AND bas.FirstName != 'Placeholder'\n           AND IFNULL(gd.Retired, 0) = 0\n         LIMIT 1`,\n        [Number(driverId)],\n        'singleValue'\n    );\n    if (!exists) {\n        throw new Error(`${label} must be an active driver`);\n    }\n}\n\nfunction assertCompletedRaceForCustomNews(raceId, label = \"Race\") {\n    const raceState = queryDB(`SELECT State FROM Races WHERE RaceID = ?`, [raceId], 'singleValue');\n    if (Number(raceState) !== 2) {\n        throw new Error(`${label} must already have taken place`);\n    }\n}\n\nexport function getRaceDriversForCustomNews(raceId) {\n    const results = getOneRaceResults(raceId) || [];\n    return results.map(row => {\n        const [nameFormatted, driverId, teamId] = formatNamesSimple(row);\n        return {\n            driverId: Number(driverId),\n            name: news_insert_space(nameFormatted),\n            teamId: Number(teamId),\n            teamName: combined_dict[teamId] || `Team ${teamId}`,\n            pos: Number(row[4])\n        };\n    });\n}\n\nfunction isoToExcelDay(iso) {\n    if (!iso || typeof iso !== \"string\") return null;\n    const m = iso.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n    if (!m) return null;\n    const d = new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]));\n    return dateToExcel(d);\n}\n\nfunction getDriverAndTeamForCustomNews(driverId) {\n    const row = queryDB(\n        `SELECT bas.FirstName, bas.LastName, bas.StaffID, con.TeamID\n         FROM Staff_BasicData bas\n         JOIN Staff_DriverData dri ON bas.StaffID = dri.StaffID\n         LEFT JOIN Staff_Contracts con ON bas.StaffID = con.StaffID AND con.ContractType = 0\n         WHERE bas.StaffID = ?\n         LIMIT 1`,\n        [driverId],\n        'singleRow'\n    );\n    const [nameFormatted, id, teamId] = formatNamesSimple(row || [\"Unknown\", \"Driver\", driverId, 0]);\n    return {\n        driverId: Number(id),\n        name: news_insert_space(nameFormatted),\n        teamId: Number(teamId || 0),\n        teamName: Number(teamId || 0) > 0 ? (combined_dict[teamId] || `Team ${teamId}`) : \"Free Agent\"\n    };\n}\n\nfunction renderNormalTitleTemplate(data, new_type, templateIndex) {\n    const templateObj = newsTitleTemplates.find(t => t.new_type === new_type);\n    const titles = Array.isArray(templateObj?.titles) ? templateObj.titles : [];\n    const tpl = titles[templateIndex];\n    if (!tpl) return null;\n\n    const prepared = { ...(data || {}) };\n    if (prepared.raceId) {\n        const raceInfo = getCircuitInfo(prepared.raceId);\n        prepared.circuit = raceInfo?.circuit;\n        prepared.country = raceInfo?.country;\n        prepared.adjective = raceInfo?.adjective;\n    }\n\n    const paramMap = getParamMap(prepared);\n    return tpl.replace(/{{\\s*(\\w+)\\s*}}/g, (_, key) => paramMap?.[new_type]?.[key] || '');\n}\n\nfunction renderTurningPointTitleTemplate(data, new_type, turningPointType, templateIndex) {\n    const templateObj = turningPointsTitleTemplates.find(t => t.new_type === new_type);\n    let titles = [];\n    if (turningPointType === \"positive\") titles = templateObj?.positive_titles || [];\n    else if (turningPointType === \"negative\") titles = templateObj?.negative_titles || [];\n    else titles = templateObj?.turning_titles || [];\n\n    const tpl = titles[templateIndex];\n    if (!tpl) return null;\n\n    const paramMap = getParamMap(data || {});\n    return tpl.replace(/{{\\s*(\\w+)\\s*}}/g, (_, key) => paramMap?.[new_type]?.[key] || '');\n}\n\nfunction assertCustomTurningPointPayload(type, data) {\n    if (!type?.startsWith(\"turning_point_\")) return;\n    if (!data || typeof data !== \"object\") {\n        throw new Error(`Incomplete turning point data for ${type}`);\n    }\n\n    const requireNumber = (value, label) => {\n        if (!Number.isFinite(Number(value))) {\n            throw new Error(`Missing ${label} for ${type}`);\n        }\n    };\n    const requireText = (value, label) => {\n        if (typeof value !== \"string\" || !value.trim()) {\n            throw new Error(`Missing ${label} for ${type}`);\n        }\n    };\n    const requireObject = (value, label) => {\n        if (!value || typeof value !== \"object\" || Array.isArray(value) || Object.keys(value).length === 0) {\n            throw new Error(`Missing ${label} for ${type}`);\n        }\n    };\n    const requireArray = (value, label) => {\n        if (!Array.isArray(value) || value.length === 0) {\n            throw new Error(`Missing ${label} for ${type}`);\n        }\n    };\n\n    if (type === \"turning_point_technical_directive\") {\n        requireNumber(data.componentId, \"componentId\");\n        requireObject(data.effectOnEachteam, \"effectOnEachteam\");\n        return;\n    }\n\n    if (type === \"turning_point_transfer\") {\n        requireNumber(data.teamId, \"teamId\");\n        requireNumber(data.driver_out?.id, \"driver_out.id\");\n        requireNumber(data.driver_in?.id, \"driver_in.id\");\n        return;\n    }\n\n    if (type === \"turning_point_investment\") {\n        requireNumber(data.teamId, \"teamId\");\n        requireNumber(data.investmentAmount, \"investmentAmount\");\n        requireNumber(data.investmentShare, \"investmentShare\");\n        requireText(data.country, \"country\");\n        return;\n    }\n\n    if (type === \"turning_point_dsq\") {\n        requireNumber(data.race_id, \"race_id\");\n        requireNumber(data.teamId, \"teamId\");\n        requireText(data.component, \"component\");\n        return;\n    }\n\n    if (type === \"turning_point_race_substitution\") {\n        requireNumber(data.raceId, \"raceId\");\n        requireNumber(data.newRaceTrackId, \"newRaceTrackId\");\n        requireNumber(data.newRaceDay, \"newRaceDay\");\n        return;\n    }\n\n    if (type === \"turning_point_injury\") {\n        requireNumber(data.driver_affected?.id, \"driver_affected.id\");\n        requireNumber(data.condition?.end_date, \"condition.end_date\");\n        requireNumber(data.reserve_driver?.id, \"reserve_driver.id\");\n        requireArray(data.condition?.races_affected, \"condition.races_affected\");\n        return;\n    }\n\n    if (type === \"turning_point_engine_regulation\") {\n        requireObject(data.engineData, \"engineData\");\n        return;\n    }\n\n    if (type === \"turning_point_young_drivers\") {\n        requireArray(data.prospects, \"prospects\");\n        data.prospects.forEach((prospect, index) => {\n            requireNumber(prospect?.driverId, `prospects[${index}].driverId`);\n        });\n        return;\n    }\n\n    if (type === \"turning_point_aduo\") {\n        requireNumber(data.quarter, \"quarter\");\n        requireArray(data.engineImprovements, \"engineImprovements\");\n        data.engineImprovements.forEach((engineChange, index) => {\n            requireNumber(engineChange?.engineId, `engineImprovements[${index}].engineId`);\n            requireText(engineChange?.name, `engineImprovements[${index}].name`);\n            requireObject(engineChange?.improvements, `engineImprovements[${index}].improvements`);\n        });\n    }\n}\n\nexport function createCustomNewsEntry(input = {}) {\n    const { type, title, titleTemplateIndex, dateIso, params } = input || {};\n    if (!type || typeof type !== \"string\") {\n        throw new Error(\"Missing custom news type\");\n    }\n\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const seasonYear = Number(daySeason?.[1] ?? 0);\n    const currentDay = Number(daySeason?.[0] ?? 0);\n\n    const now = Date.now();\n    const id = type === \"custom_new\" ? `custom_new_${now}` : `custom_${type}_${now}`;\n    const stableKey = id;\n    const selectedTemplateIndex = titleTemplateIndex != null ? Number(titleTemplateIndex) : null;\n\n    const dateFromIso = isoToExcelDay(dateIso);\n    let date = dateFromIso != null ? dateFromIso : currentDay;\n    const currentMonth = excelToDate(date).getMonth() + 1;\n\n    let data = null;\n    let overlay = null;\n    let image = null;\n    let finalTitle = (typeof title === \"string\" && title.trim()) ? title.trim() : null;\n\n    if (type === \"race_result\") {\n        const raceId = Number(params?.raceId);\n        if (!raceId || raceId <= 0) throw new Error(\"Missing raceId\");\n        assertCompletedRaceForCustomNews(raceId);\n        const results = getOneRaceResults(raceId);\n        if (!results?.length) throw new Error(\"No race results found for that race\");\n\n        const formatted = results.map(row => {\n            const [nameFormatted, driverId, teamId] = formatNamesSimple(row);\n            return { name: news_insert_space(nameFormatted), driverId, teamId, pos: row[4] };\n        });\n\n        const trackId = queryDB(`SELECT TrackID FROM Races WHERE RaceID = ?`, [raceId], 'singleRow');\n        const code = races_names[parseInt(trackId)];\n\n        data = {\n            raceId,\n            first: formatted[0].name,\n            second: formatted[1].name,\n            third: formatted[2].name,\n            firstTeam: formatted[0].teamId,\n            secondTeam: formatted[1].teamId,\n            thirdTeam: formatted[2].teamId,\n            trackId: trackId,\n            seasonYear: seasonYear,\n        };\n\n        if (dateFromIso == null) {\n            const d = queryDB(`SELECT Day FROM Races WHERE RaceID = ?`, [raceId], 'singleValue');\n            date = Number(d);\n        }\n\n        if (!finalTitle) {\n            finalTitle = renderNormalTitleTemplate({ raceId, seasonYear, winnerName: formatted[0].name }, 2, selectedTemplateIndex)\n                || generateTitle({ raceId, seasonYear, winnerName: formatted[0].name }, 2);\n        }\n\n        overlay = \"race-overlay\";\n        image = getImagePath(formatted[0].teamId, code, \"raceQuali\");\n    }\n    else if (type === \"quali_result\") {\n        const raceId = Number(params?.raceId);\n        if (!raceId || raceId <= 0) throw new Error(\"Missing raceId\");\n        assertCompletedRaceForCustomNews(raceId);\n        const results = getOneQualifyingResults(raceId);\n        if (!results?.length) throw new Error(\"No qualifying results found for that race\");\n\n        const formatted = results.map(row => {\n            const [nameFormatted, driverId, teamId] = formatNamesSimple(row);\n            return { name: news_insert_space(nameFormatted), driverId, teamId, pos: row[4], fastestLap: row[5] };\n        });\n\n        const trackId = queryDB(`SELECT TrackID FROM Races WHERE RaceID = ?`, [raceId], 'singleRow');\n        const code = races_names[parseInt(trackId)];\n\n        data = {\n            raceId,\n            first: formatted[0].name,\n            second: formatted[1].name,\n            third: formatted[2].name,\n            firstTeam: formatted[0].teamId,\n            secondTeam: formatted[1].teamId,\n            thirdTeam: formatted[2].teamId,\n            trackId: trackId,\n            seasonYear: seasonYear,\n        };\n\n        if (dateFromIso == null) {\n            const d = queryDB(`SELECT Day FROM Races WHERE RaceID = ?`, [raceId], 'singleValue') - 1;\n            date = Number(d);\n        }\n\n        if (!finalTitle) {\n            finalTitle = renderNormalTitleTemplate({ raceId, seasonYear, pole_driver: formatted[0].name }, 1, selectedTemplateIndex)\n                || generateTitle({ raceId, seasonYear, pole_driver: formatted[0].name }, 1);\n        }\n\n        overlay = \"quali-overlay\";\n        image = getImagePath(formatted[0].teamId, `${code}_car`, \"raceQuali\");\n    }\n    else if (type === \"race_reaction\") {\n        const raceId = Number(params?.raceId);\n        if (!raceId || raceId <= 0) throw new Error(\"Missing raceId\");\n        assertCompletedRaceForCustomNews(raceId);\n        const results = getOneRaceResults(raceId);\n        if (!results?.length) throw new Error(\"No race results found for that race\");\n\n        const formatted = results.map(row => {\n            const [nameFormatted, driverId, teamId] = formatNamesSimple(row);\n            return {\n                name: news_insert_space(nameFormatted),\n                driverId: Number(driverId),\n                teamId: Number(teamId),\n                teamName: combined_dict[teamId],\n                pos: Number(row[4]),\n                rating: getDriverOverall(driverId)\n            };\n        });\n\n        const pickById = (idVal) => formatted.find(d => Number(d.driverId) === Number(idVal)) || null;\n        const chosenHappy = params?.happyDriverId ? pickById(params.happyDriverId) : null;\n        const chosenUnhappy = params?.unhappyDriverId ? pickById(params.unhappyDriverId) : null;\n\n        const unhappyDrivers = formatted.filter(r => r.rating >= 88 && r.pos > 6);\n        const happyDrivers = formatted.filter(r => r.pos <= 4);\n        const randomUnHappyDriver = chosenUnhappy || randomPick(unhappyDrivers.length ? unhappyDrivers : formatted);\n        const randomHappyDriver = chosenHappy || randomPick(happyDrivers.length ? happyDrivers : formatted);\n\n        const trackId = queryDB(`SELECT TrackID FROM Races WHERE RaceID = ?`, [raceId], 'singleRow');\n        const code = races_names[parseInt(trackId)].toLowerCase();\n\n        data = {\n            raceId,\n            allHappyDrivers: happyDrivers,\n            allUnhappyDrivers: unhappyDrivers,\n            randomHappyDriver,\n            happyTeam: randomHappyDriver.teamName,\n            unhappyTeam: randomUnHappyDriver.teamName,\n            randomUnHappyDriver,\n            seasonYear,\n            trackId: trackId\n        };\n\n        if (!finalTitle) {\n            finalTitle = renderNormalTitleTemplate(data, 16, selectedTemplateIndex) || generateTitle(data, 16);\n        }\n\n        if (dateFromIso == null) {\n            const d = queryDB(`SELECT Day FROM Races WHERE RaceID = ?`, [raceId], 'singleValue');\n            date = Number(d) + 1;\n        }\n\n        let driverTeamIdInTitle = null;\n        if (finalTitle.includes(randomUnHappyDriver.name)) driverTeamIdInTitle = randomUnHappyDriver.teamId;\n        else if (finalTitle.includes(randomHappyDriver.name)) driverTeamIdInTitle = randomHappyDriver.teamId;\n        if (driverTeamIdInTitle != null) data.driverTeamIdInTitle = driverTeamIdInTitle;\n\n        overlay = \"reaction-overlay\";\n        image = getImagePath(driverTeamIdInTitle, code, \"reaction\");\n    }\n    else if (type === \"fake_transfer\") {\n        const driverId = Number(params?.driverId);\n        if (!driverId || driverId <= 0) throw new Error(\"Missing driverId\");\n        assertOfficialF1DriverForCustomNews(driverId);\n        const d = getDriverAndTeamForCustomNews(driverId);\n        data = {\n            drivers: [{\n                name: d.name,\n                driverId: d.driverId,\n                team: d.teamName,\n                teamId: d.teamId\n            }]\n        };\n        if (!finalTitle) {\n            finalTitle = renderNormalTitleTemplate({ driver1: d.name, team1: d.teamName }, 7, selectedTemplateIndex)\n                || generateTitle({ driver1: d.name, team1: d.teamName }, 7);\n        }\n        overlay = \"fake-transfer-overlay\";\n        image = getImagePath(d.teamId, d.driverId, \"transfer\");\n    }\n    else if (type === \"big_transfer\" || type === \"massive_exit\" || type === \"massive_signing\") {\n        const driverId = Number(params?.driverId);\n        const fromTeamId = Number(params?.fromTeamId);\n        const toTeamId = Number(params?.toTeamId);\n        const salary = params?.salary != null ? Number(params.salary) : null;\n        const endSeason = params?.endSeason != null ? Number(params.endSeason) : null;\n        if (!driverId || driverId <= 0) throw new Error(\"Missing driverId\");\n        if (!fromTeamId || fromTeamId <= 0) throw new Error(\"Missing fromTeamId\");\n        if (!toTeamId || toTeamId <= 0) throw new Error(\"Missing toTeamId\");\n        assertOfficialF1DriverForCustomNews(driverId);\n\n        const d = getDriverAndTeamForCustomNews(driverId);\n        const team1 = combined_dict[fromTeamId] || `Team ${fromTeamId}`;\n        const team2 = combined_dict[toTeamId] || `Team ${toTeamId}`;\n\n        data = {\n            driver1: d.name,\n            driverId: d.driverId,\n            team1: team1,\n            team2: team2,\n            team1Id: fromTeamId,\n            team2Id: toTeamId,\n            salary: salary,\n            endSeason: endSeason,\n            season_year: seasonYear\n        };\n\n        if (!finalTitle) {\n            const titleType = type === \"big_transfer\" ? 6 : (type === \"massive_exit\" ? 17 : 18);\n            finalTitle = renderNormalTitleTemplate(data, titleType, selectedTemplateIndex) || generateTitle(data, titleType);\n        }\n\n        overlay = type === \"massive_exit\" ? \"massive-exit-overlay\" : \"massive-signing-overlay\";\n        const imageTeamId = type === \"massive_exit\" ? fromTeamId : toTeamId;\n        image = getImagePath(imageTeamId, d.driverId, \"transfer\");\n    }\n    else if (type === \"contract_renewal\") {\n        const driverId = Number(params?.driverId);\n        const renewalTeamId = Number(params?.renewalTeamId);\n        const currentTeamId = Number(params?.currentTeamId);\n        const salary = params?.salary != null ? Number(params.salary) : null;\n        const endSeason = params?.endSeason != null ? Number(params.endSeason) : null;\n        if (!driverId || driverId <= 0) throw new Error(\"Missing driverId\");\n        if (!renewalTeamId || renewalTeamId <= 0) throw new Error(\"Missing renewalTeamId\");\n        if (!currentTeamId || currentTeamId <= 0) throw new Error(\"Missing currentTeamId\");\n        assertOfficialF1DriverForCustomNews(driverId);\n\n        const d = getDriverAndTeamForCustomNews(driverId);\n        data = {\n            driver1: d.name,\n            driverId: d.driverId,\n            team1: combined_dict[renewalTeamId] || `Team ${renewalTeamId}`,\n            team2: combined_dict[currentTeamId] || `Team ${currentTeamId}`,\n            team1Id: renewalTeamId,\n            team2Id: currentTeamId,\n            salary: salary,\n            endSeason: endSeason\n        };\n\n        if (!finalTitle) {\n            finalTitle = renderNormalTitleTemplate(data, 10, selectedTemplateIndex) || generateTitle(data, 10);\n        }\n\n        overlay = \"contract-renewal-overlay\";\n        image = getImagePath(renewalTeamId, d.driverId, \"transfer\");\n    }\n    else if (type === \"silly_season_rumors\") {\n        const items = Array.isArray(params?.drivers) ? params.drivers : [];\n        const drivers = items.slice(0, 6).map(it => {\n            const driverId = Number(it?.driverId);\n            if (!driverId || driverId <= 0) return null;\n            assertOfficialF1DriverForCustomNews(driverId);\n            const d = getDriverAndTeamForCustomNews(driverId);\n            const potentialTeam = it?.potentialTeam != null ? Number(it.potentialTeam) : null;\n            const salary = it?.salary != null ? Number(it.salary) : null;\n            const endSeason = it?.endSeason != null ? Number(it.endSeason) : null;\n            return {\n                driverId: d.driverId,\n                name: d.name,\n                team: d.teamName,\n                teamId: d.teamId,\n                potentialTeam,\n                potentialSalary: salary,\n                potentialYearEnd: endSeason\n            };\n        }).filter(Boolean);\n\n        if (drivers.length < 3) throw new Error(\"Pick at least 3 drivers\");\n\n        if (!finalTitle) {\n            const titleData = {\n                driver1: drivers[0].name,\n                driver2: drivers[1].name,\n                driver3: drivers[2].name,\n                team1: drivers[0].potentialTeam ? (combined_dict[drivers[0].potentialTeam] || \"\") : \"\",\n                team2: drivers[1].potentialTeam ? (combined_dict[drivers[1].potentialTeam] || \"\") : \"\",\n                team3: drivers[2].potentialTeam ? (combined_dict[drivers[2].potentialTeam] || \"\") : \"\",\n                season: seasonYear\n            };\n            finalTitle = renderNormalTitleTemplate(titleData, 4, selectedTemplateIndex) || generateTitle(titleData, 4);\n        }\n\n        if (dateFromIso == null) {\n            date = dateToExcel(new Date(seasonYear, 7, 10));\n        }\n\n        data = { drivers };\n        overlay = \"silly-season-overlay\";\n        image = getImagePath(drivers[0].teamId, drivers[0].driverId, \"transfer_generic\");\n    }\n    else if (type === \"team_comparison\") {\n        const teamId = Number(params?.teamId);\n        const compType = params?.compType === \"bad\" ? \"bad\" : \"good\";\n        const drop = params?.drop != null ? Number(params.drop) : 0;\n        if (!teamId || teamId <= 0) throw new Error(\"Missing teamId\");\n\n        data = {\n            team: { teamId, drop },\n            season: seasonYear,\n            compType\n        };\n\n        if (!finalTitle) {\n            const titleType = compType === \"good\" ? 12 : 11;\n            const titleData = { teamId: combined_dict[teamId] || `Team ${teamId}`, season: seasonYear };\n            finalTitle = renderNormalTitleTemplate(titleData, titleType, selectedTemplateIndex) || generateTitle(titleData, titleType);\n        }\n\n        image = getImagePath(teamId, teamId, \"teamComparison\");\n        overlay = null;\n    }\n    else if (type === \"driver_comparison\") {\n        const teamId = Number(params?.teamId);\n        const driver1Id = Number(params?.driver1Id);\n        const driver2Id = Number(params?.driver2Id);\n        if (!teamId || teamId <= 0) throw new Error(\"Missing teamId\");\n        if (!driver1Id || driver1Id <= 0) throw new Error(\"Missing driver1Id\");\n        if (!driver2Id || driver2Id <= 0) throw new Error(\"Missing driver2Id\");\n        assertOfficialF1DriverForCustomNews(driver1Id, \"Driver 1\");\n        assertOfficialF1DriverForCustomNews(driver2Id, \"Driver 2\");\n\n        const d1 = getDriverAndTeamForCustomNews(driver1Id);\n        const d2 = getDriverAndTeamForCustomNews(driver2Id);\n        const teamName = combined_dict[teamId] || `Team ${teamId}`;\n\n        data = {\n            teamId,\n            teamName,\n            drivers: [{ name: d1.name, driverId: d1.driverId }, { name: d2.name, driverId: d2.driverId }],\n            season: seasonYear\n        };\n\n        if (!finalTitle) {\n            finalTitle = renderNormalTitleTemplate({ team: teamName, driver1: d1.name, driver2: d2.name }, 13, selectedTemplateIndex)\n                || generateTitle({ team: teamName, driver1: d1.name, driver2: d2.name }, 13);\n        }\n\n        overlay = \"driver-comparison-overlay\";\n        image = null;\n    }\n    else if (type === \"season_review\") {\n        const part = Number(params?.part);\n        if (![1, 2, 3].includes(part)) throw new Error(\"Invalid season review part\");\n\n        const nRaces = queryDB(`SELECT COUNT(*) FROM Races WHERE SeasonID = ?`, [seasonYear], 'singleValue');\n        const racesInterval = nRaces / 3;\n        const firstRaceSeasonId = queryDB(`SELECT MIN(RaceID) FROM Races WHERE SeasonID = ?`, [seasonYear], 'singleValue');\n        const seasonResults = fetchSeasonResults(seasonYear);\n        const raceIdInPoint = firstRaceSeasonId + Math.floor(racesInterval * part) - 1;\n\n        const { driverStandings, teamStandings } = rebuildStandingsUntil(seasonResults, raceIdInPoint);\n        const firstDriver = driverStandings[0];\n        const secondDriver = driverStandings[1];\n        const firstTeam = teamStandings[0];\n        const secondTeam = teamStandings[1];\n\n        data = {\n            season: seasonYear,\n            part,\n            firstDriver,\n            secondDriver,\n            firstTeam,\n            secondTeam\n        };\n\n        if (!finalTitle) {\n            const titleId = part === 3 ? 15 : 14;\n            const titleData = { season: seasonYear, part, driver1: firstDriver?.name, driver2: secondDriver?.name };\n            finalTitle = renderNormalTitleTemplate(titleData, titleId, selectedTemplateIndex) || generateTitle(titleData, titleId);\n        }\n\n        image = getImagePath(firstTeam ? firstTeam.id : 1, firstDriver ? firstDriver.id : 1, \"season_review\");\n        overlay = null;\n    }\n    else if (type === \"potential_champion\" || type === \"world_champion\") {\n        const raceId = Number(params?.raceId);\n        if (!raceId || raceId <= 0) throw new Error(\"Missing raceId\");\n        assertCompletedRaceForCustomNews(raceId);\n\n        const seasonResults = fetchSeasonResults(seasonYear, true);\n        const standings = type === \"potential_champion\"\n            ? rebuildStandingsUntil(seasonResults, raceId - 1, true)\n            : rebuildStandingsUntil(seasonResults, raceId, true);\n\n        const leader = standings?.driverStandings?.[0];\n        const rival = standings?.driverStandings?.[1];\n        if (!leader || !rival) throw new Error(\"Not enough standings data for this race\");\n\n        const raceInfo = getCircuitInfo(raceId);\n        const trackId = queryDB(`SELECT TrackID FROM Races WHERE RaceID = ?`, [raceId], 'singleValue');\n        const code = races_names[Number(trackId)];\n\n        data = {\n            raceId,\n            season_year: seasonYear,\n            driver_id: leader.driverId,\n            driver_team_id: leader.teamId,\n            driver_name: leader.name,\n            driver_points: leader.points,\n            rival_driver_id: rival.driverId,\n            rival_driver_name: rival.name,\n            rival_points: rival.points,\n            circuit_name: raceInfo.circuit,\n            country_name: raceInfo.country,\n            adjective: raceInfo.adjective\n        };\n\n        if (!finalTitle) {\n            const titleData = {\n                driver_name: leader.name,\n                circuit: raceInfo.circuit,\n                country: raceInfo.country,\n                adjective: raceInfo.adjective,\n                season_year: seasonYear\n            };\n            const titleType = type === \"potential_champion\" ? 8 : 9;\n            finalTitle = renderNormalTitleTemplate(titleData, titleType, selectedTemplateIndex) || generateTitle(titleData, titleType);\n        }\n\n        overlay = null;\n        image = getImagePath(leader.teamId, (type === \"potential_champion\" ? code?.toLowerCase() : code), \"champion\");\n\n        if (dateFromIso == null) {\n            const baseDay = queryDB(`SELECT Day FROM Races WHERE RaceID = ?`, [raceId], 'singleValue');\n            date = type === \"potential_champion\" ? (Number(baseDay) - 2) : (Number(baseDay) + 1);\n        }\n    }\n    else if (type === \"next_season_grid\") {\n        const globals = getGlobals();\n        let teamIds = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n        if (globals?.isCreateATeam) teamIds.push(32);\n        let teamsDict = {};\n        teamIds.forEach(teamId => {\n            const teamName = combined_dict[teamId] || \"Unknown Team\";\n            let teamInfo = {\n                name: teamName,\n                teamId: teamId,\n                driversNextSeason: [],\n                driversThisSeason: []\n            };\n            const driversThisSeason = queryDB(\n                `SELECT bas.FirstName, bas.LastName, dri.StaffID, con.TeamID, con.ContractType\n                 FROM Staff_BasicData bas\n                 JOIN Staff_DriverData dri ON bas.StaffID = dri.StaffID\n                 JOIN Staff_Contracts con ON bas.StaffID = con.StaffID\n                 WHERE con.TeamID = ?\n                   AND con.PosInTeam <= 2\n                   AND con.ContractType = 0`,\n                [teamId],\n                'allRows'\n            );\n            const driversNextSeason = queryDB(\n                `SELECT bas.FirstName, bas.LastName, dri.StaffID, con.TeamID, con.ContractType\n                 FROM Staff_BasicData bas\n                 JOIN Staff_DriverData dri ON bas.StaffID = dri.StaffID\n                 JOIN Staff_Contracts con ON bas.StaffID = con.StaffID\n                 WHERE con.TeamID = ?\n                   AND con.PosInTeam <= 2\n                   AND con.ContractType IN (0,3)`,\n                [teamId],\n                'allRows'\n            );\n            driversNextSeason.forEach(d => {\n                const name = formatNamesSimple(d);\n                const contractType = d[4];\n                teamInfo.driversNextSeason.push({\n                    name: news_insert_space(name[0]),\n                    driverId: name[1],\n                    isForNextSeason: contractType === 3\n                });\n            });\n            driversThisSeason.forEach(d => {\n                const name = formatNamesSimple(d);\n                teamInfo.driversThisSeason.push({\n                    name: news_insert_space(name[0]),\n                    driverId: name[1]\n                });\n            });\n            teamsDict[teamId] = teamInfo;\n        });\n\n        const nextYear = seasonYear + 1;\n        data = { season_year: nextYear, teams: teamsDict };\n        if (!finalTitle) finalTitle = renderNormalTitleTemplate({ season_year: nextYear }, 19, selectedTemplateIndex) || generateTitle({ season_year: nextYear }, 19);\n        overlay = \"next-season-grid\";\n        image = getImagePath(null, null, \"grid\");\n        if (dateFromIso == null) {\n            date = dateToExcel(new Date(seasonYear, 11, 15));\n        }\n    }\n    else if (type === \"feeder_series_review\") {\n        const f2 = queryDB(\n            `SELECT bas.FirstName, bas.LastName, rds.DriverID, 1\n             FROM Races_DriverStandings rds\n             JOIN Staff_BasicData bas ON rds.DriverID = bas.StaffID\n             WHERE rds.SeasonID = ? AND rds.RaceFormula = 2 AND rds.Position = 1\n             LIMIT 1`,\n            [seasonYear],\n            \"singleRow\"\n        );\n        const f3 = queryDB(\n            `SELECT bas.FirstName, bas.LastName, rds.DriverID, 1\n             FROM Races_DriverStandings rds\n             JOIN Staff_BasicData bas ON rds.DriverID = bas.StaffID\n             WHERE rds.SeasonID = ? AND rds.RaceFormula = 3 AND rds.Position = 1\n             LIMIT 1`,\n            [seasonYear],\n            \"singleRow\"\n        );\n\n        const [f2Name, f2Id] = formatNamesSimple(f2 || [\"Unknown\", \"Driver\", 0]);\n        const [f3Name, f3Id] = formatNamesSimple(f3 || [\"Unknown\", \"Driver\", 0]);\n\n        data = {\n            f2_champion: { name: news_insert_space(f2Name), driverId: f2Id },\n            f3_champion: { name: news_insert_space(f3Name), driverId: f3Id },\n            season_year: seasonYear\n        };\n        if (!finalTitle) {\n            const titleData = { season_year: seasonYear, f2_champion: data.f2_champion.name, f3_champion: data.f3_champion.name };\n            finalTitle = renderNormalTitleTemplate(titleData, 20, selectedTemplateIndex) || generateTitle(titleData, 20);\n        }\n        overlay = null;\n        image = getImagePath(null, null, \"young\");\n    }\n    else if (type === \"turning_point_technical_directive\") {\n        const componentId = Number(params?.componentId);\n        const reason = String(params?.reason || \"\").trim() || \"improve safety\";\n        const requestedEffectMode = String(params?.effectMode || \"\").trim().toLowerCase();\n        const effectMode = [\"random\", \"spread\", \"compact\"].includes(requestedEffectMode) ? requestedEffectMode : null;\n        const requestedEffectAmount = Number(params?.effectAmount);\n        if (![3, 4, 5, 6, 7, 8].includes(componentId)) throw new Error(\"Missing componentId\");\n\n        const globals = getGlobals();\n        const teamIds = globals?.isCreateATeam ? [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 32] : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n        const effectOnEachteam = {};\n        const capsByPart = {\n            3: 7.5,\n            4: 4,\n            5: 4,\n            6: 4,\n            7: 7,\n            8: 5\n        };\n        const cap = requestedEffectAmount > 0 ? requestedEffectAmount : (capsByPart[componentId] || 5);\n        const modeRoll = Math.random();\n        const resolvedEffectMode = effectMode || (modeRoll < 0.30 ? \"random\" : modeRoll < 0.40 ? \"compact\" : \"spread\");\n        const clamp = (v, min, max) => Math.max(min, Math.min(max, v));\n\n        if (resolvedEffectMode === \"random\") {\n            for (const teamId of teamIds) {\n                effectOnEachteam[teamId] = {\n                    performanceGainLoss: ((Math.random() * 2 * cap) - cap).toFixed(2),\n                    teamName: combined_dict[teamId] || `Team ${teamId}`,\n                    teamId\n                };\n            }\n        } else {\n            const performance = getPerformanceAllTeams(date, null, globals?.isCreateATeam);\n            const championship = queryDB(\n                `SELECT TeamID, Points\n                 FROM Races_TeamStandings\n                 WHERE SeasonID = ? AND RaceFormula = 1`,\n                [seasonYear],\n                'allRows'\n            );\n            const constructorsPoints = {};\n            for (const row of championship) {\n                constructorsPoints[Number(row[0])] = Number(row[1]) || 0;\n            }\n\n            const vals = teamIds.map(id => Number(performance?.[id] || 0));\n            const mean = vals.length ? vals.reduce((a, b) => a + b, 0) / vals.length : 0;\n            const maxAbs = Math.max(...vals.map(v => Math.abs(v - mean)), 1);\n            const maxPts = Math.max(...teamIds.map(id => constructorsPoints[id] || 0), 1);\n            const effectiveCap = !effectMode && resolvedEffectMode === \"spread\" ? (cap * 1.45) : cap;\n            const direction = resolvedEffectMode === \"compact\" ? -1 : 1;\n            const rawEffects = teamIds.map((teamId) => {\n                const normalizedPerformance = (Number(performance?.[teamId] || mean) - mean) / maxAbs;\n                const normalizedPoints = ((constructorsPoints[teamId] || 0) / maxPts) - 0.5;\n                let effect = (normalizedPerformance * 0.8 + normalizedPoints * 0.2) * effectiveCap * direction;\n                effect += (Math.random() * 0.3) - 0.15;\n                return { teamId, effect };\n            });\n            const averageEffect = rawEffects.length ? rawEffects.reduce((sum, item) => sum + item.effect, 0) / rawEffects.length : 0;\n\n            for (const { teamId, effect } of rawEffects) {\n                effectOnEachteam[teamId] = {\n                    performanceGainLoss: clamp(effect - averageEffect, -effectiveCap, effectiveCap).toFixed(2),\n                    teamName: combined_dict[teamId] || `Team ${teamId}`,\n                    teamId\n                };\n            }\n        }\n\n        data = {\n            component: String(part_full_names[componentId] || \"Unknown component\").toLowerCase(),\n            componentId,\n            effectOnEachteam,\n            effectMode: resolvedEffectMode,\n            effectAmount: cap,\n            month: currentMonth,\n            reason,\n            season: seasonYear\n        };\n\n        if (!finalTitle) {\n            finalTitle = renderTurningPointTitleTemplate(data, 100, \"original\", selectedTemplateIndex)\n                || generateTurningPointTitle(data, 100, \"original\");\n        }\n\n        image = getImagePath(null, componentId, \"technical\");\n    }\n    else if (type === \"turning_point_transfer\") {\n        const teamId = Number(params?.teamId);\n        const driverOutId = Number(params?.driverOutId);\n        const driverInId = Number(params?.driverInId);\n        const reserveDriverId = params?.reserveDriverId != null ? Number(params.reserveDriverId) : null;\n        if (!teamId || teamId <= 0) throw new Error(\"Missing teamId\");\n        if (!driverOutId || driverOutId <= 0) throw new Error(\"Missing driverOutId\");\n        if (!driverInId || driverInId <= 0) throw new Error(\"Missing driverInId\");\n        assertOfficialF1DriverForCustomNews(driverOutId, \"Driver out\");\n        assertActiveDriverForCustomNews(driverInId, \"Driver in\");\n        if (reserveDriverId > 0) assertActiveDriverForCustomNews(reserveDriverId, \"Substitute driver\");\n\n        const selectedTeamDriverIds = new Set(getOfficialF1DriverIdsForCustomNews(teamId));\n        if (!selectedTeamDriverIds.has(driverOutId)) {\n            throw new Error(\"Driver out must belong to the selected team\");\n        }\n        if (selectedTeamDriverIds.has(driverInId)) {\n            throw new Error(\"Driver in must come from outside the selected team\");\n        }\n        const driverInHasOfficialSeat = isOfficialF1DriverForCustomNews(driverInId);\n        if (!driverInHasOfficialSeat && reserveDriverId > 0) {\n            throw new Error(\"A substitute driver is only allowed when driver in comes from an official F1 seat\");\n        }\n        if (reserveDriverId > 0) {\n            if (isOfficialF1DriverForCustomNews(reserveDriverId)) {\n                throw new Error(\"Substitute driver cannot come from another official F1 seat\");\n            }\n            if (selectedTeamDriverIds.has(reserveDriverId)) {\n                throw new Error(\"Substitute driver must come from outside the selected team\");\n            }\n        }\n\n        const driverOut = getDriverAndTeamForCustomNews(driverOutId);\n        const driverIn = getDriverAndTeamForCustomNews(driverInId);\n        const reserveDriver = reserveDriverId > 0 ? getDriverAndTeamForCustomNews(reserveDriverId) : null;\n\n        data = {\n            team: combined_dict[teamId] || `Team ${teamId}`,\n            teamId,\n            driver_out: { id: driverOut.driverId, name: driverOut.name, teamId },\n            driver_in: { id: driverIn.driverId, name: driverIn.name, teamId: driverIn.teamId || null },\n            driver_substitute: reserveDriver ? { id: reserveDriver.driverId, name: reserveDriver.name, teamId: reserveDriver.teamId || null } : null,\n            month: currentMonth,\n            season: seasonYear\n        };\n\n        if (!finalTitle) {\n            finalTitle = renderTurningPointTitleTemplate(data, 101, \"original\", selectedTemplateIndex)\n                || generateTurningPointTitle(data, 101, \"original\");\n        }\n\n        image = getImagePath(null, driverOut.driverId, \"transfer\");\n    }\n    else if (type === \"turning_point_investment\") {\n        const teamId = Number(params?.teamId);\n        const country = String(params?.country || \"\").trim();\n        const investmentAmount = Number(params?.investmentAmount);\n        const investmentShare = Number(params?.investmentShare);\n        if (!teamId || teamId <= 0) throw new Error(\"Missing teamId\");\n        if (!country) throw new Error(\"Missing country\");\n        if (!investmentAmount || investmentAmount <= 0) throw new Error(\"Missing investmentAmount\");\n        if (!investmentShare || investmentShare <= 0) throw new Error(\"Missing investmentShare\");\n\n        data = {\n            country,\n            teamId,\n            teamName: combined_dict[teamId] || `Team ${teamId}`,\n            investmentAmount,\n            investmentShare,\n            season: seasonYear,\n            month: currentMonth,\n        };\n\n        if (!finalTitle) {\n            finalTitle = renderTurningPointTitleTemplate(data, 102, \"original\", selectedTemplateIndex)\n                || generateTurningPointTitle(data, 102, \"original\");\n        }\n\n        image = getImagePath(null, country.slice(0, 3).toLowerCase(), \"investment\");\n    }\n    else if (type === \"turning_point_dsq\") {\n        const raceId = Number(params?.raceId);\n        const teamId = Number(params?.teamId);\n        const component = String(params?.component || \"\").trim();\n        if (!raceId || raceId <= 0) throw new Error(\"Missing raceId\");\n        if (!teamId || teamId <= 0) throw new Error(\"Missing teamId\");\n        if (!component) throw new Error(\"Missing component\");\n        assertCompletedRaceForCustomNews(raceId);\n\n        const driversInRace = queryDB(\n            `SELECT bas.FirstName, bas.LastName, res.TeamID, res.Points, bas.StaffID, res.FinishingPos\n             FROM Races_Results res\n             JOIN Staff_BasicData bas ON res.DriverID = bas.StaffID\n             WHERE res.RaceID = ? AND res.TeamID = ?`,\n            [raceId, teamId],\n            'allRows'\n        );\n        if (!driversInRace.length) throw new Error(\"No drivers found for that team in the selected race\");\n\n        const formatRaceDriver = (row) => {\n            const [nameFormatted] = formatNamesSimple(row);\n            return {\n                name: news_insert_space(nameFormatted),\n                points: Number(row[3]) || 0,\n                position: Number(row[5]) || 0,\n                driverId: Number(row[4]) || 0\n            };\n        };\n\n        const raceInfo = getCircuitInfo(raceId);\n        data = {\n            team: combined_dict[teamId] || `Team ${teamId}`,\n            adjective: raceInfo?.adjective || \"\",\n            circuit: raceInfo?.circuit || \"\",\n            country: raceInfo?.country || \"\",\n            race_id: raceId,\n            component,\n            teamId,\n            currentSeason: seasonYear,\n            driver_1: formatRaceDriver(driversInRace[0]),\n            driver_2: driversInRace[1] ? formatRaceDriver(driversInRace[1]) : formatRaceDriver(driversInRace[0])\n        };\n\n        if (!finalTitle) {\n            finalTitle = renderTurningPointTitleTemplate(data, 103, \"original\", selectedTemplateIndex)\n                || generateTurningPointTitle(data, 103, \"original\");\n        }\n\n        image = getImagePath(null, null, \"dsq\");\n        if (dateFromIso == null) {\n            const raceDay = queryDB(`SELECT Day FROM Races WHERE RaceID = ?`, [raceId], 'singleValue');\n            date = Number(raceDay) + 2;\n        }\n    }\n    else if (type === \"turning_point_race_substitution\") {\n        const raceId = Number(params?.raceId);\n        const newRaceTrackId = Number(params?.newRaceTrackId);\n        const reason = String(params?.reason || \"\").trim() || \"calendar restructuring\";\n        if (!raceId || raceId <= 0) throw new Error(\"Missing raceId\");\n        if (!newRaceTrackId || newRaceTrackId <= 0) throw new Error(\"Missing newRaceTrackId\");\n\n        const raceRow = queryDB(`SELECT TrackID, Day FROM Races WHERE RaceID = ?`, [raceId], 'singleRow');\n        if (!raceRow) throw new Error(\"Selected race was not found\");\n\n        const originalTrackId = Number(raceRow[0]);\n        data = {\n            originalCountry: countries_data[races_names[originalTrackId]]?.adjective || \"Unknown Country\",\n            substituteCountry: countries_data[races_names[newRaceTrackId]]?.country || \"Unknown Country\",\n            reason,\n            originalTrackId,\n            newRaceTrackId,\n            newRaceDay: Number(raceRow[1]),\n            raceId,\n            month: currentMonth,\n            season: seasonYear,\n            typeOfSubstitution: originalTrackId === newRaceTrackId ? \"same_track\" : \"different_race\"\n        };\n\n        if (!finalTitle) {\n            finalTitle = renderTurningPointTitleTemplate(data, 105, \"original\", selectedTemplateIndex)\n                || generateTurningPointTitle(data, 105, \"original\");\n        }\n\n        image = getImagePath(null, String(races_names[originalTrackId] || \"\").toLowerCase(), \"race_substitution\");\n    }\n    else if (type === \"turning_point_injury\") {\n        const driverId = Number(params?.driverId);\n        const reserveDriverId = params?.reserveDriverId != null ? Number(params.reserveDriverId) : null;\n        const conditionText = String(params?.condition || \"\").trim() || \"an illness\";\n        const reason = String(params?.reason || \"\").trim() || \"a medical issue\";\n        const racesAffectedCount = Math.max(1, Number(params?.racesAffected) || 1);\n        if (!driverId || driverId <= 0) throw new Error(\"Missing driverId\");\n        assertOfficialF1DriverForCustomNews(driverId, \"Affected driver\");\n        if (reserveDriverId > 0) {\n            assertActiveDriverForCustomNews(reserveDriverId, \"Reserve driver\");\n            if (isOfficialF1DriverForCustomNews(reserveDriverId)) {\n                throw new Error(\"Reserve driver cannot come from another official F1 seat\");\n            }\n        }\n\n        const driver = getDriverAndTeamForCustomNews(driverId);\n        const reserveDriver = reserveDriverId > 0 ? getDriverAndTeamForCustomNews(reserveDriverId) : null;\n        const racesAffected = queryDB(\n            `SELECT RaceID, Day, TrackID\n             FROM Races\n             WHERE SeasonID = ? AND Day >= ?\n             ORDER BY Day ASC\n             LIMIT ?`,\n            [seasonYear, date, racesAffectedCount],\n            'allRows'\n        );\n\n        const lastRaceDay = racesAffected.length ? Number(racesAffected[racesAffected.length - 1][1]) : date;\n        const expectedReturnRace = queryDB(\n            `SELECT RaceID, TrackID\n             FROM Races\n             WHERE SeasonID = ? AND Day > ?\n             ORDER BY Day ASC\n             LIMIT 1`,\n            [seasonYear, lastRaceDay],\n            'singleRow'\n        );\n\n        data = {\n            team: driver.teamName,\n            teamId: driver.teamId,\n            driver_affected: { id: driver.driverId, name: driver.name, teamId: driver.teamId },\n            condition: {\n                type: \"custom\",\n                condition: conditionText,\n                reason,\n                start_date: date,\n                end_date: lastRaceDay,\n                next_race_min_enforced: true,\n                races_affected: racesAffected.map(([affectedRaceId, affectedDay, affectedTrackId]) => ({\n                    raceId: Number(affectedRaceId),\n                    country: countries_data[races_names[Number(affectedTrackId)]]?.country,\n                    day: Number(affectedDay)\n                })),\n                expectedReturnRaceId: expectedReturnRace ? Number(expectedReturnRace[0]) : null,\n                expectedReturnCountry: expectedReturnRace ? (countries_data[races_names[Number(expectedReturnRace[1])]]?.country || \"\") : \"\"\n            },\n            reserve_driver: reserveDriver ? {\n                id: reserveDriver.driverId,\n                name: reserveDriver.name,\n                teamId: reserveDriver.teamId || null,\n                isFreeAgent: !reserveDriver.teamId,\n                futureTeamId: driver.teamId\n            } : null,\n            month: currentMonth,\n            season: seasonYear\n        };\n\n        if (!finalTitle) {\n            finalTitle = renderTurningPointTitleTemplate(data, 106, \"original\", selectedTemplateIndex)\n                || generateTurningPointTitle(data, 106, \"original\");\n        }\n\n        image = getImagePath(null, driver.driverId, \"injury\");\n    }\n    else if (type === \"turning_point_engine_regulation\") {\n        const changeType = String(params?.changeType || \"minor\").trim() || \"minor\";\n        const mainChangeArea = String(params?.changeArea || \"\").trim() || (changeType === \"major\" ? \"hybrid system architecture\" : \"fuel flow monitoring\");\n        const requestedEngineChanges = Array.isArray(params?.engineChanges) ? params.engineChanges : [];\n        const useManualEngineChanges = !!params?.manualMode;\n        const manualChangesByEngine = {};\n        const engines = queryDB(`SELECT * FROM Custom_Engines_list`, [], \"allRows\");\n        const engineStats = queryDB(`SELECT * FROM Custom_Engines_stats`, [], \"allRows\");\n        const variability = changeType === \"major\" ? 0.28 : 0.13;\n        const engineData = {};\n        const engineBias = {};\n        const engineImpact = {};\n        const winnerNames = [];\n        const loserNames = [];\n        const neutralNames = [];\n        const currentStats = {};\n\n        for (const row of engineStats) {\n            const engineId = String(row[0]);\n            const designId = Number(row[1]);\n            const partStat = Number(row[2]);\n            const unitValue = Number(row[3]);\n            if (!currentStats[engineId]) currentStats[engineId] = {};\n            const engineNum = Number(engineId);\n            if (partStat === 15 && designId === engineNum + 1) currentStats[engineId][18] = unitValue;\n            else if (partStat === 15 && designId === engineNum + 2) currentStats[engineId][19] = unitValue;\n            else currentStats[engineId][partStat] = unitValue;\n        }\n\n        for (const change of requestedEngineChanges) {\n            const engineId = String(Number(change?.engineId));\n            if (!engineId || engineId === \"NaN\") continue;\n            const requestedValue = Number(change?.value);\n            manualChangesByEngine[engineId] = Number.isFinite(requestedValue) ? requestedValue : 0;\n        }\n\n        for (const [engineId, stats] of Object.entries(currentStats)) {\n            const hasManualChange = useManualEngineChanges && Object.prototype.hasOwnProperty.call(manualChangesByEngine, engineId);\n            const requestedPct = hasManualChange ? Number(manualChangesByEngine[engineId]) : null;\n            const biasRoll = Math.random();\n            const bias = hasManualChange\n                ? (requestedPct > 0 ? 1 : requestedPct < 0 ? -1 : 0)\n                : (changeType === \"major\" ? (biasRoll < 0.45 ? 1 : biasRoll < 0.90 ? -1 : 0) : (biasRoll < 0.35 ? 1 : biasRoll < 0.70 ? -1 : 0));\n            engineBias[engineId] = bias;\n            let sumPct = 0;\n            let count = 0;\n            engineData[engineId] = {};\n\n            for (const [statId, currentValue] of Object.entries(stats)) {\n                if (Number(statId) === 11 || Number(statId) === 12) {\n                    engineData[engineId][statId] = Number(currentValue);\n                    continue;\n                }\n                const delta = hasManualChange\n                    ? (1 + (clampValue(requestedPct + ((Math.random() * 2.4) - 1.2), -40, 40) / 100))\n                    : bias === 1\n                        ? (1 + (Math.random() * variability))\n                        : bias === -1\n                            ? (1 - (Math.random() * variability))\n                            : (1 + ((Math.random() * 2 * variability) - variability));\n                const next = Math.max(0, Math.min(100, Math.round(Number(currentValue) * delta)));\n                engineData[engineId][statId] = next;\n                if (Number(currentValue) > 0) {\n                    sumPct += (next - Number(currentValue)) / Number(currentValue);\n                    count += 1;\n                }\n            }\n\n            engineImpact[engineId] = count ? (sumPct / count) : 0;\n            const engineName = engines.find(row => String(row[0]) === String(engineId))?.[1] || `Engine ${engineId}`;\n            if (bias === 1) winnerNames.push(engineName);\n            else if (bias === -1) loserNames.push(engineName);\n            else neutralNames.push(engineName);\n        }\n\n        data = {\n            changeType,\n            mainChangeArea,\n            variability,\n            manualMode: useManualEngineChanges,\n            engineData,\n            engineBias,\n            engineImpact,\n            requestedEngineChanges: useManualEngineChanges ? manualChangesByEngine : {},\n            winners: winnerNames,\n            losers: loserNames,\n            neutrals: neutralNames,\n            winnerNames,\n            loserNames,\n            neutralNames,\n            season: seasonYear\n        };\n\n        if (!finalTitle) {\n            finalTitle = renderTurningPointTitleTemplate(data, 107, \"original\", selectedTemplateIndex)\n                || generateTurningPointTitle(data, 107, \"original\");\n        }\n\n        image = getImagePath(null, \"engine\", \"engine\");\n    }\n    else if (type === \"turning_point_young_drivers\") {\n        const ids = Array.isArray(params?.prospectDriverIds) ? params.prospectDriverIds.map(id => Number(id)).filter(id => id > 0) : [];\n        if (ids.length < 2) throw new Error(\"Pick at least two prospects\");\n        ids.forEach((driverId, index) => assertOfficialF1DriverForCustomNews(driverId, `Prospect ${index + 1}`));\n\n        const prospects = ids.map(driverId => {\n            const driver = getDriverAndTeamForCustomNews(driverId);\n            return {\n                driverId: driver.driverId,\n                name: driver.name,\n                age: null,\n                position: null,\n                points: null,\n                teamId: driver.teamId || null,\n                team: driver.teamName || \"\",\n                series: driver.teamId ? \"Formula 1\" : \"Junior formulas\",\n                overall: Number(getDriverOverall(driver.driverId) || 0)\n            };\n        });\n\n        data = {\n            season: seasonYear,\n            driver1: prospects[0]?.name || \"\",\n            driver2: prospects[1]?.name || \"\",\n            driver3: prospects[2]?.name || \"\",\n            f2Prospects: [],\n            f3Prospects: [],\n            freeAgentProspects: [],\n            prospects\n        };\n\n        if (!finalTitle) {\n            finalTitle = renderTurningPointTitleTemplate(data, 108, \"original\", selectedTemplateIndex)\n                || generateTurningPointTitle(data, 108, \"original\");\n        }\n\n        image = getImagePath(null, null, \"young\");\n    }\n    else if (type === \"turning_point_aduo\") {\n        const quarter = Math.max(1, Math.min(3, Number(params?.quarter) || 1));\n        const quarterString = quarter === 1 ? \"1st\" : quarter === 2 ? \"2nd\" : \"3rd\";\n        const useManualEstimate = !!params?.manualMode;\n        const requestedEngineChanges = Array.isArray(params?.engineChanges) ? params.engineChanges : [];\n        const requestedEstimateByEngine = {};\n        const selectedEngineIds = new Set();\n        const enginesData = fetchEngines()?.[0] || [];\n        const getPower = (engineRow) => {\n            const stats = engineRow?.[1] || {};\n            const raw = stats[10] !== undefined ? stats[10] : stats[\"10\"];\n            return raw == null ? null : Number(raw);\n        };\n\n        for (const change of requestedEngineChanges) {\n            const engineId = String(Number(change?.engineId));\n            if (!engineId || engineId === \"NaN\") continue;\n            if (change?.enabled) {\n                selectedEngineIds.add(engineId);\n            }\n            const requestedValue = Number(change?.value);\n            requestedEstimateByEngine[engineId] = Number.isFinite(requestedValue) ? requestedValue : 0;\n        }\n\n        if (!selectedEngineIds.size) {\n            throw new Error(\"Select at least one engine for this ADUO period\");\n        }\n\n        let bestEngine = null;\n        let bestPower = -Infinity;\n        for (const engineRow of enginesData) {\n            const power = getPower(engineRow);\n            if (power == null) continue;\n            if (power > bestPower) {\n                bestPower = power;\n                bestEngine = engineRow;\n            }\n        }\n\n        const threshold = bestPower * 0.92;\n        const engineImprovements = enginesData\n            .filter(engineRow => {\n                const engineId = String(engineRow?.[0]);\n                if (!selectedEngineIds.has(engineId)) return false;\n                const power = getPower(engineRow);\n                return power != null;\n            })\n            .map(engineRow => {\n                const stats = engineRow?.[1] || {};\n                const improvements = {};\n                for (const statId of Object.keys(stats)) {\n                    if (useManualEstimate) {\n                        const engineId = String(engineRow[0]);\n                        const requestedEstimate = Object.prototype.hasOwnProperty.call(requestedEstimateByEngine, engineId)\n                            ? Number(requestedEstimateByEngine[engineId])\n                            : 0;\n                        improvements[statId] = Math.round(clampValue(requestedEstimate + ((Math.random() * 2) - 1), -20, 20) * 100) / 100;\n                    } else {\n                        improvements[statId] = Math.round((1 + (Math.random() * 6)) * 100) / 100;\n                    }\n                }\n                return {\n                    engineId: engineRow[0],\n                    name: engineRow[2],\n                    improvements\n                };\n            });\n\n        if (!engineImprovements.length) throw new Error(\"No underperforming manufacturers were found for ADUO\");\n\n        data = {\n            season: seasonYear,\n            quarter,\n            leader: { engineId: bestEngine?.[0], name: bestEngine?.[2], stat10: bestPower },\n            thresholdStat10: threshold,\n            engineImprovements,\n            estimateMode: useManualEstimate ? \"manual\" : \"random\",\n            requestedEngineChanges: useManualEstimate ? requestedEstimateByEngine : {},\n            quarterString,\n            manufacturers: engineImprovements.map(entry => entry.name).join(\", \").replace(/, ([^,]*)$/, \" and $1\")\n        };\n\n        if (!finalTitle) {\n            finalTitle = renderTurningPointTitleTemplate(data, 109, \"original\", selectedTemplateIndex)\n                || generateTurningPointTitle(data, 109, \"original\");\n        }\n\n        image = getImagePath(null, \"engine\", \"engine\");\n    }\n    else if (type === \"custom_new\") {\n        const prompt = String(params?.prompt || \"\").trim();\n        const customImage = String(params?.image || \"\").trim();\n        if (!prompt) throw new Error(\"Missing prompt\");\n        if (!customImage) throw new Error(\"Missing image\");\n        if (!finalTitle) throw new Error(\"Custom articles need a title\");\n\n        data = {\n            prompt,\n            image: customImage,\n            season_year: seasonYear\n        };\n        image = `./assets/images/news/${customImage}`;\n        overlay = null;\n    }\n    else {\n        throw new Error(`Unsupported custom news type: ${type}`);\n    }\n\n    //for testing purposes \n    assertCustomTurningPointPayload(type, data);\n\n    return {\n        id,\n        stableKey,\n        type,\n        title: finalTitle || \"Untitled\",\n        date,\n        image,\n        overlay,\n        data,\n        text: null,\n        turning_point_type: type.startsWith(\"turning_point_\") ? \"original\" : undefined\n    };\n}\n\nfunction randomRemovalOfNames(data) {\n    let paramsWithName = [\"winnerName\", \"pole_driver\", \"driver1\", \"driver2\", \"driver3\", \"driver_name\"];\n    const nestedPaths = [\n        [\"driver_affected\", \"name\"],\n        [\"reserve_driver\", \"name\"],\n        [\"driver_out\", \"name\"],\n        [\"driver_in\", \"name\"],\n        [\"driver_substitute\", \"name\"],\n        [\"reserve\", \"name\"],\n    ];\n\n    // Campos planos\n    paramsWithName.forEach(param => {\n        const v = data[param];\n        if (typeof v === \"string\" && v.trim()) {\n            let out = v.trim();\n            if (Math.random() < 0.5) {\n                out = out.split(/\\s+/).pop();\n            }\n            out = news_insert_space(out);\n            data[param] = out;\n        }\n    });\n\n    // Campos anidados .name\n    nestedPaths.forEach(path => {\n        let obj = data;\n        for (let i = 0; i < path.length - 1; i++) {\n            obj = obj?.[path[i]];\n            if (!obj) return;\n        }\n        const lastKey = path[path.length - 1];\n        const v = obj[lastKey];\n        if (typeof v === \"string\" && v.trim()) {\n            let out = v.trim();\n            if (Math.random() < 0.5) {\n                out = out.split(/\\s+/).pop();\n            }\n            out = (typeof news_insert_space === \"function\" ? news_insert_space(out) : _newsSpace(out));\n            obj[lastKey] = out;\n        }\n    });\n\n    return data;\n}\n\n\nfunction generateTurningPointTitle(data, new_type, turningPointType) {\n    let dataRandomized = randomRemovalOfNames(data);\n    let templateObj = null;\n    templateObj = turningPointsTitleTemplates.find(t => t.new_type === new_type);\n    const paramMap = getParamMap(dataRandomized);\n    let titles = [];\n    if (turningPointType === \"original\") {\n        titles = templateObj.turning_titles;\n    } else if (turningPointType === \"positive\") {\n        titles = templateObj.positive_titles;\n    } else if (turningPointType === \"negative\") {\n        titles = templateObj.negative_titles;\n    }\n\n    const idx = Math.floor(Math.random() * titles.length);\n    const tpl = titles[idx];\n    return tpl.replace(/{{\\s*(\\w+)\\s*}}/g, (_, key) => paramMap[new_type][key] || '');\n}\n\n\nfunction generateTitle(data, new_type) {\n    let dataRandomized = randomRemovalOfNames(data);\n    let templateObj = null;\n    templateObj = newsTitleTemplates.find(t => t.new_type === new_type);\n    let raceInfo = null;\n    if (data.raceId) {\n        raceInfo = getCircuitInfo(data.raceId);\n        data.circuit = raceInfo.circuit;\n        data.country = raceInfo.country;\n        data.adjective = raceInfo.adjective;\n    }\n    const paramMap = getParamMap(dataRandomized);\n\n    const titles = templateObj.titles;\n    const idx = Math.floor(Math.random() * titles.length);\n    const tpl = titles[idx];\n\n    return tpl.replace(/{{\\s*(\\w+)\\s*}}/g, (_, key) => paramMap[new_type][key] || '');\n}\n\nfunction generateF2AndF3ReviewNews(currentMonth, savedNews) {\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], \"singleRow\");\n    const season = daySeason[1];\n    const newsList = [];\n\n    const allRacesDone = queryDB(\n        `SELECT COUNT(*) FROM Races WHERE SeasonID = ? AND State = 2`,\n        [season],\n        \"singleValue\"\n    );\n    const totalRaces = queryDB(\n        `SELECT COUNT(*) FROM Races WHERE SeasonID = ?`,\n        [season],\n        \"singleValue\"\n    );\n\n    // Solo último mes + temporada terminada\n    if (currentMonth < 11 || allRacesDone < totalRaces) {\n        return newsList;\n    }\n\n    const F2Champion = queryDB(\n        `SELECT bas.FirstName, bas.LastName, rds.DriverID, 1\n            FROM Races_DriverStandings rds\n            JOIN Staff_BasicData bas ON rds.DriverID = bas.StaffID\n            WHERE rds.SeasonID = ? AND rds.RaceFormula = 2 AND rds.Position = 1\n            LIMIT 1`,\n        [season],\n        \"singleRow\"\n    );\n    const F3Champion = queryDB(\n        `SELECT bas.FirstName, bas.LastName, rds.DriverID, 1\n            FROM Races_DriverStandings rds\n            JOIN Staff_BasicData bas ON rds.DriverID = bas.StaffID\n            WHERE rds.SeasonID = ? AND rds.RaceFormula = 3 AND rds.Position = 1\n            LIMIT 1`,\n        [season],\n        \"singleRow\"\n    );\n\n    const entry = `feeder_series_review_${season}`;\n    if (savedNews[entry]) {\n        newsList.push({ id: entry, ...savedNews[entry] });\n        return newsList;\n    }\n\n    const [f2Name, f2Id] = formatNamesSimple(F2Champion || [\"Unknown\", \"Driver\", 0]);\n    const [f3Name, f3Id] = formatNamesSimple(F3Champion || [\"Unknown\", \"Driver\", 0]);\n\n    const titleData = {\n        f2_champion: { name: news_insert_space(f2Name), driverId: f2Id },\n        f3_champion: { name: news_insert_space(f3Name), driverId: f3Id },\n        season_year: season\n    };\n\n    const date = new Date(season, currentMonth - 1, Math.floor(Math.random() * 28) + 1);\n    const excelDate = dateToExcel(date);\n    const title = generateTitle({\n        f2_champion: titleData.f2_champion.name,\n        f3_champion: titleData.f3_champion.name,\n        season_year: season\n    }, 20);\n    const image = getImagePath(null, null, \"young\");\n    const newEntry = {\n        id: entry,\n        title,\n        image,\n        data: titleData,\n        date: excelDate,\n        type: \"feeder_series_review\"\n    };\n\n    newsList.push(newEntry);\n    return newsList;\n}\n\nexport function generateFakeTransferNews(monthsDone, savedNews, bigConfirmedTransfersNews) {\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const season = daySeason[1];\n\n    const seasonResults = fetchSeasonResults(season);\n\n    const usedDriverIdsGlobal = new Set();\n\n    Object.entries(savedNews || {}).forEach(([id, news]) => {\n        if (!news || !news.data || !Array.isArray(news.data.drivers)) return;\n        // Solo nos interesa mapear fechas por mes para las fake_transfer_*\n        if (id.startsWith(\"fake_transfer_\")) {\n            news.data.drivers.forEach(driver => {\n                if (driver.driverId) {\n                    usedDriverIdsGlobal.add(driver.driverId);\n                }\n            });\n\n            //if it is only fake_transfer_m without slot, transform it into fake_transfer_m_1\n            const parts = id.split(\"_\");\n            if (parts.length === 3) {\n                const newId = `${id}_1`;\n                savedNews[newId] = news;\n                delete savedNews[id];\n            }\n        }\n\n        if (id.startsWith(\"big_transfer_\") || id.startsWith(\"massive_signing_\") || id.startsWith(\"massive_exit_\")) {\n            let id = news.data.driverId;\n            if (id) {\n                usedDriverIdsGlobal.add(id);\n            }\n        }\n    });\n\n    //also put driverids from bigConfirmedTransfersNews into usedDriverIdsGlobal\n    bigConfirmedTransfersNews.forEach(news => {\n        let id = news.data.driverId;\n        if (id) {\n            usedDriverIdsGlobal.add(id);\n        }\n    });\n\n    console.log(\"USED DRIVERS FOR FAKE TRANSFERS:\", usedDriverIdsGlobal);\n\n    let newsList = [];\n\n    monthsDone.forEach(m => {\n        const drivers = queryDB(\n            `SELECT bas.FirstName, bas.LastName, dri.StaffID, con.TeamID\n             FROM Staff_BasicData bas\n             JOIN Staff_DriverData dri\n               ON bas.StaffID = dri.StaffID\n             JOIN Staff_Contracts con\n               ON bas.StaffID = con.StaffID\n             WHERE con.ContractType = 0\n               AND con.PosInTeam <= 2\n               AND con.TeamID IN (1,2,3,4,5,6,7,8,9,10,32)`, [],\n            'allRows'\n        );\n\n        let driversWithOverall = [];\n        drivers.forEach(d => {\n            const overall = getDriverOverall(d[2]);\n            const name = formatNamesSimple(d);\n            const teamId = d[3];\n            const teamName = combined_dict[teamId] || \"Unknown Team\";\n\n            let driver = {\n                name: name[0],\n                driverId: name[1],\n                team: teamName,\n                teamId: teamId,\n                overall: overall\n            };\n            if (overall >= 88 && !usedDriverIdsGlobal.has(driver.driverId)) {\n                driversWithOverall.push(driver);\n            }\n        });\n\n        //sort by overall descending\n        driversWithOverall.sort((a, b) => b.overall - a.overall);\n\n        const pointsSchema = fetchPointsRegulations();\n        const racesDone = queryDB(\n            `SELECT COUNT(*) FROM Races WHERE SeasonID = ? AND State = 2`, [season],\n            'singleValue'\n        );\n        const mostPointsPerRace = pointsSchema.twoBiggestPoints[0];\n        const maxPointsPossible = mostPointsPerRace * racesDone;\n        const championshipLeaderPoints = queryDB(\n            `SELECT DriverID, Points\n             FROM Races_DriverStandings\n             WHERE SeasonID = ?\n               AND Position = 1\n               AND RaceFormula = 1`, [season],\n            'singleRow'\n        );\n\n        const leaderPoints = Number(championshipLeaderPoints?.[1] || 0);\n        const thresholdGap = maxPointsPossible / 3;\n\n        // Para evitar repetir piloto en el mismo mes (opcional pero lógico)\n\n        // Si ya hay noticias guardadas para este mes, marcar sus drivers como usados\n        for (let slot = 1; slot <= 2; slot++) {\n            const existingId = `fake_transfer_${m}_${slot}`;\n            const saved = savedNews[existingId];\n            if (saved && saved.data && saved.data.drivers && saved.data.drivers[0]) {\n                const savedDriverId = saved.data.drivers[0].driverId;\n                if (savedDriverId) usedDriverIdsGlobal.add(savedDriverId);\n            }\n        }\n\n        for (let slot = 1; slot <= 2; slot++) {\n            const entryId = `fake_transfer_${m}_${slot}`;\n\n            if (savedNews[entryId]) {\n                newsList.push({ id: entryId, ...savedNews[entryId] });\n                continue;\n            }\n\n            const day = Math.floor(Math.random() * 30) + 1;\n            const date = new Date(season, m - 1, day);\n            const excelDate = dateToExcel(date);\n            const latestRaceDoneUpToDate = queryDB(`SELECT MAX(RaceID) FROM Races WHERE SeasonID = ? AND State = 2 AND Day <= ?`, [season, excelDate], 'singleValue');\n\n            const { driverStandings, teamStandings, driversResults, racesNames } = rebuildStandingsUntil(seasonResults, latestRaceDoneUpToDate);\n            const championshipLeader = driverStandings.find(ds => ds.position === 1);\n            const leaderPoints = Number(championshipLeader?.points || 0);\n\n            if (savedNews[entryId]) {\n                newsList.push({ id: entryId, ...savedNews[entryId] });\n                continue;\n            }\n\n            let randomDriver = null;\n            let randomTeamId = null;\n\n            driversWithOverall.forEach(driver => {\n                if (usedDriverIdsGlobal.has(driver.driverId)) {\n                    return;\n                }\n\n                const driverPoints = driversResults.find(dr => dr.driverId === driver.driverId)?.points;\n\n                const points = Number(driverPoints || 0);\n                const gap = leaderPoints - points;\n\n                if (gap >= thresholdGap) {\n                    if (!randomDriver || driver.overall > randomDriver.overall) {\n                        randomDriver = {\n                            name: driver.name,\n                            driverId: driver.driverId,\n                            teamId: driver.teamId\n                        };\n                        randomTeamId = driver.teamId;\n                        usedDriverIdsGlobal.add(driver.driverId);\n                    }\n                }\n            });\n\n            if (!randomDriver) {\n                const top10DriversExpiringContracts = queryDB(\n                    `SELECT bas.FirstName, bas.LastName, dri.StaffID, con.TeamID\n                     FROM Staff_BasicData bas\n                     JOIN Staff_DriverData dri\n                       ON bas.StaffID = dri.StaffID\n                     JOIN Staff_Contracts con\n                       ON bas.StaffID = con.StaffID\n                     JOIN Races_DriverStandings sta\n                       ON dri.StaffID = sta.DriverID\n                     WHERE con.ContractType = 0\n                       AND con.PosInTeam    <= 2\n                       AND con.EndSeason     = ?\n                       AND sta.Position     <= 10\n                       AND sta.RaceFormula   = 1\n                       AND sta.SeasonID      = ?\n                       AND NOT EXISTS (\n                           SELECT 1\n                           FROM Staff_Contracts c3\n                           JOIN Staff_DriverData d3\n                             ON d3.StaffID = c3.StaffID\n                           WHERE c3.TeamID      = con.TeamID\n                             AND c3.PosInTeam   = con.PosInTeam\n                             AND c3.ContractType = 3\n                       );`, [season, season],\n                    'allRows'\n                );\n\n                if (top10DriversExpiringContracts.length) {\n                    let picked = randomPick(top10DriversExpiringContracts);\n                    //if picked is already used try to pick another one up to 5 times\n                    let attempts = 0;\n                    while (usedDriverIdsGlobal.has(picked[2]) && attempts < 5) {\n                        picked = randomPick(top10DriversExpiringContracts);\n                        attempts++;\n                    }\n                    if (usedDriverIdsGlobal.has(picked[2])) {\n                        picked = randomPick(drivers)\n                    }\n\n\n                    const [nameFormatted, driverId] = formatNamesSimple(picked);\n                    randomDriver = {\n                        name: nameFormatted,\n                        driverId: driverId,\n                        teamId: picked[3]\n                    };\n                    usedDriverIdsGlobal.add(randomDriver.driverId);\n                    randomTeamId = picked[3];\n                }\n            }\n\n            if (randomDriver) {\n                usedDriverIdsGlobal.add(randomDriver.driverId);\n\n                const nameFormatted = randomDriver.name;\n                const driverId = randomDriver.driverId;\n\n                const newData = {\n                    drivers: [{\n                        name: news_insert_space(nameFormatted),\n                        driverId,\n                        team: combined_dict[randomTeamId],\n                        teamId: randomTeamId,\n                        previouslyDrivenTeams: getPreviouslyDrivenTeams(driverId),\n                    }],\n                };\n\n                const titleData = {\n                    driver1: news_insert_space(nameFormatted),\n                    team1: combined_dict[randomTeamId],\n                };\n\n                const title = generateTitle(titleData, 7);\n                const image = getImagePath(randomTeamId, driverId, \"transfer\");\n\n                newsList.push({\n                    id: entryId,\n                    type: \"fake_transfer\",\n                    title,\n                    date: excelDate,\n                    image: image,\n                    overlay: \"fake-transfer-overlay\",\n                    data: newData,\n                    text: null\n                });\n            }\n        }\n    });\n\n    return newsList;\n}\n\n\nconst randomPick = arr => arr[Math.floor(Math.random() * arr.length)];\n\nexport function generateBigConfirmedTransferNews(savedNews = {}, currentMonth) {\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const season = daySeason[1];\n    const month = currentMonth > 9 ? 9 : currentMonth;\n\n    const drivers = queryDB(\n        `SELECT bas.FirstName, bas.LastName, dri.StaffID, con.TeamID\n             FROM Staff_BasicData bas\n             JOIN Staff_DriverData dri\n               ON bas.StaffID = dri.StaffID\n             JOIN Staff_Contracts con\n               ON bas.StaffID = con.StaffID\n             WHERE con.ContractType = 0\n               AND con.PosInTeam <= 2`, [],\n        'allRows'\n    );\n\n    const driversWithHighOverall = [];\n    drivers.forEach(d => {\n        const overall = getDriverOverall(d[2]);\n        const name = formatNamesSimple(d);\n        const teamId = d[3];\n        const teamName = combined_dict[teamId] || \"Unknown Team\";\n        let driver = {\n            name: name[0],\n            driverId: name[1],\n            team: teamName,\n            teamId: teamId,\n            overall: overall\n        };\n        if (overall >= 88) {\n            driversWithHighOverall.push(driver);\n        }\n    });\n\n    let newsList = [];\n\n    //iterate through each list\n    driversWithHighOverall.forEach(driver => {\n        const contract = queryDB(`SELECT TeamID, Salary, EndSeason FROM Staff_Contracts WHERE StaffID = ? AND ContractType = 3 AND TeamID != ?`, [driver.driverId, driver.teamId], 'singleRow');\n        if (!contract) return;\n        const futureTeamId = contract[0]\n\n\n        let titleData = {\n            driver1: driver.name,\n            driverId: driver.driverId,\n            team1: driver.team,\n            team2Id: futureTeamId,\n            salary: contract[1],\n            endSeason: contract[2],\n            previouslyDrivenTeams: getPreviouslyDrivenTeams(driver.driverId),\n            team2: combined_dict[futureTeamId],\n            season_year: season\n        }\n\n        if (driver.overall < 90) {\n            const entryId = `new_big_transfer_${driver.driverId}`;\n            if (savedNews[entryId]) {\n                newsList.push({ id: entryId, ...savedNews[entryId] });\n                return;\n            }\n\n            const title = generateTitle(titleData, 6);\n            const image = getImagePath(futureTeamId, driver.driverId, \"transfer\");\n            const day = Math.floor(Math.random() * 30) + 1;\n            const date = new Date(season, month - 1, day);\n            const excelDate = dateToExcel(date);\n\n            titleData.date = excelDate;\n\n            newsList.push({\n                id: entryId,\n                type: \"big_transfer\",\n                title,\n                date: excelDate,\n                image,\n                overlay: \"massive-signing-overlay\",\n                data: titleData,\n                text: null\n            });\n        }\n        else {\n            const entryId1 = `massive_exit_${driver.driverId}`;\n            if (savedNews[entryId1]) {\n                newsList.push({ id: entryId1, ...savedNews[entryId1] });\n                return;\n            }\n\n            const title1 = generateTitle(titleData, 17);\n            const image1 = getImagePath(driver.teamId, driver.driverId, \"transfer\");\n            const day1 = Math.floor(Math.random() * 30) + 1;\n            const date1 = new Date(season, month - 1, day1);\n\n            const excelDate1 = dateToExcel(date1);\n            titleData.date = excelDate1;\n            titleData.team2Id = driver.teamId;\n            newsList.push({\n                id: entryId1,\n                type: \"massive_exit\",\n                title: title1,\n                date: excelDate1,\n                image: image1,\n                overlay: \"massive-exit-overlay\",\n                data: titleData,\n                text: null\n            });\n\n            const entryId2 = `massive_signing_${driver.driverId}`;\n            if (savedNews[entryId2]) {\n                newsList.push({ id: entryId2, ...savedNews[entryId2] });\n                return;\n            }\n\n            const title2 = generateTitle(titleData, 18);\n            const image2 = getImagePath(futureTeamId, driver.driverId, \"transfer\");\n            const excelDate2 = excelDate1 + 1;\n            titleData.date = excelDate2;\n            titleData.team2Id = futureTeamId;\n            newsList.push({\n                id: entryId2,\n                type: \"massive_signing\",\n                title: title2,\n                date: excelDate2,\n                image: image2,\n                overlay: \"massive-signing-overlay\",\n                data: titleData,\n                text: null\n            });\n        }\n    });\n\n\n    return newsList;\n}\n\nfunction buildGridLineupsData(season) {\n    const globals = getGlobals();\n    const teamIds = globals.isCreateATeam\n        ? [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 32]\n        : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n    const currentTeamFilterSql = globals.isCreateATeam\n        ? `(TeamID BETWEEN 1 AND 10 OR TeamID = 32)`\n        : `(TeamID BETWEEN 1 AND 10)`;\n    const currentContractsRows = queryDB(\n        `SELECT StaffID, TeamID\n            FROM Staff_Contracts\n            WHERE ContractType = 0\n              AND PosInTeam <= 2\n              AND EndSeason >= ?\n              AND ${currentTeamFilterSql}`,\n        [season],\n        'allRows'\n    ) || [];\n    const currentTeamByDriver = new Map();\n    currentContractsRows.forEach((row) => {\n        const driverId = Number(row[0]);\n        const teamId = Number(row[1]);\n        if (!Number.isNaN(driverId) && !Number.isNaN(teamId)) {\n            currentTeamByDriver.set(driverId, teamId);\n        }\n    });\n\n    const teamsDict = {};\n\n    teamIds.forEach(teamId => {\n        const teamName = combined_dict[teamId] || \"Unknown Team\";\n        const teamInfo = {\n            name: teamName,\n            teamId,\n            driversNextSeason: [],\n            driversThisSeason: []\n        };\n\n        const driversThisSeason = queryDB(\n            `SELECT bas.FirstName, bas.LastName, dri.StaffID, con.TeamID, con.ContractType, con.PosInTeam, num.Number\n                FROM Staff_BasicData bas\n                JOIN Staff_DriverData dri\n                  ON bas.StaffID = dri.StaffID\n                JOIN Staff_Contracts con\n                    ON bas.StaffID = con.StaffID\n                LEFT JOIN Staff_DriverNumbers num\n                    ON num.CurrentHolder = bas.StaffID\n                WHERE con.TeamID = ?\n                  AND con.PosInTeam <= 2\n                  AND con.ContractType = 0\n                  AND con.EndSeason >= ?\n                ORDER BY con.PosInTeam, con.ContractType, dri.StaffID`, [teamId, season],\n            'allRows'\n        ) || [];\n\n        const driversNextSeason = queryDB(\n            `SELECT bas.FirstName, bas.LastName, dri.StaffID, con.TeamID, con.ContractType, con.PosInTeam, num.Number\n                FROM Staff_BasicData bas\n                JOIN Staff_DriverData dri\n                  ON bas.StaffID = dri.StaffID\n                JOIN Staff_Contracts con\n                    ON bas.StaffID = con.StaffID\n                LEFT JOIN Staff_DriverNumbers num\n                    ON num.CurrentHolder = bas.StaffID\n                WHERE con.TeamID = ?\n                  AND con.PosInTeam <= 2\n                  AND con.ContractType IN (0,3)\n                  AND con.EndSeason > ?\n                ORDER BY con.PosInTeam, con.ContractType, dri.StaffID`, [teamId, season],\n            'allRows'\n        ) || [];\n\n        const seenThisSeason = new Set();\n        driversThisSeason.forEach(d => {\n            const name = formatNamesSimple(d);\n            const driverId = Number(name[1]);\n            if (seenThisSeason.has(driverId)) return;\n            seenThisSeason.add(driverId);\n            const driverNumber = Number(d[6]);\n            teamInfo.driversThisSeason.push({\n                name: news_insert_space(name[0]),\n                driverId,\n                posInTeam: Number(d[5]) || null,\n                contractType: Number(d[4]) || 0,\n                driverNumber: !Number.isNaN(driverNumber) && driverNumber > 0 ? driverNumber : null\n            });\n        });\n\n        const seenNextSeason = new Set();\n        driversNextSeason.forEach(d => {\n            const name = formatNamesSimple(d);\n            const contractType = Number(d[4]) || 0;\n            const driverId = Number(name[1]);\n            if (seenNextSeason.has(driverId)) return;\n            seenNextSeason.add(driverId);\n            const driverNumber = Number(d[6]);\n            const currentTeamId = Number(currentTeamByDriver.get(driverId));\n            const isTeamChangeForNextSeason = contractType === 3 && currentTeamId !== teamId;\n            teamInfo.driversNextSeason.push({\n                name: news_insert_space(name[0]),\n                driverId,\n                posInTeam: Number(d[5]) || null,\n                contractType,\n                driverNumber: !Number.isNaN(driverNumber) && driverNumber > 0 ? driverNumber : null,\n                isForNextSeason: isTeamChangeForNextSeason\n            });\n        });\n\n        teamsDict[teamId] = teamInfo;\n    });\n\n    return { teamIds, teamsDict };\n}\n\nexport function getCurrentAndNextSeasonGridLineups() {\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const season = daySeason[1];\n    const { teamIds, teamsDict } = buildGridLineupsData(season);\n    return { season, teamIds, teams: teamsDict };\n}\n\nfunction generateNextSeasonGridNews(savedNews = {}, currentMonth) {\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const season = daySeason[1];\n    const newsList = [];\n    const allRacesDone = queryDB(\n        `SELECT COUNT(*) FROM Races WHERE SeasonID = ? AND State = 2`, [season],\n        'singleValue'\n    );\n    const totalRaces = queryDB(\n        `SELECT COUNT(*) FROM Races WHERE SeasonID = ?`, [season],\n        'singleValue'\n    );\n    //if we are not in the last month or not all races done, return empty list\n    if (currentMonth < 11 || allRacesDone < totalRaces) {\n        return newsList;\n    }\n    const entryId = `next_season_grid`;\n\n    if (savedNews[entryId]) {\n        return [{ id: entryId, ...savedNews[entryId] }];\n    }\n\n    const { teamsDict } = buildGridLineupsData(season);\n\n    const title = generateTitle({ season_year: season + 1 }, 19);\n    const image = getImagePath(null, null, \"grid\");\n    const newsDate = new Date(season, 11, 15);\n    const excelDate = dateToExcel(newsDate);\n\n    newsList.push({\n        id: entryId,\n        type: \"next_season_grid\",\n        title,\n        date: excelDate,\n        image,\n        overlay: \"next-season-grid\",\n        data: {\n            season_year: season + 1,\n            teams: teamsDict\n        },\n        text: null\n    });\n\n    return newsList;\n\n}\n\nexport function generateContractRenewalsNews(savedNews = {}, contractRenewals = [], currentMonth) {\n    const renewalMonths = [8, 9, 10].filter(m => m < currentMonth);\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const season = daySeason[1];\n\n\n    const used = new Set(\n        Object.values(savedNews)\n            .filter(n => n?.type === \"contract_renewal\" && n?.data?.driverId != null)\n            .map(n => n.data.driverId)\n    );\n\n    const newsList = [];\n    //iterate through months done of renewalMonths\n    for (const m of renewalMonths) {\n        const entryId = `contract_renewal_${m}`;\n\n        if (savedNews[entryId]) {\n            newsList.push({ id: entryId, ...savedNews[entryId] });\n            const dId = savedNews[entryId]?.data?.driverId;\n            if (dId != null) used.add(dId);\n            continue;\n        }\n\n        const pool = contractRenewals.filter(c => !used.has(c.driverId));\n        if (!pool.length) continue;\n\n        const contract = randomPick(pool);\n        used.add(contract.driverId);\n\n        const title = generateTitle(contract, 10);\n        const image = getImagePath(contract.team1Id, contract.driverId, \"transfer\");\n\n        // Generate a date from the current month\n        const newsDate = new Date(season, m - 1, Math.floor(Math.random() * 28) + 1);\n        const excelDate = dateToExcel(newsDate);\n\n        newsList.push({\n            id: entryId,\n            type: \"contract_renewal\",\n            title,\n            date: excelDate,\n            image,\n            overlay: \"contract-renewal-overlay\",\n            data: contract,\n            text: null\n        });\n    }\n\n    return newsList;\n\n}\n\nexport function getContractExtensions() {\n    const daySeason = queryDB(\n        `SELECT Day, CurrentSeason FROM Player_State`, [],\n        'singleRow'\n    )\n    const seasonYear = daySeason[1]\n\n    let contractRenewals = queryDB(\n        `\n        SELECT \n        bas.FirstName,\n        bas.LastName,\n        con3.StaffID,\n        con3.TeamID,\n        con3.EndSeason,\n        con3.Salary\n        FROM Staff_Contracts con3\n        JOIN Staff_DriverData dri ON con3.StaffID = dri.StaffID\n        JOIN Staff_BasicData bas  ON con3.StaffID = bas.StaffID\n        WHERE con3.ContractType = 3\n        AND con3.PosInTeam <= 2\n        AND EXISTS (\n            SELECT 1\n            FROM Staff_Contracts con0\n            WHERE con0.StaffID = con3.StaffID\n                AND con0.TeamID  = con3.TeamID\n                AND con0.ContractType = 0\n                AND con0.PosInTeam <= 2\n        );\n        `\n        , [], 'allRows')\n\n    // contractRenewals.forEach(contract => {\n    //     let driverID = contract[2];\n    //     const driverOverall = getDriverOverall(driverID);\n\n    //     if (driverOverall < 88) {\n    //         contractRenewals = contractRenewals.filter(c => c[2] !== driverID);\n    //     }\n    // });\n\n\n    const formattedContracts = contractRenewals.map(contract => {\n        const [nameFormatted, driverId, teamId] = formatNamesSimple(contract);\n        const currentTeam = queryDB(`SELECT TeamID FROM Staff_Contracts WHERE StaffID = ? AND ContractType = 0`, [driverId], 'singleValue');\n        return {\n            driver1: nameFormatted,\n            driverId: driverId,\n            team1: combined_dict[teamId],\n            team2: combined_dict[currentTeam],\n            team1Id: teamId,\n            team2Id: currentTeam,\n            previouslyDrivenTeams: getPreviouslyDrivenTeams(driverId),\n            endSeason: contract[4],\n            salary: contract[5]\n        };\n    });\n\n\n    return formattedContracts;\n}\n\n\n\nexport function getTrueTransferRumors() {\n    const daySeason = queryDB(\n        `SELECT Day, CurrentSeason FROM Player_State`, [],\n        'singleRow'\n    )\n    const seasonYear = daySeason[1]\n\n    const top5rows = queryDB(\n        `SELECT DriverID \n     FROM Races_DriverStandings \n     WHERE RaceFormula = 1 \n       AND SeasonID = ? \n     ORDER BY Position \n     LIMIT 5`, [seasonYear],\n        'allRows'\n    )\n    const top5DriverIDs = top5rows.map(r => r[0])\n\n    const sql = `\n    SELECT \n        bas.FirstName, \n        bas.LastName, \n        dri.StaffID,\n        ofe.TeamID as PotentialTeam,\n        ofe.ContractState,\n        ofe.PosInTeam,\n        enu.Name as State,\n        ofe.OfferDay,\n        ofe.Salary,\n        ofe.SalaryOpinion,\n        ofe.EndSeason,\n        ofe.LengthOpinion,\n        ofe.ExpirationDay,\n        con.TeamID\n    FROM Staff_BasicData bas\n    RIGHT JOIN Staff_DriverData dri\n        ON bas.StaffID = dri.StaffID\n    JOIN Staff_ContractOffers ofe\n        ON bas.StaffID = ofe.StaffID\n    JOIN Staff_Enum_ContractState enu\n        ON ofe.ContractState = enu.Value\n    JOIN Staff_Contracts con\n        ON bas.StaffID = con.StaffID\n    WHERE con.ContractType = 0\n    AND ofe.PosInTeam <= 2\n    `\n\n    const rows = queryDB(sql, [], 'allRows')\n        .filter(r => {\n            const date = excelToDate(r[7])\n            return date.getFullYear() === seasonYear\n        })\n\n    const formatted = rows.map(r => {\n        const [nameFormatted, driverId] = formatNamesSimple(r)\n        let actualTeam = queryDB(`SELECT TeamID FROM Staff_Contracts WHERE StaffID = ? AND ContractType = 0`, [r[2]], 'singleValue')\n        actualTeam = combined_dict[actualTeam]\n        let driverAtRisk = queryDB(`SELECT bas.FirstName, bas.LastName, con.StaffID, con.TeamID FROM Staff_Contracts con JOIN Staff_BasicData bas ON bas.StaffID = con.StaffID RIGHT JOIN Staff_DriverData dri ON bas.StaffID = dri.StaffID WHERE con.TeamID = ? AND con.PosInTeam = ? AND con.ContractType = 0`, [r[3], r[5]], 'singleRow')\n        //if driverAtRisk[2] is th same as r[2] then remove it\n        if (driverAtRisk[2] === r[2]) return null\n        driverAtRisk = formatNamesSimple(driverAtRisk)\n        const driverAtRiskName = news_insert_space(driverAtRisk[0])\n        return {\n            name: news_insert_space(nameFormatted),\n            driverId,\n            actualTeam,\n            actualTeamId: r[13],\n            potentialTeam: combined_dict[r[3]],\n            state: r[6],\n            offerDay: excelToDate(r[7]),\n            expirationDate: excelToDate(r[12]),\n            posInTeam: r[5],\n            driverAtRisk: driverAtRiskName,\n            salary: r[8],\n            salaryOpinion: opinionDict[r[9]],\n            endSeason: r[10],\n            lengthOpinion: opinionDict[r[11]],\n            overall: getDriverOverall(driverId),\n        }\n    }).filter(r => r !== null);\n\n\n    const seen = new Set()\n    const uniqueFormatted = formatted.filter(item => {\n        const key = JSON.stringify(item)\n        if (seen.has(key)) {\n            return false\n        } else {\n            seen.add(key)\n            return true\n        }\n    })\n\n    const tier1OrTop5 = []\n    const others = []\n\n    for (const rumor of uniqueFormatted) {\n        const [tier] = getTier(rumor.driverId)\n        const isTop5 = top5DriverIDs.includes(rumor.driverId)\n\n        if (tier === 1 || isTop5) {\n            tier1OrTop5.push(rumor)\n        } else {\n            others.push(rumor)\n        }\n    }\n\n\n    return {\n        tier1OrTop5,\n        others\n    }\n}\n\nexport function getConfirmedTransfers(bestDrivers = false) {\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const day = daySeason[0];\n    const seasonYear = daySeason[1];\n\n    let futureContracts = queryDB(\n        `SELECT DISTINCT\n        bas.FirstName,\n        bas.LastName,\n        con3.StaffID,\n        con3.TeamID,\n        con3.EndSeason,\n        con3.Salary\n        FROM Staff_Contracts con3\n        JOIN Staff_DriverData  dri ON con3.StaffID = dri.StaffID\n        JOIN Staff_BasicData   bas ON con3.StaffID = bas.StaffID\n        WHERE con3.ContractType = 3\n        AND con3.PosInTeam <= 2\n        AND EXISTS (\n            SELECT 1\n            FROM Staff_Contracts con0\n            WHERE con0.StaffID = con3.StaffID\n                AND con0.ContractType = 0\n                AND con0.PosInTeam <= 2\n                AND con0.TeamID <> con3.TeamID   -- equipos distintos\n                -- Opcional: filtros por temporada si aplica, por ejemplo:\n                -- AND con0.EndSeason = con3.EndSeason\n        );`\n        , [], 'allRows')\n\n    if (bestDrivers) {\n        futureContracts.forEach(contract => {\n            let driverID = contract[2];\n            const driverOverall = getDriverOverall(driverID);\n\n            if (driverOverall < 88) {\n                futureContracts = futureContracts.filter(c => c[2] !== driverID);\n            }\n        });\n    }\n\n    const formattedContracts = futureContracts.map(contract => {\n        const [nameFormatted, driverId, teamId] = formatNamesSimple(contract);\n        const currentTeam = queryDB(`SELECT TeamID FROM Staff_Contracts WHERE StaffID = ? AND ContractType = 0`, [driverId], 'singleValue');\n        return {\n            driver1: nameFormatted,\n            driverId: driverId,\n            team1: combined_dict[teamId],\n            team2: combined_dict[currentTeam],\n            team1Id: teamId,\n            team2Id: currentTeam,\n            previouslyDrivenTeams: getPreviouslyDrivenTeams(driverId),\n            endSeason: contract[4],\n            salary: contract[5]\n        };\n    });\n\n\n    return formattedContracts;\n}\n\nexport function generateTransferRumorsNews(offers, savedNews) {\n    if (!offers) return null;\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const day = daySeason[0];\n    const seasonYear = daySeason[1];\n    let newsList = [];\n\n    const realDay = excelToDate(day);\n\n    if (realDay.getMonth() + 1 < 8 || (realDay.getMonth() + 1 === 8 && realDay.getDate() < 10)) {\n        return null;\n    }\n\n    const date = dateToExcel(new Date(seasonYear, 7, 10));\n\n    const validOffers = offers.others.filter(item => item.state !== 'Signed');\n\n    const driversDict = validOffers.reduce((acc, item) => {\n        const previousResultsTeam = queryDB(`SELECT SeasonID, Points, Position FROM Races_TeamStandings WHERE TeamID = ?`, [item.actualTeamId], 'allRows')\n            .map(r => {\n                return {\n                    season: r[0],\n                    points: r[1],\n                    position: r[2]\n                }\n            });\n        const {\n            driverId,\n            name,\n            overall,\n            actualTeam,\n            teamId,\n            previouslyDrivenTeams,\n            ...offerDetails\n        } = item;\n\n        if (!acc[driverId]) {\n            acc[driverId] = {\n                driverId,\n                name,\n                overall,\n                actualTeam,\n                teamId: item.actualTeamId,\n                previouslyDrivenTeams: getPreviouslyDrivenTeams(driverId),\n                previousResultsTeam: previousResultsTeam,\n                offers: []\n            };\n        }\n\n        acc[driverId].offers.push(offerDetails);\n        return acc;\n    }, {});\n\n    const top3Drivers = Object\n        .values(driversDict)\n        .filter(driver => driver.offers.length > 0)\n        .sort((a, b) => b.overall - a.overall)\n        .slice(0, 3);\n\n\n    // Si no hay suficientes pilotos, no generamos la noticia\n    if (top3Drivers.length < 3) {\n        return null;\n    }\n\n    let titleData = {\n        driver1: top3Drivers[0].name,\n        driver2: top3Drivers[1].name,\n        driver3: top3Drivers[2].name,\n        team1: top3Drivers[0][\"offers\"][0].potentialTeam,\n        team2: top3Drivers[1][\"offers\"][0].potentialTeam,\n        team3: top3Drivers[2][\"offers\"][0].potentialTeam,\n    }\n\n    const title = generateTitle(titleData, 4);\n\n    const sillySeasonRumorsId = `silly_season_${seasonYear}`;\n\n    if (savedNews[sillySeasonRumorsId]) {\n        newsList.push({ id: sillySeasonRumorsId, ...savedNews[sillySeasonRumorsId] });\n        return newsList;\n    }\n\n    const driversArray = Object.values(driversDict);\n\n    const image = getImagePath(top3Drivers[0].teamId, top3Drivers[0].driverId, \"transfer_generic\");\n\n    const sillySeasonNew = {\n        id: sillySeasonRumorsId,\n        type: \"silly_season_rumors\",\n        title: title,\n        date: date,\n        season: seasonYear,\n        image: image,\n        overlay: \"silly-season-overlay\",\n        data: { drivers: driversArray },\n        text: null\n    };\n\n\n    newsList.push(sillySeasonNew);\n\n    return newsList\n\n}\n\nexport function generateTeamsUpgradesNews(events, savednews) {\n    //aparcado de momento\n    const globals = getGlobals();\n    let teamIds = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n    if (globals.isCreateATeam) {\n        teamIds.push(32);\n    }\n\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const seasonYear = daySeason[1];\n    const parts = getAllPartsFromTeam(32);\n\n\n    events.forEach(raceId => {\n        const entryId = `${seasonYear}_upgrades_${raceId}`;\n\n        if (savednews[entryId]) {\n            newsList.push({ id: entryId, ...savednews[entryId] });\n            return;\n        }\n\n        let nextRaceId = raceId + 1;\n        let trackIdNextRace = queryDB(`SELECT TrackID FROM Races WHERE RaceID = ?`, [nextRaceId], 'singleValue');\n        let newParts = {};\n        teamIds.forEach(teamId => {\n            let teamName = combined_dict[teamId];\n            newParts[teamId] = [];\n            let parts = getAllPartsFromTeam(teamId);\n            //iterate through the parts dictionary\n            for (const part in parts) {\n                let partsArray = parts[part]\n                partsArray.forEach(partDetails => {\n                    let trackDebutForPart = partDetails[3];\n                    if (trackDebutForPart === trackIdNextRace) {\n                        newParts[teamId].push(part);\n                        return;\n                    }\n                });\n            }\n        });\n\n    });\n}\n\nexport function generateComparisonNews(comparisonMonths, savedNews) {\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const season = daySeason[1];\n    const currentDate = excelToDate(daySeason[0]);\n    const currentMonth = currentDate.getMonth() + 1;\n\n    let newsList = [];\n    comparisonMonths.forEach(month => {\n        if (month >= currentMonth) return; //only past months\n\n        const randomDay1 = Math.floor(Math.random() * 31) + 1;\n\n        const date = new Date(season, month - 1, randomDay1);\n        const excelDate = dateToExcel(date);\n\n\n        if (month % 2 !== 0) {\n            let shifts = calculateTeamDropsByDate(season, date);\n            //order by shift.drop\n            shifts.sort((a, b) => a.drop - b.drop);\n            const top3 = shifts.slice(0, 3);\n            const bottom3 = shifts.slice(-3);\n\n            //put together in the same array\n            const combined = [...top3, ...bottom3];\n            const teamToTalk = randomPick(combined);\n\n            //create the new\n            const entryId = `team_comparison_${season}_${month}`;\n\n            if (savedNews[entryId]) {\n                newsList.push({ id: entryId, ...savedNews[entryId] });\n                return;\n            }\n\n            let newTypeId, compType;\n            if (teamToTalk.drop > 0) {\n                newTypeId = 11;\n                compType = \"bad\"\n            }\n            else {\n                newTypeId = 12;\n                compType = \"good\";\n            }\n\n            const title = generateTitle({ teamId: combined_dict[teamToTalk.teamId], season }, newTypeId);\n            const image = getImagePath(teamToTalk.teamId, teamToTalk.teamId, \"teamComparison\");\n\n            const newsEntry = {\n                id: entryId,\n                type: \"team_comparison\",\n                title: title,\n                date: excelDate,\n                image: image,\n                overlay: null,\n                data: {\n                    team: teamToTalk,\n                    season: season,\n                    compType: compType\n                },\n                text: null\n            };\n            newsList.push(newsEntry);\n        }\n        else {\n            const isCreateATeam = getGlobals().isCreateATeam;\n            const teams = isCreateATeam ? [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 32] : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n            const teamId = randomPick(teams);\n            const teamName = combined_dict[teamId];\n\n            const entryId = `driver_comparison_${season}_${month}`;\n\n            if (savedNews[entryId]) {\n                newsList.push({ id: entryId, ...savedNews[entryId] });\n                return;\n            }\n\n            const drivers = queryDB(`SELECT bas.FirstName, bas.LastName, dri.StaffID FROM Staff_BasicData bas\n                    JOIN Staff_DriverData dri ON bas.StaffID = dri.StaffID \n                    JOIN Staff_Contracts con ON bas.StaffID = con.StaffID\n                    JOIN Races_DriverStandings sta ON dri.StaffID = sta.DriverID\n                    WHERE sta.SeasonID = ? AND sta.RaceFormula = 1\n                    AND con.TeamID = ? AND con.ContractType = 0 AND con.PosInTeam <= 2\n                    ORDER BY sta.Position`, [season, teamId], 'allRows');\n            if (drivers.length < 2) return;\n\n            const formattedDrivers = drivers.map(driver => {\n                const [nameFormatted, driverId] = formatNamesSimple(driver);\n                return {\n                    name: news_insert_space(nameFormatted),\n                    driverId\n                }\n            });\n\n            //for each driver, select randomlky if taking his entire name or only last name\n            formattedDrivers.forEach(driver => {\n                if (Math.random() < 0.5) {\n                    const parts = driver.name.split(' ');\n                    driver.name = parts[parts.length - 1]; //last name only\n                }\n            });\n\n\n            let data = {\n                team: teamName,\n                driver1: formattedDrivers[0].name,\n                driver2: formattedDrivers[1].name,\n            }\n\n            const title = generateTitle(data, 13);\n            // const image = getImagePath(teamId, teamId, \"driverComparison\");\n            const overlay = \"driver-comparison-overlay\";\n\n\n            const newsEntry = {\n                id: entryId,\n                type: \"driver_comparison\",\n                title: title,\n                date: excelDate,\n                image: null,\n                overlay: overlay,\n                data: {\n                    teamId,\n                    teamName,\n                    drivers: formattedDrivers,\n                    season\n                },\n                text: null\n            };\n            newsList.push(newsEntry);\n\n        }\n\n\n    });\n\n    return newsList;\n}\n\nexport function generateRaceResultsNews(events, savednews) {\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const seasonYear = daySeason[1];\n    let newsList = [];\n\n    events.forEach(raceId => {\n        const entryId = `${seasonYear}_race_${raceId}`;\n\n        if (savednews[entryId]) {\n            newsList.push({ id: entryId, ...savednews[entryId] });\n            return;\n        }\n\n        const results = getOneRaceResults(raceId);\n\n        const formatted = results.map(row => {\n            const [nameFormatted, driverId, teamId] = formatNamesSimple(row);\n            return {\n                name: news_insert_space(nameFormatted),\n                driverId,\n                teamId,\n                pos: row[4]\n            };\n        });\n\n        const podium = formatted.filter(r => r.pos <= 3);\n\n        const winnerEntry = podium.find(r => r.pos === 1);\n        const winnerName = winnerEntry ? winnerEntry.name : \"Unknown\";\n\n        let data = {\n            raceId,\n            seasonYear,\n            winnerName: winnerName,\n        }\n\n        const title = generateTitle(data, 2);\n\n        const trackId = queryDB(`SELECT TrackID FROM Races WHERE RaceID = ?`, [raceId], 'singleRow');\n        const code = races_names[parseInt(trackId)];\n\n        const image = getImagePath(formatted[0].teamId, code, \"raceQuali\");\n\n        const overlay = \"race-overlay\"\n\n        const newsData = {\n            first: formatted[0].name,\n            second: formatted[1].name,\n            third: formatted[2].name,\n            firstTeam: formatted[0].teamId,\n            secondTeam: formatted[1].teamId,\n            thirdTeam: formatted[2].teamId,\n            trackId: trackId,\n            seasonYear: seasonYear,\n        }\n\n        const date = queryDB(`SELECT Day FROM Races WHERE RaceID = ?`, [raceId], 'singleValue');\n\n        const newsEntry = {\n            id: entryId,\n            type: \"race_result\",\n            title: title,\n            date: date,\n            image: image,\n            overlay: overlay,\n            data: newsData,\n            text: null\n        };\n        newsList.push(newsEntry);\n\n    });\n\n    return newsList;\n}\n\nexport function generateRaceReactionsNews(events, savednews) {\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const seasonYear = daySeason[1];\n    let newsList = [];\n\n    events.forEach(raceId => {\n        const entryId = `${seasonYear}_race_reaction_${raceId}`;\n\n        if (savednews[entryId]) {\n            newsList.push({ id: entryId, ...savednews[entryId] });\n            return;\n        }\n\n        // //30% chance of not generating\n        // if (Math.random() < 0.3) {\n        //     return;\n        // }\n\n        const results = getOneRaceResults(raceId);\n\n        const formatted = results.map(row => {\n            const [nameFormatted, driverId, teamId] = formatNamesSimple(row);\n            return {\n                name: news_insert_space(nameFormatted),\n                driverId,\n                teamId,\n                teamName: combined_dict[teamId],\n                pos: row[4],\n                rating: getDriverOverall(driverId)\n            };\n        });\n\n        const unhappyDrivers = formatted.filter(r => r.rating >= 88 && r.pos > 6);\n        if (unhappyDrivers.length === 0) {\n            //get the lowest 88 or more overall driver\n            const sortedByOverall = formatted.filter(r => r.rating >= 88).sort((a, b) => b.rating - a.rating);\n            if (sortedByOverall.length > 0) {\n                unhappyDrivers.push(sortedByOverall[sortedByOverall.length - 1]);\n            }\n        }\n        if (unhappyDrivers.length === 0) {\n            //ge tthe driver with 86 or more rating in the lowest position\n            const sortedByOverall = formatted.filter(r => r.rating >= 86).sort((a, b) => b.rating - a.rating);\n            if (sortedByOverall.length > 0) {\n                unhappyDrivers.push(sortedByOverall[sortedByOverall.length - 1]);\n            }\n        }\n        //if sitll no unhappyDrivers, get the last one\n        if (unhappyDrivers.length === 0) {\n            unhappyDrivers.push(formatted[formatted.length - 1]);\n        }\n\n        const randomUnHappyDriver = randomPick(unhappyDrivers);\n\n\n        //get all drivers who finished in the top 4\n        const happyDrivers = formatted.filter(r => r.pos <= 4);\n        const randomHappyDriver = randomPick(happyDrivers);\n\n        const trackId = queryDB(`SELECT TrackID FROM Races WHERE RaceID = ?`, [raceId], 'singleRow');\n        const code = races_names[parseInt(trackId)].toLowerCase();\n\n\n        let titleData = {\n            raceId,\n            allHappyDrivers: happyDrivers,\n            allUnhappyDrivers: unhappyDrivers,\n            randomHappyDriver,\n            happyTeam: randomHappyDriver.teamName,\n            unhappyTeam: randomUnHappyDriver.teamName,\n            randomUnHappyDriver,\n            seasonYear,\n            trackId: trackId\n        }\n\n        const title = generateTitle(titleData, 16);\n        \n\n        let driverTeamIdInTitle = null;\n        //check if in the title there is randomHappyDriver name or randomUnHappyDriver name\n        if (title.includes(randomUnHappyDriver.name)) {\n            driverTeamIdInTitle = randomUnHappyDriver.teamId;\n            titleData.driverTeamIdInTitle = driverTeamIdInTitle;\n        }\n        else if (title.includes(randomHappyDriver.name)) {\n            driverTeamIdInTitle = randomHappyDriver.teamId;\n            titleData.driverTeamIdInTitle = driverTeamIdInTitle;\n        }\n\n        const image = getImagePath(driverTeamIdInTitle, code, \"reaction\");\n\n        const date = queryDB(`SELECT Day FROM Races WHERE RaceID = ?`, [raceId], 'singleValue');\n\n        const newsEntry = {\n            id: entryId,\n            type: \"race_reaction\",\n            title: title,\n            date: date + 1,\n            image: image,\n            overlay: \"reaction-overlay\",\n            data: titleData,\n            text: null\n        };\n        newsList.push(newsEntry);\n\n    });\n\n    return newsList;\n}\n\nexport function generateQualifyingResultsNews(events, savednews) {\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const seasonYear = daySeason[1];\n    let newsList = [];\n\n    events.forEach(raceId => {\n        const entryId = `${seasonYear}_quali_${raceId}`;\n\n        if (savednews[entryId]) {\n            newsList.push({ id: entryId, ...savednews[entryId] });\n            return;\n        }\n\n        const results = getOneQualifyingResults(raceId);\n\n        const formatted = results.map(row => {\n            const [nameFormatted, driverId, teamId] = formatNamesSimple(row);\n            return {\n                name: news_insert_space(nameFormatted),\n                driverId,\n                teamId,\n                pos: row[4],\n                fastestLap: row[5]\n            };\n        });\n\n        const podium = formatted.filter(r => r.pos <= 3);\n\n        const winnerEntry = podium.find(r => r.pos === 1);\n        const poleDriver = winnerEntry ? winnerEntry.name : \"Unknown\";\n\n        let data = {\n            raceId,\n            seasonYear,\n            pole_driver: poleDriver,\n        }\n\n        const title = generateTitle(data, 1);\n\n        const trackId = queryDB(`SELECT TrackID FROM Races WHERE RaceID = ?`, [raceId], 'singleRow');\n        const code = races_names[parseInt(trackId)];\n\n        const image = getImagePath(formatted[0].teamId, `${code}_car`, \"raceQuali\");\n\n        const overlay = \"quali-overlay\"\n\n        const newsData = {\n            first: formatted[0].name,\n            second: formatted[1].name,\n            third: formatted[2].name,\n            firstTeam: formatted[0].teamId,\n            secondTeam: formatted[1].teamId,\n            thirdTeam: formatted[2].teamId,\n            trackId: trackId,\n            seasonYear: seasonYear,\n        }\n\n        const date = queryDB(`SELECT Day FROM Races WHERE RaceID = ?`, [raceId], 'singleValue') - 1;\n\n        const newsEntry = {\n            id: entryId,\n            type: \"quali_result\",\n            title: title,\n            date: date,\n            image: image,\n            overlay: overlay,\n            data: newsData,\n            text: null\n        };\n        newsList.push(newsEntry);\n\n    });\n\n    return newsList;\n}\n\nexport function generateSeasonReviewNews(savedNews) {\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const nRaces = queryDB(`SELECT COUNT(*) FROM Races WHERE SeasonID = ?`, [daySeason[1]], 'singleValue');\n    let racesInterval = nRaces / 3;\n    const racesCompleted = queryDB(`SELECT COUNT(*) FROM Races WHERE SeasonID = ? AND State = 2`, [daySeason[1]], 'singleValue');\n    let newsList = [];\n    const firstRaceSeasonId = queryDB(`SELECT MIN(RaceID) FROM Races WHERE SeasonID = ?`, [daySeason[1]], 'singleValue');\n    const seasonResults = fetchSeasonResults(daySeason[1]);\n\n\n    let reviewPoints = [];\n    if (racesCompleted >= racesInterval) {\n        reviewPoints.push({ part: 1, totalParts: 3 });\n    }\n    if (racesCompleted >= racesInterval * 2) {\n        reviewPoints.push({ part: 2, totalParts: 3 });\n    }\n    if (racesCompleted >= nRaces) {\n        reviewPoints.push({ part: 3, totalParts: 3 });\n    }\n\n    reviewPoints.forEach(review => {\n        const entryId = `season_review_${daySeason[1]}_${review.part}`;\n\n        if (savedNews[entryId]) {\n            newsList.push({ id: entryId, ...savedNews[entryId] });\n            return;\n        }\n\n        const raceIdInPoint = firstRaceSeasonId + Math.floor(racesInterval * review.part) - 1;\n        const nextRace = raceIdInPoint + 1;\n\n        const dates = queryDB(`SELECT Day FROM Races WHERE RaceID IN (?, ?)`, [raceIdInPoint, nextRace], 'allRows');\n        //pick a random date between those two dates\n        let date;\n        if (dates.length === 2) {\n            const day1 = dates[0][0] + 1;\n            const day2 = dates[1][0] - 1;\n            date = Math.floor(Math.random() * (day2 - day1 + 1)) + day1;\n        }\n\n        if (review.part === 3 || !date) {\n            date = dateToExcel(new Date(daySeason[1], 11, 10));\n        }\n\n        const excelDate = date\n\n        const { driverStandings, teamStandings, driversResults, racesNames } = rebuildStandingsUntil(seasonResults, raceIdInPoint);\n        const firstDriver = driverStandings[0];\n        const firstTeam = teamStandings[0];\n        const secondDriver = driverStandings[1];\n        const secondTeam = teamStandings[1];\n        const thirdDriver = driverStandings[2];\n        const thirdTeam = teamStandings[2];\n\n        let data = {\n            season: daySeason[1],\n            part: review.part,\n            driver1: firstDriver.name,\n            driver2: secondDriver.name,\n        }\n\n        let titleId;\n        if (review.part === 3) titleId = 15;\n        else titleId = 14;\n        const title = generateTitle(data, titleId);\n        const image = getImagePath(firstTeam ? firstTeam.id : 1, firstDriver ? firstDriver.id : 1, \"season_review\");\n\n        let newsData = {\n            season: daySeason[1],\n            part: review.part,\n            firstDriver,\n            secondDriver,\n            firstTeam,\n            secondTeam\n        }\n\n        newsList.push({\n            id: entryId,\n            type: \"season_review\",\n            title: title,\n            date: excelDate,\n            image: image,\n            overlay: null,\n            data: newsData,\n            text: null\n        });\n    });\n\n    return newsList;\n}\n\nexport function news_insert_space(str) {\n    return str\n        .replace(/([A-Z])/g, ' $1')\n        .trim()\n        .replace(/\\s+/g, ' ');\n}\n\nexport function getOneQualiDetails(raceId) {\n    const results = getOneQualifyingResults(raceId);\n    if (!results.length) return {};\n\n    const season = queryDB(`SELECT SeasonID FROM Races WHERE RaceID = ?`, [raceId], 'singleRow');\n\n    const seasonResults = fetchQualiResults(season);\n    const seasonRaceResults = fetchSeasonResults(season, true); //to get standings\n\n    const { driverStandings, teamStandings, driversResults, racesNames } = rebuildStandingsUntil(seasonResults, raceId - 1, true, true, true); //get championship standings before that race\n    const { driverStandings: raceDriverStandings, teamStandings: raceTeamStandings, driversResults: driverRaceResults, racesNames: raceRacesNames } = rebuildStandingsUntil(seasonRaceResults, raceId - 1, true, true, false);\n\n\n    // 1) Obtenemos time y laps del ganador (primera fila)\n    const poleTime = results[0][5]; // índice 5 = res.FastestLap\n\n    const poleDetails = results.map(row => {\n        const [nameFormatted, driverId, teamId] = formatNamesSimple(row);\n        const time = row[5];\n        //format to mins:secs.millis, time is in seconds.milis\n        const minutes = Math.floor(time / 60);\n        const seconds = Math.floor(time % 60);\n        const millis = Math.round((time % 1) * 1000);\n        const fastestLap =\n            `${minutes}:${seconds.toString().padStart(2, \"0\")}.${millis\n                .toString()\n                .padStart(3, \"0\")}`;\n\n        const gapToPole = time - poleTime;\n\n        return {\n            name: news_insert_space(nameFormatted),\n            driverId,\n            teamId,\n            pos: row[4],\n            gapToPole,\n            fastestLap: fastestLap\n        };\n    });\n\n    const champions = getLatestChampions(season);\n\n    const numberOfRaces = queryDB(`SELECT COUNT(*) FROM Races WHERE SeasonID = ?`, [season], 'singleRow')[0];\n\n    const drivers = seasonResults.map(r => ({\n        id: r.driverId,\n        name: r.driverName ?? \"\"\n    }));\n    const enrichedAllTime = enrichDriversWithHistory(drivers);\n\n    return {\n        details: poleDetails,\n        driverStandings,\n        teamStandings,\n        driverQualiResults: driversResults,\n        racesNames,\n        champions,\n        nRaces: numberOfRaces,\n        enrichedAllTime,\n        driversResults: driverRaceResults\n    }\n}\n\nexport function getOneRaceDetails(raceId) {\n    const results = getOneRaceResults(raceId);\n    if (!results.length) return {};\n\n    const sprintResults = getOneRaceResults(raceId, true);\n\n    const season = queryDB(`SELECT SeasonID FROM Races WHERE RaceID = ?`, [raceId], 'singleRow');\n\n    const seasonResults = fetchSeasonResults(season, true);\n    const pointsSchema = fetchPointsRegulations();\n    const maxPointsPerRace = pointsSchema.twoBiggestPoints[0]\n\n    const { driverStandings, teamStandings, driversResults, racesNames } = rebuildStandingsUntil(seasonResults, raceId);\n\n    const remainingRaces = queryDB(`SELECT RaceID, TrackID, WeekendType FROM Races WHERE SeasonID = ? AND RaceID > ? ORDER BY RaceID`, [season, raceId], 'allRows');\n    //make an object that has raceid, trackId, and race track\n    const remainingRacesDetails = remainingRaces.map(r => {\n        return {\n            raceId: r[0],\n            trackId: r[1],\n            sprint: r[2] === 1,\n            trackName: countries_data[races_names[r[1]]].country\n        }\n    });\n\n\n    // 1) Obtenemos time y laps del ganador (primera fila)\n    const winnerTime = results[0][10]; // índice 10 = res.Time\n    const winnerLaps = results[0][11]; // índice 11 = res.Laps\n\n    const top3DoD = getDoDTopNForRace(season, raceId, 3);\n\n    //for each of the top3, changen name for news_insert_space(name), and leave the rest the same\n    const driverOfTheDayInfo = top3DoD.map((dod, index) => {\n        const newName = news_insert_space(dod.name);\n        return {\n            name: newName,\n            ...dod,\n        };\n    });\n\n    const raceDetails = results.map(row => {\n        const [nameFormatted, driverId, teamId] = formatNamesSimple(row);\n        const time = row[10];\n        const laps = row[11];\n\n        const gapToWinner = time - winnerTime;\n        const gapLaps = winnerLaps - laps;\n\n        const base = {\n            name: news_insert_space(nameFormatted),\n            driverId,\n            teamId,\n            pos: row[4],\n            grid: row[5],\n            points: row[6],\n            dnf: row[7],\n            safetyCar: row[8],\n            virtualSafetyCar: row[9],\n            gapToWinner,\n            gapLaps,\n            overall: getDriverOverall(driverId),\n            pointsGapToLeader: driverStandings.find(d => d.driverId === driverId)?.gapToLeader\n        };\n\n        return base;\n    });\n\n    let sprintDetails = [];\n\n    if (sprintResults.length > 0) {\n        const sprintWinnerTime = sprintResults[0][7];\n        const sprintWinnerLaps = sprintResults[0][8];\n\n        sprintDetails = sprintResults.map(row => {\n            const [nameFormatted, driverId, teamId] = formatNamesSimple(row);\n            const time = row[7];\n            const laps = row[8];\n\n\n            const gapToWinner = time - sprintWinnerTime;\n            const gapLaps = sprintWinnerLaps - laps\n\n            return {\n                name: news_insert_space(nameFormatted),\n                driverId,\n                teamId,\n                pos: row[4],\n                points: row[5],\n                dnf: row[6],\n                gapToWinner,\n                gapLaps,\n            };\n        });\n    }\n\n    const champions = getLatestChampions(season);\n\n    const numberOfRaces = queryDB(`SELECT COUNT(*) FROM Races WHERE SeasonID = ?`, [season], 'singleRow')[0];\n\n    const drivers = seasonResults.map(r => ({\n        id: r.driverId,\n        name: r.driverName ?? \"\"\n    }));\n    const enrichedAllTime = enrichDriversWithHistory(drivers);\n\n    return {\n        details: raceDetails,\n        driverStandings,\n        teamStandings,\n        driversResults,\n        racesNames,\n        champions,\n        nRaces: numberOfRaces,\n        sprintDetails,\n        pointsSchema,\n        remainingRaces: remainingRacesDetails,\n        enrichedAllTime,\n        driverOfTheDayInfo\n    }\n}\n\n\nfunction getOneRaceResults(raceId, sprint = false) {\n    const sql = `\n    SELECT \n      bas.FirstName, \n      bas.LastName, \n      res.DriverID, \n      res.TeamID,\n      res.FinishingPos,\n      ${sprint ? \"\" : \"res.StartingPos, \"}\n      ${sprint ? \"res.ChampionshipPoints,\" : \"res.Points, \"}\n      res.DNF,\n      ${sprint ? \"\" : \"res.SafetyCarDeployments, \"}\n      ${sprint ? \"\" : \"res.VirtualSafetyCarDeployments, \"}\n      ${sprint ? \"res.RaceTime,\" : \"res.Time, \"}\n      ${sprint ? \"res.LapCount\" : \"res.Laps\"}\n    FROM Staff_BasicData bas\n    JOIN ${sprint ? \"Races_SprintResults\" : \"Races_Results\"} res \n      ON bas.StaffID = res.DriverID\n    WHERE res.RaceID = ?\n    ${sprint ? \"AND res.RaceFormula = 1\" : \"\"}\n    ORDER BY res.FinishingPos\n  `;\n    const rows = queryDB(sql, [raceId], 'allRows');\n\n    return rows;\n}\n\nfunction getOneQualifyingResults(raceId) {\n    const sql = `\n    SELECT \n        bas.FirstName, \n        bas.LastName, \n        res.DriverID,\n        res.TeamID,\n        res.FinishingPos,\n        res.FastestLap\n    FROM Staff_BasicData bas\n    JOIN Races_QualifyingResults res\n        ON bas.StaffID = res.DriverID\n        WHERE res.RaceID = ?\n        AND res.RaceFormula = 1\n        AND res.QualifyingStage =\n        (SELECT MAX(res2.QualifyingStage)\n        FROM Races_QualifyingResults res2\n        WHERE res2.RaceID = ? AND res2.DriverID = res.DriverID)\n        AND SprintShootout = 0\n        ORDER BY res.FinishingPos;\n    `\n\n    const rows = queryDB(sql, [raceId, raceId], 'allRows');\n\n    return rows;\n}\n\nexport function rebuildStandingsUntil(seasonResultsRaw, raceId, includeCurrentRacePrevResults = false, includeCurrentRacePoints = true, isQuali = false) {\n    //includeCurrentRacePrevResults only limits previous reace results string, points are always summed up until raceId\n    const seasonResults = (seasonResultsRaw || [])\n        .map(d => (d?.data && typeof d.data === \"object\") ? d.data : d)\n        .filter(d => d && typeof d.driverName === \"string\" && Array.isArray(d.races));\n\n    const driverMap = {};\n    const teamMap = {};\n    let racesNames = [];\n    const driversResults = [];\n    let maxPoints = 0;\n\n    seasonResults.forEach(driverRec => {\n        const name = driverRec.driverName;\n        let resultsString = \"\";\n        let driverRaces = [];\n        let nPodiums = 0;\n        let nWins = 0;\n        let nPointsFinishes = 0;\n\n        const races = driverRec.races;\n\n        // 2) Suma de puntos hasta raceId (incluye la actual; el detalle depende de includeCurrentRacePrevResults)\n        const totalDriverPoints = races.reduce((sum, r) => {\n            const thisRaceId = Number(r.raceId);\n            if (thisRaceId <= raceId) {\n                // if includeCurrentRacePrevResults is flase, don't add currentraceId to previous results string\n                if (thisRaceId < raceId || includeCurrentRacePrevResults) {\n                    driverRaces.push(getCircuitInfo(thisRaceId).country);\n                    const fin = parseInt(r.finishingPos);\n                    if (!isQuali) {\n                        resultsString += (fin !== -1 ? `P${fin}` : \"DNF\") + \", \";\n                    }\n                    else {\n                        resultsString += (r.qualifyingPos !== 99 ? `P${r.qualifyingPos}` : `P${r.startingPos}`) + \", \";\n                    }\n                    if (fin === 1) nWins++;\n                    if (fin > 0 && fin <= 3) nPodiums++;\n                    if ((parseInt(r.points) || 0) > 0) nPointsFinishes++;\n                }\n                // if includeCurrentRacePoints is true, sum points from current race\n                if (thisRaceId < raceId || includeCurrentRacePoints) {\n                    const pts = (Number(r.points) > 0) ? Number(r.points) : 0;\n                    const sprintPts = (r.sprintPoints != null && Number(r.sprintPoints) !== -1) ? Number(r.sprintPoints) : 0;\n                    return sum + pts + sprintPts;\n                    maxPoints = Math.max(maxPoints, sum + pts + sprintPts);\n                }\n            }\n            return sum;\n        }, 0);\n\n        // quita la coma y espacio final\n        if (resultsString.endsWith(\", \")) resultsString = resultsString.slice(0, -2);\n\n        if (driverRaces.length > racesNames.length) {\n            racesNames = driverRaces;\n        }\n\n        // 3) Clasificación de pilotos\n        driverMap[name] = {\n            name: news_insert_space(name),\n            driverId: driverRec.driverId,\n            points: totalDriverPoints,\n            teamId: driverRec.latestTeamId,\n            gapToLeader: 0,\n        };\n\n        driversResults.push({\n            name: news_insert_space(name),\n            resultsString,\n            nPodiums,\n            nWins,\n            teamId: driverRec.latestTeamId,\n            nPointsFinishes\n        });\n\n        // 4) Puntos por equipo por carrera\n        races.forEach(r => {\n            const thisRaceId = Number(r.raceId);\n            if (thisRaceId <= raceId) {\n                const teamId = Number(r.teamId); // <-- antes r[r.length-1]\n                const pts = (Number(r.points) > 0) ? Number(r.points) : 0;\n                const sprintPts = (r.sprintPoints != null && Number(r.sprintPoints) !== -1) ? Number(r.sprintPoints) : 0;\n                teamMap[teamId] = (teamMap[teamId] || 0) + pts + sprintPts;\n            }\n        });\n    });\n\n    const driverStandings = Object.values(driverMap).sort((a, b) => b.points - a.points);\n    //calcula gap to leader\n    if (driverStandings.length > 0) {\n        const leaderPoints = driverStandings[0].points;\n        driverStandings.forEach(driver => {\n            driver.gapToLeader = leaderPoints - driver.points;\n        });\n    }\n\n    const teamStandings = Object.entries(teamMap)\n        .map(([teamId, points]) => ({ teamId: Number(teamId), points }))\n        .sort((a, b) => b.points - a.points);\n\n    return { driverStandings, teamStandings, driversResults, racesNames };\n}\n\n\nfunction getLatestChampions(seasonId) {\n    const sql = `\n    SELECT \n      bas.FirstName, \n      bas.LastName, \n      sta.DriverID, \n      sta.Position,\n      sta.SeasonID,\n      sta.Points\n    FROM Staff_BasicData bas\n    JOIN Races_DriverStandings sta\n        ON bas.StaffID = sta.DriverID\n        WHERE sta.Position <= 3\n        AND sta.RaceFormula = 1\n        AND sta.SeasonID < ?\n    `;\n    const rows = queryDB(sql, [seasonId], 'allRows');\n\n    let champions = rows.map(row => {\n        const [nameFormatted, driverId] = formatNamesSimple(row);\n        return {\n            name: news_insert_space(nameFormatted),\n            driverId,\n            pos: row[3],\n            season: row[4],\n            points: row[5],\n        };\n    });\n\n    //order champions by season descending and by position ascending\n    champions.sort((a, b) => {\n        if (a.season === b.season) {\n            return a.pos - b.pos; // Ascending order by position\n        }\n        return b.season - a.season; // Descending order by season\n    });\n\n    return champions;\n\n}\n\nfunction getImagePath(teamId, code, type) {\n    const maxImages = {\n        'fe': 5, 'mc': 2, 'rb': 4, 'me': 4, 'al': 2, 'wi': 3,\n        'ha': 2, 'at': 2, 'af': 2, 'as': 2, 'ct': 2, 'f2': 2, 'f3': 2\n    };\n    if (type === \"raceQuali\") {\n        if (teamId === 32) {\n            return `./assets/images/news/${code.toLowerCase()}.webp`;\n        }\n\n        // Decidir si usar el code o el teamId con 50% de probabilidad\n        const useCode = Math.random() < 0.5;\n\n        if (useCode) {\n            return `./assets/images/news/${code.toLowerCase()}.webp`;\n        }\n\n        // Obtener el nombre del equipo desde el diccionario\n        const teamName = team_dict[teamId];\n\n        // Obtener el número aleatorio para el archivo\n        const max = maxImages[teamName] || 1;\n        const randomNum = getRandomInt(1, max);\n\n        return `./assets/images/news/${teamName}${randomNum}.webp`;\n    }\n    else if (type === \"transfer\") {\n        const useGeneric = Math.random() > 0.5;\n        if (useGeneric) {\n            const randomNum = getRandomInt(1, 12);\n            return `./assets/images/news/con${randomNum}.webp`;\n        }\n        else {\n            return `./assets/images/news/${code}_pad.webp`;\n        }\n    }\n    else if (type === \"transfer_generic\") {\n        const randomNum = getRandomInt(1, 9);\n        return `./assets/images/news/con${randomNum}.webp`;\n    }\n    else if (type === \"champion\") {\n        const useChamp = Math.random() < 0.5;\n        if (useChamp) {\n            const randomNum = getRandomInt(1, 5);\n            return `./assets/images/news/champ${randomNum}.webp`;\n        }\n        else {\n            return `./assets/images/news/${code}_tra.webp`;\n        }\n\n    }\n    else if (type === \"reaction\") {\n        if (code === \"mon\"){\n            return `./assets/images/news/monaco_media.webp`;\n        }\n        const useTrack = Math.random() > 0.8;\n        if (useTrack) {\n            return `./assets/images/news/${code}_tra.webp`;\n        }\n        else {\n            const useMedia = Math.random() < 0.5;\n            if (useMedia) {\n                const randomNum = getRandomInt(1, 5);\n                return `./assets/images/news/${randomNum}_media.webp`;\n            }\n            else {\n                const options = [1, 2, 3, 4, 5, 6, 8, 9, 10]\n                const randomNum = randomPick(options);\n                return `./assets/images/news/${randomNum}_gar.webp`;\n            }\n        }\n\n    }\n    else if (type === \"teamComparison\") {\n        return `./assets/images/news/${team_dict[teamId]}_factory.webp`;\n    }\n    else if (type === \"season_review\") {\n        //number bnetween 1 and 8 included 8\n        const randomNum = getRandomInt(1, 8);\n        return `./assets/images/news/${randomNum}_shot.webp`;\n    }\n    else if (type === \"dsq\") {\n        const randomNum = getRandomInt(1, 8);\n        return `./assets/images/news/dsq_${randomNum}.webp`;\n    }\n    else if (type === \"technical\") {\n        const useGeneric = Math.random() < 0.4;\n        if (useGeneric) {\n            const randomNum = getRandomInt(1, 8);\n            return `./assets/images/news/dsq_${randomNum}.webp`;\n        }\n        else {\n            const randomNum = getRandomInt(1, 3);\n            return `./assets/images/news/part_${code}_${randomNum}.webp`;\n        }\n    }\n    else if (type === \"investment\") {\n        return `./assets/images/news/${code}_inv.webp`;\n    }\n    else if (type === \"race_substitution\") {\n        return `./assets/images/news/${code}_tra.webp`;\n    }\n    else if (type === \"injury\") {\n        return `./assets/images/news/${code}_pad.webp`;\n    }\n    else if (type === \"engine\"){\n        const randomNum = getRandomInt(1, 10);\n        return `./assets/images/news/engine_${randomNum}.webp`;\n    }\n    else if (type === \"grid\"){\n        const randomNum = getRandomInt(1, 4);\n        return `./assets/images/news/grid_${randomNum}.webp`;\n    }\n    else if (type === \"young\"){\n        const randomNum = getRandomInt(1, 9);\n        return `./assets/images/news/young_${randomNum}.webp`;\n    }\n}\n\nexport function calculateTeamDropsByDate(season, date) {\n    const excelDate = dateToExcel(date);\n\n    // cachea el resultado completo de drops para esta fecha exacta\n    const dropKey = `${season}:${excelDate}`;\n    if (_dropsCache.has(dropKey)) return _dropsCache.get(dropKey);\n\n    const racesDone = fetchEventsDoneBefore(season, excelDate);\n    if (!racesDone.length) {\n        _dropsCache.set(dropKey, []);\n        return [];\n    }\n\n\n    const lastRaceId = racesDone[racesDone.length - 1];\n\n    const racesCount = queryDB(\n        `SELECT COUNT(*) FROM Races WHERE SeasonID = ? AND RaceID <= ?`, [season, lastRaceId],\n        'singleValue'\n    );\n    const firstRacePrevSeason = queryDB(\n        `SELECT MIN(RaceID) FROM Races WHERE SeasonID = ?`,\n        [season - 1],\n        'singleValue'\n    );\n    const lastYearEquivalent = firstRacePrevSeason + (racesCount - 1);\n\n    // Usa versiones cacheadas\n    const currentResults = fetchSeasonResultsCached(season);\n    const lastYearResults = fetchSeasonResultsCached(season - 1);\n\n    const currentStandings = rebuildStandingsUntil(currentResults, lastRaceId);\n    const lastYearStandings = rebuildStandingsUntil(lastYearResults, lastYearEquivalent);\n\n    const drops = currentStandings.teamStandings.map(team => {\n        const prev = lastYearStandings.teamStandings.find(t => t.teamId === team.teamId);\n        const prevPoints = prev ? prev.points : 0;\n        return { teamId: team.teamId, drop: prevPoints - team.points };\n    })\n\n    _dropsCache.set(dropKey, drops);\n    return drops;\n}\n\nexport function getTransferDetails(drivers, date = null) {\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const driverMap = []\n    drivers.forEach(d => {\n        const previousResultsTeam = queryDB(`SELECT SeasonID, Points, Position FROM Races_TeamStandings WHERE TeamID = ?`, [d.teamId], 'allRows')\n            .map(r => {\n                return {\n                    season: r[0],\n                    points: r[1],\n                    position: r[2]\n                }\n            });\n        driverMap.push({\n            driverId: d.driverId,\n            name: d.name,\n            previouslyDrivenTeams: getPreviouslyDrivenTeams(d.driverId),\n            actualTeam: d.team,\n            actualTeamPreviousResults: previousResultsTeam,\n            potentialSalary: d.potentialSalary ? d.potentialSalary : null,\n            potentialTeam: d.potentialTeam ? combined_dict[d.potentialTeam] : null,\n            potentialYearEnd: d.potentialYearEnd ? d.potentialYearEnd : null\n        })\n\n    })\n\n    let objRace;\n\n    if (date === null) {\n        const lastRaceIdThisSeason = queryDB(`SELECT MAX(RaceID) FROM Races WHERE SeasonID = ? AND State = 2`, [daySeason[1]], 'singleValue');\n        objRace = lastRaceIdThisSeason\n    }\n    else {\n        objRace = queryDB(`SELECT MAX(RaceID) FROM Races WHERE SeasonID = ? AND State = 2 AND Day <= ?`, [daySeason[1], date], 'singleValue');\n    }\n\n    const seasonResults = fetchSeasonResults(daySeason[1], true);\n    const { driverStandings, teamStandings, driversResults, racesNames } = rebuildStandingsUntil(seasonResults, objRace);\n    const driversForRecords = seasonResults.map(r => ({\n        id: r.driverId,\n        name: r.driverName ?? \"\"\n    }));\n    const enrichedAllTime = enrichDriversWithHistory(driversForRecords);\n\n    return {\n        driverMap,\n        driverStandings,\n        teamStandings,\n        driversResults,\n        racesNames,\n        enrichedAllTime,\n        season: daySeason[1]\n    }\n}\n\nexport function getTeamComparisonDetails(teamId, season, date) {\n    const lastRaceBeforeDate = queryDB(`SELECT MAX(RaceID) FROM Races WHERE SeasonID = ? AND Day < ?`, [season, date], 'singleValue');\n    const seasonResults = fetchSeasonResults(season, true);\n    const lastSeasonResults = fetchSeasonResults(season - 1);\n    const {\n        driverStandings: currentDriverStandings,\n        teamStandings: currentTeamStandings,\n        driversResults: currentDriversResults,\n        racesNames: currentRacesNames\n    } = rebuildStandingsUntil(seasonResults, lastRaceBeforeDate, true);\n\n    const racesCount = queryDB(\n        `SELECT COUNT(*) FROM Races WHERE SeasonID = ? AND RaceID <= ?`, [season, lastRaceBeforeDate],\n        'singleValue'\n    );\n\n    const firstRacePrevSeason = queryDB(\n        `SELECT MIN(RaceID) FROM Races WHERE SeasonID = ?`, [season - 1],\n        'singleValue'\n    );\n\n    const lastYearEquivalent = firstRacePrevSeason + (racesCount - 1);\n\n    const {\n        driverStandings: oldDriverStandings,\n        teamStandings: oldTeamStandings,\n        driversResults: oldDriversResults,\n        racesNames: oldRacesNames\n    } = rebuildStandingsUntil(lastSeasonResults, lastYearEquivalent, true);\n\n    const previousResultsTeam = queryDB(`SELECT SeasonID, Points, Position FROM Races_TeamStandings WHERE TeamID = ?`, [teamId], 'allRows')\n        .map(r => {\n            return {\n                season: r[0],\n                points: r[1],\n                position: r[2]\n            }\n        });\n\n    const drivers = seasonResults.map(r => ({\n        id: r.driverId,\n        name: r.driverName ?? \"\"\n    }));\n    const enrichedAllTime = enrichDriversWithHistory(drivers);\n\n    return {\n        currentDriverStandings,\n        currentTeamStandings,\n        currentDriversResults,\n        oldDriverStandings,\n        oldTeamStandings,\n        oldDriversResults,\n        currentRacesNames,\n        oldRacesNames,\n        previousResultsTeam,\n        enrichedAllTime\n    };\n}\n\n\nexport function getFullChampionSeasonDetails(season) {\n    const seasonResults = fetchSeasonResults(season, true);\n    const qualiResults = fetchQualiResults(season);\n    const lastRaceId = queryDB(`SELECT MAX(RaceID) FROM Races WHERE SeasonID = ? AND State = 2`, [season], 'singleValue');\n    const { driverStandings, teamStandings, driversResults, racesNames } = rebuildStandingsUntil(seasonResults, lastRaceId, true);\n    const { driverStandings: qualiDriverStandings, teamStandings: qualiTeamStandings, driversResults: driverQualiResults, racesNames: qualiRacesNames } = rebuildStandingsUntil(qualiResults, lastRaceId, true, true, true);\n    const champions = getLatestChampions(season);\n\n    const racesCompleted = queryDB(`SELECT COUNT(*) FROM Races WHERE SeasonID = ? AND State = 2`, [season], 'singleValue');\n    const drivers = seasonResults.map(r => ({\n        id: r.driverId,\n        name: r.driverName ?? \"\"\n    }));\n    const enrichedAllTime = enrichDriversWithHistory(drivers);\n\n    const isCreateATeam = getGlobals().isCreateATeam;\n\n    const performances = getPerformanceAllTeamsSeason(isCreateATeam);\n\n    let performanceEvolution = performances[0].slice(1, -1);\n    const remapped = performanceEvolution.map(obj => {\n        const newObj = {};\n        Object.entries(obj).forEach(([teamId, value]) => {\n            const teamName = combined_dict[teamId] ?? teamId; // fallback al id\n            newObj[teamName] = value;\n        });\n        return newObj;\n    });\n\n    return {\n        driverStandings,\n        teamStandings,\n        driversResults,\n        driverQualiResults,\n        racesNames,\n        champions,\n        carsPerformance: remapped,\n        enrichedAllTime: enrichedAllTime,\n    }\n\n}\n\nexport function getFullFeederSeriesDetails(season) {\n    const f2 = buildFeederSeriesSeasonDetails(season, 2);\n    const f3 = buildFeederSeriesSeasonDetails(season, 3);\n\n    return { f2, f3 };\n}\n\nfunction buildFeederSeriesSeasonDetails(season, formula) {\n    const seasonResults = fetchSeasonResults(season, true, false, formula) || [];\n    const byDriverId = new Map(\n        seasonResults.map(r => [Number(r.driverId), r])\n    );\n\n    const standingsRows = queryDB(`\n        SELECT DriverID, Points, Position\n        FROM Races_DriverStandings\n        WHERE SeasonID = ?\n          AND RaceFormula = ?\n        ORDER BY Position\n    `, [season, formula], 'allRows') || [];\n\n    const driverStandings = standingsRows.map(([driverId, points]) => {\n        const id = Number(driverId);\n        const rec = byDriverId.get(id);\n        const rawName = rec?.driverName ?? `Driver ${id}`;\n        return {\n            name: news_insert_space(rawName),\n            driverId: id,\n            points: Number(points) || 0,\n            teamId: Number(rec?.latestTeamId) || 0,\n            gapToLeader: 0,\n        };\n    });\n\n    if (driverStandings.length > 0) {\n        const leaderPoints = driverStandings[0].points;\n        driverStandings.forEach(d => {\n            d.gapToLeader = leaderPoints - d.points;\n        });\n    }\n\n    const teamStandingsRows = queryDB(`\n        SELECT TeamID, Points, Position\n        FROM Races_TeamStandings\n        WHERE SeasonID = ?\n          AND RaceFormula = ?\n        ORDER BY Position\n    `, [season, formula], 'allRows') || [];\n\n    const teamStandings = teamStandingsRows.map(([teamId, points]) => ({\n        teamId: Number(teamId),\n        points: Number(points) || 0\n    }));\n\n    const driversResults = seasonResults.map(driverRec => {\n        const rawName = driverRec?.driverName ?? `Driver ${driverRec?.driverId}`;\n        const name = news_insert_space(rawName);\n\n        let resultsString = \"\";\n        let nPodiums = 0;\n        let nWins = 0;\n        let nPointsFinishes = 0;\n\n        const races = Array.isArray(driverRec?.races) ? driverRec.races : [];\n        races.forEach(r => {\n            const fin = Number(r.finishingPos);\n            const sprintFin = (r.sprintPos == null) ? null : Number(r.sprintPos);\n\n            const mainStr =\n                (fin > 0 && fin !== 99) ? `P${fin}` : \"DNF\";\n\n            if (fin === 1) nWins++;\n            if (fin > 0 && fin <= 3) nPodiums++;\n\n            const featurePts = (Number(r.points) > 0) ? Number(r.points) : 0;\n            const sprintPts = (r.sprintPoints != null && Number(r.sprintPoints) > 0)\n                ? Number(r.sprintPoints)\n                : 0;\n            if ((featurePts + sprintPts) > 0) nPointsFinishes++;\n\n            let sprintPart = \"\";\n            if (sprintFin != null) {\n                const sprintStr =\n                    (sprintFin > 0 && sprintFin !== 99) ? `P${sprintFin}` : \"DNF\";\n                sprintPart = ` (SPR ${sprintStr})`;\n            }\n\n            resultsString += `${mainStr}${sprintPart}, `;\n        });\n\n        if (resultsString.endsWith(\", \")) resultsString = resultsString.slice(0, -2);\n\n        return {\n            name,\n            resultsString,\n            nPodiums,\n            nWins,\n            teamId: Number(driverRec?.latestTeamId) || 0,\n            nPointsFinishes\n        };\n    });\n\n    return { driverStandings, teamStandings, driversResults, enrichedAllTime: [] };\n}\n\nexport function getPreviouslyDrivenTeams(driverId) {\n    //select distinct from every race that is not raceID 122 or raceID 124\n    const sql = `\n        SELECT DISTINCT TeamID, Season\n        FROM Races_Results\n        WHERE DriverID = ? AND RaceID NOT IN (122, 124, 100, 101)\n    `\n    const rows = queryDB(sql, [driverId], 'allRows');\n    const teams = rows.map(r => {\n        return {\n            teamId: r[0],\n            season: r[1],\n            teamName: combined_dict[r[0]],\n        }\n    });\n\n    return teams;\n}\n\nfunction buildPointsTable(positionAndPointsRows) {\n    // rows: [RacePos, Points]\n    const tbl = new Map();\n    for (const [pos, pts] of positionAndPointsRows) {\n        tbl.set(Number(pos), Number(pts) || 0);\n    }\n    return tbl;\n}\n\nfunction getBasePointsForPos(pos, pointsTable, doublePoints, isLastRace = false) {\n    const base = pointsTable.get(pos) ?? 0;\n    return doublePoints && isLastRace ? base * 2 : base;\n}\n\n// ---- Fastest Lap (FastestLap en segundos) ----\nfunction getFastestLapHolderBySeconds(raceId, queryDB) {\n    const row = queryDB(`\n    SELECT DriverID \n    FROM Races_Results\n    WHERE RaceID = ? AND FastestLap IS NOT NULL AND FastestLap > 0\n    ORDER BY FastestLap ASC\n    LIMIT 1\n  `, [raceId], 'singleRow');\n    return row ? Number(row[0]) : null;\n}\n\nexport function checkDoublePointsBug(turningPointState){\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    let wasBugged = {result : false, raceId: null};\n    const ilegalRaces = turningPointState.ilegalRaces\n    if (ilegalRaces.length === 0) return wasBugged;\n\n    for (let i = 0; i < ilegalRaces.length; i++) {\n        let raceId = ilegalRaces[i].race_id;\n        let winnerRow = queryDB(`\n            SELECT DriverID, Points FROM Races_Results\n            WHERE RaceID = ? AND FinishingPos = 1\n        `, [raceId], 'singleRow');\n        \n        let winnerRowPrevRace = queryDB(`\n            SELECT DriverID, Points FROM Races_Results\n            WHERE RaceID = ? AND FinishingPos = 1 AND Season = ?\n        `, [raceId - 1, daySeason[1]], 'singleRow');\n        //if it doesnt existe then take the next race\n        if (!winnerRowPrevRace) {\n            winnerRowPrevRace = queryDB(`\n                SELECT DriverID, Points FROM Races_Results\n                WHERE RaceID = ? AND FinishingPos = 1 AND Season = ?\n            `, [raceId + 1, daySeason[1]], 'singleRow');\n        }\n\n        //if points are more than double, then bug happened\n        if (winnerRow && winnerRowPrevRace) {\n            if (Number(winnerRow[1]) >= Number(winnerRowPrevRace[1]) * 2) {\n                wasBugged = {result : true, raceId: raceId};\n                return wasBugged;\n            }\n        }\n\n    }\n\n    return wasBugged;\n}\n\nexport function fixDoublePointsBug(raceId) {\n    const rows = queryDB(`\n        SELECT DriverID, Points \n        FROM Races_Results\n        WHERE RaceID = ? AND Points > 0\n    `, [raceId], 'allRows');\n\n    for (let i = 0; i < rows.length; i++) {\n        let driverId = rows[i][0];\n        let champPoints = Number(rows[i][1]);\n        let fixedPoints = Math.floor(champPoints / 2);\n        queryDB(`\n            UPDATE Races_Results SET Points = ?\n            WHERE RaceID = ? AND DriverID = ?\n        `, [fixedPoints, raceId, driverId], 'run');\n    }\n    \n}\n\n/**\n * Descalifica al equipo y recalcula todo lo necesario (pilotos + constructores + vuelta rápida).\n *\n * @param {Object} params\n * @param {number} params.raceId\n * @param {number} params.teamId\n * @param {Function} params.queryDB\n * @param {Object} params.pointsReg - objeto de fetchPointsRegulations()\n */\nfunction disqualifyTeamInRace({\n    raceId,\n    teamId,\n    queryDB,\n    pointsReg,\n}) {\n    // 0) Contexto temporada\n    const daySeason = queryDB(`SELECT Day, CurrentSeason FROM Player_State`, [], 'singleRow');\n    const seasonId = daySeason?.[1];\n\n    // 1) Config de puntos\n    const pointsTable = buildPointsTable(pointsReg.positionAndPoints);\n    const flEnabled = Number(pointsReg.fastestLapBonusPoint) === 1;\n    const doublePts = pointsReg.isLastraceDouble ? true : false; //falta añadir que si la regulacion esta activa Y ES LA ULTIMA CARRERA\n\n    // 2) Estado inicial de la carrera\n    const allRes = queryDB(`\n    SELECT DriverID, TeamID, FinishingPos, Points, IFNULL(DNF,0) AS DNF, FastestLap\n    FROM Races_Results\n    WHERE RaceID = ?\n    ORDER BY FinishingPos ASC\n  `, [raceId], 'allRows') || [];\n    if (!allRes.length) return;\n\n    const prevRacePoints = new Map(); // DriverID -> puntos antes\n    const driverTeam = new Map(); // DriverID -> TeamID\n    for (const r of allRes) {\n        prevRacePoints.set(Number(r[0]), Number(r[3]) || 0);\n        driverTeam.set(Number(r[0]), Number(r[1]));\n    }\n\n    // Identifica DSQ del teamId\n    const dsqRows = allRes.filter(r => Number(r[1]) === Number(teamId));\n    if (!dsqRows.length) return;\n    const dsqIds = new Set(dsqRows.map(r => Number(r[0])));\n\n    // 1) Offset temporal a TODA la carrera para no violar UNIQUE\n    queryDB(`\n    UPDATE Races_Results\n    SET FinishingPos = FinishingPos + 1000\n    WHERE RaceID = ?\n  `, [raceId], 'run');\n\n    // 2) Construye el nuevo orden completo\n    const classified = allRes\n        .filter(r => r[4] === 0 && !dsqIds.has(Number(r[0])))\n        .sort((a, b) => a[2] - b[2]); // por FinishingPos original\n\n    const dnfsOther = allRes\n        .filter(r => r[4] === 1 && !dsqIds.has(Number(r[0])))\n        .sort((a, b) => a[2] - b[2]); // conserva su orden relativo\n\n    const dsqSorted = dsqRows.slice().sort((a, b) => a[2] - b[2]); // el que estaba más arriba primero\n\n    // 3) Reasignar FinishingPos secuencialmente y puntos base\n    let pos = 1;\n    const afterRacePoints = new Map(); // DriverID -> puntos tras recálculo (sin FL aún)\n\n    const lastRace = queryDB(`SELECT MAX(RaceID) FROM Races WHERE SeasonID = ?`, [seasonId], 'singleValue');\n    const isLastRace = Number(raceId) === Number(lastRace);\n\n    // Clasificados: posiciones 1..K + puntos\n    for (const r of classified) {\n        const driverId = Number(r[0]);\n        const pts = getBasePointsForPos(pos, pointsTable, doublePts, isLastRace);\n        afterRacePoints.set(driverId, pts);\n        queryDB(`\n      UPDATE Races_Results\n      SET FinishingPos = ?, Points = ?, DNF = 0\n      WHERE RaceID = ? AND DriverID = ?\n    `, [pos, pts, raceId, driverId], 'run');\n        pos++;\n    }\n\n    // DNFs no DSQ: van detrás de clasificados, sin puntos\n    for (const r of dnfsOther) {\n        const driverId = Number(r[0]);\n        afterRacePoints.set(driverId, 0);\n        queryDB(`\n      UPDATE Races_Results\n      SET FinishingPos = ?, Points = 0, DNF = 1\n      WHERE RaceID = ? AND DriverID = ?\n    `, [pos, raceId, driverId], 'run');\n        pos++;\n    }\n\n    // DSQ del equipo: los dos últimos\n    for (let i = 0; i < dsqSorted.length; i++) {\n        const driverId = Number(dsqSorted[i][0]);\n        afterRacePoints.set(driverId, 0);\n        queryDB(`\n      UPDATE Races_Results\n      SET FinishingPos = ?, Points = 0, DNF = 1\n      WHERE RaceID = ? AND DriverID = ?\n    `, [pos, raceId, driverId], 'run');\n        pos++;\n    }\n\n    // 4) BONUS VUELTA RÁPIDA (si habilitado y el portador queda top-10 y DNF=0)\n    if (flEnabled) {\n        const flDriver = getFastestLapHolderBySeconds(raceId, queryDB);\n        if (flDriver != null && !dsqIds.has(flDriver)) {\n            const row = queryDB(`\n        SELECT FinishingPos, IFNULL(DNF,0)\n        FROM Races_Results\n        WHERE RaceID = ? AND DriverID = ?\n      `, [raceId, flDriver], 'singleRow');\n            const fPos = Number(row?.[0] ?? 9999);\n            const fDNF = Number(row?.[1] ?? 0);\n\n            if (fDNF === 0 && fPos <= 10) {\n                const bonus = 1;\n                const base = afterRacePoints.get(flDriver) ?? 0;\n                const withBonus = base + bonus;\n                afterRacePoints.set(flDriver, withBonus);\n                queryDB(`\n                    UPDATE Races_Results\n                    SET Points = ?\n                    WHERE RaceID = ? AND DriverID = ?\n                `, [withBonus, raceId, flDriver], 'run');\n            }\n        }\n    }\n\n    if (Number(pointsReg.poleBonusPoint) === 1) {\n        const poleDriverId = queryDB(`\n        SELECT DriverID\n        FROM Races_Results\n        WHERE RaceID = ? AND StartingPos = 1\n    `, [raceId], 'singleValue');\n\n        if (poleDriverId != null) {\n            const poleId = Number(poleDriverId);\n            if (!dsqIds.has(poleId)) {\n                // Si tu normativa NO duplica la pole, fija bonus = 1.\n                const bonus = 1;\n                const base = afterRacePoints.get(poleId) ?? 0;\n                const withBonus = base + bonus;\n                afterRacePoints.set(poleId, withBonus);\n\n                queryDB(`\n                UPDATE Races_Results\n                SET Points = ?\n                WHERE RaceID = ? AND DriverID = ?\n            `, [withBonus, raceId, poleId], 'run');\n            }\n        }\n    }\n\n    // 5) Deltas campeonato (pilotos) + acumulado por equipo (constructores)\n    const teamDelta = new Map(); // TeamID -> delta total\n    for (const r of allRes) {\n        const driverId = Number(r[0]);\n        const team = driverTeam.get(driverId);\n        const before = prevRacePoints.get(driverId) || 0;\n        const after = afterRacePoints.get(driverId) ?? 0;\n        const delta = after - before;\n\n        if (delta !== 0 && seasonId != null) {\n            queryDB(`\n        UPDATE Races_DriverStandings\n        SET Points = Points + ?\n        WHERE SeasonID = ? AND DriverID = ?\n      `, [delta, seasonId, driverId], 'run');\n        }\n        teamDelta.set(team, (teamDelta.get(team) || 0) + delta);\n    }\n\n    if (seasonId != null) {\n        for (const [team, delta] of teamDelta.entries()) {\n            if (delta !== 0) {\n                queryDB(`\n          UPDATE Races_TeamStandings\n          SET Points = Points + ?\n          WHERE SeasonID = ? AND TeamID = ?\n        `, [delta, seasonId, team], 'run');\n            }\n        }\n        queryDB(`\n        WITH ranked AS (\n            SELECT\n                DriverID,\n                ROW_NUMBER() OVER (PARTITION BY SeasonID ORDER BY Points DESC, DriverID ASC) AS pos\n            FROM Races_DriverStandings\n            WHERE SeasonID = ?\n            AND RaceFormula = 1\n        )\n        UPDATE Races_DriverStandings\n        SET Position = (\n            SELECT pos\n            FROM ranked\n            WHERE ranked.DriverID = Races_DriverStandings.DriverID\n              AND RaceFormula = 1\n        )\n        WHERE SeasonID = ?\n        AND RaceFormula = 1;\n    `, [seasonId, seasonId], 'run');\n\n        // Recalcular posición en la clasificación de constructores\n        queryDB(`\n        WITH ranked AS (\n            SELECT\n                TeamID,\n                ROW_NUMBER() OVER (PARTITION BY SeasonID ORDER BY Points DESC, TeamID ASC) AS pos\n            FROM Races_TeamStandings\n            WHERE SeasonID = ?\n            AND RaceFormula = 1\n        )\n        UPDATE Races_TeamStandings\n        SET Position = (\n            SELECT pos\n            FROM ranked\n            WHERE ranked.TeamID = Races_TeamStandings.TeamID\n            AND RaceFormula = 1\n        )\n        WHERE SeasonID = ?\n        AND RaceFormula = 1;\n    `, [seasonId, seasonId], 'run');\n    }\n}\n\n\nfunction getRandomInt(min, max) {\n    return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\n// SAVING NEWS\nconst encodeJSON = (obj) =>\n    USE_COMPRESSION ? LZString.compressToUTF16(JSON.stringify(obj)) : JSON.stringify(obj);\n\nconst decodeJSON = (txt) => {\n    if (!txt) return {};\n    const raw = USE_COMPRESSION ? LZString.decompressFromUTF16(txt) : txt;\n    try { return JSON.parse(raw || \"{}\"); } catch { return {}; }\n};\n\n// --- DB helpers ---\nexport function ensureEditorStateTable() {\n    const exists = queryDB(\n        `SELECT name FROM sqlite_master WHERE type='table' AND name='Custom_News_State'`,\n        [],\n        \"singleRow\"\n    );\n    if (!exists) queryDB(`CREATE TABLE Custom_News_State (key TEXT PRIMARY KEY, value TEXT)`, [], 'run');\n}\n\nexport function getEditorState(key) {\n    ensureEditorStateTable();\n    const row = queryDB(`SELECT value FROM Custom_News_State WHERE key = ?`, [key], \"singleRow\");\n    return row ? row[0] : null;\n}\n\nexport function setEditorState(key, valueText) {\n    ensureEditorStateTable();\n    queryDB(`\n    INSERT INTO Custom_News_State (key,value) VALUES (?, ?)\n    ON CONFLICT(key) DO UPDATE SET value=excluded.value\n  `, [key, valueText], 'run');\n}\n\n// --- computeStableKey compartido (mismo algoritmo en front y worker) ---\nexport function computeStableKey(n) {\n    if (n.id != null && n.id !== \"\") return String(n.id);\n    // ajusta por tipo si quieres; fallback seguro:\n    return `h:${n.type}|${n.title}|${n.date}`;\n}\n\n// --- NEWS: load/save/upsert ---\nexport function loadNewsMapFromDB(season = null) {\n    const globals = getGlobals();\n    if (season == null) {\n        season = globals?.currentDate[1];\n    }\n    const key = `${season}_news`;\n    return decodeJSON(getEditorState(key)) || {};\n}\n\nexport function saveNewsToDBMap(map) {\n    const globals = getGlobals();\n    const year = globals?.currentDate[1]\n    const key = `${year}_news`;\n    setEditorState(key, encodeJSON(map));\n}\n\nexport function deleteNews() {\n    const globals = getGlobals();\n    const year = globals?.currentDate[1]\n    const key = `${year}_news`;\n    setEditorState(key, encodeJSON({}));\n}\n\nexport function deleteTurningPoints() {\n    const globals = getGlobals();\n    const year = globals?.currentDate[1]\n    const key = `${year}_turning_points`;\n    setEditorState(key, encodeJSON({}));\n}\n\nexport function upsertNews(newsList = []) {\n    const prev = loadNewsMapFromDB();\n    const out = { ...prev };\n    for (const n of newsList) {\n        const key = n.stableKey ?? computeStableKey(n);\n        const old = out[key] || {};\n        out[key] = {\n            ...old,\n            title: n.title,\n            type: n.type,\n            date: n.date,\n            image: n.image,\n            overlay: n.overlay,\n            data: n.data,\n            text: n.text ?? old.text,\n            turning_point_type: n.turning_point_type ?? old.turning_point_type,\n            nonReadable: n.nonReadable ?? old.nonReadable,\n            hiddenByAvailability: n.hiddenByAvailability ?? old.hiddenByAvailability,\n            hiddenReason: n.hiddenReason ?? old.hiddenReason,\n            stableKey: key,\n        };\n    }\n    saveNewsToDBMap(out);\n    return out; // por si quieres devolver el estado\n}\n\n// --- TP: load/save/upsert (simple: arrays -> replace, objetos -> merge, primitivos -> replace) ---\nexport function loadTPFromDB(season = null) {\n    const globals = getGlobals();\n    if (season == null) {\n        season = globals?.currentDate[1];\n    }\n    const key = `${season}_turning_points`;\n    return decodeJSON(getEditorState(key)) || {};\n}\n\nexport function saveTPToDBMap(map) {\n    const globals = getGlobals();\n    const year = globals?.currentDate[1]\n    const key = `${year}_turning_points`;\n    setEditorState(key, encodeJSON(map));\n}\n\nexport function upsertTurningPoints(tpPartial = {}) {\n    const prev = loadTPFromDB();\n    const out = { ...prev };\n    for (const [k, v] of Object.entries(tpPartial)) {\n        const old = out[k];\n        if (Array.isArray(v)) out[k] = v.slice();\n        else if (v && typeof v === \"object\") out[k] = { ...(old || {}), ...v };\n        else out[k] = v;\n    }\n    saveTPToDBMap(out);\n    return out;\n}\n\nexport function updateNewsFields(stableKey, patch) {\n    const map = loadNewsMapFromDB();\n    const old = map[stableKey] || null;\n    if (!old) return false; // o lanzar error si prefieres\n\n    // Solo actualiza los campos permitidos\n    const allowed = [\"text\", \"turning_point_type\", \"nonReadable\", \"hiddenByAvailability\", \"hiddenReason\", \"overlay\", \"image\", \"title\"];\n    const next = { ...old };\n    for (const k of allowed) {\n        if (patch[k] !== undefined) next[k] = patch[k];\n    }\n    map[stableKey] = next;\n    saveNewsToDBMap(map);\n    return true;\n}\n\nexport function deleteNewByKey(stableKey) {\n    const map = loadNewsMapFromDB();\n    if (map[stableKey]) {\n        delete map[stableKey];\n        saveNewsToDBMap(map);\n        return true;\n    }\n    return false;\n}\n\nexport function isMigrationDone() {\n    return getEditorState(\"_migration_v1_done\") === \"1\";\n}\nexport function markMigrationDone() {\n    setEditorState(\"_migration_v1_done\", \"1\");\n}\n\n// util segura\nfunction safeParse(txt, fallback) {\n    try { return JSON.parse(txt); } catch { return fallback; }\n}\n\nfunction mergeNewsMaps(dbMap, lsMap) {\n    // preferimos LS para no perder artículos generados/ediciones locales\n    return { ...dbMap, ...lsMap };\n}\nfunction mergeTPMaps(dbMap, lsMap) {\n    const out = { ...dbMap };\n    for (const [k, v] of Object.entries(lsMap)) {\n        const old = out[k];\n        if (Array.isArray(v)) out[k] = v.slice();                 // arrays -> replace\n        else if (v && typeof v === \"object\") out[k] = { ...(old || {}), ...v }; // objetos -> merge\n        else out[k] = v;                                          // primitivos/null -> replace\n    }\n    return out;\n}\n\nexport function migrateLegacyData(lsNewsTxt, lsTPTxt) {\n    if (isMigrationDone()) return \"already\"; // idempotente\n\n    if (lsNewsTxt) {\n        const lsNewsMap = safeParse(lsNewsTxt, {});\n        const dbNewsMap = loadNewsMapFromDB();\n        const outNews = mergeNewsMaps(dbNewsMap, lsNewsMap);\n        saveNewsToDBMap(outNews);\n    }\n\n    if (lsTPTxt) {\n        const lsTPMap = safeParse(lsTPTxt, {});\n        const dbTPMap = loadTPFromDB();\n        const outTP = mergeTPMaps(dbTPMap, lsTPMap);\n        saveTPToDBMap(outTP);\n    }\n\n    markMigrationDone();\n    return \"migrated\";\n}\n\nexport function ensureTurningPointsStructure() {\n    const globals = getGlobals?.(); // si lo tienes disponible\n    const year = globals?.currentDate?.[1];\n    const key = `${year}_tps`;\n\n    let data = loadTPFromDB();\n    if (data && Object.keys(data).length > 0) {\n        return data;\n    }\n\n    // Estructura por defecto\n    const defaultStructure = {\n        checkedRaces: [],\n        ilegalRaces: [],\n        transfers: { 5: null, 6: null, 7: null },\n        technicalDirectives: { 6: null, 9: null },\n        investmentOpportunities: {\n            4: null, 5: null, 6: null, 7: null,\n            8: null, 9: null, 10: null, 11: null\n        },\n        raceSubstitutionOpportunities: {\n            4: null, 5: null, 6: null, 7: null,\n            8: null, 9: null, 10: null, 11: null\n        },\n        youngDrivers: null\n    };\n\n    // guarda en DB si no existía\n    saveTPToDBMap(defaultStructure);\n\n    return defaultStructure;\n}\n\nexport function getNewsAndTpYearsAvailable() {\n    const minYear = isTimeTravel2026Enabled() ? 2026 : 0;\n    const yearsSet = new Set();\n    const editorStateRows = queryDB(\n        `SELECT key FROM Custom_News_State WHERE key LIKE '%_news' OR key LIKE '%_turning_points'`,\n        [],\n        'allRows'\n    );\n    for (const [key] of editorStateRows) {\n        const match = key.match(/^(\\d{4})_(news|turning_points)$/);\n        if (match) {\n            const year = Number(match[1]);\n            if (year >= minYear) {\n                yearsSet.add(year);\n            }\n        }\n    }\n    const years = Array.from(yearsSet);\n    years.sort((a, b) => b - a);\n    return years;\n}\n\nexport function getNewsFromSeason(season) {\n    const newsMap = loadNewsMapFromDB(season);\n    const tpMap = loadTPFromDB(season);\n    return { newsList: Object.values(newsMap).sort((a, b) => new Date(b.date) - new Date(a.date)), turningPointState: tpMap };\n}\n\n\nexport function startInjurySwap(injuredId, reserveData, endDay) {\n    const [dayNow, seasonId] = queryDB(`\n        SELECT Day, CurrentSeason\n        FROM Player_State\n    `, [], 'singleRow');\n    let reserveId = reserveData.id;\n\n\n    if (reserveData.isFreeAgent) {\n        let teamId = reserveData.futureTeamId\n        hireDriver(\"auto\", reserveId, teamId, 10);\n    }\n\n    swapDrivers(injuredId, reserveId);\n\n    return { seasonId, dayNow };\n}\n\n\n\n\nfunction applyDriverInjury(turningPointData) {\n    // 1) Aplicar lesión y registrar\n    const injuredId = turningPointData.driver_affected.id;\n    const reserveData = turningPointData.reserve_driver\n    const endDay = turningPointData.condition.end_date;\n    let reserveId = reserveData.id;\n    const { seasonId } = startInjurySwap(injuredId, reserveData, endDay);\n}\n"
  },
  {
    "path": "src/js/backend/scriptUtils/recordUtils.js",
    "content": "import { queryDB, setMetaData, getMetadata } from \"../dbManager.js\";\nimport { formatNamesSimple, fetchDriverOfTheDayCounts, fetchDriversStandings, fetchTeamsStandingsWithPoints, fetchTeamMateQualiRaceHeadToHead, fetchTeamSeasonPodiumsTotals, fetchTeamSeasonPolesTotals, fetchTeamSeasonWinsTotals, fetchEventsFrom, fetchPointsRegulations, fetchLastCompletedRaceId, ensureCustomDoDRankingTable } from \"./dbUtils.js\";\nimport records from \"../../../data/records.json\";\nimport { getGlobals } from \"../commandGlobals.js\";\nfunction idsToCsv(ids) {\n    return Array.from(new Set(ids)).filter(x => x != null).join(\",\");\n}\n\nfunction fetchHistoryMap(tableName, ids) {\n    if (!ids.length) return new Map();\n    const placeholders = ids.map(() => '?').join(',');\n    const rows = queryDB(`\n    SELECT \n      StaffID,\n      TotalStarts,\n      FirstRace   AS FirstRaceSeason,   FirstRaceTrackID,\n      FirstPodium AS FirstPodiumSeason, FirstPodiumTrackID,\n      FirstWin    AS FirstWinSeason,    FirstWinTrackID,\n      LastWin     AS LastWinSeason,     LastWinTrackID,\n      TotalPoles, TotalPodiums, TotalWins, TotalSprintWins, TotalChampionshipWins, TotalPointsScored, TotalFastestLaps\n    FROM ${tableName}\n    WHERE StaffID IN (${placeholders})\n    AND Formula = 1\n  `, ids, 'allRows') || [];\n\n    const map = new Map();\n    for (const r of rows) {\n        map.set(r[0], {\n            totalStarts: r[1] ?? 0,\n            firstRace: { season: r[2], trackId: r[3] },\n            firstPodium: { season: r[4], trackId: r[5] },\n            firstWin: { season: r[6], trackId: r[7] },\n            lastWin: { season: r[8], trackId: r[9] },\n            totalPoles: r[10] ?? 0,\n            totalPodiums: r[11] ?? 0,\n            totalWins: r[12] ?? 0,\n            totalSprintWins: r[13] ?? 0,\n            totalChampionshipWins: r[14] ?? 0,\n            totalPointsScored: r[15] ?? 0,\n            totalFastestLaps: r[16] ?? 0\n        });\n    }\n    return map;\n}\n\nexport function fetchDriverHistoryRecords(historyTable, ids, season) {\n    const map = new Map();\n    if (!ids || !ids.length) return map;\n\n    const placeholders = ids.map(() => '?').join(',');\n\n    const historyRows = queryDB(`\n    SELECT \n      StaffID,\n      TotalStarts,\n      FirstRace   AS FirstRaceSeason,   FirstRaceTrackID,\n      FirstPodium AS FirstPodiumSeason, FirstPodiumTrackID,\n      FirstWin    AS FirstWinSeason,    FirstWinTrackID,\n      LastWin     AS LastWinSeason,     LastWinTrackID,\n      TotalPoles, TotalPodiums, TotalWins, TotalSprintWins, TotalChampionshipWins, TotalPointsScored, TotalFastestLaps\n    FROM ${historyTable}\n    WHERE StaffID IN (${placeholders})\n      AND Formula = 1\n  `, ids, 'allRows') || [];\n\n    for (const r of historyRows) {\n        map.set(r[0], {\n            totalStarts: r[1] ?? 0,\n            firstRace: { season: r[2] ?? null, trackId: r[3] ?? null },\n            firstPodium: { season: r[4] ?? null, trackId: r[5] ?? null },\n            firstWin: { season: r[6] ?? null, trackId: r[7] ?? null },\n            lastWin: { season: r[8] ?? null, trackId: r[9] ?? null },\n            totalPoles: r[10] ?? 0,\n            totalPodiums: r[11] ?? 0,\n            totalWins: r[12] ?? 0,\n            totalSprintWins: r[13] ?? 0,\n            totalChampionshipWins: r[14] ?? 0,\n            totalPointsScored: r[15] ?? 0,\n            totalFastestLaps: r[16] ?? 0,\n        });\n    }\n\n    for (const id of ids) {\n        if (!map.has(id)) {\n            map.set(id, {\n                totalStarts: 0,\n                firstRace: { season: null, trackId: null },\n                firstPodium: { season: null, trackId: null },\n                firstWin: { season: null, trackId: null },\n                lastWin: { season: null, trackId: null },\n                totalPoles: 0, totalPodiums: 0, totalWins: 0,\n                totalSprintWins: 0, totalChampionshipWins: 0,\n                totalPointsScored: 0, totalFastestLaps: 0\n            });\n        }\n    }\n\n    if (season != null) {\n        const seasonRows = queryDB(`\n      SELECT\n        StaffID,\n        TotalPoles, TotalPodiums, TotalWins, TotalSprintWins,\n        TotalChampionshipWins, TotalPointsScored, TotalFastestLaps, TotalStarts\n      FROM Staff_Driver_RaceRecordPerSeason\n      WHERE StaffID IN (${placeholders})\n        AND SeasonID = ?\n    `, [...ids, season], 'allRows') || [];\n\n        for (const r of seasonRows) {\n            const id = r[0];\n            const base = map.get(id) || {\n                totalStarts: 0,\n                firstRace: { season: null, trackId: null },\n                firstPodium: { season: null, trackId: null },\n                firstWin: { season: null, trackId: null },\n                lastWin: { season: null, trackId: null },\n                totalPoles: 0, totalPodiums: 0, totalWins: 0,\n                totalSprintWins: 0, totalChampionshipWins: 0,\n                totalPointsScored: 0, totalFastestLaps: 0,\n                totalStarts: 0\n            };\n\n            base.totalPoles = r[1] ?? 0;\n            base.totalPodiums = r[2] ?? 0;\n            base.totalWins = r[3] ?? 0;\n            base.totalSprintWins = r[4] ?? 0;\n            base.totalChampionshipWins = r[5] ?? 0;\n            base.totalPointsScored = r[6] ?? 0;\n            base.totalFastestLaps = r[7] ?? 0;\n            base.totalStarts = r[8] ?? 0;\n\n            map.set(id, base);\n        }\n    }\n\n    return map;\n}\n\n\n\nfunction validSeason(x) {\n    return x && x.season && x.season !== 0;\n}\n\nexport function enrichDriversWithHistory(drivers, season = null) {\n    if (!drivers || drivers.length === 0) return drivers;\n\n    const ids = drivers.map(d => d.id);\n\n    const BEFORE = \"Staff_Driver_RaceRecordBeforeGameStart\";\n    const SINCE = \"Staff_Driver_RaceRecordSinceGameStart\";\n\n    const bMap = fetchDriverHistoryRecords(BEFORE, ids, season);\n    const sMap = fetchDriverHistoryRecords(SINCE, ids, season);\n\n    return drivers.map(d => {\n        const b = bMap.get(d.id) || {};\n        const s = sMap.get(d.id) || {};\n\n        const firstRace = validSeason(b.firstRace) ? b.firstRace : (validSeason(s.firstRace) ? s.firstRace : { season: 0, trackId: null });\n        const firstPodium = validSeason(b.firstPodium) ? b.firstPodium : (validSeason(s.firstPodium) ? s.firstPodium : { season: 0, trackId: null });\n        const firstWin = validSeason(b.firstWin) ? b.firstWin : (validSeason(s.firstWin) ? s.firstWin : { season: 0, trackId: null });\n\n        const lastWin = validSeason(s.lastWin) ? s.lastWin : (validSeason(b.lastWin) ? b.lastWin : { season: 0, trackId: null });\n\n        let totalPoles, totalPodiums, totalWins, totalSprintWins, totalChampionshipWins, totalPointsScored, totalFastestLaps, totalStarts;\n\n        if (!season) {\n            totalPoles = (b.totalPoles ?? 0) + (s.totalPoles ?? 0);\n            totalPodiums = (b.totalPodiums ?? 0) + (s.totalPodiums ?? 0);\n            totalWins = (b.totalWins ?? 0) + (s.totalWins ?? 0);\n            totalSprintWins = (b.totalSprintWins ?? 0) + (s.totalSprintWins ?? 0);\n            totalChampionshipWins = (b.totalChampionshipWins ?? 0) + (s.totalChampionshipWins ?? 0);\n            totalPointsScored = (b.totalPointsScored ?? 0) + (s.totalPointsScored ?? 0);\n            totalFastestLaps = (b.totalFastestLaps ?? 0) + (s.totalFastestLaps ?? 0);\n            totalStarts = (b.totalStarts ?? 0) + (s.totalStarts ?? 0);\n        } else {\n            totalPoles = s.totalPoles ?? 0;\n            totalPodiums = s.totalPodiums ?? 0;\n            totalWins = s.totalWins ?? 0;\n            totalSprintWins = s.totalSprintWins ?? 0;\n            totalChampionshipWins = s.totalChampionshipWins ?? 0;\n            totalPointsScored = s.totalPointsScored ?? 0;\n            totalFastestLaps = s.totalFastestLaps ?? 0;\n            totalStarts = s.totalStarts ?? 0;\n        }\n\n        return {\n            ...d,\n            totalStarts,\n            firstRace,\n            firstPodium,\n            firstWin,\n            lastWin,\n            totalPoles,\n            totalPodiums,\n            totalWins,\n            totalSprintWins,\n            totalChampionshipWins,\n            totalPointsScored,\n            totalFastestLaps\n        };\n    });\n}\n\nexport function getSelectedRecord(type, year) {\n    let recordTargetColumn, recordTargetTable;\n\n    if (type === \"dotd\") {\n        if (year === \"all\") {\n            ensureCustomDoDRankingTable();\n            const rows = queryDB(`\n        SELECT\n          bas.FirstName,\n          bas.LastName,\n          t.DriverID,\n          COUNT(*) AS Count,\n          COALESCE((\n            SELECT w.TeamID\n            FROM Custom_DriverOfTheDay_Ranking w\n            JOIN Races r ON r.RaceID = w.RaceID\n            WHERE w.Rank = 1\n              AND w.DriverID = t.DriverID\n            ORDER BY w.Season DESC, r.Day DESC, w.RaceID DESC\n            LIMIT 1\n          ), -1) AS TeamID,\n          COALESCE(gam.Retired, 0) AS Retired\n        FROM Custom_DriverOfTheDay_Ranking t\n        JOIN Staff_BasicData bas ON bas.StaffID = t.DriverID\n        LEFT JOIN Staff_GameData gam ON gam.StaffID = t.DriverID\n        WHERE t.Rank = 1\n        GROUP BY t.DriverID\n        ORDER BY Count DESC\n      `, [], 'allRows') || [];\n\n            const formatted = rows.map(r => ({\n                name: formatNamesSimple([r[0], r[1]])[0],\n                id: r[2],\n                record: type,\n                value: r[3],\n                teamId: r[4],\n                retired: r[5],\n            }));\n\n            return enrichDriversWithHistory(formatted);\n        }\n\n        const counts = fetchDriverOfTheDayCounts(year) || [];\n        const formatted = counts.map(r => ({\n            name: r.name,\n            id: r.id,\n            record: type,\n            value: r.count,\n            teamId: r.teamId,\n            retired: 0,\n        })).sort((a, b) => (b.value ?? 0) - (a.value ?? 0));\n\n        return enrichDriversWithHistory(formatted, year);\n    }\n\n    if (type === \"wins\") recordTargetColumn = \"TotalWins\";\n    else if (type === \"podiums\") recordTargetColumn = \"TotalPodiums\";\n    else if (type === \"poles\") recordTargetColumn = \"TotalPoles\";\n    else if (type === \"champs\") recordTargetColumn = \"TotalChampionshipWins\";\n    else if (type === \"fastestlaps\") recordTargetColumn = \"TotalFastestLaps\";\n    else if (type === \"points\") recordTargetColumn = \"TotalPointsScored\";\n    else if (type === \"races\") recordTargetColumn = \"TotalStarts\";\n\n    if (year === \"all\") {\n        const recordTargetTableBefore = \"Staff_Driver_RaceRecordBeforeGameStart\";\n        const recordTargetTableSince = \"Staff_Driver_RaceRecordSinceGameStart\";\n\n        const beforeGameStart = queryDB(`\n      SELECT bas.FirstName, bas.LastName, tab1.StaffID, tab1.${recordTargetColumn}, COALESCE(con.TeamID, -1) AS TeamID, gam.Retired\n      FROM ${recordTargetTableBefore} tab1\n      JOIN Staff_BasicData bas ON tab1.StaffID = bas.StaffID\n      LEFT JOIN Staff_Contracts con ON tab1.StaffID = con.StaffID AND con.ContractType = 0\n      LEFT JOIN Staff_GameData gam ON tab1.StaffID = gam.StaffID\n      WHERE tab1.Formula = 1 AND tab1.${recordTargetColumn} IS NOT 0\n      ORDER BY tab1.${recordTargetColumn} DESC\n    `, [], 'allRows');\n\n        const sinceGameStart = queryDB(`\n      SELECT bas.FirstName, bas.LastName, tab1.StaffID, tab1.${recordTargetColumn}, COALESCE(con.TeamID, -1) AS TeamID, gam.Retired\n      FROM ${recordTargetTableSince} tab1\n      JOIN Staff_BasicData bas ON tab1.StaffID = bas.StaffID\n      LEFT JOIN Staff_Contracts con ON tab1.StaffID = con.StaffID AND con.ContractType = 0\n      LEFT JOIN Staff_GameData gam ON tab1.StaffID = gam.StaffID\n      WHERE tab1.Formula = 1 AND tab1.${recordTargetColumn} IS NOT 0\n      ORDER BY tab1.${recordTargetColumn} DESC\n    `, [], 'allRows');\n\n        const formattedBefore = beforeGameStart.map(r => ({\n            name: formatNamesSimple([r[0], r[1]])[0],\n            id: r[2],\n            record: type,\n            value: r[3],\n            teamId: r[4],\n            retired: r[5],\n        }));\n        const formattedSince = sinceGameStart.map(r => ({\n            name: formatNamesSimple([r[0], r[1]])[0],\n            id: r[2],\n            record: type,\n            value: r[3],\n            teamId: r[4],\n            retired: r[5],\n        }));\n\n        const byId = {};\n        formattedBefore.forEach(r => { byId[r.id] = { ...r }; });\n        formattedSince.forEach(r => {\n            if (byId[r.id]) byId[r.id].value += r.value;\n            else byId[r.id] = { ...r };\n        });\n\n        const combinedArray = Object.values(byId).sort((a, b) => b.value - a.value);\n\n        // enriquecemos aquí\n        const enriched = enrichDriversWithHistory(combinedArray);\n\n        const ALLTIME_EXTERNAL_DRIVERS = records;\n        const merged = mergeWithExternalRecords(enriched, ALLTIME_EXTERNAL_DRIVERS, type, year);\n\n        //sort again after merging\n        merged.sort((a, b) => (b.value ?? 0) - (a.value ?? 0));\n\n        console.log(\"final all-time records:\", merged);\n\n        return merged;\n    }\n    else {\n        // temporada concreta\n        recordTargetTable = \"Staff_Driver_RaceRecordPerSeason\";\n\n        const record = queryDB(`\n    SELECT \n        bas.FirstName,\n        bas.LastName,\n        tab1.StaffID,\n        tab1.${recordTargetColumn},\n\n        -- Team en la ÚLTIMA carrera de esa temporada\n        COALESCE((\n        SELECT rr.TeamID\n        FROM Races_Results rr\n        JOIN Races r ON r.RaceID = rr.RaceID\n        WHERE rr.DriverID = tab1.StaffID\n            AND r.SeasonID = ?\n        ORDER BY r.Day DESC, r.RaceID DESC\n        LIMIT 1\n        ), -1) AS TeamID,\n\n        COALESCE(gam.Retired, 0) AS Retired\n\n    FROM Staff_Driver_RaceRecordPerSeason tab1\n    JOIN Staff_BasicData bas ON tab1.StaffID = bas.StaffID\n    LEFT JOIN Staff_GameData gam ON tab1.StaffID = gam.StaffID\n    WHERE tab1.SeasonID = ?\n        AND tab1.${recordTargetColumn} IS NOT 0\n        AND (tab1.TeamID <= 10 OR tab1.TeamID = 32)\n    ORDER BY tab1.${recordTargetColumn} DESC\n    `, [year, year], 'allRows');\n\n        const formatted = (record || []).map(r => ({\n            name: formatNamesSimple([r[0], r[1]])[0],\n            id: r[2],\n            record: type,\n            value: r[3],\n            teamId: r[4],\n            retired: r[5],\n        }));\n\n        // enriquecemos también para temporada concreta con histórico all-time\n        const aggregated = aggregateSeasonDriverRecords(formatted);\n        return enrichDriversWithHistory(aggregated, year);\n\n    }\n\n}\n\nexport function fetchSeasonReviewData(year, formula = 1, isCurrentYear = true) {\n    const teamsStandings = fetchTeamsStandingsWithPoints(year, formula);\n    const driversStandings = fetchDriversStandings(year, formula);\n    const events = fetchEventsFrom(year, formula);\n    const pointsInfo = fetchPointsRegulations();\n    const lastRaceDoneId = fetchLastCompletedRaceId(year, formula);\n    const winsRecords = getSelectedRecord(\"wins\", year);\n    const polesRecords = getSelectedRecord(\"poles\", year);\n    const podiumsRecords = getSelectedRecord(\"podiums\", year);\n    const teamWinsTotals = fetchTeamSeasonWinsTotals(year, formula);\n    const teamPolesTotals = fetchTeamSeasonPolesTotals(year, formula);\n    const teamPodiumsTotals = fetchTeamSeasonPodiumsTotals(year, formula);\n    const qualifyingStageCounts = fetchQualifyingStageCounts(year, formula, isCurrentYear);\n    const driverOfTheDayCounts = fetchDriverOfTheDayCounts(year);\n    const teamMateHeadToHead = fetchTeamMateQualiRaceHeadToHead(year);\n\n    return {\n        year,\n        formula,\n        teamsStandings,\n        driversStandings,\n        events,\n        pointsInfo,\n        lastRaceDoneId,\n        qualifyingStageCounts,\n        driverOfTheDayCounts,\n        teamMateHeadToHead,\n        teamWinsTotals,\n        teamPolesTotals,\n        teamPodiumsTotals,\n        polesRecords,\n        podiumsRecords,\n        winsRecords\n    };\n}\n\nexport function getSelectedTeamRecord(type, year, formula = 1) {\n    if (!type) return [];\n    if (String(year) === \"all\") return [];\n\n    const recordType = String(type);\n\n    let base = [];\n    let breakdownRows = [];\n    if (recordType === \"wins\") base = fetchTeamSeasonWinsTotals(year, formula);\n    else if (recordType === \"podiums\") base = fetchTeamSeasonPodiumsTotals(year, formula);\n    else if (recordType === \"poles\") base = fetchTeamSeasonPolesTotals(year, formula);\n    else if (recordType === \"dotd\") {\n        if (Number(formula) !== 1) return [];\n\n        ensureCustomDoDRankingTable();\n        const globals = getGlobals();\n        const teamFilterSql = globals.isCreateATeam\n            ? `(t.TeamID BETWEEN 1 AND 10 OR t.TeamID = 32)`\n            : `(t.TeamID BETWEEN 1 AND 10)`;\n\n        const rows = queryDB(`\n      SELECT t.TeamID, COUNT(*) AS Cnt\n      FROM Custom_DriverOfTheDay_Ranking t\n      WHERE t.Season = ?\n        AND t.Rank = 1\n        AND ${teamFilterSql}\n      GROUP BY t.TeamID\n      ORDER BY Cnt DESC, t.TeamID ASC\n    `, [year], 'allRows') || [];\n\n        base = rows.map(r => ({\n            teamId: Number(r[0]),\n            value: Number(r[1]) || 0,\n        }));\n\n        breakdownRows = queryDB(`\n      SELECT\n        t.TeamID,\n        t.DriverID,\n        bas.FirstName,\n        bas.LastName,\n        COUNT(*) AS Cnt\n      FROM Custom_DriverOfTheDay_Ranking t\n      JOIN Staff_BasicData bas ON bas.StaffID = t.DriverID\n      WHERE t.Season = ?\n        AND t.Rank = 1\n        AND ${teamFilterSql}\n      GROUP BY t.TeamID, t.DriverID\n      ORDER BY t.TeamID ASC, Cnt DESC\n    `, [year], 'allRows') || [];\n    }\n    else {\n        return [];\n    }\n\n    const breakdownByTeamId = new Map();\n    if (recordType === \"wins\" || recordType === \"podiums\" || recordType === \"poles\") {\n        if (Number(formula) !== 1) return base;\n        const globals = getGlobals();\n        const teamFilterSql = globals.isCreateATeam\n            ? `(rr.TeamID BETWEEN 1 AND 10 OR rr.TeamID = 32)`\n            : `(rr.TeamID BETWEEN 1 AND 10)`;\n\n        let whereSql = \"\";\n        if (recordType === \"wins\") whereSql = `rr.FinishingPos = 1`;\n        else if (recordType === \"podiums\") whereSql = `rr.FinishingPos BETWEEN 1 AND 3`;\n        else whereSql = `rr.StartingPos = 1`;\n\n        breakdownRows = queryDB(`\n      SELECT\n        rr.TeamID,\n        rr.DriverID,\n        bas.FirstName,\n        bas.LastName,\n        COUNT(*) AS Cnt\n      FROM Races_Results rr\n      JOIN Staff_BasicData bas ON bas.StaffID = rr.DriverID\n      WHERE rr.Season = ?\n        AND ${teamFilterSql}\n        AND ${whereSql}\n      GROUP BY rr.TeamID, rr.DriverID\n      ORDER BY rr.TeamID ASC, Cnt DESC\n    `, [year], 'allRows') || [];\n    }\n\n    breakdownRows.forEach((r) => {\n        const teamId = Number(r[0]);\n        const driverId = Number(r[1]);\n        const count = Number(r[4]) || 0;\n        if (count <= 0) return;\n        const name = formatNamesSimple([r[2], r[3]])[0];\n        if (!breakdownByTeamId.has(teamId)) breakdownByTeamId.set(teamId, []);\n        breakdownByTeamId.get(teamId).push({ id: driverId, name, count });\n    });\n\n    const lastRaceId = Number(formula) === 1 ? queryDB(`\n    SELECT RaceID\n    FROM Races\n    WHERE SeasonID = ?\n      AND State = 2\n    ORDER BY Day DESC, RaceID DESC\n    LIMIT 1\n  `, [year], 'singleValue') : null;\n\n    const attachDriversAndBreakdown = (item) => ({\n        ...item,\n        breakdown: breakdownByTeamId.get(item.teamId) || [],\n        drivers: (() => {\n            if (!lastRaceId) return { driver1: null, driver2: null };\n            const drivers = fetchTeamDriversAtRace(lastRaceId, item.teamId);\n            return {\n                driver1: drivers[0] ?? null,\n                driver2: drivers[1] ?? null\n            };\n        })()\n    });\n\n    if (!lastRaceId) return base.map(attachDriversAndBreakdown);\n\n    const fetchTeamDriversAtRace = (raceId, teamId) => {\n        const rows = queryDB(`\n      SELECT DISTINCT rr.DriverID, bas.FirstName, bas.LastName, rr.FinishingPos\n      FROM Races_Results rr\n      JOIN Staff_BasicData bas ON bas.StaffID = rr.DriverID\n      WHERE rr.RaceID = ?\n        AND rr.TeamID = ?\n      ORDER BY rr.FinishingPos ASC, rr.DriverID ASC\n    `, [raceId, teamId], 'allRows') || [];\n\n        return rows.slice(0, 2).map(r => {\n            const driverID = r[0];\n            const driverName = formatNamesSimple([r[1], r[2]])[0];\n            const currentNumber = queryDB(`\n        SELECT Number\n        FROM Staff_DriverNumbers\n        WHERE CurrentHolder = ?\n      `, [driverID], 'singleValue');\n\n            return {\n                id: Number(driverID),\n                name: driverName,\n                number: currentNumber != null ? Number(currentNumber) : null\n            };\n        });\n    };\n\n    return base.map(attachDriversAndBreakdown);\n}\n\nexport function fetchQualifyingStageCounts(year, formula = 1, isCurrentYear = true) {\n    if (Number(formula) === 1 && !isCurrentYear) {\n        const cutoffQ2 = getGlobals().isCreateATeam ? 16 : 15;\n        const rows = queryDB(`\n      SELECT\n        ds.DriverID,\n        bas.FirstName,\n        bas.LastName,\n        COALESCE((\n          SELECT rr.TeamID\n          FROM Races_Results rr\n          JOIN Races r ON r.RaceID = rr.RaceID\n          WHERE rr.DriverID = ds.DriverID\n            AND r.SeasonID = ?\n          ORDER BY r.Day DESC, r.RaceID DESC\n          LIMIT 1\n        ), -1) AS TeamID,\n        SUM(CASE WHEN rr.StartingPos = 1 THEN 1 ELSE 0 END) AS PoleCount,\n        SUM(CASE WHEN rr.StartingPos > 0 AND rr.StartingPos != 99 AND rr.StartingPos <= 10 THEN 1 ELSE 0 END) AS Q3Count,\n        SUM(CASE WHEN rr.StartingPos > 0 AND rr.StartingPos != 99 AND rr.StartingPos <= ${cutoffQ2} THEN 1 ELSE 0 END) AS Q2Count\n      FROM Races_DriverStandings ds\n      JOIN Staff_BasicData bas ON bas.StaffID = ds.DriverID\n      LEFT JOIN Races_Results rr\n        ON rr.DriverID = ds.DriverID\n       AND rr.Season = ?\n      WHERE ds.SeasonID = ?\n        AND ds.RaceFormula = ?\n      GROUP BY ds.DriverID\n      ORDER BY PoleCount DESC, Q3Count DESC, Q2Count DESC, ds.Position ASC\n    `, [year, year, year, formula], 'allRows') || [];\n\n        return rows.map(r => ({\n            id: r[0],\n            name: formatNamesSimple([r[1], r[2]])[0],\n            teamId: r[3],\n            q2Count: r[6] ?? 0,\n            q3Count: r[5] ?? 0,\n            poleCount: r[4] ?? 0\n        }));\n    }\n\n    if (Number(formula) === 1) {\n        const rows = queryDB(`\n      SELECT\n        ds.DriverID,\n        bas.FirstName,\n        bas.LastName,\n        COALESCE((\n          SELECT rr.TeamID\n          FROM Races_Results rr\n          JOIN Races r ON r.RaceID = rr.RaceID\n          WHERE rr.DriverID = ds.DriverID\n            AND r.SeasonID = ?\n          ORDER BY r.Day DESC, r.RaceID DESC\n          LIMIT 1\n        ), -1) AS TeamID,\n        COUNT(DISTINCT CASE WHEN q.QualifyingStage = 2 THEN q.RaceID END) AS Q2Count,\n        COUNT(DISTINCT CASE WHEN q.QualifyingStage = 3 THEN q.RaceID END) AS Q3Count,\n        COUNT(DISTINCT CASE WHEN q.QualifyingStage = 3 AND q.FinishingPos = 1 THEN q.RaceID END) AS PoleCount\n      FROM Races_DriverStandings ds\n      JOIN Staff_BasicData bas ON bas.StaffID = ds.DriverID\n      LEFT JOIN Races_QualifyingResults q\n        ON q.DriverID = ds.DriverID\n       AND q.SeasonID = ds.SeasonID\n       AND q.RaceFormula = ds.RaceFormula\n       AND COALESCE(q.SprintShootout, 0) = 0\n       AND q.QualifyingStage IN (2, 3)\n      WHERE ds.SeasonID = ?\n        AND ds.RaceFormula = ?\n      GROUP BY ds.DriverID\n      ORDER BY Q3Count DESC, Q2Count DESC, ds.Position ASC\n    `, [year, year, formula], 'allRows') || [];\n\n        return rows.map(r => ({\n            id: r[0],\n            name: formatNamesSimple([r[1], r[2]])[0],\n            teamId: r[3],\n            q2Count: r[4] ?? 0,\n            q3Count: r[5] ?? 0,\n            poleCount: r[6] ?? 0\n        }));\n    }\n\n    const rows = queryDB(`\n    SELECT\n      ds.DriverID,\n      bas.FirstName,\n      bas.LastName,\n      COALESCE((\n        SELECT fr.TeamID\n        FROM Races_FeatureRaceResults fr\n        JOIN Races r ON r.RaceID = fr.RaceID\n        WHERE fr.DriverID = ds.DriverID\n          AND fr.SeasonID = ?\n          AND fr.RaceFormula = ?\n        ORDER BY r.Day DESC, r.RaceID DESC\n        LIMIT 1\n      ), -1) AS TeamID,\n      COUNT(DISTINCT CASE WHEN q.QualifyingStage = 2 THEN q.RaceID END) AS Q2Count,\n      COUNT(DISTINCT CASE WHEN q.QualifyingStage = 3 THEN q.RaceID END) AS Q3Count,\n      COUNT(DISTINCT CASE WHEN q.QualifyingStage = 3 AND q.FinishingPos = 1 THEN q.RaceID END) AS PoleCount\n    FROM Races_DriverStandings ds\n    JOIN Staff_BasicData bas ON bas.StaffID = ds.DriverID\n    LEFT JOIN Races_QualifyingResults q\n      ON q.DriverID = ds.DriverID\n     AND q.SeasonID = ds.SeasonID\n     AND q.RaceFormula = ds.RaceFormula\n     AND q.QualifyingStage IN (2, 3)\n    WHERE ds.SeasonID = ?\n      AND ds.RaceFormula = ?\n    GROUP BY ds.DriverID\n    ORDER BY Q3Count DESC, Q2Count DESC, ds.Position ASC\n  `, [year, formula, year, formula], 'allRows') || [];\n\n    return rows.map(r => ({\n        id: r[0],\n        name: formatNamesSimple([r[1], r[2]])[0],\n        teamId: r[3],\n        q2Count: r[4] ?? 0,\n        q3Count: r[5] ?? 0,\n        poleCount: r[6] ?? 0\n    }));\n}\n\nfunction pickValueFromType(item, type) {\n    if (!item) return 0;\n    switch (type) {\n        case \"wins\": return item.totalWins ?? 0;\n        case \"podiums\": return item.totalPodiums ?? 0;\n        case \"poles\": return item.totalPoles ?? 0;\n        case \"champs\": return item.totalChampionshipWins ?? 0;\n        case \"fastestLaps\": return item.totalFastestLaps ?? 0;\n        case \"points\": return item.totalPointsScored ?? 0;\n        case \"races\": return item.totalStarts ?? 0;\n        default: return 0;\n    }\n}\n\nfunction mapExternalItem(item, type) {\n    return {\n        ...item,\n        // forzados como pediste\n        id: -1,\n        retired: 1,\n        teamId: -1,\n        record: type,\n        value: pickValueFromType(item, type),\n\n        // por si en tu app esperas que existan siempre\n        totalStarts: item.totalStarts ?? 0,\n        totalPoles: item.totalPoles ?? 0,\n        totalPodiums: item.totalPodiums ?? 0,\n        totalWins: item.totalWins ?? 0,\n        totalSprintWins: item.totalSprintWins ?? 0,\n        totalChampionshipWins: item.totalChampionshipWins ?? 0,\n        totalPointsScored: item.totalPointsScored ?? 0,\n        totalFastestLaps: item.totalFastestLaps ?? 0,\n\n\n        firstRace: item.firstRace ?? { season: 0, trackName: null },\n        firstPodium: item.firstPodium ?? { season: 0, trackName: null },\n        firstWin: item.firstWin ?? { season: 0, trackName: null },\n        lastWin: item.lastWin ?? { season: 0, trackName: null },\n\n    };\n}\n\nfunction aggregateSeasonDriverRecords(records) {\n    const byId = new Map();\n\n    (records || []).forEach((record) => {\n        const driverId = Number(record?.id);\n        const value = Number(record?.value) || 0;\n\n        if (!driverId || value === 0) return;\n\n        if (!byId.has(driverId)) {\n            byId.set(driverId, {\n                ...record,\n                id: driverId,\n                value\n            });\n            return;\n        }\n\n        const current = byId.get(driverId);\n        current.value += value;\n\n        const teamId = Number(record?.teamId ?? -1);\n        if (teamId !== -1) current.teamId = teamId;\n        if (record?.name) current.name = record.name;\n        if (record?.retired != null) current.retired = record.retired;\n    });\n\n    return [...byId.values()].sort((a, b) => (Number(b?.value) || 0) - (Number(a?.value) || 0));\n}\n\nfunction mergeWithExternalRecords(dbDrivers, externalJson, type, year) {\n    const normName = (name) => {\n        return (name || \"\").replace(/\\s+/g, \" \").trim().toLowerCase();\n    };\n\n    if (year !== \"all\") return dbDrivers || [];\n\n    const byName = new Set((dbDrivers || []).map(d => normName(d.name)));\n\n    const externalMapped = (externalJson || [])\n        .map(it => mapExternalItem(it, type))\n        .filter(it => !byName.has(normName(it.name)));\n\n    const merged = [...(dbDrivers || []), ...externalMapped];\n\n    // Ordenamos por la columna value desc\n    merged.sort((a, b) => (b.value ?? 0) - (a.value ?? 0));\n    return merged;\n}\n\nfunction fetchRacePointsSnapshot(raceIdNum) {\n    const rows = queryDB(\n        `SELECT DriverID, TeamID, Points\n         FROM Races_Results\n         WHERE RaceID = ?`,\n        [raceIdNum],\n        'allRows'\n    ) || [];\n\n    const pointsByDriver = new Map();\n    const pointsByTeam = new Map();\n\n    for (const r of rows) {\n        const driverId = Number(r?.[0]);\n        const teamId = Number(r?.[1]);\n        const pts = Number(r?.[2] ?? 0);\n        pointsByDriver.set(driverId, pts);\n        const prev = Number(pointsByTeam.get(teamId) ?? 0);\n        pointsByTeam.set(teamId, prev + pts);\n    }\n\n    return { pointsByDriver, pointsByTeam };\n}\n\nfunction fetchSprintPointsSnapshot(raceIdNum) {\n    const rows = queryDB(\n        `SELECT DriverID, TeamID, ChampionshipPoints\n         FROM Races_SprintResults\n         WHERE RaceID = ?\n           AND RaceFormula = 1`,\n        [raceIdNum],\n        'allRows'\n    ) || [];\n\n    const pointsByDriver = new Map();\n    const pointsByTeam = new Map();\n\n    for (const r of rows) {\n        const driverId = Number(r?.[0]);\n        const teamId = Number(r?.[1]);\n        const pts = Number(r?.[2] ?? 0);\n        pointsByDriver.set(driverId, pts);\n        const prev = Number(pointsByTeam.get(teamId) ?? 0);\n        pointsByTeam.set(teamId, prev + pts);\n    }\n\n    return { pointsByDriver, pointsByTeam };\n}\n\nfunction fetchSprintPosToPointsMap(raceIdNum) {\n    const rows = queryDB(\n        `SELECT FinishingPos, ChampionshipPoints, DNF\n         FROM Races_SprintResults\n         WHERE RaceID = ?\n           AND RaceFormula = 1`,\n        [raceIdNum],\n        'allRows'\n    ) || [];\n\n    const posToPts = new Map();\n    for (const r of rows) {\n        const pos = Number(r?.[0]);\n        const pts = Number(r?.[1] ?? 0);\n        const dnf = Number(r?.[2]) === 1;\n        if (!dnf && pos > 0 && pos !== 99) posToPts.set(pos, Math.max(0, pts));\n    }\n    return posToPts;\n}\n\nfunction fetchRaceDriverRecordsSnapshot(raceIdNum) {\n    const rows = queryDB(\n        `SELECT DriverID, FinishingPos, DNF, Points\n         FROM Races_Results\n         WHERE RaceID = ?`,\n        [raceIdNum],\n        'allRows'\n    ) || [];\n\n    const byDriver = new Map();\n\n    for (const r of rows) {\n        const driverId = Number(r?.[0]);\n\n        const pos = Number(r?.[1]);\n        const dnf = Number(r?.[2]) === 1;\n        const pts = Number(r?.[3] ?? 0);\n\n        const starts = 1;\n        const wins = (!dnf && pos === 1) ? 1 : 0;\n        const podiums = (!dnf && pos >= 1 && pos <= 3) ? 1 : 0;\n        const points = Math.max(0, pts);\n\n        byDriver.set(driverId, { starts, wins, podiums, points });\n    }\n\n    return byDriver;\n}\n\nfunction diffPointsMaps(newMap, oldMap) {\n    const deltas = new Map();\n    const keys = new Set([...(oldMap ? oldMap.keys() : []), ...(newMap ? newMap.keys() : [])]);\n    for (const k of keys) {\n        const before = Number(oldMap?.get(k) ?? 0);\n        const after = Number(newMap?.get(k) ?? 0);\n        const delta = after - before;\n        if (delta !== 0) deltas.set(k, delta);\n    }\n    return deltas;\n}\n\nfunction diffDriverRecordMaps(newMap, oldMap) {\n    const deltas = new Map();\n    const keys = new Set([...(oldMap ? oldMap.keys() : []), ...(newMap ? newMap.keys() : [])]);\n    for (const k of keys) {\n        const before = oldMap?.get(k) || { starts: 0, wins: 0, podiums: 0, points: 0 };\n        const after = newMap?.get(k) || { starts: 0, wins: 0, podiums: 0, points: 0 };\n\n        const dStarts = Number(after.starts ?? 0) - Number(before.starts ?? 0);\n        const dWins = Number(after.wins ?? 0) - Number(before.wins ?? 0);\n        const dPodiums = Number(after.podiums ?? 0) - Number(before.podiums ?? 0);\n        const dPoints = Number(after.points ?? 0) - Number(before.points ?? 0);\n\n        if (dStarts !== 0 || dWins !== 0 || dPodiums !== 0 || dPoints !== 0) {\n            deltas.set(k, { starts: dStarts, wins: dWins, podiums: dPodiums, points: dPoints });\n        }\n    }\n    return deltas;\n}\n\nfunction resortF1StandingsForSeason(seasonId) {\n    const seasonNum = Number(seasonId);\n\n    const driverRows = queryDB(\n        `SELECT DriverID, Points, Position\n         FROM Races_DriverStandings\n         WHERE SeasonID = ?\n           AND RaceFormula = 1`,\n        [seasonNum],\n        'allRows'\n    ) || [];\n\n    const existingDriverPos = new Map();\n    const pointsByDriver = new Map();\n    const driverIds = [];\n\n    driverRows.forEach((r) => {\n        const driverId = Number(r?.[0]);\n        const pts = Number(r?.[1] ?? 0);\n        const pos = Number(r?.[2]);\n        driverIds.push(driverId);\n        pointsByDriver.set(driverId, pts);\n        existingDriverPos.set(driverId, pos);\n    });\n\n    const finishCountsRows = queryDB(\n        `SELECT DriverID, FinishingPos, COUNT(*) AS Cnt\n         FROM Races_Results\n         WHERE Season = ?\n           AND FinishingPos > 0\n           AND FinishingPos != 99\n         GROUP BY DriverID, FinishingPos`,\n        [seasonNum],\n        'allRows'\n    ) || [];\n\n    const countsByDriver = new Map();\n    finishCountsRows.forEach((r) => {\n        const driverId = Number(r?.[0]);\n        const finPos = Number(r?.[1]);\n        const cnt = Number(r?.[2] ?? 0);\n        if (!countsByDriver.has(driverId)) countsByDriver.set(driverId, new Map());\n        countsByDriver.get(driverId).set(finPos, cnt);\n    });\n\n    const sortedDrivers = driverIds.slice().sort((a, b) => {\n        const pa = Number(pointsByDriver.get(a) ?? 0);\n        const pb = Number(pointsByDriver.get(b) ?? 0);\n        if (pa !== pb) return pb - pa;\n        const ca = countsByDriver.get(a) || new Map();\n        const cb = countsByDriver.get(b) || new Map();\n        for (let pos = 1; pos <= 30; pos++) {\n            const da = Number(ca.get(pos) ?? 0);\n            const db = Number(cb.get(pos) ?? 0);\n            if (da !== db) return db - da;\n        }\n        const ea = Number(existingDriverPos.get(a) ?? Infinity);\n        const eb = Number(existingDriverPos.get(b) ?? Infinity);\n        if (ea !== eb) return ea - eb;\n        return a - b;\n    });\n\n    for (let i = 0; i < sortedDrivers.length; i++) {\n        const driverId = sortedDrivers[i];\n        const pts = Number(pointsByDriver.get(driverId) ?? 0);\n        queryDB(\n            `UPDATE Races_DriverStandings\n             SET Points = ?, Position = ?, LastPointsChange = 0, LastPositionChange = 0\n             WHERE SeasonID = ? AND RaceFormula = 1 AND DriverID = ?`,\n            [pts, i + 1, seasonNum, driverId],\n            'run'\n        );\n    }\n\n    const teamRows = queryDB(\n        `SELECT TeamID, Points, Position\n         FROM Races_TeamStandings\n         WHERE SeasonID = ?\n           AND RaceFormula = 1`,\n        [seasonNum],\n        'allRows'\n    ) || [];\n\n    const existingTeamPos = new Map();\n    const pointsByTeam = new Map();\n    const teamIds = [];\n\n    teamRows.forEach((r) => {\n        const teamId = Number(r?.[0]);\n        const pts = Number(r?.[1] ?? 0);\n        const pos = Number(r?.[2]);\n        teamIds.push(teamId);\n        pointsByTeam.set(teamId, pts);\n        existingTeamPos.set(teamId, pos);\n    });\n\n    const teamFinishCountsRows = queryDB(\n        `SELECT TeamID, FinishingPos, COUNT(*) AS Cnt\n         FROM Races_Results\n         WHERE Season = ?\n           AND FinishingPos > 0\n           AND FinishingPos != 99\n         GROUP BY TeamID, FinishingPos`,\n        [seasonNum],\n        'allRows'\n    ) || [];\n\n    const countsByTeam = new Map();\n    teamFinishCountsRows.forEach((r) => {\n        const teamId = Number(r?.[0]);\n        const finPos = Number(r?.[1]);\n        const cnt = Number(r?.[2] ?? 0);\n        if (!countsByTeam.has(teamId)) countsByTeam.set(teamId, new Map());\n        countsByTeam.get(teamId).set(finPos, cnt);\n    });\n\n    const sortedTeams = teamIds.slice().sort((a, b) => {\n        const pa = Number(pointsByTeam.get(a) ?? 0);\n        const pb = Number(pointsByTeam.get(b) ?? 0);\n        if (pa !== pb) return pb - pa;\n        const ca = countsByTeam.get(a) || new Map();\n        const cb = countsByTeam.get(b) || new Map();\n        for (let pos = 1; pos <= 30; pos++) {\n            const da = Number(ca.get(pos) ?? 0);\n            const db = Number(cb.get(pos) ?? 0);\n            if (da !== db) return db - da;\n        }\n        const ea = Number(existingTeamPos.get(a) ?? Infinity);\n        const eb = Number(existingTeamPos.get(b) ?? Infinity);\n        if (ea !== eb) return ea - eb;\n        return a - b;\n    });\n\n    for (let i = 0; i < sortedTeams.length; i++) {\n        const teamId = sortedTeams[i];\n        const pts = Number(pointsByTeam.get(teamId) ?? 0);\n        queryDB(\n            `UPDATE Races_TeamStandings\n             SET Points = ?, Position = ?, LastPointsChange = 0, LastPositionChange = 0\n             WHERE SeasonID = ? AND RaceFormula = 1 AND TeamID = ?`,\n            [pts, i + 1, seasonNum, teamId],\n            'run'\n        );\n    }\n}\n\nexport function editRaceResults(raceId, edits = [], opts = {}) {\n    const raceIdNum = Number(raceId);\n    if (!Array.isArray(edits) || edits.length === 0) return { ok: false, error: \"No edits provided\" };\n    const sessionKey = String(opts?.sessionKey || (opts?.isSprint ? \"sprintrace\" : \"race\")).toLowerCase();\n    const isSprint = sessionKey === \"sprintrace\" || sessionKey === \"sprint\" || sessionKey === \"sprintrace\";\n\n    try {\n        queryDB(`BEGIN IMMEDIATE`, [], \"run\");\n\n        const seasonId = queryDB(`SELECT SeasonID FROM Races WHERE RaceID = ?`, [raceIdNum], \"singleValue\");\n        if (seasonId == null) {\n            queryDB(`ROLLBACK`, [], \"run\");\n            return { ok: false, error: \"Race not found\" };\n        }\n\n        const rowCount = Number(queryDB(\n            isSprint\n                ? `SELECT COUNT(*) FROM Races_SprintResults WHERE RaceID = ? AND RaceFormula = 1`\n                : `SELECT COUNT(*) FROM Races_Results WHERE RaceID = ?`,\n            [raceIdNum],\n            \"singleValue\"\n        ) ?? 0);\n        if (rowCount > 0 && edits.length !== rowCount) {\n            queryDB(`ROLLBACK`, [], \"run\");\n            return { ok: false, error: `Edits count (${edits.length}) does not match ${isSprint ? \"sprint\" : \"race\"} entries (${rowCount}).` };\n        }\n\n        for (const edit of edits) {\n            const dnf = Number(edit?.dnf);\n            if (!(dnf === 0 || dnf === 1)) {\n                queryDB(`ROLLBACK`, [], \"run\");\n                return { ok: false, error: \"Invalid edits payload\" };\n            }\n        }\n        const posSet = new Set(edits.map(e => Number(e?.finishingPos)));\n        if (posSet.size !== edits.length) {\n            queryDB(`ROLLBACK`, [], \"run\");\n            return { ok: false, error: \"Duplicate finishing positions in edits.\" };\n        }\n\n        const before = isSprint ? fetchSprintPointsSnapshot(raceIdNum) : fetchRacePointsSnapshot(raceIdNum);\n        const beforeDriverRecords = isSprint ? null : fetchRaceDriverRecordsSnapshot(raceIdNum);\n\n        if (!isSprint) {\n            // Avoid UNIQUE constraint collisions while reordering (Season, RaceID, FinishingPos)\n            queryDB(\n                `UPDATE Races_Results SET FinishingPos = COALESCE(FinishingPos, 0) + 1000 WHERE RaceID = ?`,\n                [raceIdNum],\n                \"run\"\n            );\n\n            for (const edit of edits) {\n                const dnf = Number(edit.dnf) === 1 ? 1 : 0;\n                const time = dnf ? 0 : Number(edit.time);\n                queryDB(\n                    `UPDATE Races_Results SET FinishingPos = ?, Time = ?, DNF = ? WHERE RaceID = ? AND DriverID = ?`,\n                    [Number(edit.finishingPos), time, dnf, raceIdNum, Number(edit.driverId)],\n                    \"run\"\n                );\n            }\n\n            // Recalculate points for the edited race\n            queryDB(`UPDATE Races_Results SET Points = 0 WHERE RaceID = ?`, [raceIdNum], \"run\");\n\n            const regs = fetchPointsRegulations();\n            const posPoints = new Map(\n                (Array.isArray(regs?.positionAndPoints) ? regs.positionAndPoints : [])\n                    .map((r) => [Number(r?.[0]), Number(r?.[1])])\n            );\n\n            const lastRaceId = queryDB(\n                `SELECT RaceID FROM Races WHERE SeasonID = ? ORDER BY Day DESC, RaceID DESC LIMIT 1`,\n                [seasonId],\n                \"singleValue\"\n            );\n            const isLastRace = Number(lastRaceId) === raceIdNum;\n            const doublePoints = isLastRace && Number(regs?.isLastraceDouble) === 1;\n            const flBonusEnabled = Number(regs?.fastestLapBonusPoint) === 1;\n\n            const rows = queryDB(\n                `SELECT DriverID, FinishingPos, DNF, FastestLap FROM Races_Results WHERE RaceID = ? ORDER BY FinishingPos`,\n                [raceIdNum],\n                \"allRows\"\n            ) || [];\n\n            let fastestDriverId = null;\n            let fastestLap = null;\n            let fastestPos = null;\n\n            for (const r of rows) {\n                const fl = Number(r?.[3]);\n                if (fl > 0 && (fastestLap == null || fl < fastestLap)) {\n                    fastestLap = fl;\n                    fastestDriverId = Number(r?.[0]);\n                    fastestPos = Number(r?.[1]);\n                }\n            }\n\n            for (const r of rows) {\n                const driverId = Number(r?.[0]);\n                const pos = Number(r?.[1]);\n                const dnf = Number(r?.[2]) === 1;\n\n                let pts = 0;\n                if (!dnf && pos >= 1 && pos <= 11) {\n                    pts = Number(posPoints.get(pos) ?? 0);\n                }\n\n                if (flBonusEnabled && fastestDriverId != null && driverId === fastestDriverId && Number(fastestPos) <= 10 && !dnf) {\n                    pts += 1;\n                }\n\n                if (doublePoints) pts *= 2;\n\n                queryDB(`UPDATE Races_Results SET Points = ? WHERE RaceID = ? AND DriverID = ?`, [pts, raceIdNum, driverId], \"run\");\n            }\n        } else {\n            const posToPts = fetchSprintPosToPointsMap(raceIdNum);\n\n            // Avoid UNIQUE constraint collisions while reordering\n            queryDB(\n                `UPDATE Races_SprintResults\n                 SET FinishingPos = COALESCE(FinishingPos, 0) + 1000\n                 WHERE RaceID = ? AND RaceFormula = 1`,\n                [raceIdNum],\n                \"run\"\n            );\n\n            for (const edit of edits) {\n                const dnf = Number(edit.dnf) === 1 ? 1 : 0;\n                const time = dnf ? 0 : Number(edit.time);\n                queryDB(\n                    `UPDATE Races_SprintResults\n                     SET FinishingPos = ?, RaceTime = ?, DNF = ?\n                     WHERE RaceID = ? AND RaceFormula = 1 AND DriverID = ?`,\n                    [Number(edit.finishingPos), time, dnf, raceIdNum, Number(edit.driverId)],\n                    \"run\"\n                );\n            }\n\n            queryDB(\n                `UPDATE Races_SprintResults\n                 SET ChampionshipPoints = 0\n                 WHERE RaceID = ? AND RaceFormula = 1`,\n                [raceIdNum],\n                \"run\"\n            );\n\n            const rows = queryDB(\n                `SELECT DriverID, FinishingPos, DNF\n                 FROM Races_SprintResults\n                 WHERE RaceID = ? AND RaceFormula = 1\n                 ORDER BY FinishingPos`,\n                [raceIdNum],\n                \"allRows\"\n            ) || [];\n\n            for (const r of rows) {\n                const driverId = Number(r?.[0]);\n                const pos = Number(r?.[1]);\n                const dnf = Number(r?.[2]) === 1;\n                const pts = (!dnf && pos > 0 && pos !== 99) ? Number(posToPts.get(pos) ?? 0) : 0;\n                queryDB(\n                    `UPDATE Races_SprintResults\n                     SET ChampionshipPoints = ?\n                     WHERE RaceID = ? AND RaceFormula = 1 AND DriverID = ?`,\n                    [pts, raceIdNum, driverId],\n                    \"run\"\n                );\n            }\n        }\n\n        const after = isSprint ? fetchSprintPointsSnapshot(raceIdNum) : fetchRacePointsSnapshot(raceIdNum);\n        const afterDriverRecords = isSprint ? null : fetchRaceDriverRecordsSnapshot(raceIdNum);\n\n        const driverDeltas = diffPointsMaps(after.pointsByDriver, before.pointsByDriver);\n        for (const [driverId, delta] of driverDeltas.entries()) {\n            queryDB(\n                `UPDATE Races_DriverStandings\n                 SET Points = COALESCE(Points, 0) + ?\n                 WHERE SeasonID = ? AND RaceFormula = 1 AND DriverID = ?`,\n                [Number(delta), Number(seasonId), Number(driverId)],\n                \"run\"\n            );\n        }\n\n        const teamDeltas = diffPointsMaps(after.pointsByTeam, before.pointsByTeam);\n        for (const [teamId, delta] of teamDeltas.entries()) {\n            queryDB(\n                `UPDATE Races_TeamStandings\n                 SET Points = COALESCE(Points, 0) + ?\n                 WHERE SeasonID = ? AND RaceFormula = 1 AND TeamID = ?`,\n                [Number(delta), Number(seasonId), Number(teamId)],\n                \"run\"\n            );\n        }\n\n        if (!isSprint && beforeDriverRecords && afterDriverRecords) {\n            const recordDeltas = diffDriverRecordMaps(afterDriverRecords, beforeDriverRecords);\n            for (const [driverId, delta] of recordDeltas.entries()) {\n                queryDB(\n                    `UPDATE Staff_Driver_RaceRecordSinceGameStart\n                     SET TotalStarts = MAX(0, COALESCE(TotalStarts, 0) + ?),\n                         TotalWins = MAX(0, COALESCE(TotalWins, 0) + ?),\n                         TotalPodiums = MAX(0, COALESCE(TotalPodiums, 0) + ?),\n                         TotalPointsScored = MAX(0, COALESCE(TotalPointsScored, 0) + ?)\n                     WHERE StaffID = ? AND Formula = 1`,\n                    [Number(delta.starts), Number(delta.wins), Number(delta.podiums), Number(delta.points), Number(driverId)],\n                    \"run\"\n                );\n\n                queryDB(\n                    `UPDATE Staff_Driver_RaceRecordPerSeason\n                     SET TotalStarts = MAX(0, COALESCE(TotalStarts, 0) + ?),\n                         TotalWins = MAX(0, COALESCE(TotalWins, 0) + ?),\n                         TotalPodiums = MAX(0, COALESCE(TotalPodiums, 0) + ?),\n                         TotalPointsScored = MAX(0, COALESCE(TotalPointsScored, 0) + ?)\n                     WHERE StaffID = ? AND SeasonID = ?`,\n                    [Number(delta.starts), Number(delta.wins), Number(delta.podiums), Number(delta.points), Number(driverId), Number(seasonId)],\n                    \"run\"\n                );\n            }\n        }\n\n        resortF1StandingsForSeason(seasonId);\n\n        queryDB(`COMMIT`, [], \"run\");\n        return { ok: true };\n    } catch (e) {\n        try { queryDB(`ROLLBACK`, [], \"run\"); } catch (e2) { /* ignore */ }\n        return { ok: false, error: e?.message || String(e) };\n    }\n}\n"
  },
  {
    "path": "src/js/backend/scriptUtils/regulationsUtils.js",
    "content": "import { queryDB } from \"../dbManager.js\";\n\nexport function fetchRegulationsData() {\n  const enumRows = queryDB(\n    `SELECT ChangeID, Name, CurrentValue, MinValue, MaxValue FROM Regulations_Enum_Changes`,\n    [],\n    \"allRows\"\n  ) || [];\n\n  const enumChanges = {};\n  for (const [ChangeID, Name, CurrentValue, MinValue, MaxValue] of enumRows) {\n    enumChanges[Name] = {\n      ChangeID,\n      Name,\n      CurrentValue,\n      MinValue,\n      MaxValue,\n    };\n  }\n\n  const pointRows = queryDB(\n    `SELECT PointScheme, RacePos, Points\n     FROM Regulations_NonTechnical_PointSchemes\n     ORDER BY PointScheme ASC, RacePos ASC`,\n    [],\n    \"allRows\"\n  ) || [];\n\n  const pointSchemes = {};\n  for (const [PointScheme, RacePos, Points] of pointRows) {\n    if (!pointSchemes[PointScheme]) pointSchemes[PointScheme] = [];\n    pointSchemes[PointScheme].push({ RacePos, Points });\n  }\n\n  const resourceRows = queryDB(\n    `SELECT ResourcePackage, StandingPos, WindTunnelBlocks, CfdBlocks\n     FROM Regulations_NonTechnical_PartResources\n     ORDER BY ResourcePackage ASC, StandingPos ASC`,\n    [],\n    \"allRows\"\n  ) || [];\n\n  const partResources = {};\n  for (const [ResourcePackage, StandingPos, WindTunnelBlocks, CfdBlocks] of resourceRows) {\n    if (!partResources[ResourcePackage]) partResources[ResourcePackage] = [];\n    partResources[ResourcePackage].push({\n      StandingPos,\n      WindTunnelBlocks,\n      CfdBlocks,\n    });\n  }\n\n  return { enumChanges, pointSchemes, partResources };\n}\n\nfunction isRowPresent(query, params) {\n  const exists = queryDB(query, params, \"singleValue\");\n  return exists !== null && exists !== undefined;\n}\n\nexport function updateOneRegulationEnumChange(name, currentValue, minValue, maxValue) {\n  queryDB(\n    `UPDATE Regulations_Enum_Changes\n     SET CurrentValue = ?, MinValue = ?, MaxValue = ?\n     WHERE Name = ?`,\n    [currentValue, minValue, maxValue, name],\n    \"run\"\n  );\n}\n\n\nexport function updateRegulations(data) {\n  const enumChanges = data?.enumChanges || {};\n\n  for (const [name, row] of Object.entries(enumChanges)) {\n    if (!row || row.CurrentValue === undefined || row.CurrentValue === null) continue;\n    queryDB(\n      `UPDATE Regulations_Enum_Changes\n       SET CurrentValue = ?\n       WHERE Name = ?`,\n      [row.CurrentValue, name],\n      \"run\"\n    );\n  }\n\n  const pointSchemes = data?.pointSchemes || {};\n  for (const [schemeIdStr, rows] of Object.entries(pointSchemes)) {\n    const schemeId = Number(schemeIdStr);\n    if (!Array.isArray(rows)) continue;\n\n    for (const r of rows) {\n      const racePos = Number(r?.RacePos);\n      const points = Number(r?.Points ?? 0);\n\n      const present = isRowPresent(\n        `SELECT 1 FROM Regulations_NonTechnical_PointSchemes WHERE PointScheme = ? AND RacePos = ? LIMIT 1`,\n        [schemeId, racePos]\n      );\n\n      if (present) {\n        queryDB(\n          `UPDATE Regulations_NonTechnical_PointSchemes\n           SET Points = ?\n           WHERE PointScheme = ? AND RacePos = ?`,\n          [points, schemeId, racePos],\n          \"run\"\n        );\n      } else {\n        queryDB(\n          `INSERT INTO Regulations_NonTechnical_PointSchemes (PointScheme, RacePos, Points)\n           VALUES (?, ?, ?)`,\n          [schemeId, racePos, points],\n          \"run\"\n        );\n      }\n    }\n  }\n\n  const partResources = data?.partResources || {};\n  for (const [packageIdStr, rows] of Object.entries(partResources)) {\n    const packageId = Number(packageIdStr);\n    if (!Array.isArray(rows)) continue;\n\n    for (const r of rows) {\n      const standingPos = Number(r?.StandingPos);\n      const wind = Number(r?.WindTunnelBlocks ?? 0);\n      const cfd = Number(r?.CfdBlocks ?? 0);\n\n      const present = isRowPresent(\n        `SELECT 1 FROM Regulations_NonTechnical_PartResources WHERE ResourcePackage = ? AND StandingPos = ? LIMIT 1`,\n        [packageId, standingPos]\n      );\n\n      if (present) {\n        queryDB(\n          `UPDATE Regulations_NonTechnical_PartResources\n           SET WindTunnelBlocks = ?, CfdBlocks = ?\n           WHERE ResourcePackage = ? AND StandingPos = ?`,\n          [wind, cfd, packageId, standingPos],\n          \"run\"\n        );\n      } else {\n        queryDB(\n          `INSERT INTO Regulations_NonTechnical_PartResources (ResourcePackage, StandingPos, WindTunnelBlocks, CfdBlocks)\n           VALUES (?, ?, ?, ?)`,\n          [packageId, standingPos, wind, cfd],\n          \"run\"\n        );\n      }\n    }\n  }\n}\n\n"
  },
  {
    "path": "src/js/backend/scriptUtils/transferUtils.js",
    "content": "import { getGlobals } from \"../commandGlobals\";\nimport { queryDB } from \"../dbManager\";\n\nexport const minMaxTypeStaff = {\n  driver: {\n    salary: {\n      1: [14,30],\n      2: [7,12],\n      3: [0.5,6],\n      4: [0.2,1.2]\n    },\n    starting_bonus: {\n      1: [2,4.5],\n      2: [1,2],\n      3: [0,1.6],\n      4: [0,0]\n    },\n    year_end: {\n      1: [1,5],\n      2: [1,4],\n      3: [1,3],\n      4: [1,2]\n    },\n    race_bonus: {\n      1: [1.5,2.5],\n      2: [0.9,1.7],\n      3: [0,0.7],\n      4: [0,0]\n    },\n    race_bonus_pos: {\n      1: [1,3],\n      2: [2,5],\n      3: [7,10],\n      4: [9,10]\n    }\n  },\n  staff: {\n    salary: {\n      1: [3.5,5],\n      2: [2.5,4],\n      3: [1.5,3],\n      4: [0.5,1.5]\n    },\n    starting_bonus: {\n      1: [0.5,1.5],\n      2: [0.5,1],\n      3: [0,0.5],\n      4: [0,0.5]\n    },\n    year_end: {\n      1: [1,5],\n      2: [1,4],\n      3: [1,3],\n      4: [1,2]\n    }\n  }\n};\n\nexport let CONTRACT_PLACEHOLDERS_24 = {\n  teamID: 1,\n  posInTeam: 1,\n  startDay: 43831,\n  endSeason: 2026,\n  salary: 100000,\n  startingBonus: 0,\n  raceBonus: 0,\n  raceBonusTargetPos: 1\n};\n\nfunction isBlankContractValue(value) {\n  return value === null || value === undefined || (typeof value === \"string\" && value.trim() === \"\");\n}\n\nfunction toContractInt(value, fallback) {\n  if (isBlankContractValue(value)) return fallback;\n  const parsed = Number.parseInt(String(value), 10);\n  return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction sanitizeContractPayload(payload = {}) {\n  console.log(getGlobals().currentDate);\n  const seasonYear = getGlobals().currentDate[1];\n  console.log(\"Sanitizing contract payload:\", payload);\n  let staffID = toContractInt(payload.staffID, 0);\n  if (staffID < 0) staffID = 0;\n\n  let contractType = toContractInt(payload.contractType, 0);\n\n  let teamID = toContractInt(payload.teamID, CONTRACT_PLACEHOLDERS_24.teamID);\n\n  let posInTeam = toContractInt(payload.posInTeam, CONTRACT_PLACEHOLDERS_24.posInTeam);\n\n  let startDay = toContractInt(payload.startDay, CONTRACT_PLACEHOLDERS_24.startDay);\n\n  let endSeason = toContractInt(payload.endSeason, seasonYear + 1);\n\n  let salary = toContractInt(payload.salary, CONTRACT_PLACEHOLDERS_24.salary);\n\n  let startingBonus = toContractInt(payload.startingBonus, CONTRACT_PLACEHOLDERS_24.startingBonus);\n\n  let raceBonus = toContractInt(payload.raceBonus, CONTRACT_PLACEHOLDERS_24.raceBonus);\n\n  let raceBonusTargetPos = toContractInt(payload.raceBonusTargetPos, CONTRACT_PLACEHOLDERS_24.raceBonusTargetPos);\n\n  return {\n    staffID,\n    contractType,\n    teamID,\n    posInTeam,\n    startDay,\n    endSeason,\n    salary,\n    startingBonus,\n    raceBonus,\n    raceBonusTargetPos\n  };\n}\n\nfunction getCurrentMainContractSnapshot(driverID) {\n  const safeDriverID = toContractInt(driverID, 0);\n  const row = queryDB(\n    `SELECT TeamID, PosInTeam\n     FROM Staff_Contracts\n     WHERE StaffID = ?\n       AND ContractType = 0\n     ORDER BY TeamID ASC\n     LIMIT 1`,\n    [safeDriverID],\n    \"singleRow\"\n  ) || [];\n\n  return sanitizeContractPayload({\n    staffID: safeDriverID,\n    contractType: 0,\n    teamID: row[0],\n    posInTeam: row[1]\n  });\n}\n\nexport function checkAndFixContract(driverID, teamID) {\n  const safeDriverID = toContractInt(driverID, 0);\n  const safeTeamID = toContractInt(teamID, CONTRACT_PLACEHOLDERS_24.teamID);\n\n  const row = queryDB(\n    `SELECT StaffID, ContractType, TeamID, PosInTeam, StartDay, EndSeason, Salary, StartingBonus, RaceBonus, RaceBonusTargetPos\n     FROM Staff_Contracts\n     WHERE StaffID = ?\n       AND TeamID = ?\n       AND ContractType = 0`,\n    [safeDriverID, safeTeamID],\n    \"singleRow\"\n  );\n  console.log(\"Checking contract for DriverID:\", safeDriverID, \"TeamID:\", safeTeamID, \"Result:\", row);\n  if (!row) return null;\n\n  const current = {\n    staffID: row[0],\n    contractType: row[1],\n    teamID: row[2],\n    posInTeam: row[3],\n    startDay: row[4],\n    endSeason: row[5],\n    salary: row[6],\n    startingBonus: row[7],\n    raceBonus: row[8],\n    raceBonusTargetPos: row[9]\n  };\n\n  const sanitized = sanitizeContractPayload(current);\n  console.log(\"Sanitized contract values:\", sanitized);\n  const changed = (\n    current.teamID !== sanitized.teamID ||\n    current.posInTeam !== sanitized.posInTeam ||\n    current.startDay !== sanitized.startDay ||\n    current.endSeason !== sanitized.endSeason ||\n    current.salary !== sanitized.salary ||\n    current.startingBonus !== sanitized.startingBonus ||\n    current.raceBonus !== sanitized.raceBonus ||\n    current.raceBonusTargetPos !== sanitized.raceBonusTargetPos\n  );\n\n  console.log(\"Contract values changed:\", changed);\n\n  if (changed) {\n    queryDB(\n      `UPDATE Staff_Contracts\n       SET TeamID = ?, PosInTeam = ?, StartDay = ?, EndSeason = ?, Salary = ?, StartingBonus = ?, RaceBonus = ?, RaceBonusTargetPos = ?\n       WHERE StaffID = ?\n         AND TeamID = ?\n         AND ContractType = 0`,\n      [\n        sanitized.teamID,\n        sanitized.posInTeam,\n        sanitized.startDay,\n        sanitized.endSeason,\n        sanitized.salary,\n        sanitized.startingBonus,\n        sanitized.raceBonus,\n        sanitized.raceBonusTargetPos,\n        safeDriverID,\n        safeTeamID\n      ],\n      \"run\"\n    );\n  }\n\n  return sanitized;\n}\n\nexport function transferJuniorDriver(driverID,newTeamID, posInTeam, yearIteration = \"24\") {\n  const teamHasDriverInPosition = queryDB(`SELECT StaffID FROM Staff_Contracts WHERE TeamID = ? AND PosInTeam = ? AND ContractType = 0`,[newTeamID,posInTeam],\"singleValue\");\n  if (teamHasDriverInPosition) {\n    //remove that driver from the team\n    queryDB(`DELETE FROM Staff_Contracts WHERE StaffID = ? AND TeamID = ? AND ContractType = 0`,[teamHasDriverInPosition,newTeamID],'run');\n    queryDB(`UPDATE Staff_DriverData SET AssignedCarNumber = NULL WHERE StaffID = ?`,[teamHasDriverInPosition],'run');\n    queryDB(`UPDATE Staff_DriverData SET FeederSeriesAssignedCarNumber = NULL WHERE StaffID = ?`,[teamHasDriverInPosition],'run');\n  }\n  //check if the driver has a contract with another team that is in between 11 and 31 (both included)\n  const hasJunioorContract = queryDB(`SELECT TeamID FROM Staff_Contracts WHERE StaffID = ? AND ContractType = 0 AND TeamID > 10 AND TeamID < 32`,[driverID],\"singleValue\");\n  if (hasJunioorContract) {\n    queryDB(`DELETE FROM Staff_Contracts WHERE StaffID = ? AND TeamID = ? AND ContractType = 0`,[driverID,hasJunioorContract],'run');\n    queryDB(`UPDATE Staff_DriverData SET FeederSeriesAssignedCarNumber = NULL WHERE StaffID = ?`,[driverID],'run');\n  }\n  //add the driver to the new team\n  const day = queryDB(\"SELECT Day FROM Player_State\",[],\"singleValue\");\n  const year = queryDB(\"SELECT CurrentSeason FROM Player_State\",[],\"singleValue\");\n  const yearEnd = (parseInt(year) + 1).toString();\n  const salary = \"100000\";\n  const contractValues = sanitizeContractPayload({\n    staffID: driverID,\n    contractType: 0,\n    teamID: newTeamID,\n    posInTeam,\n    startDay: day,\n    endSeason: yearEnd,\n    salary,\n    startingBonus: 0,\n    raceBonus: 0,\n    raceBonusTargetPos: 1\n  });\n  if (yearIteration === \"23\") {\n    queryDB(`INSERT INTO Staff_Contracts VALUES (?, 0, 1, ?, 1, ?, ?, 1, '[OPINION_STRING_NEUTRAL]', ?, ?, 1, '[OPINION_STRING_NEUTRAL]', ?, 1, '[OPINION_STRING_NEUTRAL]', ?, 1, '[OPINION_STRING_NEUTRAL]', ?, 1, '[OPINION_STRING_NEUTRAL]', ?, 1, '[OPINION_STRING_NEUTRAL]', 0, 1, '[OPINION_STRING_NEUTRAL]')`, \n      [contractValues.staffID,contractValues.startDay,contractValues.teamID,contractValues.posInTeam,contractValues.startDay,contractValues.endSeason,contractValues.salary,contractValues.startingBonus,contractValues.raceBonus,contractValues.raceBonusTargetPos],'run'\n    );\n  } else if (yearIteration === \"24\") {\n    queryDB(\n      `INSERT INTO Staff_Contracts VALUES (?, 0, ?, ?, ?, ?, ?, ?, ?, ?, 0.5, 0)`,\n      [contractValues.staffID,contractValues.teamID,contractValues.posInTeam,contractValues.startDay,contractValues.endSeason,contractValues.salary,contractValues.startingBonus,contractValues.raceBonus,contractValues.raceBonusTargetPos],'run'\n    );\n  }\n  queryDB(`UPDATE Staff_DriverData SET AssignedCarNumber = ? WHERE StaffID = ?`,[contractValues.posInTeam,driverID],'run');\n  queryDB(`UPDATE Staff_DriverData SET FeederSeriesAssignedCarNumber = ? WHERE StaffID = ?`,[contractValues.posInTeam,driverID],'run');\n  rearrangeDriverEngineerPairings(contractValues.teamID);\n  //if teamid is less than 22, then its 2, if more is 3\n  const juniorFormula = (contractValues.teamID < 22) ? 2 : 3;\n  //check if he is in the standings of that formula\n  let positionInStandings = queryDB(`SELECT Position FROM Races_DriverStandings WHERE SeasonID = ? AND DriverID = ? AND RaceFormula = ?`,[year,driverID,juniorFormula],\"singleValue\");\n  if (!positionInStandings) {\n    //insert in position maximum possible\n    const actualMaxPosition = queryDB(`SELECT COUNT(*) FROM Races_DriverStandings WHERE SeasonID = ? AND RaceFormula = ?`,[year,juniorFormula],\"singleValue\");\n    positionInStandings = actualMaxPosition + 1;\n    queryDB(`INSERT INTO Races_DriverStandings VALUES (?, ?, 0, ?, 0, 0, ?)`,[year,driverID,positionInStandings,juniorFormula],'run');\n  }\n\n}\n\nexport function hireDriver(type,driverID,teamID,position,salary = \"\",startingBonus = \"\",raceBonus = \"\",raceBonusPos = \"\",yearEnd = \"\",yearIteration = \"24\") {\n  if (type === \"auto\" || salary === \"\" || startingBonus === \"\") {\n    const params = getParamsAutoContract(driverID,teamID,position,yearIteration);\n    salary = params.salary;\n    yearEnd = params.yearEnd;\n    startingBonus = params.startingBonus;\n    raceBonus = params.raceBonus;\n    raceBonusPos = params.raceBonusPos;\n  }\n\n  const day = queryDB(\"SELECT Day FROM Player_State\",[],\"singleValue\");\n  const year = queryDB(\"SELECT CurrentSeason FROM Player_State\",[],\"singleValue\");\n  const staffType = fetchTypeStaff(driverID);\n  const contractValues = sanitizeContractPayload({\n    staffID: driverID,\n    contractType: 0,\n    teamID,\n    posInTeam: position,\n    startDay: day,\n    endSeason: yearEnd,\n    salary,\n    startingBonus,\n    raceBonus,\n    raceBonusTargetPos: raceBonusPos\n  });\n\n  const isRetired = queryDB(`SELECT Retired FROM Staff_GameData WHERE StaffID = ?`,[driverID],\"singleValue\");\n  if (isRetired === 1) {\n    queryDB(`UPDATE Staff_GameData SET Retired = 0 WHERE StaffID = ?`,[driverID],'run');\n  }\n\n  if (yearIteration === \"23\") {\n    queryDB(\n      `INSERT INTO Staff_Contracts VALUES (?, 0, 1, ?, 1, ?, ?, 1, '[OPINION_STRING_NEUTRAL]', ?, ?, 1, '[OPINION_STRING_NEUTRAL]', ?, 1, '[OPINION_STRING_NEUTRAL]', ?, 1, '[OPINION_STRING_NEUTRAL]', ?, 1, '[OPINION_STRING_NEUTRAL]', ?, 1, '[OPINION_STRING_NEUTRAL]', 0, 1, '[OPINION_STRING_NEUTRAL]')`,\n      [contractValues.staffID,contractValues.startDay,contractValues.teamID,contractValues.posInTeam,contractValues.startDay,contractValues.endSeason,contractValues.salary,contractValues.startingBonus,contractValues.raceBonus,contractValues.raceBonusTargetPos],'run'\n    );\n  } else if (yearIteration === \"24\") {\n    queryDB(\n      `INSERT INTO Staff_Contracts VALUES (?, 0, ?, ?, ?, ?, ?, ?, ?, ?, 0.5, 0)`,\n      [contractValues.staffID,contractValues.teamID,contractValues.posInTeam,contractValues.startDay,contractValues.endSeason,contractValues.salary,contractValues.startingBonus,contractValues.raceBonus,contractValues.raceBonusTargetPos],'run'\n    );\n  }\n\n  if (contractValues.posInTeam < 3 && staffType === 0) {\n    queryDB(`UPDATE Staff_DriverData SET AssignedCarNumber = ? WHERE StaffID = ?`,[contractValues.posInTeam,driverID],'run');\n    const isDrivingInF2F3 = queryDB(\n      `SELECT TeamID FROM Staff_Contracts WHERE StaffID = ? AND ContractType = 0 AND (TeamID > 10 AND TeamID < 32)`,\n      [driverID],\n      \"singleValue\"\n    );\n    if (isDrivingInF2F3 !== null && isDrivingInF2F3 !== undefined) {\n      queryDB(`DELETE FROM Staff_Contracts WHERE StaffID = ? AND ContractType = 0 AND TeamID = ?`,[driverID,isDrivingInF2F3],'run');\n      queryDB(`UPDATE Staff_DriverData SET FeederSeriesAssignedCarNumber = NULL WHERE StaffID = ?`,[driverID],'run');\n    }\n\n    let positionInStandings = queryDB(\n      `SELECT MAX(Position) FROM Races_DriverStandings WHERE SeasonID = ? AND RaceFormula = 1`,\n      [year],\n      \"singleValue\"\n    );\n    let pointsDriverInStandings = queryDB(\n      `SELECT Points FROM Races_DriverStandings WHERE DriverID = ? AND SeasonID = ? AND RaceFormula = 1`,\n      [driverID,year],\n      \"singleValue\"\n    );\n    if (pointsDriverInStandings === null || pointsDriverInStandings === undefined) {\n      pointsDriverInStandings = 0;\n      queryDB(\n        `INSERT INTO Races_DriverStandings VALUES (?, ?, ?, ?, 0, 0, 1)`,\n        [year,driverID,pointsDriverInStandings,positionInStandings + 1],'run'\n      );\n    }\n\n    const wasInF2 = queryDB(\n      `SELECT Points FROM Races_DriverStandings WHERE DriverID = ? AND SeasonID = ? AND RaceFormula = 2`,\n      [driverID,year],\n      \"singleValue\"\n    );\n    const wasInF3 = queryDB(\n      `SELECT Points FROM Races_DriverStandings WHERE DriverID = ? AND SeasonID = ? AND RaceFormula = 3`,\n      [driverID,year],\n      \"singleValue\"\n    );\n    if (wasInF2 !== null && wasInF2 !== undefined) {\n      queryDB(`DELETE FROM Races_DriverStandings WHERE DriverID = ? AND SeasonID = ? AND RaceFormula = 2`,[driverID,year],'run');\n    }\n    if (wasInF3 !== null && wasInF3 !== undefined) {\n      queryDB(`DELETE FROM Races_DriverStandings WHERE DriverID = ? AND SeasonID = ? AND RaceFormula = 3`,[driverID,year],'run');\n    }\n\n    const driverHasNumber = queryDB(\n      `SELECT Number FROM Staff_DriverNumbers WHERE CurrentHolder = ?`,\n      [driverID],\n      \"singleValue\"\n    );\n    if (!driverHasNumber) {\n      freeNumbersNotF1();\n      const freeNumbers = queryDB(\"SELECT Number FROM Staff_DriverNumbers WHERE CurrentHolder IS NULL AND Number != 0\",[],\"allRows\");\n      if (freeNumbers && freeNumbers.length > 0) {\n        const randIndex = Math.floor(Math.random() * freeNumbers.length);\n        const newNum = freeNumbers[randIndex][0];\n        queryDB(`UPDATE Staff_DriverNumbers SET CurrentHolder = ? WHERE Number = ?`,[driverID,newNum],'run');\n      }\n    }\n  }\n\n  rearrangeDriverEngineerPairings(contractValues.teamID);\n  fixDriverStandings();\n}\n\nexport function freeNumbersNotF1() {\n  const numbers = queryDB(\"SELECT CurrentHolder, Number FROM Staff_DriverNumbers WHERE Number != 0 AND CurrentHolder IS NOT NULL\",[],\"allRows\");\n  if (numbers) {\n    numbers.forEach(row => {\n      const driver = row[0];\n      const number = row[1];\n      const teamId = queryDB(\n        `SELECT MIN(TeamID) FROM Staff_Contracts WHERE StaffID = ? AND ContractType = 0`,\n        [driver],\n        \"singleValue\"\n      );\n      if (teamId !== null && teamId > 10 && teamId < 32) {\n        queryDB(`UPDATE Staff_DriverNumbers SET CurrentHolder = NULL WHERE Number = ?`,[number],'run');\n      }\n    });\n  }\n}\n\nexport function fetchTypeStaff(driverID) {\n  return queryDB(`SELECT StaffType FROM Staff_GameData WHERE StaffID = ?`,[driverID],\"singleValue\");\n}\n\nexport function getParamsAutoContract(driverID,teamID,position,yearIteration = \"24\") {\n  const day = queryDB(\"SELECT Day FROM Player_State\",[],\"singleValue\");\n  const year = queryDB(\"SELECT CurrentSeason FROM Player_State\",[],\"singleValue\");\n  const [tier,type,rating] = getTier(driverID);\n\n  // Calcular salary\n  const salaryRange = minMaxTypeStaff[type].salary[tier];\n  let salary = (Math.round((Math.random() * (salaryRange[1] - salaryRange[0]) + salaryRange[0]) * 1000) / 1000) * 1000000;\n  salary = salary.toString();\n\n  const startingBonusRange = minMaxTypeStaff[type].starting_bonus[tier];\n  let startingBonus = (Math.round((Math.random() * (startingBonusRange[1] - startingBonusRange[0]) + startingBonusRange[0]) * 1000) / 1000) * 1000000;\n  startingBonus = startingBonus.toString();\n\n  let yearEnd = parseInt(year) + Math.floor(Math.random() * (minMaxTypeStaff[type].year_end[tier][1] - minMaxTypeStaff[type].year_end[tier][0] + 1)) + minMaxTypeStaff[type].year_end[tier][0];\n  yearEnd = yearEnd.toString();\n\n  let raceBonus = \"0\";\n  let hasBonus = false;\n  if (type === \"driver\") {\n    if (tier === 1) {\n      const rbRange = minMaxTypeStaff[type].race_bonus[tier];\n      raceBonus = (Math.round((Math.random() * (rbRange[1] - rbRange[0]) + rbRange[0]) * 1000) / 1000) * 1000000;\n      raceBonus = raceBonus.toString();\n      hasBonus = true;\n    } else if (tier === 2) {\n      if (Math.floor(Math.random() * 11) <= 7) {\n        const rbRange = minMaxTypeStaff[type].race_bonus[tier];\n        raceBonus = (Math.round((Math.random() * (rbRange[1] - rbRange[0]) + rbRange[0]) * 1000) / 1000) * 1000000;\n        raceBonus = raceBonus.toString();\n        hasBonus = true;\n      } else {\n        raceBonus = \"0\";\n        hasBonus = false;\n      }\n    } else if (tier === 3) {\n      if (Math.floor(Math.random() * 11) <= 2) {\n        const rbRange = minMaxTypeStaff[type].race_bonus[tier];\n        raceBonus = (Math.round((Math.random() * (rbRange[1] - rbRange[0]) + rbRange[0]) * 1000) / 1000) * 1000000;\n        raceBonus = raceBonus.toString();\n        hasBonus = true;\n      } else {\n        raceBonus = \"0\";\n        hasBonus = false;\n      }\n    } else if (tier === 4) {\n      raceBonus = \"0\";\n      hasBonus = false;\n    }\n  } else {\n    raceBonus = \"0\";\n    hasBonus = false;\n  }\n\n  const driverBirthDate = queryDB(`SELECT DOB_ISO FROM Staff_BasicData WHERE StaffID = ?`,[driverID],\"singleValue\");\n  if (driverBirthDate) {\n    const yob = parseInt(driverBirthDate.split(\"-\")[0]);\n    if ((parseInt(year) - yob > 34) && type === \"driver\") {\n      yearEnd = (parseInt(year) + Math.floor(Math.random() * 2) + 1).toString();\n    }\n  }\n\n  let raceBonusPos = \"1\";\n  if (hasBonus) {\n    let prestigeTableName = \"Board_Prestige\";\n    if (yearIteration === \"24\") {\n      prestigeTableName = \"Board_TeamRating\";\n    }\n    const prestigeValues = queryDB(\n      `SELECT PtsFromConstructorResults, PtsFromDriverResults, PtsFromSeasonsEntered, PtsFromChampionshipsWon FROM ${prestigeTableName} WHERE SeasonID = ? AND TeamID = ?`,\n      [year,teamID],\n      \"allRows\"\n    );\n    let prestige = 0;\n    if (prestigeValues) {\n      prestigeValues.forEach(row => {\n        prestige += row[0];\n      });\n    }\n    if (prestige >= 750) {\n      raceBonusPos = (Math.floor(Math.random() * (3 - 1 + 1)) + 1).toString();\n    } else if (prestige >= 600) {\n      raceBonusPos = (Math.floor(Math.random() * (5 - 2 + 1)) + 2).toString();\n    } else if (prestige >= 525) {\n      raceBonusPos = (Math.floor(Math.random() * (10 - 7 + 1)) + 7).toString();\n    } else if (prestige >= 450) {\n      raceBonusPos = (Math.floor(Math.random() * (10 - 9 + 1)) + 9).toString();\n    } else {\n      raceBonus = \"0\";\n      raceBonusPos = \"1\";\n    }\n  }\n\n  return { salary,yearEnd,position,startingBonus,raceBonus,raceBonusPos };\n}\n\nexport function fireDriver(driverID,teamID) {\n  const position = queryDB(`SELECT PosInTeam FROM Staff_Contracts WHERE StaffID = ?`,[driverID],\"singleValue\");\n  queryDB(`DELETE FROM Staff_Contracts WHERE StaffID = ? AND ContractType = 0 AND TeamID = ?`,[driverID,teamID],'run');\n  if (position < 3) {\n    queryDB(`UPDATE Staff_DriverData SET AssignedCarNumber = NULL WHERE StaffID = ?`,[driverID],'run');\n  }\n  const engineerID = queryDB(\n    `SELECT RaceEngineerID FROM Staff_RaceEngineerDriverAssignments WHERE IsCurrentAssignment = 1 AND DriverID = ?`,\n    [driverID],\n    \"singleValue\"\n  );\n  if (engineerID) {\n    queryDB(`UPDATE Staff_RaceEngineerDriverAssignments SET IsCurrentAssignment = 0 WHERE RaceEngineerID = ? AND DriverID = ?`,[engineerID,driverID],'run');\n  }\n}\n\nexport function removeFutureContract(driverID) {\n  queryDB(`DELETE FROM Staff_Contracts WHERE StaffID = ? AND ContractType = 3`,[driverID],'run');\n}\n\nexport function rearrangeDriverEngineerPairings(teamID) {\n  const engineers = queryDB(\n    `SELECT gam.StaffID FROM Staff_GameData gam JOIN Staff_Contracts con ON gam.StaffID = con.StaffID WHERE con.TeamID = ? AND con.ContractType = 0 AND gam.StaffType = 2`,\n    [teamID],\n    \"allRows\"\n  );\n  const drivers = queryDB(\n    `SELECT gam.StaffID FROM Staff_GameData gam JOIN Staff_Contracts con ON gam.StaffID = con.StaffID WHERE con.TeamID = ? AND con.ContractType = 0 AND gam.StaffType = 0 AND PosInTeam <= 2`,\n    [teamID],\n    \"allRows\"\n  );\n  if (drivers && drivers.length === 2 && engineers && engineers.length === 2) {\n    drivers.forEach(driverRow => {\n      const driverID = driverRow[0];\n      queryDB(`UPDATE Staff_RaceEngineerDriverAssignments SET IsCurrentAssignment = 0 WHERE DriverID = ?`,[driverID],'run');\n    });\n    engineers.forEach(engineerRow => {\n      const engineerID = engineerRow[0];\n      queryDB(`UPDATE Staff_RaceEngineerDriverAssignments SET IsCurrentAssignment = 0 WHERE RaceEngineerID = ?`,[engineerID],'run');\n    });\n    const pair1Exists = queryDB(\n      `SELECT DaysTogether FROM Staff_RaceEngineerDriverAssignments WHERE DriverID = ? AND RaceEngineerID = ?`,\n      [drivers[0][0],engineers[0][0]],\n      \"singleValue\"\n    );\n    if (pair1Exists !== null && pair1Exists !== undefined) {\n      queryDB(`UPDATE Staff_RaceEngineerDriverAssignments SET IsCurrentAssignment = 1 WHERE DriverID = ? AND RaceEngineerID = ?`,[drivers[0][0],engineers[0][0]],'run');\n    } else {\n      queryDB(`INSERT INTO Staff_RaceEngineerDriverAssignments VALUES (?, ?, 0, 0, 1)`,[engineers[0][0],drivers[0][0]],'run');\n    }\n    const pair2Exists = queryDB(\n      `SELECT DaysTogether FROM Staff_RaceEngineerDriverAssignments WHERE DriverID = ? AND RaceEngineerID = ?`,\n      [drivers[1][0],engineers[1][0]],\n      \"singleValue\"\n    );\n    if (pair2Exists !== null && pair2Exists !== undefined) {\n      queryDB(`UPDATE Staff_RaceEngineerDriverAssignments SET IsCurrentAssignment = 1 WHERE DriverID = ? AND RaceEngineerID = ?`,[drivers[1][0],engineers[1][0]],'run');\n    } else {\n      queryDB(`INSERT INTO Staff_RaceEngineerDriverAssignments VALUES (?, ?, 0, 0, 1)`,[engineers[1][0],drivers[1][0]],'run');\n    }\n  }\n}\n\nexport function swapDrivers(driver1ID,driver2ID) {\n  const contract1 = getCurrentMainContractSnapshot(driver1ID);\n  const contract2 = getCurrentMainContractSnapshot(driver2ID);\n\n  const safeDriver1ID = contract1.staffID;\n  const safeDriver2ID = contract2.staffID;\n  const team1ID = contract1.teamID;\n  const team2ID = contract2.teamID;\n  const position1 = contract1.posInTeam;\n  const position2 = contract2.posInTeam;\n\n  const year = queryDB(\"SELECT CurrentSeason FROM Player_State\",[],\"singleValue\");\n  const type1 = fetchTypeStaff(safeDriver1ID);\n  const type2 = fetchTypeStaff(safeDriver2ID);\n  const isStaff = (type1 === 1 || type2 === 1);\n\n  if (position1 < 3 && position2 < 3 && !isStaff) {\n    queryDB(`UPDATE Staff_Contracts SET TeamID = ?, PosInTeam = ? WHERE ContractType = 0 AND StaffID = ?`,[team2ID,position2,safeDriver1ID],'run');\n    queryDB(`UPDATE Staff_Contracts SET TeamID = ?, PosInTeam = ? WHERE ContractType = 0 AND StaffID = ?`,[team1ID,position1,safeDriver2ID],'run');\n    queryDB(`UPDATE Staff_DriverData SET AssignedCarNumber = ? WHERE StaffID = ?`,[position2,safeDriver1ID],'run');\n    queryDB(`UPDATE Staff_DriverData SET AssignedCarNumber = ? WHERE StaffID = ?`,[position1,safeDriver2ID],'run');\n    rearrangeDriverEngineerPairings(team1ID);\n    rearrangeDriverEngineerPairings(team2ID);\n  } else if ((position1 >= 3 && position2 >= 3) || isStaff) {\n    queryDB(`UPDATE Staff_Contracts SET TeamID = ? WHERE ContractType = 0 AND StaffID = ?`,[team2ID,safeDriver1ID],'run');\n    queryDB(`UPDATE Staff_Contracts SET TeamID = ? WHERE ContractType = 0 AND StaffID = ?`,[team1ID,safeDriver2ID],'run');\n  } else if (position1 >= 3) {\n    const isDrivingInF2 = queryDB(\n      `SELECT TeamID FROM Staff_Contracts WHERE StaffID = ? AND ContractType = 0 AND (TeamID > 10 AND TeamID < 32)`,\n      [safeDriver1ID],\n      \"singleValue\"\n    );\n    if (isDrivingInF2) {\n      queryDB(`DELETE FROM Staff_Contracts WHERE StaffID = ? AND ContractType = 0 AND TeamID = ?`,[safeDriver1ID,isDrivingInF2],'run');\n    }\n    const type = fetchTypeStaff(safeDriver1ID);\n    if (parseInt(type) === 0) {\n      const wasInF2 = queryDB(\n        `SELECT Points FROM Races_DriverStandings WHERE DriverID = ? AND SeasonID = ? AND RaceFormula = 2`,\n        [safeDriver1ID,year],\n        \"singleValue\"\n      );\n      const wasInF3 = queryDB(\n        `SELECT Points FROM Races_DriverStandings WHERE DriverID = ? AND SeasonID = ? AND RaceFormula = 3`,\n        [safeDriver1ID,year],\n        \"singleValue\"\n      );\n      if (wasInF2) {\n        queryDB(`DELETE FROM Races_DriverStandings WHERE DriverID = ? AND SeasonID = ? AND RaceFormula = 2`,[safeDriver1ID,year],'run');\n      }\n      if (wasInF3) {\n        queryDB(`DELETE FROM Races_DriverStandings WHERE DriverID = ? AND SeasonID = ? AND RaceFormula = 3`,[safeDriver1ID,year],'run');\n      }\n      const position1InStandings = queryDB(\n        `SELECT MAX(Position) FROM Races_DriverStandings WHERE RaceFormula = 1 AND SeasonID = ?`,\n        [year],\n        \"singleValue\"\n      );\n      let pointsDriver1InStandings = queryDB(\n        `SELECT Points FROM Races_DriverStandings WHERE RaceFormula = 1 AND DriverID = ? AND SeasonID = ?`,\n        [safeDriver1ID,year],\n        \"singleValue\"\n      );\n      if (pointsDriver1InStandings === null || pointsDriver1InStandings === undefined) {\n        pointsDriver1InStandings = 0;\n        queryDB(\n          `INSERT INTO Races_DriverStandings VALUES (?, ?, ?, ?, 0, 0, 1)`,\n          [year,safeDriver1ID,pointsDriver1InStandings,position1InStandings + 1],'run'\n        );\n      }\n    }\n    queryDB(\n      `UPDATE Staff_Contracts SET TeamID = ?, PosInTeam = ? WHERE ContractType = 0 AND StaffID = ? AND TeamID = ?`,\n      [team1ID,position1,safeDriver2ID,team2ID],'run'\n    );\n    queryDB(`UPDATE Staff_DriverData SET AssignedCarNumber = NULL WHERE StaffID = ?`,[safeDriver2ID],'run');\n    queryDB(\n      `UPDATE Staff_Contracts SET TeamID = ?, PosInTeam = ? WHERE ContractType = 0 AND StaffID = ? AND TeamID = ?`,\n      [team2ID,position2,safeDriver1ID,team1ID],'run'\n    );\n    queryDB(`UPDATE Staff_DriverData SET AssignedCarNumber = ? WHERE StaffID = ?`,[position2,safeDriver1ID],'run');\n    rearrangeDriverEngineerPairings(team1ID);\n    rearrangeDriverEngineerPairings(team2ID);\n  } else if (position2 >= 3) {\n    const isDrivingInF2 = queryDB(\n      `SELECT TeamID FROM Staff_Contracts WHERE StaffID = ? AND ContractType = 0 AND (TeamID > 10 AND TeamID < 32)`,\n      [safeDriver2ID],\n      \"singleValue\"\n    );\n    if (isDrivingInF2) {\n      queryDB(`DELETE FROM Staff_Contracts WHERE StaffID = ? AND ContractType = 0 AND TeamID = ?`,[safeDriver2ID,isDrivingInF2],'run');\n    }\n    const type = fetchTypeStaff(safeDriver1ID);\n    if (parseInt(type) === 0) {\n      const wasInF2 = queryDB(\n        `SELECT Points FROM Races_DriverStandings WHERE DriverID = ? AND SeasonID = ? AND RaceFormula = 2`,\n        [safeDriver2ID,year],\n        \"singleValue\"\n      );\n      const wasInF3 = queryDB(\n        `SELECT Points FROM Races_DriverStandings WHERE DriverID = ? AND SeasonID = ? AND RaceFormula = 3`,\n        [safeDriver2ID,year],\n        \"singleValue\"\n      );\n      if (wasInF2) {\n        queryDB(`DELETE FROM Races_DriverStandings WHERE DriverID = ? AND SeasonID = ? AND RaceFormula = 2`,[safeDriver2ID,year],'run');\n      }\n      if (wasInF3) {\n        queryDB(`DELETE FROM Races_DriverStandings WHERE DriverID = ? AND SeasonID = ? AND RaceFormula = 3`,[safeDriver2ID,year],'run');\n      }\n      const position2InStandings = queryDB(\n        `SELECT MAX(Position) FROM Races_DriverStandings WHERE RaceFormula = 1 AND SeasonID = ?`,\n        [year],\n        \"singleValue\"\n      );\n      let pointsDriver2InStandings = queryDB(\n        `SELECT Points FROM Races_DriverStandings WHERE RaceFormula = 1 AND DriverID = ? AND SeasonID = ?`,\n        [safeDriver2ID,year],\n        \"singleValue\"\n      );\n      if (pointsDriver2InStandings === null || pointsDriver2InStandings === undefined) {\n        pointsDriver2InStandings = 0;\n        queryDB(\n          `INSERT INTO Races_DriverStandings VALUES (?, ?, ?, ?, 0, 0, 1)`,\n          [year,safeDriver2ID,pointsDriver2InStandings,position2InStandings + 1],'run'\n        );\n      }\n    }\n    queryDB(\n      `UPDATE Staff_Contracts SET TeamID = ?, PosInTeam = ? WHERE ContractType = 0 AND StaffID = ? AND TeamID = ?`,\n      [team2ID,position2,safeDriver1ID,team1ID],'run'\n    );\n    queryDB(`UPDATE Staff_DriverData SET AssignedCarNumber = NULL WHERE StaffID = ?`,[safeDriver1ID],'run');\n    queryDB(\n      `UPDATE Staff_Contracts SET TeamID = ?, PosInTeam = ? WHERE ContractType = 0 AND StaffID = ? AND TeamID = ?`,\n      [team1ID,position1,safeDriver2ID,team2ID],'run'\n    );\n    queryDB(`UPDATE Staff_DriverData SET AssignedCarNumber = ? WHERE StaffID = ?`,[position1,safeDriver2ID],'run');\n    rearrangeDriverEngineerPairings(team1ID);\n    rearrangeDriverEngineerPairings(team2ID);\n  }\n  checkAndFixContract(safeDriver1ID, team2ID);\n  checkAndFixContract(safeDriver2ID, team1ID);\n  fixDriverStandings();\n}\n\nexport function editContract(driverID,salary,endSeason,startingBonus,raceBonus,raceBonusTargetPos) {\n  let safeDriverID = toContractInt(driverID, 0);\n  const contractValues = sanitizeContractPayload({\n    staffID: safeDriverID,\n    contractType: 0,\n    salary,\n    endSeason,\n    startingBonus,\n    raceBonus,\n    raceBonusTargetPos\n  });\n  const hasContract = queryDB(\n    `SELECT TeamID FROM Staff_Contracts WHERE StaffID = ? AND ContractType = 0`,\n    [safeDriverID],\n    \"singleValue\"\n  );\n  if (hasContract !== null && hasContract !== undefined) {\n    queryDB(\n      `UPDATE Staff_Contracts SET Salary = ?, EndSeason = ?, StartingBonus = ?, RaceBonus = ?, RaceBonusTargetPos = ? WHERE ContractType = 0 AND StaffID = ?`,\n      [contractValues.salary,contractValues.endSeason,contractValues.startingBonus,contractValues.raceBonus,contractValues.raceBonusTargetPos,safeDriverID],'run'\n    );\n  }\n}\n\nexport function futureContract(teamID,driverID,salary,endSeason,startingBonus,raceBonus,raceBonusTargetPos,position,yearIteration = \"24\") {\n  let safeDriverID = toContractInt(driverID, 0);\n  const requestedTeamID = toContractInt(teamID, CONTRACT_PLACEHOLDERS_24.teamID);\n\n  if (requestedTeamID === -1) {\n    queryDB(`DELETE FROM Staff_Contracts WHERE StaffID = ? AND ContractType = 3`,[safeDriverID],'run');\n  } else {\n    const season = queryDB(\"SELECT CurrentSeason FROM Player_State\",[],\"singleValue\");\n    const day = getExcelDate(parseInt(season) + 1);\n    const contractValues = sanitizeContractPayload({\n      staffID: safeDriverID,\n      contractType: 3,\n      teamID: requestedTeamID,\n      posInTeam: position,\n      startDay: day,\n      endSeason,\n      salary,\n      startingBonus,\n      raceBonus,\n      raceBonusTargetPos\n    });\n\n    let alreadyHasFutureContract = queryDB(\n      `SELECT TeamID FROM Staff_Contracts WHERE StaffID = ? AND ContractType = 3`,\n      [safeDriverID],\n      \"singleValue\"\n    );\n    alreadyHasFutureContract = toContractInt(alreadyHasFutureContract, -1);\n\n    if (alreadyHasFutureContract !== contractValues.teamID) {\n      queryDB(`DELETE FROM Staff_Contracts WHERE StaffID = ? AND ContractType = 3`,[safeDriverID],'run');\n      if (yearIteration === \"24\") {\n        queryDB(\n          `INSERT INTO Staff_Contracts VALUES (?, 3, ?, ?, ?, ?, ?, ?, ?, ?, 0.5, 0)`,\n          [contractValues.staffID,contractValues.teamID,contractValues.posInTeam,contractValues.startDay,contractValues.endSeason,contractValues.salary,contractValues.startingBonus,contractValues.raceBonus,contractValues.raceBonusTargetPos],'run'\n        );\n      } else if (yearIteration === \"23\") {\n        queryDB(\n          `INSERT INTO Staff_Contracts VALUES (?, 3, 1, ?, 1, ?, ?, 1, '[OPINION_STRING_NEUTRAL]', ?, ?, 1, '[OPINION_STRING_NEUTRAL]', ?, 1, '[OPINION_STRING_NEUTRAL]', ?, 1, '[OPINION_STRING_NEUTRAL]', ?, 1, '[OPINION_STRING_NEUTRAL]', ?, 1, '[OPINION_STRING_NEUTRAL]', 0, 1, '[OPINION_STRING_NEUTRAL]')`,\n          [contractValues.staffID,contractValues.startDay,contractValues.teamID,contractValues.posInTeam,contractValues.startDay,contractValues.endSeason,contractValues.salary,contractValues.startingBonus,contractValues.raceBonus,contractValues.raceBonusTargetPos],'run'\n        );\n      }\n    } else {\n      queryDB(\n        `UPDATE Staff_Contracts SET PosInTeam = ?, Salary = ?, EndSeason = ?, StartingBonus = ?, RaceBonus = ?, RaceBonusTargetPos = ? WHERE StaffID = ? AND TeamID = ? AND ContractType = 3`,\n        [contractValues.posInTeam,contractValues.salary,contractValues.endSeason,contractValues.startingBonus,contractValues.raceBonus,contractValues.raceBonusTargetPos,contractValues.staffID,alreadyHasFutureContract],'run'\n      );\n    }\n  }\n}\n\nexport function getExcelDate(year) {\n  const excelStartDate = new Date(1900,0,1);\n  const targetDate = new Date(year,0,1);\n  const diffDays = Math.floor((targetDate - excelStartDate) / (1000 * 60 * 60 * 24)) + 2;\n  return diffDays;\n}\n\nexport function unretire(driverID) {\n  queryDB(`UPDATE Staff_GameData SET Retired = 0 WHERE StaffID = ?`,[driverID],'run');\n  queryDB(`UPDATE Staff_DriverData SET HasSuperLicense = 1 WHERE StaffID = ?`,[driverID],'run');\n}\n\nexport function getTier(driverID) {\n  const driverStats = queryDB(`SELECT Val FROM Staff_PerformanceStats WHERE StaffID = ?`,[driverID],\"allRows\");\n  let type = \"driver\";\n  let rating = 0;\n  if (driverStats && driverStats.length === 9) {\n    const cornering = parseFloat(driverStats[0][0]);\n    const braking = parseFloat(driverStats[1][0]);\n    const control = parseFloat(driverStats[2][0]);\n    const smoothness = parseFloat(driverStats[3][0]);\n    const adaptability = parseFloat(driverStats[4][0]);\n    const overtaking = parseFloat(driverStats[5][0]);\n    const defence = parseFloat(driverStats[6][0]);\n    const reactions = parseFloat(driverStats[7][0]);\n    const accuracy = parseFloat(driverStats[8][0]);\n    rating = (cornering + braking * 0.75 + reactions * 0.5 + control * 0.75 + smoothness * 0.5 + accuracy * 0.75 + adaptability * 0.25 + overtaking * 0.25 + defence * 0.25) / 5;\n    rating = Math.round(rating);\n  } else if (driverStats && driverStats.length > 0) {\n    type = \"staff\";\n    driverStats.forEach(stat => {\n      rating += parseFloat(stat[0]);\n    });\n    rating = rating / driverStats.length;\n  } else {\n    rating = 0;\n  }\n  let tier = 4;\n  if (rating >= 89) {\n    tier = 1;\n  } else if (rating >= 85) {\n    tier = 2;\n  } else if (rating >= 80) {\n    tier = 3;\n  } else {\n    tier = 4;\n  }\n  return [tier,type,rating];\n}\n\nexport function getDriverOverall(driverID) {\n  const driverStats = queryDB(`SELECT Val FROM Staff_PerformanceStats WHERE StaffID = ?`,[driverID],\"allRows\");\n  let rating = 0;\n  if (driverStats && driverStats.length === 9) {\n    const cornering = parseFloat(driverStats[0][0]);\n    const braking = parseFloat(driverStats[1][0]);\n    const control = parseFloat(driverStats[2][0]);\n    const smoothness = parseFloat(driverStats[3][0]);\n    const adaptability = parseFloat(driverStats[4][0]);\n    const overtaking = parseFloat(driverStats[5][0]);\n    const defence = parseFloat(driverStats[6][0]);\n    const reactions = parseFloat(driverStats[7][0]);\n    const accuracy = parseFloat(driverStats[8][0]);\n    rating = (cornering + braking * 0.75 + reactions * 0.5 + control * 0.75 + smoothness * 0.5 + accuracy * 0.75 + adaptability * 0.25 + overtaking * 0.25 + defence * 0.25) / 5;\n  } else if (driverStats && driverStats.length > 0) {\n    driverStats.forEach(stat => {\n      rating += parseFloat(stat[0]);\n    });\n    rating = rating / driverStats.length;\n  } else {\n    rating = 0;\n  }\n  return Math.round(rating);\n}\n\nexport function getDriverId(name) {\n  let driver = name.charAt(0).toUpperCase() + name.slice(1);\n  const multipleDrivers = [\"Perez\",\"Raikkonen\",\"Hulkenberg\",\"Toth\",\"Stanek\",\"Villagomez\",\"Bolukbasi\",\"Marti\"];\n  if (multipleDrivers.includes(driver)) {\n    driver = driver + \"1\";\n  }\n  let driverId;\n  if (driver === \"Aleclerc\") {\n    driverId = 132;\n  } else if (driver === \"Devries\") {\n    driverId = 76;\n  } else if (driver === \"Dschumacher\") {\n    driverId = 270;\n  } else {\n    const lastName = `[StaffName_Surname_${driver}]`;\n    driverId = queryDB(`SELECT StaffID FROM Staff_BasicData WHERE LastName = ?`,[lastName],\"singleValue\");\n  }\n  return driverId;\n}\n\nexport function fixDriverStandings() {\n  const year = queryDB(\"SELECT CurrentSeason FROM Player_State\",[],\"singleValue\");\n  const driversInStandings = queryDB(`SELECT DriverID FROM Races_DriverStandings WHERE SeasonID = ? AND RaceFormula = 1`,[year],\"allRows\");\n  if (driversInStandings) {\n    driversInStandings.forEach(driverRow => {\n      const driverID = driverRow[0];\n      const isDriver = queryDB(`SELECT StaffType FROM Staff_GameData WHERE StaffID = ?`,[driverID],\"singleValue\");\n      if (isDriver !== 0) {\n        queryDB(`DELETE FROM Races_DriverStandings WHERE DriverID = ? AND SeasonID = ? AND RaceFormula = 1`,[driverID,year],'run');\n      }\n    });\n  }\n}\n"
  },
  {
    "path": "src/js/backend/scriptUtils/triggerUtils.js",
    "content": "import { queryDB } from \"../dbManager\";\n\nconst difficultyDict = {\n  0: {\n    name: \"default\",\n    perc: 0,\n    \"7and8\": 0,\n    \"9\": 0,\n    reduction: 0,\n    research: 0\n  },\n  1: {\n    name: \"extraHard\",\n    perc: 0.5,\n    \"7and8\": 0.01,\n    \"9\": 0.005,\n    reduction: 0,\n    research: 8\n  },\n  2: {\n    name: \"brutal\",\n    perc: 0.8,\n    \"7and8\": 0.016,\n    \"9\": 0.008,\n    reduction: 0.05,\n    research: 14\n  },\n  3: {\n    name: \"unfair\",\n    perc: 1.5,\n    \"7and8\": 0.03,\n    \"9\": 0.015,\n    reduction: 0.11,\n    research: 30\n  },\n  4: {\n    name: \"insane\",\n    perc: 2,\n    \"7and8\": 0.04,\n    \"9\": 0.02,\n    reduction: 0.16,\n    research: 45\n  },\n  5: {\n    name: \"impossible\",\n    perc: 3,\n    \"7and8\": 0.06,\n    \"9\": 0.03,\n    reduction: 0.2,\n    research: 65\n  }\n};\n\n\nconst invertedDifficultyDict = Object.fromEntries(\n  Object.entries(difficultyDict).map(([key, entry]) => [entry.name, Number(key)])\n);\n\nexport function manageDifficultyTriggers(triggerList) {\n  console.log(\"Managing difficulty triggers with list:\", triggerList);\n  if (triggerList.statDif !== undefined) manageDesignBoostTriggers(triggerList.statDif);\n  if (triggerList.designTimeDif !== undefined) manageDesignTimeTriggers(triggerList.designTimeDif);\n  if (triggerList.lightDif !== undefined) manageWeightTrigger(triggerList.lightDif);\n  if (triggerList.buildDif !== undefined) manageInstantBuildTriggers(triggerList.buildDif);\n  if (triggerList.researchDif !== undefined) manageResearchTriggers(triggerList.researchDif);\n}\n\nexport function manageWeightTrigger(triggerLevel) {\n  console.log(\"Managing weight trigger with level:\", triggerLevel);\n  queryDB(\"DROP TRIGGER IF EXISTS reduced_weight_reducedWeight\", [], 'run');\n  queryDB(\"DROP TRIGGER IF EXISTS reduced_weight_normal\", [], 'run');\n  queryDB(\"DROP TRIGGER IF EXISTS reduced_weight_extraHard\", [], 'run');\n  queryDB(\"DROP TRIGGER IF EXISTS reduced_weight_extreme\", [], 'run');\n  queryDB(\"DROP TRIGGER IF EXISTS reduced_weight_impossible\", [], 'run');\n  triggerLevel = parseInt(triggerLevel);\n  let triggerSQL = \"\";\n  if (triggerLevel > 0) {\n    if (triggerLevel === 1) {\n      triggerSQL = `\n          CREATE TRIGGER reduced_weight_extraHard\n          AFTER INSERT ON Parts_Designs_StatValues\n          FOR EACH ROW\n          WHEN (\n            SELECT TeamID FROM Parts_Designs WHERE DesignID = NEW.DesignID\n          ) != (SELECT TeamID FROM Player)\n          AND NEW.PartStat = 15\n          BEGIN\n            UPDATE Parts_Designs_StatValues\n            SET \n              Value = 200,\n              unitValue = (\n                SELECT CASE PD.PartType\n                  WHEN 3 THEN 4340\n                  WHEN 4 THEN 1800\n                  WHEN 5 THEN 2240\n                  WHEN 6 THEN 3300\n                  WHEN 7 THEN 2680\n                  WHEN 8 THEN 2180\n                  ELSE value\n                END\n                FROM Parts_Designs PD\n                WHERE PD.DesignID = NEW.DesignID\n              )\n            WHERE DesignID = NEW.DesignID\n            AND PartStat = 15;\n          END;\n        `;\n    } else if (triggerLevel === 5) {\n      triggerSQL = `\n          CREATE TRIGGER reduced_weight_impossible\n          AFTER INSERT ON Parts_Designs_StatValues\n          FOR EACH ROW\n          WHEN (\n            SELECT TeamID FROM Parts_Designs WHERE DesignID = NEW.DesignID\n          ) != (SELECT TeamID FROM Player)\n          AND NEW.PartStat = 15\n          BEGIN\n            UPDATE Parts_Designs_StatValues\n            SET \n              Value = 0,\n              unitValue = (\n                SELECT CASE PD.PartType\n                  WHEN 3 THEN 3800\n                  WHEN 4 THEN 1250\n                  WHEN 5 THEN 1650\n                  WHEN 6 THEN 2750\n                  WHEN 7 THEN 2100\n                  WHEN 8 THEN 1700\n                  ELSE value\n                END\n                FROM Parts_Designs PD\n                WHERE PD.DesignID = NEW.DesignID\n              )\n            WHERE DesignID = NEW.DesignID\n            AND PartStat = 15;\n          END;\n        `;\n    }\n    if (triggerSQL) queryDB(triggerSQL, [], 'run');\n  }\n}\n\nexport function manageDesignTimeTriggers(triggerLevel) {\n  queryDB(\"DROP TRIGGER IF EXISTS designTime_extraHard\", [], 'run');\n  queryDB(\"DROP TRIGGER IF EXISTS designTime_brutal\", [], 'run');\n  queryDB(\"DROP TRIGGER IF EXISTS designTime_unfair\", [], 'run');\n  queryDB(\"DROP TRIGGER IF EXISTS designTime_insane\", [], 'run');\n  queryDB(\"DROP TRIGGER IF EXISTS designTime_impossible\", [], 'run');\n}\n\nexport function manageDesignBoostTriggers(triggerLevel) {\n  triggerLevel = parseInt(triggerLevel);\n  queryDB(\"DROP TRIGGER IF EXISTS difficulty_reducedWeight\", [], 'run');\n  queryDB(\"DROP TRIGGER IF EXISTS difficulty_extraHard\", [], 'run');\n  queryDB(\"DROP TRIGGER IF EXISTS difficulty_reducedWeight\", [], 'run');\n  queryDB(\"DROP TRIGGER IF EXISTS difficulty_brutal\", [], 'run');\n  queryDB(\"DROP TRIGGER IF EXISTS difficulty_unfair\", [], 'run');\n  queryDB(\"DROP TRIGGER IF EXISTS difficulty_insane\", [], 'run');\n  queryDB(\"DROP TRIGGER IF EXISTS difficulty_impossible\", [], 'run');\n  let triggerSQL = \"\";\n  if (triggerLevel > 0) {\n    const triggerName = `difficulty_${difficultyDict[triggerLevel].name}`;\n    const increase_perc = difficultyDict[triggerLevel].perc;\n    const increase_7and8 = difficultyDict[triggerLevel][\"7and8\"];\n    const increase_9 = difficultyDict[triggerLevel][\"9\"];\n    triggerSQL = `\n        CREATE TRIGGER ${triggerName}\n        AFTER INSERT ON Parts_Designs_StatValues\n        FOR EACH ROW\n        WHEN (\n          SELECT TeamID FROM Parts_Designs WHERE DesignID = NEW.DesignID\n          AND ValidFrom = (SELECT CurrentSeason FROM Player_State)\n        ) != (SELECT TeamID FROM Player)\n        AND NEW.PartStat != 15\n        BEGIN\n          UPDATE Parts_Designs_StatValues\n          SET \n            unitValue = CASE\n              WHEN NEW.PartStat IN (7, 8) THEN unitValue + ${increase_7and8}\n              WHEN NEW.PartStat = 9 THEN unitValue + ${increase_9}\n              ELSE unitValue + ${increase_perc}\n            END,\n            Value = CASE\n              WHEN NEW.PartStat IN (0, 1, 2, 3, 4, 5) THEN (unitValue + ${increase_perc}) * 10\n              WHEN NEW.PartStat = 6 THEN ((unitValue + ${increase_perc}) - 90) * 1000 / 10\n              WHEN NEW.PartStat = 7 THEN (unitValue + ${increase_7and8} - 3) / 0.002\n              WHEN NEW.PartStat = 8 THEN (unitValue + ${increase_7and8} - 5) / 0.002\n              WHEN NEW.PartStat = 9 THEN (unitValue + ${increase_9} - 7) / 0.001\n              WHEN NEW.PartStat = 10 THEN ((unitValue + ${increase_perc}) - 90) * 1000 / 10\n              WHEN NEW.PartStat = 11 THEN (85 - (unitValue + ${increase_perc})) * 1000 / 20\n              WHEN NEW.PartStat = 12 THEN ((unitValue + ${increase_perc}) - 70) * 1000 / 15\n              WHEN NEW.PartStat = 13 THEN (unitValue + ${increase_perc}) * 10\n              WHEN NEW.PartStat = 14 THEN (85 - (unitValue + ${increase_perc})) * 1000 / 15\n              WHEN NEW.PartStat = 15 THEN ((unitValue + ${increase_perc}) - 40) * 1000 / 30\n              WHEN NEW.PartStat = 18 THEN ((unitValue + ${increase_perc}) - 40) * 1000 / 30\n              WHEN NEW.PartStat = 19 THEN ((unitValue + ${increase_perc}) - 40) * 1000 / 30\n              ELSE NULL\n            END\n          WHERE DesignID = NEW.DesignID\n          AND PartStat = NEW.PartStat AND PartStat != 15;\n          \n          UPDATE Parts_TeamExpertise\n          SET Expertise = Expertise * (\n              (SELECT Value\n              FROM Parts_Designs_StatValues\n              WHERE DesignID = NEW.DesignID\n                AND PartStat = NEW.PartStat)\n              /\n              COALESCE(\n                (SELECT Value\n                FROM Parts_Designs_StatValues\n                WHERE PartStat = NEW.PartStat\n                  AND DesignID = (\n                      SELECT MAX(DesignID)\n                      FROM Parts_Designs\n                      WHERE DesignID < NEW.DesignID\n                        AND PartType = (SELECT PartType \n                                        FROM Parts_Designs \n                                        WHERE DesignID = NEW.DesignID)\n                        AND TeamID = (SELECT TeamID \n                                      FROM Parts_Designs \n                                      WHERE DesignID = NEW.DesignID)\n                  )\n                ),\n                (SELECT Value \n                FROM Parts_Designs_StatValues \n                WHERE DesignID = NEW.DesignID \n                  AND PartStat = NEW.PartStat\n                )\n              )\n          )\n          WHERE TeamID = (SELECT TeamID FROM Parts_Designs WHERE DesignID = NEW.DesignID)\n            AND PartType = (SELECT PartType FROM Parts_Designs WHERE DesignID = NEW.DesignID)\n            AND PartStat = NEW.PartStat;\n\n        END;\n      `;\n    queryDB(triggerSQL, [], 'run');\n  }\n}\n\nexport function manageInstantBuildTriggers(triggerLevel) {\n  queryDB(\"DROP TRIGGER IF EXISTS instant_build_insane\", [], 'run');\n  queryDB(\"DROP TRIGGER IF EXISTS instant_build_impossible\", [], 'run');\n}\n\nexport function manageResearchTriggers(triggerLevel) {\n  queryDB(\"DROP TRIGGER IF EXISTS research_reducedWeight\", [], 'run');\n  queryDB(\"DROP TRIGGER IF EXISTS research_extraHard\", [], 'run');\n  queryDB(\"DROP TRIGGER IF EXISTS research_brutal\", [], 'run');\n  queryDB(\"DROP TRIGGER IF EXISTS research_unfair\", [], 'run');\n  queryDB(\"DROP TRIGGER IF EXISTS research_insane\", [], 'run');\n  queryDB(\"DROP TRIGGER IF EXISTS research_impossible\", [], 'run');\n  triggerLevel = parseInt(triggerLevel);\n  let triggerSQL = \"\";\n  if (triggerLevel > 0) {\n    const triggerName = `research_${difficultyDict[triggerLevel].name}`;\n    const researchExp = difficultyDict[triggerLevel].research;\n    triggerSQL = `\n        CREATE TRIGGER ${triggerName}\n        AFTER UPDATE ON Parts_Designs\n        FOR EACH ROW\n        WHEN NEW.DesignWork >= NEW.DesignWorkMax\n        AND NEW.TeamID != (SELECT TeamID FROM Player)\n        AND NEW.ValidFrom = (SELECT CurrentSeason FROM Player_State) + 1\n        BEGIN\n          UPDATE Parts_Designs_StatValues\n          SET ExpertiseGain = ExpertiseGain + ${researchExp}\n          WHERE DesignID = NEW.DesignID;\n          \n          UPDATE Parts_TeamExpertise\n          SET NextSeasonExpertise = NextSeasonExpertise + ${researchExp / 2}\n          WHERE TeamID = NEW.TeamID\n          AND PartType = NEW.PartType;\n        END;\n      `;\n    queryDB(triggerSQL, [], 'run');\n  }\n}\n\nexport function upgradeFactories(triggerLevel) {\n  if (triggerLevel === 4) {\n    queryDB(\"UPDATE Buildings_HQ SET BuildingID = 34, DegradationValue = 1 WHERE BuildingType = 3 AND TeamID != (SELECT TeamID FROM Player) AND BuildingID < 34\", [], 'run');\n  } else if (triggerLevel === 6) {\n    queryDB(\"UPDATE Buildings_HQ SET BuildingID = 35, DegradationValue = 1 WHERE BuildingType = 3 AND TeamID != (SELECT TeamID FROM Player) AND BuildingID < 35\", [], 'run');\n  } else if (triggerLevel === -1) {\n    queryDB(\"UPDATE Buildings_HQ SET BuildingID = 33, DegradationValue = 1 WHERE BuildingType = 3 AND TeamID != (SELECT TeamID FROM Player) AND BuildingID >= 34\", [], 'run');\n  }\n}\n\nexport function manageRefurbishTrigger(type) {\n  queryDB(\"DROP TRIGGER IF EXISTS refurbish_fix\", [], 'run');\n  if (type === 1) {\n    const triggerSQL = `\n        CREATE TRIGGER refurbish_fix\n        AFTER UPDATE ON Buildings_HQ\n        FOR EACH ROW\n        BEGIN\n          UPDATE Buildings_HQ\n          SET DegradationValue = 1\n          WHERE DegradationValue < 0.7\n          AND TeamID != (SELECT TeamID FROM Player);\n        END;\n      `;\n    queryDB(triggerSQL, [], 'run');\n  }\n}\n\nexport function fetchExistingTriggers() {\n  let highest_difficulty = 0;\n  const triggerList = {\n    lightDif: -1,\n    researchDif: -1,\n    buildDif: -1,\n    statDif: -1,\n    designTimeDif: -1\n  };\n  let refurbish = 0;\n  let frozenMentality = 0;\n  let freezeDevelopment = 0;\n  const triggers = queryDB(\"SELECT name FROM sqlite_master WHERE type='trigger';\", [], \"allRows\");\n  if (triggers && triggers.length) {\n    triggers.forEach(row => {\n      const triggerName = row[0];\n      if (triggerName === \"freeze_development\") {\n        freezeDevelopment = 1;\n      }\n      const parts = triggerName.split(\"_\");\n      const dif = parts[parts.length - 1];\n      console.log(\"Processing trigger:\", triggerName, \"with difficulty part:\", dif);\n      const dif_level = invertedDifficultyDict[dif] !== undefined ? invertedDifficultyDict[dif] : 0;\n      console.log(\"Mapped difficulty level:\", dif_level);\n      const type_trigger = parts[0];\n\n      if (type_trigger === \"difficulty\") {\n        triggerList.statDif = dif_level;\n      } else if (type_trigger === \"designTime\") {\n        triggerList.designTimeDif = dif_level;\n      } else if (type_trigger === \"instant\") {\n        triggerList.buildDif = dif_level;\n      } else if (type_trigger === \"research\") {\n        triggerList.researchDif = dif_level;\n      } else if (type_trigger === \"reduced\") {\n        console.log(\"Found weight trigger with difficulty level:\", dif_level);\n        if (dif_level === 6) {\n          triggerList.lightDif = 2;\n        }\n        else{\n          triggerList.lightDif = dif_level;\n        }\n      } else if (type_trigger === \"refurbish\") {\n        refurbish = 1;\n      } else if (type_trigger === \"clear\") {\n        frozenMentality = 1;\n      }\n      \n      if (dif_level > highest_difficulty) highest_difficulty = dif_level;\n    });\n  }\n  return { highest_difficulty, triggerList, refurbish, frozenMentality, freezeDevelopment };\n}\n\n\nexport function deleteProblematicTriggers() {\n  const triggerStartNames = [\"trg_injury_revert\"];\n  for (const startName of triggerStartNames) {\n    const triggers = queryDB(\"SELECT name FROM sqlite_master WHERE type='trigger' AND name LIKE ?;\", [`${startName}%`], \"allRows\") || [];\n    triggers.forEach(row => {\n      const triggerName = row?.[0];\n      if (!triggerName) return;\n      const escaped = String(triggerName).replace(/\"/g, '\"\"');\n      queryDB(`DROP TRIGGER IF EXISTS \"${escaped}\"`, [], 'run');\n    });\n  }\n\n  queryDB(\"DROP TABLE IF EXISTS Custom_Injury_Swaps;\", [], 'run');\n}\n\n\nexport function editFreezeMentality(state) {\n  if (state === 0) {\n    queryDB(\"DROP TRIGGER IF EXISTS update_Opinion_After_Insert;\", [], 'run');\n    queryDB(\"DROP TRIGGER IF EXISTS update_Opinion_After_Update;\", [], 'run');\n    queryDB(\"DROP TRIGGER IF EXISTS clear_Staff_Mentality_Statuses;\", [], 'run');\n    queryDB(\"DROP TRIGGER IF EXISTS clear_Staff_Mentality_AreaOpinions;\", [], 'run');\n    queryDB(\"DROP TRIGGER IF EXISTS clear_Staff_Mentality_Events;\", [], 'run');\n    queryDB(\"DROP TRIGGER IF EXISTS reset_Staff_State;\", [], 'run');\n  } else {\n    queryDB(`\n      CREATE TRIGGER IF NOT EXISTS update_Opinion_After_Insert\n      AFTER INSERT ON Staff_Mentality_AreaOpinions\n      BEGIN\n        UPDATE Staff_Mentality_AreaOpinions\n        SET Opinion = 2\n        WHERE Opinion != 2;\n      END;\n    `, [], 'run');\n    queryDB(`\n      CREATE TRIGGER IF NOT EXISTS update_Opinion_After_Update\n      AFTER UPDATE OF Opinion ON Staff_Mentality_AreaOpinions\n      BEGIN\n        UPDATE Staff_Mentality_AreaOpinions\n        SET Opinion = 2\n        WHERE Opinion != 2;\n      END;\n    `, [], 'run');\n    queryDB(`\n      CREATE TRIGGER IF NOT EXISTS clear_Staff_Mentality_Statuses\n      AFTER INSERT ON Staff_Mentality_Statuses\n      BEGIN\n        DELETE FROM Staff_Mentality_Statuses;\n      END;\n    `, [], 'run');\n    queryDB(`\n      CREATE TRIGGER IF NOT EXISTS clear_Staff_Mentality_Events\n      AFTER INSERT ON Staff_Mentality_Events\n      BEGIN\n        DELETE FROM Staff_Mentality_Events;\n      END;\n    `, [], 'run');\n    queryDB(`\n      CREATE TRIGGER IF NOT EXISTS reset_Staff_State\n      AFTER UPDATE ON Staff_State\n      BEGIN\n        UPDATE Staff_State\n        SET Mentality = 50, MentalityOpinion = 2;\n      END;\n    `, [], 'run');\n  }\n}\n\nexport function editFreezeDevelopment(state) {\n  queryDB(\"DROP TRIGGER IF EXISTS freeze_development\", [], 'run');\n  if (parseInt(state) === 1) {\n    queryDB(`\n        CREATE TRIGGER freeze_development\n        AFTER UPDATE ON Parts_Designs\n        FOR EACH ROW\n        WHEN NEW.TeamID != (SELECT TeamID FROM Player)\n        AND NEW.PartType BETWEEN 3 AND 8\n        AND (\n          NEW.DesignWork != OLD.DesignWork OR\n          NEW.DayCompleted != OLD.DayCompleted OR\n          NEW.ValidFrom != OLD.ValidFrom OR\n          NEW.DayCreated != OLD.DayCreated\n        )\n        BEGIN\n          UPDATE Parts_Designs\n          SET \n            DesignWork = OLD.DesignWork,\n            DayCompleted = OLD.DayCompleted,\n            ValidFrom = OLD.ValidFrom,\n            DayCreated = OLD.DayCreated\n          WHERE rowid = NEW.rowid;\n        END;\n      `, [], 'run');\n  }\n}\n"
  },
  {
    "path": "src/js/backend/worker.js",
    "content": "import {\n  fetchSeasonResults, fetchEventsFrom, fetchTeamsStandings,\n  fetchTeamsStandingsWithPositionChange,\n  fetchDrivers, fetchStaff, fetchEngines, fetchYear, fetchDriverNumbers, checkCustomTables, checkYearSave,\n  fetchOneDriverSeasonResults, fetchOneTeamSeasonResults, fetchEventsDoneFrom, updateCustomEngines, fetchDriversPerYear, fetchDriverContracts,\n  fetchJuniorTeamDriverNames,\n  editEngines, updateCustomConfig, fetchCustomConfig,\n  fetch2025ModData, fetch2026ModData, check2025ModCompatibility,\n  fetchPointsRegulations,\n  fetchSessionResults,\n  getDate,\n  setCustomSaveConfig,\n  check2026ModCompatibility,\n  snapshotEnginePowerProgression\n} from \"./scriptUtils/dbUtils\";\nimport { getPerformanceAllTeamsSeason, getAttributesAllTeams, getPerformanceAllCars, getAttributesAllCars, getAduoEngineUpgradeRaceIds } from \"./scriptUtils/carAnalysisUtils\"\nimport { setDatabase, getMetadata, getDatabase } from \"./dbManager\";\nimport { fetchHead2Head, fetchHead2HeadTeam } from \"./scriptUtils/head2head\";\nimport { editTeam, fetchTeamData } from \"./scriptUtils/editTeamUtils\";\nimport { overwritePerformanceTeam, updateItemsForDesignDict, fitLoadoutsDict, getPartsFromTeam, getUnitValueFromParts, getAllPartsFromTeam, getMaxDesign, getUnitValueFromOnePart, deleteCustomEngineAndReassign, getTeamExpertise, updateTeamExpertise } from \"./scriptUtils/carAnalysisUtils\";\nimport { setGlobals, getGlobals } from \"./commandGlobals\";\nimport { editAge, editMarketability, editName, editRetirement, editSuperlicense, editCode, editMentality, editStats, setAllDriversStatsTo85 } from \"./scriptUtils/eidtStatsUtils\";\nimport { editCalendar, fetchCalendar } from \"./scriptUtils/calendarUtils\";\nimport { fireDriver, hireDriver, swapDrivers, editContract, futureContract, transferJuniorDriver, CONTRACT_PLACEHOLDERS_24 } from \"./scriptUtils/transferUtils\";\nimport { change2024Standings, changeDriverLineUps, changeStats, removeFastestLap, timeTravelWithData, manageAffiliates, changeRaces, manageStandings, \n  insertStaff2025, manageFeederSeries, changeDriverEngineerPairs, updatePerofmrnace2025, fixes_mod,\n  change2025Standings, \n  updateCalendar2026,\n  changeStats2026,\n  insertStaff2026,\n  changeLineUps2026,\n  changeDriverNumbers2026,\n  apply2026EnginePerformanceChanges,\n  updatePerofmrnace2026,\n  changeAdditionalRegulations2026,\n  fixesMod2026} from \"./scriptUtils/modUtils\";\nimport {\n  generate_news, getOneQualiDetails, getOneRaceDetails, getTransferDetails, getTeamComparisonDetails,\n  getFullChampionSeasonDetails, generateTurningResponse, upsertNews,\n  updateNewsFields,\n  upsertTurningPoints,\n  loadTPFromDB,\n  getCurrentAndNextSeasonGridLineups,\n  computeStableKey,\n  migrateLegacyData,\n  loadNewsMapFromDB,\n  ensureTurningPointsStructure,\n  deleteNews,\n  deleteTurningPoints,\n  getNewsAndTpYearsAvailable,\n  getNewsFromSeason,\n  deleteNewByKey,\n  checkDoublePointsBug,\n  fixDoublePointsBug,\n  getFullFeederSeriesDetails,\n  getCustomNewsOptions,\n  getRaceDriversForCustomNews,\n  createCustomNewsEntry\n} from \"./scriptUtils/newsUtils\";\nimport { fetchSeasonReviewData, getSelectedRecord, getSelectedTeamRecord, editRaceResults } from \"./scriptUtils/recordUtils\";\nimport { teamReplaceDict } from \"./commandGlobals\";\nimport { excelToDate } from \"./scriptUtils/eidtStatsUtils\";\nimport { analyzeFileToDatabase, repack } from \"./UESaveHandler\";\nimport { fetchRegulationsData, updateRegulations } from \"./scriptUtils/regulationsUtils.js\";\nimport { deleteProblematicTriggers } from \"./scriptUtils/triggerUtils.js\";\nimport { fetchCountryLocaleForCode, fetchRandomDraftForename, fetchRandomStaffDraft } from \"./scriptUtils/createStaffUtils.js\";\n\nimport initSqlJs from 'sql.js';\nimport { combined_dict } from \"../frontend/config\";\n\n// Diccionario de comandos\nconst workerCommands = {\n  loadDB: async (data, postMessage) => {\n    console.log(data)\n    const SQL = await initSqlJs({\n      locateFile: file => 'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.13.0/sql-wasm.wasm',\n      wasmMemory: new WebAssembly.Memory({ initial: 1024, maximum: 2048 })\n    });\n\n    const { db, metadata } = await analyzeFileToDatabase(data.file, SQL);\n\n    console.log(metadata)\n\n    let day = metadata.careerSaveMetadata.Day;\n    let date = excelToDate(day);\n\n    setDatabase(db, metadata);\n\n    postMessage({ responseMessage: \"Database loaded\", content: date });\n  },\n  exportSave: async (data, postMessage) => {\n    const db = getDatabase();\n    const metadata = getMetadata();\n\n    const result = repack(db, metadata);\n\n    postMessage({ responseMessage: \"Database exported\", content: result });\n  },\n  panicDownload: async (data, postMessage) => {\n    deleteProblematicTriggers();\n\n    const db = getDatabase();\n    const metadata = getMetadata();\n\n    const result = repack(db, metadata);\n\n    postMessage({ responseMessage: \"Database exported\", content: result });\n  },\n\n  yearSelected: (data, postMessage) => {\n    const year = data.year\n    const isCurrentYear = data.isCurrentYear ?? true;\n    const formula = data.formula ? Number(data.formula) : 1;\n    const results = fetchSeasonResults(year, isCurrentYear, formula === 1, formula);\n    const events = fetchEventsFrom(year, formula);\n    const teams = fetchTeamsStandingsWithPositionChange(year, formula);\n    const pointsInfo = fetchPointsRegulations()\n\n    postMessage({\n      responseMessage: \"Results fetched\",\n      content: [events, results, teams, pointsInfo]\n    });\n  },\n\n  saveSelected: (data, postMessage) => {\n\n    const yearData = checkYearSave();\n    postMessage({ responseMessage: \"Game Year\", content: yearData });\n\n    checkCustomTables(yearData[0]);\n\n    if (yearData[1] !== null) {\n      setGlobals({ createTeam: true });\n    }\n    else {\n      setGlobals({ createTeam: false });\n    }\n\n    setGlobals({ year: yearData[0] });\n\n    const date = getDate();\n    setGlobals({ date: date });\n\n    CONTRACT_PLACEHOLDERS_24.endSeason = Number(yearData[0]) + 1;\n\n    const drivers = fetchDrivers(yearData[0]);\n    postMessage({ responseMessage: \"Save loaded succesfully\", content: drivers, noti_msg: \"Save loaded succesfully\" });\n\n    const staff = fetchStaff(yearData[0]);\n    postMessage({ responseMessage: \"Staff fetched\", content: staff });\n\n    const customConfig = fetchCustomConfig();\n    postMessage({ responseMessage: \"Config\", content: customConfig });\n\n    const engines = fetchEngines();\n    postMessage({ responseMessage: \"Engines fetched\", content: engines });\n\n    const calendar = fetchCalendar();\n    postMessage({ responseMessage: \"Calendar fetched\", content: calendar });\n\n    const regulations = fetchRegulationsData();\n    postMessage({ responseMessage: \"Regulations fetched\", content: regulations });\n\n    const year = fetchYear();\n    postMessage({ responseMessage: \"Year fetched\", content: year });\n\n    const previousYear = Number(year) - 1;\n    const standings = fetchTeamsStandings(previousYear, 1);\n    postMessage({responseMessage: \"Previous year teams standings fetched\", content: { year: previousYear, standings }});\n  \n\n    const numbers = fetchDriverNumbers();\n    postMessage({ responseMessage: \"Numbers fetched\", content: numbers });\n\n    const [performance, races] = getPerformanceAllTeamsSeason(yearData[2], { useHistoricalEnginePower: true });\n    const aduoEngineUpgradeRaceIds = getAduoEngineUpgradeRaceIds();\n    postMessage({ responseMessage: \"Season performance fetched\", content: [performance, races, aduoEngineUpgradeRaceIds] });\n\n    const attributes = getAttributesAllTeams(yearData[2]);\n    postMessage({ responseMessage: \"Performance fetched\", content: [performance[performance.length - 1], attributes] });\n\n    const carPerformance = getPerformanceAllCars(yearData[2]);\n    const carAttributes = getAttributesAllCars(yearData[2]);\n    postMessage({ responseMessage: \"Cars fetched\", content: [carPerformance, carAttributes] });\n\n    const mod2026Data = fetch2026ModData();\n    const mod2025Data = fetch2025ModData();\n    postMessage({ responseMessage: \"Mod data fetched\", content: { ...mod2025Data, ...mod2026Data } });\n\n    const mod25Compatibility = check2025ModCompatibility(yearData[0]);\n    postMessage({ responseMessage: \"Mod compatibility\", content: mod25Compatibility });\n\n    const mod2026Compatibility = check2026ModCompatibility(yearData[0]);\n    postMessage({ responseMessage: \"Mod 2026 compatibility\", content: mod2026Compatibility });\n\n    const wasError2025 = fixes_mod();\n    if (wasError2025) {\n      postMessage({ responseMessage: \"Mod fixes\", content: \"\", noti_msg: \"An error in the 2025 DLC has been automatically fixed\", unlocksDownload: true });\n    }\n\n    const wasError2026 = fixesMod2026();\n    console.log(\"Was error 2026:\", wasError2026);\n    if (wasError2026.generalWasError) {\n      postMessage({ responseMessage: \"Mod fixes\", content: \"\", noti_msg: \"An error in the 2026 DLC has been automatically fixed\", unlocksDownload: true });\n    }\n\n    fetchSeasonResults(year, true, true, 1);\n\n    postMessage({ responseMessage: \"Save selected finished\" });\n  },\n  configuredH2H: (data, postMessage) => {\n    if (data.h2h !== \"-1\") {\n      let h2hRes;\n      if (data.mode === \"driver\") {\n        h2hRes = fetchHead2Head(data.h2h[0], data.h2h[1], data.year, data.isCurrentYear);\n      } else if (data.mode === \"team\") {\n        h2hRes = fetchHead2HeadTeam(data.h2h[0], data.h2h[1], data.year, data.isCurrentYear);\n      }\n\n      if (h2hRes) {\n        postMessage({ responseMessage: \"H2H fetched\", content: h2hRes, isEditCommand: true });\n      }\n    }\n\n    const h2hDrivers = [];\n    data.graph.forEach(driver => {\n      let res;\n      if (data.mode === \"driver\") {\n        res = fetchOneDriverSeasonResults(driver, data.year, data.isCurrentYear);\n      } else if (data.mode === \"team\") {\n        res = fetchOneTeamSeasonResults(driver, data.year);\n      }\n      h2hDrivers.push(res);\n    });\n\n    // Consulta eventos y los envía al frontend\n    const eventsDone = fetchEventsDoneFrom(data.year);\n    const allEvents = fetchEventsFrom(data.year);\n    h2hDrivers.push(eventsDone);\n    h2hDrivers.unshift(allEvents);\n\n    postMessage({ responseMessage: \"H2HDriver fetched\", content: h2hDrivers });\n  },\n  customEngines: (data, postMessage) => {\n    snapshotEnginePowerProgression(Object.keys(data?.enginesData || {}), 'pre_engine_edit');\n    updateCustomEngines(data.enginesData);\n    postMessage({\n      responseMessage: \"Custom engines updated\",\n      noti_msg: \"Succesfully updated the custom engines\",\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n    const engines = fetchEngines();\n    postMessage({ responseMessage: \"Engines fetched\", content: engines });\n\n    const yearData = checkYearSave();\n    const [performance, races] = getPerformanceAllTeamsSeason(yearData[2], { useHistoricalEnginePower: true });\n    const engineUpgradeRaceIds = getAduoEngineUpgradeRaceIds();\n    postMessage({ responseMessage: \"Season performance fetched\", content: [performance, races, engineUpgradeRaceIds] });\n\n    const attributes = getAttributesAllTeams(yearData[2]);\n    postMessage({ responseMessage: \"Performance fetched\", content: [performance[performance.length - 1], attributes] });\n  },\n  deleteCustomEngine: (data, postMessage) => {\n    const res = deleteCustomEngineAndReassign(data?.engineId, data?.fallbackEngineId);\n    if (!res.ok) {\n      postMessage({ responseMessage: \"Error\", error: res.error || \"Failed to delete custom engine\" });\n      return;\n    }\n\n    postMessage({\n      responseMessage: \"Custom engine deleted\",\n      noti_msg: \"Custom engine deleted\",\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n\n    const engines = fetchEngines();\n    postMessage({ responseMessage: \"Engines fetched\", content: engines });\n  },\n  yearSelectedH2H: (data, postMessage) => {\n    const drivers = fetchDriversPerYear(data.year);\n\n    postMessage({ responseMessage: \"DriversH2H fetched\", content: drivers });\n  },\n  teamRequest: (data, postMessage) => {\n    const teamID = data.teamID;\n    const teamData = fetchTeamData(teamID);\n    postMessage({ responseMessage: \"TeamData fetched\", content: teamData });\n  },\n  performanceRequest: (data, postMessage) => {\n    const globals = getGlobals();\n    const designDict = getPartsFromTeam(data.teamID);\n    const unitValues = getUnitValueFromParts(designDict);\n    const allParts = getAllPartsFromTeam(data.teamID);\n    const maxDesign = getMaxDesign();\n    const expertise = getTeamExpertise(data.teamID, globals.yearIteration);\n\n    const designResponse = { responseMessage: \"Parts stats fetched\", content: [unitValues, allParts, maxDesign, expertise] };\n    postMessage(designResponse);\n  },\n  editExpertise: (data, postMessage) => {\n    const globals = getGlobals();\n    updateTeamExpertise(data.teamID, data.expertise, globals.yearIteration);\n    postMessage({\n      responseMessage: \"Expertise updated\",\n      noti_msg: `Succesfully edited ${teamReplaceDict[data.teamName]}'s expertise`,\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n    const expertise = getTeamExpertise(data.teamID, globals.yearIteration);\n    postMessage({ responseMessage: \"Team expertise fetched\", content: expertise });\n  },\n  driverRequest: (data, postMessage) => {\n    const contract = fetchDriverContracts(data.driverID);\n    postMessage({ responseMessage: \"Contract fetched\", content: contract });\n  },\n  juniorTeamDriversRequest: (data, postMessage) => {\n    const teamID = Number(data.teamID);\n    if (teamID < 11 || teamID > 31) {\n      postMessage({ responseMessage: \"Error\", error: \"Invalid junior team id\" });\n      return;\n    }\n\n    const driverNames = fetchJuniorTeamDriverNames(teamID);\n    postMessage({ responseMessage: \"Junior team drivers fetched\", content: { teamID, driverNames } });\n  },\n  partRequest: (data, postMessage) => {\n    const partValues = getUnitValueFromOnePart(data.designID);\n    postMessage({ responseMessage: \"Part values fetched\", content: partValues });\n  },\n  editTeam: (data, postMessage) => {\n    editTeam(data);\n    postMessage({\n      responseMessage: \"Team updated\",\n      noti_msg: `Succesfully edited ${teamReplaceDict[data.teamName]}'s details`,\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n  },\n  editStats: (data, postMessage) => {\n    const globals = getGlobals();\n    editRetirement(data.driverID, data.isRetired);\n    if (data.typeStaff === \"0\") {\n      editSuperlicense(data.driverID, data.superLicense);\n      if (globals.yearIteration === \"24\") {\n        editMarketability(data.driverID, data.marketability);\n      }\n    }\n    editStats(data.driverID, data.typeStaff, data.statsArray, data.retirement, data.driverNum, data.wants1);\n    if (data.mentality !== \"-1\" && globals.yearIteration == \"24\") {\n\n      editMentality(data.driverID, data.mentality);\n    }\n    editAge(data.driverID, data.age);\n    if (data.newName !== \"-1\") {\n      editName(data.driverID, data.newName);\n    }\n    if (data.newCode !== \"-1\") {\n      editCode(data.driverID, data.newCode);\n    }\n\n    postMessage({\n      responseMessage: \"Stats updated\",\n      noti_msg: `Succesfully edited ${data.driver}'s stats`,\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n  },\n  fetchRandomStaffDraft: (data, postMessage) => {\n    const yearData = checkYearSave();\n    const draft = fetchRandomStaffDraft(data.typeStaff, yearData[0]);\n\n    postMessage({\n      responseMessage: \"Random staff draft fetched\",\n      content: draft\n    });\n  },\n  fetchRandomDraftForename: (data, postMessage) => {\n    const res = fetchRandomDraftForename(data.gender, data.staffNameLocale);\n    postMessage({\n      responseMessage: \"Random draft forename fetched\",\n      content: {\n        ...res,\n        draftId: data.draftId,\n        gender: data.gender\n      }\n    });\n  },\n  fetchCountryLocaleForCode: (data, postMessage) => {\n    const res = fetchCountryLocaleForCode(data.code);\n    postMessage({\n      responseMessage: \"Draft country locale fetched\",\n      content: {\n        ...res,\n        draftId: data.draftId\n      }\n    });\n  },\n  devSetAllDriversStats85: (data, postMessage) => {\n    setAllDriversStatsTo85();\n\n    postMessage({\n      responseMessage: \"Dev: driver stats updated\",\n      noti_msg: \"All drivers stats set to 85\",\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n\n    const yearData = checkYearSave();\n\n    const drivers = fetchDrivers(yearData[0]);\n    postMessage({ responseMessage: \"Drivers fetched\", content: drivers });\n\n    const staff = fetchStaff(yearData[0]);\n    postMessage({ responseMessage: \"Staff fetched\", content: staff });\n  },\n  devDownloadDatabase: (data, postMessage) => {\n    const db = getDatabase();\n    const metadata = getMetadata();\n\n    if (!db || !metadata) {\n      throw new Error(\"No database loaded\");\n    }\n\n    postMessage({\n      responseMessage: \"Dev database downloaded\",\n      content: {\n        filename: metadata.filename + \".db\",\n        fileData: db.export()\n      }\n    });\n  },\n  editPerformance: (data, postMessage) => {\n    let globals = getGlobals();\n\n    const yearData = checkYearSave();\n\n    overwritePerformanceTeam(data.teamID, data.parts, globals.isCreateATeam, globals.yearIteration, data.loadouts);\n    updateItemsForDesignDict(data.n_parts_designs, data.teamID)\n    fitLoadoutsDict(data.loadouts, data.teamID)\n\n    const [performance, races] = getPerformanceAllTeamsSeason(yearData[2], { useHistoricalEnginePower: true });\n    const aduoEngineUpgradeRaceIds = getAduoEngineUpgradeRaceIds();\n    const performanceResponse = { responseMessage: \"Season performance fetched\", content: [performance, races, aduoEngineUpgradeRaceIds], noti_msg: `Succesfully edited ${teamReplaceDict[data.teamName]}'s car performance` };\n    postMessage(performanceResponse);\n\n    const attibutes = getAttributesAllTeams(yearData[2]);\n    const attributesResponse = { responseMessage: \"Performance fetched\", content: [performance[performance.length - 1], attibutes] };\n    postMessage(attributesResponse);\n\n    const carPerformance = getPerformanceAllCars(yearData[2]);\n    const carAttributes = getAttributesAllCars(yearData[2]);\n    const carPerformanceResponse = {\n      responseMessage: \"Cars fetched\",\n      content: [carPerformance, carAttributes],\n      isEditCommand: true,\n      unlocksDownload: true\n    };\n    postMessage(carPerformanceResponse);\n  },\n  editEngine: (data, postMessage) => {\n    snapshotEnginePowerProgression(Object.keys(data?.engines || {}), 'pre_engine_edit');\n    editEngines(data.engines)\n    postMessage({\n      responseMessage: \"Engines updated\",\n      noti_msg: \"Succesfully edited all engines performance\",\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n\n    const yearData = checkYearSave();\n    const [performance, races] = getPerformanceAllTeamsSeason(yearData[2], { useHistoricalEnginePower: true });\n    const engineUpgradeRaceIds = getAduoEngineUpgradeRaceIds();\n    postMessage({ responseMessage: \"Season performance fetched\", content: [performance, races, engineUpgradeRaceIds] });\n\n    const attributes = getAttributesAllTeams(yearData[2]);\n    postMessage({ responseMessage: \"Performance fetched\", content: [performance[performance.length - 1], attributes] });\n  },\n  editContract: (data, postMessage) => {\n    const year = getGlobals().yearIteration;\n\n    editContract(data.driverID, data.salary, data.year,\n      data.signBonus, data.raceBonus, data.raceBonusPos);\n\n    futureContract(data.futureTeam, data.driverID, data.futureSalary, data.futureYear,\n      data.futureSignBonus, data.futureRaceBonus, data.futureRaceBonusPos, data.futurePosition, year);\n\n    postMessage({\n      responseMessage: \"Contract updated\",\n      noti_msg: `Succesfully edited ${data.driver}'s contract`,\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n  },\n  editCalendar: (data, postMessage) => {\n    const year = getGlobals().yearIteration;\n    editCalendar(year, data.racesData);\n    postMessage({\n      responseMessage: \"Calendar updated\",\n      noti_msg: \"Succesfully updated the calendar\",\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n  },\n  editRegulations: (data, postMessage) => {\n    updateRegulations(data);\n    const regulations = fetchRegulationsData();\n    postMessage({\n      responseMessage: \"Regulations fetched\",\n      content: regulations,\n      noti_msg: \"Succesfully updated regulations\",\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n  },\n  regulationsRefresh: (data, postMessage) => {\n    const regulations = fetchRegulationsData();\n    postMessage({ responseMessage: \"Regulations fetched\", content: regulations });\n  },\n  configUpdate: (data, postMessage) => {\n    updateCustomConfig(data);\n    postMessage({\n      responseMessage: \"Config updated\",\n      noti_msg: \"Succesfully updated the configuration\",\n      unlocksDownload: true\n    });\n  },\n  fireDriver: (data, postMessage) => {\n    fireDriver(data.driverID, data.teamID);\n    postMessage({\n      responseMessage: \"Driver fired\",\n      noti_msg: `Succesfully fired ${data.driver} from ${data.team}`,\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n  },\n  hireDriver: (data, postMessage) => {\n    hireDriver(\"hire\", data.driverID, data.teamID, data.position, data.salary, data.signBonus, data.raceBonus, data.raceBonusPos, data.year, getGlobals().yearIteration);\n    postMessage({\n      responseMessage: \"Driver hired\",\n      noti_msg: `Succesfully hired ${data.driver} to ${data.team}`,\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n  },\n  juniorTransfer(data, postMessage) {\n    transferJuniorDriver(data.driverID, data.teamID, data.posInTeam, getGlobals().yearIteration);\n    postMessage({\n      responseMessage: \"Junior driver transferred\",\n      noti_msg: `Succesfully transferred ${data.driver} to ${data.team}`,\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n\n    const yearData = checkYearSave();\n\n    const drivers = fetchDrivers(yearData[0]);\n    postMessage({ responseMessage: \"Drivers fetched\", content: drivers });\n  },\n  autoContract: (data, postMessage) => {\n    hireDriver(\"auto\", data.driverID, data.teamID, data.position, getGlobals().yearIteration);\n    postMessage({\n      responseMessage: \"Driver hired\",\n      noti_msg: `Succesfully hired ${data.driver} to ${data.team}`,\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n  },\n  swapDrivers: (data, postMessage) => {\n    swapDrivers(data.driver1ID, data.driver2ID);\n    postMessage({\n      responseMessage: \"Drivers swapped\",\n      noti_msg: `Succesfully swapped ${data.driver1} and ${data.driver2}`,\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n  },\n  timeTravel: (data, postMessage) => {\n    timeTravelWithData(data.dayNumber, false, data.mod);\n    if (data.mod === \"2026\"){\n      changeDriverNumbers2026();\n    }\n    postMessage({\n      responseMessage: \"Time travel\",\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n  },\n  changeLineUps: (data, postMessage) => {\n    if (data.mod === \"2025\"){\n      changeDriverLineUps();\n      manageAffiliates();\n      manageFeederSeries();\n      changeDriverEngineerPairs();\n    }\n    else if (data.mod === \"2026\"){\n      changeLineUps2026();\n    }\n    postMessage({\n      responseMessage: \"Line ups changed\",\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n\n    const yearData = checkYearSave();\n\n\n\n    const drivers = fetchDrivers(yearData[0]);\n    postMessage({ responseMessage: \"Drivers fetched\", content: drivers });\n\n    const staff = fetchStaff(yearData[0]);\n    postMessage({ responseMessage: \"Staff fetched\", content: staff });\n  },\n  driversRefresh: (data, postMessage) => {\n    const yearData = checkYearSave();\n\n    const drivers = fetchDrivers(yearData[0]);\n    postMessage({ responseMessage: \"Drivers fetched\", content: drivers });\n  },\n  calendarRefresh: (data, postMessage) => {\n    const calendar = fetchCalendar();\n    postMessage({ responseMessage: \"Calendar fetched\", content: calendar });\n  },\n  changeStats: (data, postMessage) => {\n    if (data.mod === \"2025\"){\n      changeStats();\n    }\n    else if (data.mod === \"2026\"){\n      changeStats2026();\n    }\n    postMessage({\n      responseMessage: \"Stats changed\",\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n\n    const yearData = checkYearSave();\n\n    const drivers = fetchDrivers(yearData[0]);\n    postMessage({ responseMessage: \"Drivers fetched\", content: drivers });\n\n    const staff = fetchStaff(yearData[0]);\n    postMessage({ responseMessage: \"Staff fetched\", content: staff });\n  },\n  changeCfd: (data, postMessage) => {\n    if (data.mod === \"2025\"){\n      change2024Standings(data.mod);\n    }\n    else if (data.mod === \"2026\"){\n      change2024Standings(data.mod);\n      change2025Standings(data.mod);\n    }\n    \n    postMessage({\n      responseMessage: \"CFD times changed\",\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n  },\n  changeRegulations: (data, postMessage) => {\n    removeFastestLap(data.mod);\n    if (data.mod === \"2026\"){\n      changeAdditionalRegulations2026();\n    }\n    postMessage({\n      responseMessage: \"Regulations changed\",\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n  },\n  changeCalendar: (data, postMessage) => {\n    if (data.mod === \"2025\") {\n      changeRaces(data.type);\n    }\n    else if (data.mod === \"2026\") {\n      updateCalendar2026(data.type);\n    }\n    postMessage({\n      responseMessage: \"Calendar changed\",\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n\n    const calendar = fetchCalendar();\n    postMessage({ responseMessage: \"Calendar fetched\", content: calendar });\n  },\n  extraDrivers: (data, postMessage) => {\n    if (data.mod === \"2025\") {\n      insertStaff2025();\n    } else if (data.mod === \"2026\") {\n      insertStaff2026();\n    }\n    postMessage({\n      responseMessage: \"Extra drivers added\",\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n\n    const yearData = checkYearSave();\n\n    const drivers = fetchDrivers(yearData[0]);\n    postMessage({ responseMessage: \"Drivers fetched\", content: drivers });\n\n    const staff = fetchStaff(yearData[0]);\n    postMessage({ responseMessage: \"Staff fetched\", content: staff });\n  },\n  changePerformance: (data, postMessage) => {\n    if (data.mod === \"2025\") {\n      updatePerofmrnace2025();\n    }\n    else if (data.mod === \"2026\") {\n      updatePerofmrnace2026();\n    }\n    postMessage({\n      responseMessage: \"Performance changed\",\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n\n    const yearData = checkYearSave();\n\n    const [performance, races] = getPerformanceAllTeamsSeason(yearData[2], { useHistoricalEnginePower: true });\n    const aduoEngineUpgradeRaceIds = getAduoEngineUpgradeRaceIds();\n    const performanceResponse = { responseMessage: \"Season performance fetched\", content: [performance, races, aduoEngineUpgradeRaceIds] };\n    postMessage(performanceResponse);\n\n    const attibutes = getAttributesAllTeams(yearData[2]);\n    const attributesResponse = { responseMessage: \"Performance fetched\", content: [performance[performance.length - 1], attibutes] };\n    postMessage(attributesResponse);\n\n    const carPerformance = getPerformanceAllCars(yearData[2]);\n    const carAttributes = getAttributesAllCars(yearData[2]);\n    const carPerformanceResponse = {\n      responseMessage: \"Cars fetched\",\n      content: [carPerformance, carAttributes],\n      isEditCommand: true,\n      unlocksDownload: true\n    };\n\n    postMessage(carPerformanceResponse);\n  },\n  performanceRefresh: (data, postMessage) => {\n    const yearData = checkYearSave();\n\n    const [performance, races] = getPerformanceAllTeamsSeason(yearData[2], { useHistoricalEnginePower: true });\n    const aduoEngineUpgradeRaceIds = getAduoEngineUpgradeRaceIds();\n    const performanceResponse = { responseMessage: \"Season performance fetched\", content: [performance, races, aduoEngineUpgradeRaceIds] };\n    postMessage(performanceResponse);\n\n    const attibutes = getAttributesAllTeams(yearData[2]);\n    const attributesResponse = { responseMessage: \"Performance fetched\", content: [performance[performance.length - 1], attibutes] };\n    postMessage(attributesResponse);\n\n    const carPerformance = getPerformanceAllCars(yearData[2]);\n    const carAttributes = getAttributesAllCars(yearData[2]);\n    const carPerformanceResponse = {\n      responseMessage: \"Cars fetched\",\n      content: [carPerformance, carAttributes],\n      isEditCommand: true,\n      unlocksDownload: true\n    };\n\n    postMessage(carPerformanceResponse);\n  },\n  generateNews: (data, postMessage) => {\n    try {\n      const savedNewsMap = loadNewsMapFromDB();   // ← desde DB\n      const tpStateFromDB = loadTPFromDB();        // ← desde DB\n\n      // si necesitas asegurar estructura mínima de TP, hazlo aquí\n      const tpState = ensureTurningPointsStructure(tpStateFromDB);\n\n      const { newsList, turningPointState } = generate_news(savedNewsMap, tpState);\n      const doublePointsBug = checkDoublePointsBug(turningPointState)\n      const yearsAvailable = getNewsAndTpYearsAvailable()\n\n      postMessage({\n        responseMessage: \"News fetched\",\n        noti_msg: \"News generated successfully\",\n        content: { newsList, turningPointState, yearsAvailable, doublePointsBug },\n        unlocksDownload: true\n      });\n    } catch (e) {\n      console.error(\"ERROR COMPLETO:\", e);\n      console.error(\"STACK:\", e.stack);\n      postMessage({ responseMessage: \"Error\", error: e.message });\n    }\n  },\n  getCustomNewsOptions: (data, postMessage) => {\n    const options = getCustomNewsOptions();\n    postMessage({ responseMessage: \"Custom news options\", content: options });\n  },\n  customNewsRaceDrivers: (data, postMessage) => {\n    const raceId = Number(data?.raceId);\n    const drivers = getRaceDriversForCustomNews(raceId);\n    postMessage({ responseMessage: \"Custom news race drivers\", content: drivers });\n  },\n  createCustomNews: (data, postMessage) => {\n    try {\n      const entry = createCustomNewsEntry(data || {});\n      entry.stableKey = entry.stableKey ?? computeStableKey(entry);\n      upsertNews([entry]);\n      postMessage({\n        responseMessage: \"Custom news created\",\n        noti_msg: \"Custom news created\",\n        content: entry,\n        isEditCommand: true,\n        unlocksDownload: true\n      });\n    } catch (e) {\n      console.error(e);\n      postMessage({ responseMessage: \"Error\", error: e.message, unlocksDownload: true });\n    }\n  },\n  fixDoublePointsBug: (data, postMessage) => {\n    const raceBugged = data.raceId;\n    fixDoublePointsBug(raceBugged);\n\n    postMessage({ responseMessage: \"Double points bug fixed\", noti_msg: \"Double points bug fixed successfully\", unlocksDownload: true });\n  },\n  getNewsFromSeason: (data, postMessage) => {\n    const season = data.season;\n    let newsAndTp = getNewsFromSeason(season);\n    const currentSeason = getGlobals().currentDate[1];\n    newsAndTp.isCurrentSeason = (season == currentSeason);\n    postMessage({ responseMessage: \"News from season fetched\", content: newsAndTp });\n  },\n  lineupsRequest: (data, postMessage) => {\n    const lineups = getCurrentAndNextSeasonGridLineups();\n    const season = Number(lineups?.season) || 0;\n    const previousSeason = season > 0 ? (season - 1) : 0;\n    const previousSeasonStandings = previousSeason > 0\n      ? fetchTeamsStandings(previousSeason, 1)\n      : [];\n    postMessage({\n      responseMessage: \"Lineups fetched\",\n      content: {\n        ...lineups,\n        previousSeason,\n        previousSeasonStandings\n      }\n    });\n  },\n  updateCombinedDict: (data, postMessage) => {\n    const teamId = data.teamID;\n    const newName = data.newName;\n\n    combined_dict[teamId] = newName;\n    postMessage({ responseMessage: \"Combined dict updated\", content: combined_dict });\n  },\n  raceDetailsRequest: (data, postMessage) => {\n    const raceId = data.raceid;\n    const results = getOneRaceDetails(raceId);\n\n    postMessage({ responseMessage: \"Race details fetched\", content: results });\n  },\n  qualiDetailsRequest: (data, postMessage) => {\n    const qualiId = data.raceid;\n    const results = getOneQualiDetails(qualiId);\n\n    postMessage({ responseMessage: \"Quali details fetched\", content: results });\n  },\n  transferRumorRequest: (data, postMessage) => {\n    const drivers = data.drivers;\n    const date = data.date || null; // New date parameter\n\n    const info = getTransferDetails(drivers, date)\n\n    postMessage({ responseMessage: \"Transfer details fetched\", content: info });\n  },\n  teamComparisonRequest: (data, postMessage) => {\n    const teamId = data.team;\n    const season = data.season;\n    const date = data.date;\n\n    const results = getTeamComparisonDetails(teamId, season, date);\n    postMessage({ responseMessage: \"Team comparison details fetched\", content: results });\n  },\n  fullChampionshipDetailsRequest: (data, postMessage) => {\n    const season = data.season;\n    const junior = data.junior || false;\n\n    const results = getFullChampionSeasonDetails(season);\n    postMessage({ responseMessage: \"Full championship details fetched\", content: results });\n  },\n  fullFeederSeriesDetailsRequest: (data, postMessage) => {\n    const season = data.season;\n\n    const results = getFullFeederSeriesDetails(season, true);\n    postMessage({ responseMessage: \"Full feeder series details fetched\", content: results });\n  },\n  recordSelected: (data, postMessage) => {\n    const type = data.type;\n    const year = data.year;\n\n    const record = getSelectedRecord(type, year);\n\n    postMessage({ responseMessage: \"Record fetched\", content: record });\n  },\n  teamRecordRequest: (data, postMessage) => {\n    const type = data.type;\n    const year = data.year;\n    const formula = data.formula ? Number(data.formula) : 1;\n\n    const record = getSelectedTeamRecord(type, year, formula);\n    postMessage({ responseMessage: \"Team record fetched\", content: { type, year, formula, record } });\n  },\n  seasonReviewSelected: (data, postMessage) => {\n    const year = data.year;\n    const formula = data.formula ? Number(data.formula) : 1;\n\n    const globals = getGlobals();\n    const isCurrentYear = data.isCurrentYear ?? (String(globals?.yearIteration) === String(year));\n\n    const review = fetchSeasonReviewData(year, formula, isCurrentYear);\n\n    postMessage({ responseMessage: \"Season review data fetched\", content: review });\n  },\n  approveTurningPoint: (data, postMessage) => {\n    const turningPointData = data.turningPointData;\n    const type = data.type;\n    const maxDate = data.maxDate;\n    const originalStableKey = data.id;\n    const nonReadable = data.nonReadable || false;\n\n    const newResponse = generateTurningResponse(turningPointData, type, maxDate, \"positive\");\n\n    if (originalStableKey) {\n      updateNewsFields(originalStableKey, {\n        turning_point_type: \"approved\",\n        ...(nonReadable ? { nonReadable: true } : {})\n      });\n    }\n\n    if (newResponse) {\n      newResponse.stableKey = newResponse.stableKey ?? computeStableKey(newResponse);\n      upsertNews([newResponse]);\n    }\n\n    postMessage({ responseMessage: \"Turning point positive\", content: newResponse, isEditCommand: true, unlocksDownload: true });\n  },\n  cancelTurningPoint: (data, postMessage) => {\n    const turningPointData = data.turningPointData;\n    const type = data.type;\n    const maxDate = data.maxDate;\n    const originalStableKey = data.id;\n\n    const newResponse = generateTurningResponse(turningPointData, type, maxDate, \"negative\");\n\n\n    if (originalStableKey) {\n      updateNewsFields(originalStableKey, { turning_point_type: \"cancelled\" });\n    }\n\n    if (newResponse) {\n      newResponse.stableKey = newResponse.stableKey ?? computeStableKey(newResponse);\n      upsertNews([newResponse]);\n    }\n\n    postMessage({ responseMessage: \"Turning point negative\", noti_msg: \"Cancelled turning point\", content: newResponse, isEditCommand: true, unlocksDownload: true });\n  },\n  saveNewsState: (data, postMessage) => {\n    try {\n      upsertNews(data.newsList || []);\n      postMessage({ responseMessage: \"News saved\", noti_msg: \"News saved successfully\", isEditCommand: true, unlocksDownload: true });\n    } catch (e) {\n      console.error(e);\n      postMessage({ responseMessage: \"Error\", error: e.message, unlocksDownload: true });\n    }\n  },\n  updateNews: (data, postMessage) => {\n    try {\n      const ok = updateNewsFields(\n        data.stableKey,\n        data.patch || {} // { text, nonReadable, turning_point_type, ... }\n      );\n      postMessage({ responseMessage: ok ? \"News updated\" : \"News not found\", noti_msg: ok ? \"News updated successfully\" : \"News not found\", isEditCommand: true, unlocksDownload: true });\n    } catch (e) {\n      console.error(e);\n      postMessage({ responseMessage: \"Error\", error: e.message, unlocksDownload: true });\n    }\n  },\n  getNews: (data, postMessage) => {\n    const newsMap = loadNewsMapFromDB();\n    postMessage({ responseMessage: \"News map\", content: newsMap });\n  },\n  saveTurningPoints: (data, postMessage) => {\n    try {\n      upsertTurningPoints(data.turningPointState || {});\n      postMessage({ responseMessage: \"Turning points saved successfully\" });\n    } catch (e) {\n      console.error(e);\n      postMessage({ responseMessage: \"Error\", error: e.message, unlocksDownload: true });\n    }\n  },\n  getTurningPoints: (data, postMessage) => {\n    const turningPoints = loadTPFromDB();\n    postMessage({ responseMessage: \"Turning points\", content: turningPoints });\n  },\n  migrateFromLocalStorage: (data, postMessage) => {\n    try {\n      const { lsNewsTxt, lsTPTxt } = data || {};\n      const res = migrateLegacyData(lsNewsTxt, lsTPTxt);\n      postMessage({ responseMessage: \"Migration done\", status: res, noti_msg: \"Migration completed successfully\", isEditCommand: true, unlocksDownload: true });\n    } catch (e) {\n      console.error(\"Migration error (worker):\", e);\n      postMessage({ responseMessage: \"Error\", error: e.message });\n    }\n  },\n  deleteNewsArticle: (data, postMessage) => {\n    const articleId = data.articleId;\n    const ok = deleteNewByKey(articleId);\n    postMessage({ responseMessage: ok ? \"Article deleted successfully\" : \"Article not found\", noti_msg: ok ? \"Article deleted successfully\" : \"Article not found\", isEditCommand: true, unlocksDownload: true });\n  },\n  deleteNews: (data, postMessage) => {\n    deleteNews();\n    deleteTurningPoints();\n    postMessage({ responseMessage: \"News deleted successfully\", unlocksDownload: true });\n  },\n  enginesRefresh: (data, postMessage) => {\n    const engines = fetchEngines();\n    postMessage({ responseMessage: \"Engines fetched\", noti_msg: \"Engines updated successfully\", content: engines });\n  },\n  eventsFromRequest: (data, postMessage) => {\n    const year = data.year;\n    const formula = data.formula ? Number(data.formula) : 1;\n    const events = fetchEventsFrom(year, formula);\n    postMessage({ responseMessage: \"Events fetched\", content: { year, formula, events } });\n  },\n  sessionResultsRequest: (data, postMessage) => {\n    const year = data.year;\n    const gameYear = data.gameYear;\n    const raceId = data.raceId;\n    const sessionKey = data.sessionKey;\n\n    const payload = fetchSessionResults(raceId, sessionKey, gameYear);\n    postMessage({ responseMessage: \"Session results fetched\", content: { year, raceId, sessionKey, ...payload } });\n  },\n  editRaceResults: (data, postMessage) => {\n    const raceId = data.raceId;\n    const edits = data.edits;\n    const sessionKey = data?.sessionKey;\n    const isSprint = data?.isSprint;\n    const res = editRaceResults(raceId, edits, { sessionKey, isSprint });\n    postMessage({\n      responseMessage: res.ok ? \"Race results updated\" : \"Error\",\n      noti_msg: res.ok ? \"Race results updated\" : (res.error || \"Failed to update race results\"),\n      unlocksDownload: true,\n      isEditCommand: true\n    });\n  },\n  pointsRegulationsRequest: (data, postMessage) => {\n    const pointsInfo = fetchPointsRegulations();\n    postMessage({ responseMessage: \"Points regulations fetched\", content: pointsInfo });\n  },\n  add2026Engines: (data, postMessage) => {\n    apply2026EnginePerformanceChanges();\n\n    const engines = fetchEngines();\n    postMessage({ responseMessage: \"Engines fetched\", content: engines });\n\n    postMessage({\n      responseMessage: \"2026 engines added\",\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n  },\n  updateAduoTPEnabled: (data, postMessage) => {\n    const enabled = data.enabled;\n    setCustomSaveConfig(\"aduo_tp_enabled\", enabled);\n    postMessage({\n      responseMessage: \"ADUO TP enabled updated\",\n      noti_msg: `ADUO TP enabled set to ${enabled}`,\n      isEditCommand: true,\n      unlocksDownload: true\n    });\n  }\n\n\n};\n\n\nself.addEventListener('message', async (e) => {\n  console.log(e.data);\n  const { command, data } = e.data;\n  if (workerCommands[command]) {\n    try {\n      await workerCommands[command](data, (response) => postMessage({ command, ...response }));\n    } catch (error) {\n      console.error(`[Worker] Error executing command '${command}':`, error);\n      postMessage({ command, responseMessage: \"Error\", error: error.message });\n    }\n  } else {\n    console.error(`[Worker] Unknown command: '${command}'`);\n    postMessage({ responseMessage: \"Unknown command\", command });\n  }\n});\n"
  },
  {
    "path": "src/js/frontend/calendar.js",
    "content": "import { races_map, codes_dict, weather_dict, countries_dict, invertedRacesMap } from \"./config\";\nimport { game_version } from \"./renderer\";\nimport { max_races } from \"./head2head\";\nimport interact from 'interactjs';\n\nlet deleting = false;\nlet deleted = false;\nlet previewTarget = null;\nlet previewPosition = null;\n\n/**\n * Positions both the div the user's moving and the one he has moved it into\n * @param {div} div0 The div the user is moving\n * @param {div} div1 The div the user has moved div0 into\n * @param {string} beforeAfter If the user has moved div0 before or after div1\n */\nfunction reubicate(div0,div1,beforeAfter) {\n    const parentDiv = document.querySelector('.main-calendar-section');\n    parentDiv.removeChild(div0)\n\n    if (beforeAfter === 'before') {\n        parentDiv.insertBefore(div0,div1);\n\n    } else if (beforeAfter === 'after') {\n        parentDiv.insertBefore(div0,div1.nextSibling);\n\n    }\n\n}\n\n/**\n * Adds a race in the calendar div\n * @param {Object} race\n */\nfunction addRace(race) {\n    const {\n        code,\n        rainP,\n        rainQ,\n        rainR,\n        type,\n        trackId,\n        state,\n        isF2Race = 0,\n        isF3Race = 0,\n    } = race;\n\n    let imageUrl = codes_dict[code];\n\n    let div = document.createElement('div');\n    let leftDiv = document.createElement('div');\n    let numberDiv = document.createElement('div');\n    numberDiv.className = \"race-calendar-number bold-font\"\n    leftDiv.className = \"left-race\"\n    let rightDiv = document.createElement('div');\n    rightDiv.className = \"right-race\"\n    div.classList.add('race-calendar');\n    div.dataset.trackid = trackId\n    div.dataset.rainQ = rainQ\n    div.dataset.rainR = rainR\n    div.dataset.rainP = rainP\n    div.dataset.type = type\n    div.dataset.state = state\n    div.dataset.isf2 = isF2Race\n    div.dataset.isf3 = isF3Race\n    if(state === 2){\n        div.classList.add(\"completed\");\n    }\n\n    const seriesBadges = document.createElement('div');\n    seriesBadges.className = \"race-series-badges\";\n    const f2Badge = document.createElement('button');\n    f2Badge.className = \"race-series-badge race-series-badge-f2 bold-font\";\n    f2Badge.type = \"button\";\n    f2Badge.textContent = \"F2\";\n    seriesBadges.appendChild(f2Badge);\n    const f3Badge = document.createElement('button');\n    f3Badge.className = \"race-series-badge race-series-badge-f3 bold-font\";\n    f3Badge.type = \"button\";\n    f3Badge.textContent = \"F3\";\n    seriesBadges.appendChild(f3Badge);\n\n    if (Number(isF2Race) === 1) {\n        f2Badge.classList.add(\"active-badge\");\n    }\n\n    if (Number(isF3Race) === 1) {\n        f3Badge.classList.add(\"active-badge\");\n    }\n\n    f2Badge.addEventListener(\"click\", function () {\n        if (div.dataset.isf2 === \"1\") {\n            div.dataset.isf2 = \"0\";\n            f2Badge.classList.remove(\"active-badge\");\n        } else {\n            div.dataset.isf2 = \"1\";\n            f2Badge.classList.add(\"active-badge\");\n        }\n    });\n    \n    f3Badge.addEventListener(\"click\", function () {\n        if (div.dataset.isf3 === \"1\") {\n            div.dataset.isf3 = \"0\";\n            f3Badge.classList.remove(\"active-badge\");\n        } else {\n            div.dataset.isf3 = \"1\";\n            f3Badge.classList.add(\"active-badge\");\n        }\n    });\n\n    if (seriesBadges.childElementCount > 0) {\n        div.appendChild(seriesBadges);\n    }\n\n    let upperDiv = document.createElement('div');\n    upperDiv.className = \"upper-text-and-flag\"\n    let textDiv = document.createElement('div');\n    textDiv.classList.add('upper-race','bold-font');\n    textDiv.textContent = code.slice(0,-1).toUpperCase();\n\n    const img = document.createElement('img');\n    img.src = imageUrl;\n    img.classList.add('flag');\n    img.setAttribute(\"loading\",\"lazy\");\n\n    upperDiv.appendChild(textDiv);\n    upperDiv.appendChild(img);\n    let ATAInput;\n    let lowerDiv = document.createElement('div');\n    lowerDiv.classList.add('lower-race');\n    lowerDiv.innerHTML = \"<div class='form-check form-switch'><input class='form-check-input custom-toggle sprint-input' type='checkbox' role='switch'><label class='form-check-label'>Sprint</label></div>\";\n    if (game_version === 2023){\n        lowerDiv.innerHTML += \"<div class='form-check form-switch'><input class='form-check-input custom-toggle ata-input' type='checkbox' role='switch'><label class='form-check-label' for='flexSwitchCheckDefault'>ATA Quali</label></div>\";\n        ATAInput = lowerDiv.querySelector(\".ata-input\")\n    }\n    let SprintInput = lowerDiv.querySelector(\".sprint-input\")\n    \n    SprintInput.addEventListener(\"click\",function (event) {\n        if (game_version === 2023){\n            if (ATAInput.checked) ATAInput.checked = false\n        }\n        if (SprintInput.checked) div.dataset.type = 1\n        else div.dataset.type = 0\n    })\n    if (game_version === 2023){\n        ATAInput.addEventListener(\"click\",function (event) {\n            if (SprintInput.checked) SprintInput.checked = false\n            if (ATAInput.checked) div.dataset.type = 2\n            else div.dataset.type = 0\n        })\n    }\n\n    leftDiv.appendChild(upperDiv);\n    leftDiv.appendChild(lowerDiv);\n    if(type === 1){\n        lowerDiv.children[0].firstChild.click()\n    }\n    else if(type === 2){\n        lowerDiv.children[1].firstChild.click()\n    }\n    numberDiv.addEventListener(\"click\", function () {\n        if (!deleting) return;\n        const raceDiv = numberDiv.closest(\".race-calendar\");\n        if (!raceDiv) return;\n        raceDiv.parentNode.removeChild(raceDiv);\n        deleted = true;\n        if (raceDiv.dataset.trackid === \"6\"){\n            update_notifications(\"Why'd you do that?\", \"monaco\");\n        }\n        update_numbers();\n    });\n    div.appendChild(numberDiv)\n    div.appendChild(leftDiv)\n    let qWeather = document.createElement('div');\n    qWeather.className = \"full-quali-weather\"\n    let qName = document.createElement('div');\n    qName.className = \"session-name bold-font\"\n    qName.innerText =\"Sat\"\n    let wSelector = document.createElement('div');\n    wSelector.className = \"weather-selector\"\n    let leftArrow = document.createElement('i');\n    leftArrow.classList.add(\"bi\", \"bi-chevron-left\", \"new-augment-button\", \"transparent\")\n    let rightArrow = document.createElement('i');\n    rightArrow.classList.add(\"bi\", \"bi-chevron-right\", \"new-augment-button\", \"transparent\")\n    let wVis = document.createElement('div');\n    wVis.className = \"weather-vis\"\n    wVis.dataset.value = Number(rainQ)\n\n    wSelector.appendChild(leftArrow)\n    wSelector.appendChild(wVis)\n    wSelector.appendChild(rightArrow)\n    qWeather.appendChild(qName)\n    qWeather.appendChild(wSelector)\n    let rWeather = qWeather.cloneNode(true)\n    rWeather.firstChild.innerText = \"Sun\"\n    rWeather.children[1].children[1].dataset.value = Number(rainR)\n    let pWeather = qWeather.cloneNode(true)\n    pWeather.firstChild.innerText = \"Fri\"\n    pWeather.children[1].children[1].dataset.value = Number(rainP)\n    rightDiv.appendChild(pWeather)\n    rightDiv.appendChild(qWeather)\n    rightDiv.appendChild(rWeather)\n    div.appendChild(rightDiv)\n    div.querySelectorAll(\".bi-chevron-left\").forEach(function(elem){\n        elem.addEventListener(\"click\", function(){\n            let val = elem.parentNode.querySelector(\".weather-vis\").dataset.value\n            let newVal = Number(val) - 1\n            if(newVal === -1){\n                newVal = 5\n            }\n            elem.parentNode.querySelector(\".weather-vis\").dataset.value = newVal\n            if (elem.parentNode.parentNode.firstChild.innerText === \"Sat\"){\n                elem.parentNode.parentNode.parentNode.parentNode.dataset.rainQ = newVal\n            }\n            else if (elem.parentNode.parentNode.firstChild.innerText === \"Sun\"){\n                elem.parentNode.parentNode.parentNode.parentNode.dataset.rainR = newVal\n            }\n            else if (elem.parentNode.parentNode.firstChild.innerText === \"Fri\"){\n                elem.parentNode.parentNode.parentNode.parentNode.dataset.rainP = newVal\n            }\n            \n            updateVisualizers()\n            \n        })\n    })\n    \n    div.querySelectorAll(\".bi-chevron-right\").forEach(function(elem){\n        elem.addEventListener(\"click\", function(){\n            let val = elem.parentNode.querySelector(\".weather-vis\").dataset.value\n            let newVal = Number(val) + 1\n            if(newVal === 6){\n                newVal = 0\n            }\n            elem.parentNode.querySelector(\".weather-vis\").dataset.value = newVal\n            if (elem.parentNode.parentNode.firstChild.innerText === \"Sat\"){\n                elem.parentNode.parentNode.parentNode.parentNode.dataset.rainQ = newVal\n            }\n            else if (elem.parentNode.parentNode.firstChild.innerText === \"Sun\"){\n                elem.parentNode.parentNode.parentNode.parentNode.dataset.rainR = newVal\n            }\n            else if (elem.parentNode.parentNode.firstChild.innerText === \"Fri\"){\n                elem.parentNode.parentNode.parentNode.parentNode.dataset.rainP = newVal\n            }\n            updateVisualizers()\n            \n        })\n    })\n\n\n    document.querySelector('.main-calendar-section').appendChild(div)\n}\n\n\nfunction updateVisualizers(){\n    document.querySelector(\".main-calendar\").querySelectorAll(\".weather-vis\").forEach(function(elem){\n        elem.innerHTML = \"\"\n        let val = elem.dataset.value\n        let icon = document.createElement(\"i\")\n        icon.className = weather_dict[val]\n        elem.appendChild(icon)\n    })\n}\n\nexport function load_calendar(races){\n    document.querySelector('.main-calendar-section').innerHTML = \"\"\n    races.forEach(function(elem){\n        addRace({\n            code: races_map[elem.trackId],\n            rainP: transformWeather(elem.weatherStatePractice),\n            rainQ: transformWeather(elem.weatherStateQualifying),\n            rainR: transformWeather(elem.weatherStateRace),\n            type: elem.weekendType,\n            trackId: elem.trackId,\n            state: elem.state,\n            isF2Race: elem.isF2Race,\n            isF3Race: elem.isF3Race\n        })\n    })\n    updateVisualizers()\n    update_numbers()\n    load_addRaces()\n\n}\n\nfunction update_numbers(){\n    document.querySelectorAll(\".race-calendar\").forEach(function(elem, index){\n        updateNumberDisplay(elem, index);\n    })\n}\n\nfunction updateNumberDisplay(race, index) {\n    const numberDiv = race.querySelector(\".race-calendar-number\");\n    if (!numberDiv) return;\n    numberDiv.innerHTML = \"\";\n    numberDiv.classList.remove(\"race-calendar-number-completed\", \"race-calendar-number-delete\");\n    if (race.classList.contains(\"completed\")) {\n        const icon = document.createElement(\"i\");\n        icon.className = \"bi bi-check-lg\";\n        numberDiv.classList.add(\"race-calendar-number-completed\");\n        numberDiv.appendChild(icon);\n        return;\n    }\n    if (deleting) {\n        const icon = document.createElement(\"i\");\n        icon.className = \"bi bi-trash-fill\";\n        numberDiv.classList.add(\"race-calendar-number-delete\");\n        numberDiv.appendChild(icon);\n        return;\n    }\n    numberDiv.textContent = index + 1;\n}\n\nfunction clearDropPreview() {\n    if (previewTarget) {\n        previewTarget.classList.remove(\"drop-before\", \"drop-after\");\n    }\n    previewTarget = null;\n    previewPosition = null;\n}\n\n\nfunction transformWeather(state){\n    let realWeather;\n    if(state === 1){\n        realWeather = 0\n    }\n    else if(state === 2){\n        realWeather = 1\n    }\n    else if(state === 4){\n        realWeather = 2\n    }\n    else if(state === 8){\n        realWeather = 3\n    }\n    else if(state === 16){\n        realWeather = 4\n    }\n    else if(state === 32){\n        realWeather = 5\n    }\n    return realWeather;\n}\n\n/**\n * Changes the number after the race code to specify the format\n * @param {div} div div from the race that's changing format\n * @param {string} format code of the format\n */\nfunction changeFormat(div,format) {\n    let lastChar = div.dataset.code.charAt(div.dataset.code.length - 1)\n    if (/\\d/.test(lastChar)) {\n        div.dataset.code = div.dataset.code.slice(0,-1) + format\n    }\n    else {\n        div.dataset.code = div.dataset.code + format\n    }\n\n}\n\n/**\n * Adds all the races to the addRace menu\n */\nfunction load_addRaces() {\n    document.getElementById(\"addTrackMenu\").innerHTML = \"\"\n    for (let dataCode of Object.keys(codes_dict)) {\n        let elem = countries_dict[dataCode]\n        let li = document.createElement('li');\n        let a = document.createElement('a');\n        a.classList.add('redesigned-dropdown-item');\n        a.classList.add('menu-race');\n        a.href = '#';\n        a.textContent = elem;\n        a.dataset.code = dataCode\n        a.dataset.trackid = invertedRacesMap[dataCode]\n        let imageUrl = codes_dict[dataCode];\n        let img = document.createElement('img');\n        img.src = imageUrl;\n        img.classList.add('menuFlag');\n        img.setAttribute(\"loading\",\"lazy\");\n\n        a.appendChild(img)\n\n        li.appendChild(a);\n        document.getElementById(\"addTrackMenu\").appendChild(li);\n\n    }\n    listenerRaces()\n}\n\n/**\n * Adds the listeners to the addRace menu races\n */\nfunction listenerRaces() {\n    document.querySelectorAll('#addTrackMenu a').forEach(item => {\n        item.addEventListener(\"click\",function () {\n            if (document.querySelector(\".main-calendar-section\").childElementCount < max_races) {\n                addRace({\n                    code: item.dataset.code,\n                    rainP: 0,\n                    rainQ: 0,\n                    rainR: 0,\n                    type: 0,\n                    trackId: item.dataset.trackid,\n                    state: 0,\n                    isF2Race: 0,\n                    isF3Race: 0\n                })\n                updateVisualizers()\n                update_numbers()\n            }\n        })\n    })\n}\n\n/**\n * Event listeenr for the delete tracks button\n */\ndocument.getElementById(\"deleteTracks\").addEventListener(\"click\",function (btn) {\n    if (deleting) {\n        this.className = \"close-modal\"\n        document.querySelectorAll(\".race-calendar\").forEach(function (elem) {\n            elem.classList.remove(\"deleting\");\n\n        })\n\n    }\n    else {\n        document.querySelectorAll(\".race-calendar\").forEach(function (elem) {\n            elem.classList.add(\"deleting\");\n        })\n        this.className = \"close-modal delete-mode\"\n\n    }\n\n    deleting = !deleting\n    update_numbers();\n})\n\n\n/**\n * Manages the interaction with the race divs\n */\ninteract('.race-calendar').draggable({\n    inertia: true,\n    listeners: {\n        start(event) {\n            let target = event.target;\n            if (target.classList.contains(\"completed\")) {\n                event.interaction.stop();\n                return;\n            }\n            let position = target.getBoundingClientRect();\n            let width = target.getBoundingClientRect().width\n\n        },\n        move(event) {\n            const target = event.target;\n            if (target.classList.contains(\"completed\")) return;\n            const x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx;\n            const y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;\n\n            target.style.transform = `translate(${x}px, ${y}px)`;\n            target.style.opacity = 1;\n            target.style.zIndex = 10;\n\n            target.setAttribute('data-x',x);\n            target.setAttribute('data-y',y);\n\n            const racesEvents = document.querySelectorAll('.race-calendar');\n            let nextTarget = null;\n            let nextPosition = null;\n            racesEvents.forEach(function (element) {\n                if (target === element) return;\n                let eventRect = element.getBoundingClientRect();\n                let centerHorizontal = (eventRect.left + eventRect.right) / 2;\n                if (event.clientX >= eventRect.left && event.clientX <= eventRect.right && event.clientY >= eventRect.top && event.clientY <= eventRect.bottom) {\n                    nextTarget = element;\n                    nextPosition = event.clientX >= centerHorizontal ? \"after\" : \"before\";\n                }\n            });\n            if (previewTarget !== nextTarget || previewPosition !== nextPosition) {\n                clearDropPreview();\n                if (nextTarget && nextPosition) {\n                    previewTarget = nextTarget;\n                    previewPosition = nextPosition;\n                    previewTarget.classList.add(nextPosition === \"after\" ? \"drop-after\" : \"drop-before\");\n                }\n            }\n        },\n        end(event) {\n            let target = event.target;\n            if (target.classList.contains(\"completed\")) return;\n\n            if (previewTarget && previewPosition) {\n                reubicate(target, previewTarget, previewPosition);\n                update_numbers();\n            }\n            clearDropPreview();\n\n            target.style.transform = 'none';\n            target.setAttribute('data-x',0);\n            target.setAttribute('data-y',0);\n\n            // originalParent = undefined;\n            // destinationParent = undefined;\n            // draggable = undefined;\n        }\n    }\n})\n\n"
  },
  {
    "path": "src/js/frontend/config.js",
    "content": "// calendar\nexport let codes_dict = {\n    \"bah0\": \"../assets/images/bahrain.png\", \"sau0\": \"../assets/images/saudi.jpg\", \"aus0\": \"../assets/images/australia.png\", \"aze0\": \"../assets/images/azerbaiyan.png\",\n    \"mia0\": \"../assets/images/usa.png\", \"imo0\": \"../assets/images/italy.png\", \"mon0\": \"../assets/images/monaco.png\", \"spa0\": \"../assets/images/spain.png\", \"can0\": \"../assets/images/canada.png\",\n    \"aut0\": \"../assets/images/austria.png\", \"gbr0\": \"../assets/images/gbr.png\", \"hun0\": \"../assets/images/hungry.png\", \"bel0\": \"../assets/images/balgium.png\", \"ned0\": \"../assets/images/ned.png\",\n    \"ita0\": \"../assets/images/italy.png\", \"jap0\": \"../assets/images/japan.png\", \"sgp0\": \"../assets/images/singapore.png\", \"qat0\": \"../assets/images/qatar.png\", \"usa0\": \"../assets/images/usa.png\", \"mex0\": \"../assets/images/mexico.png\",\n    \"bra0\": \"../assets/images/brazil.png\", \"veg0\": \"../assets/images/usa.png\", \"uae0\": \"../assets/images/uae.png\", \"chi0\": \"../assets/images/china.png\"\n}\nexport let countries_dict = {\n    \"bah0\": \"Bahrain\", \"sau0\": \"Saudi Arabia\", \"aus0\": \"Australia\", \"aze0\": \"Azerbaijan\",\n    \"mia0\": \"Miami\", \"imo0\": \"Imola\", \"mon0\": \"Monaco\", \"spa0\": \"Spain\", \"can0\": \"Canada\",\n    \"aut0\": \"Austria\", \"gbr0\": \"United Kingdom\", \"hun0\": \"Hungary\", \"bel0\": \"Belgium\", \"ned0\": \"Netherlands\",\n    \"ita0\": \"Italy\", \"sgp0\": \"Singapore\", \"jap0\": \"Japan\", \"qat0\": \"Qatar\", \"usa0\": \"USA\", \"mex0\": \"Mexico\",\n    \"bra0\": \"Brazil\", \"veg0\": \"Vegas\", \"uae0\": \"Abu Dhbai\", \"chi0\": \"China\"\n};\n\nexport let weather_dict = {\n    0: \"bi bi-sun\", 1: \"bi bi-cloud-sun\", 2: \"bi bi-cloud\", 3: \"bi bi-cloud-drizzle\", 4: \"bi bi-cloud-rain\", 5: \"bi bi-cloud-rain-heavy\"\n}\n\n//h2h\nexport const lightColors = [\"#f1f1f1\", \"#47c7fc\", \"#ffd300\", \"#6CD3BF\", \"#fcfcfc\", \"#37BEDD\", \"#B6BABD\", \"#c3dc00\", \"#d0e610\", \"#fac51c\", \"#b09247\", \"#f7c82f\"]\nexport const default_dict = {\n    1: \"Ferrari\",\n    2: \"McLaren\",\n    3: \"Red Bull\",\n    4: \"Mercedes\",\n    5: \"Alpine\",\n    6: \"Williams\",\n    7: \"Haas\",\n    8: \"Alpha Tauri\",\n    9: \"Alfa Romeo\",\n    10: \"Aston Martin\",\n    32: \"Custom Team\"\n}\n\nexport let combined_dict = {\n    1: \"Ferrari\",\n    2: \"McLaren\",\n    3: \"Red Bull\",\n    4: \"Mercedes\",\n    5: \"Alpine\",\n    6: \"Williams\",\n    7: \"Haas\",\n    8: \"Alpha Tauri\",\n    9: \"Alfa Romeo\",\n    10: \"Aston Martin\",\n    11: \"Prema Racing (F2)\",\n    12: \"Virtuosi Racing (F2)\",\n    13: \"Rodin (F2)\",\n    14: \"Hitech GP (F2)\",\n    15: \"ART Grand Prix (F2)\",\n    16: \"MP Motorsport (F2)\",\n    17: \"PHM Racing (F2)\",\n    18: \"DAMS (F2)\",\n    19: \"Campos Racing (F2)\",\n    20: \"VAR Racing (F2)\",\n    21: \"Trident (F2)\",\n    22: \"Prema Racing (F3)\",\n    23: \"Trident (F3)\",\n    24: \"ART Grand Prix (F3)\",\n    25: \"Hitech GP (F3)\",\n    26: \"VAR Racing (F3)\",\n    27: \"MP Motorsport (F3)\",\n    28: \"Campos Racing (F3)\",\n    29: \"Rodin (F3)\",\n    30: \"Jenzer Motorsport (F3)\",\n    31: \"PHM Racing (F3)\",\n    32: \"Custom Team\"\n}\n\nexport function getUpdatedName(teamId) {\n    return combined_dict[teamId]\n}\n\nexport function getCombinedDict() {\n    return combined_dict\n}\n\n//performance\nexport const pars_abreviations = { \"chassis\": \"C\", \"front_wing\": \"FW\", \"rear_wing\": \"RW\", \"underfloor\": \"UF\", \"sidepods\": \"SP\", \"suspension\": \"S\" }\nexport const part_codes_abreviations = { 3: \"C\", 4: \"FW\", 5: \"RW\", 6: \"UF\", 7: \"SP\", 8: \"S\" }\nexport const part_full_names = { 3: \"Chassis\", 4: \"Front Wing\", 5: \"Rear Wing\", 6: \"Underfloor\", 7: \"Sidepods\", 8: \"Suspension\" }\n\nexport let abreviations_dict = {\n    1: \"FE\",\n    2: \"MC\",\n    3: \"RB\",\n    4: \"MER\",\n    5: \"ALP\",\n    6: \"WIL\",\n    7: \"HA\",\n    8: \"AT\",\n    9: \"ALFA\",\n    10: \"AM\",\n    32: \"CUS\"\n}\n\nexport let engine_stats_dict = new Map([\n    [10, \"Power\"],\n    [6, \"Fuel efficiency\"],\n    [11, \"Performance threshold\"],\n    [12, \"Performance loss\"],\n    [14, \"Engine durability\"],\n    [18, \"ERS durability\"],\n    [19, \"Gearbox durability\"]\n]);\n\nexport const theme_colors = {\n    \"default-theme\": {\n        \"labels\": \"#dedde6\",\n        \"grid\": \"#292929\",\n        \"general_secondary\": \"#f1f1f1\",\n        \"engine_upgrade_line\": \"#ffe16acc\"\n    },\n    \"light-theme\": {\n        \"labels\": \"#252525\",\n        \"grid\": \"#d6d6d6\",\n        \"general_secondary\": \"#1f1f1f\",\n        \"engine_upgrade_line\": \"#a18f45cc\"\n    },\n    \"og-theme\": {\n        \"labels\": \"#dedde6\",\n        \"grid\": \"#323046\",\n        \"general_secondary\": \"#f1f1f1\",\n        \"engine_upgrade_line\": \"#ffe16acc\"\n    },\n    \"vaporwave-theme\": {\n        \"labels\": \"#dedde6\",\n        \"grid\": \"#5329b5\",\n        \"general_secondary\": \"#f1f1f1\",\n        \"engine_upgrade_line\": \"#ffe16acc\"\n    },\n    \"nightly-theme\": {\n        \"labels\": \"#dedde6\",\n        \"grid\": \"#292929\",\n        \"general_secondary\": \"#f1f1f1\",\n        \"engine_upgrade_line\": \"#ffe16acc\"\n    },\n    \"ferrari-theme\": {\n        \"labels\": \"#f0e6e8\",\n        \"grid\": \"#5a3a42\",\n        \"general_secondary\": \"#f1f1f1\",\n        \"engine_upgrade_line\": \"#ffe16acc\"\n    },\n    \"redbull-theme\": {\n        \"labels\": \"#d8e5ff\",\n        \"grid\": \"#39578f\",\n        \"general_secondary\": \"#f1f1f1\",\n        \"engine_upgrade_line\": \"#ffe16acc\"\n    },\n    \"mercedes-theme\": {\n        \"labels\": \"#c8f9f2\",\n        \"grid\": \"#2a515c\",\n        \"general_secondary\": \"#f1f1f1\",\n        \"engine_upgrade_line\": \"#ffe16acc\"\n    },\n    \"astonmartin-theme\": {\n        \"labels\": \"#e8f3ee\",\n        \"grid\": \"#2a5a4a\",\n        \"general_secondary\": \"#f1f1f1\",\n        \"engine_upgrade_line\": \"#ffe16acc\"\n    },\n    \"mclaren-theme\": {\n        \"labels\": \"#f7e6dc\",\n        \"grid\": \"#5a4033\",\n        \"general_secondary\": \"#f1f1f1\",\n        \"engine_upgrade_line\": \"#ffe16acc\"\n    },\n    \"audi-theme\": {\n        \"labels\": \"#f0e6e8\",\n        \"grid\": \"#4a1f27\",\n        \"general_secondary\": \"#f1f1f1\",\n        \"engine_upgrade_line\": \"#ffe16acc\"\n    },\n    \"vcarb-theme\": {\n        \"labels\": \"#d8e2ff\",\n        \"grid\": \"#2b3f6b\",\n        \"general_secondary\": \"#f1f1f1\",\n        \"engine_upgrade_line\": \"#ffe16acc\"\n    },\n    \"williams-theme\": {\n        \"labels\": \"#d7e8ff\",\n        \"grid\": \"#173a70\",\n        \"general_secondary\": \"#f1f1f1\",\n        \"engine_upgrade_line\": \"#ffe16acc\"\n    },\n    \"haas-theme\": {\n        \"labels\": \"#e7e7ea\",\n        \"grid\": \"#3c3c4c\",\n        \"general_secondary\": \"#f1f1f1\",\n        \"engine_upgrade_line\": \"#ffe16acc\"\n    },\n    \"alpine-theme\": {\n        \"labels\": \"#ffe0f2\",\n        \"grid\": \"#5a3a5f\",\n        \"general_secondary\": \"#f1f1f1\",\n        \"engine_upgrade_line\": \"#ffe16acc\"\n    }\n}\n\nexport const themeToolbarLogos = {\n    \"nightly-theme\": { src: \"../assets/images/logoNightly.svg\", className: \"toolbar-logo--nightly\" },\n    \"ferrari-theme\": { src: \"../assets/images/logos/ferrari.png\", className: \"toolbar-logo--ferrari\" },\n    \"redbull-theme\": { src: \"../assets/images/logos/redbull.png\", className: \"toolbar-logo--redbull\" },\n    \"mercedes-theme\": { src: \"../assets/images/logos/mercedes.png\", className: \"toolbar-logo--mercedes\" },\n    \"astonmartin-theme\": { src: \"../assets/images/logos/astonMartin.png\", className: \"toolbar-logo--astonmartin\" },\n    \"mclaren-theme\": { src: \"../assets/images/logos/mclaren.png\", className: \"toolbar-logo--mclaren\" },\n    \"audi-theme\": { src: \"../assets/images/logos/audi.png\", className: \"toolbar-logo--audi\" },\n    \"vcarb-theme\": { src: \"../assets/images/logos/visarb.png\", className: \"toolbar-logo--vcarb\" },\n    \"williams-theme\": { src: \"../assets/images/logos/Williams_2026_logo.svg\", className: \"toolbar-logo--williams\" },\n    \"haas-theme\": { src: \"../assets/images/logos/haas.png\", className: \"toolbar-logo--haas\" },\n    \"alpine-theme\": { src: \"../assets/images/logos/alpine.png\", className: \"toolbar-logo--alpine\" },\n};\n\n//predictions\nexport const names_full = {\n    \"BAH\": \"Bahrain\",\n    \"AUS\": \"Australia\",\n    \"SAU\": \"Saudi Arabia\",\n    \"IMO\": \"Imola\",\n    \"MIA\": \"Miami\",\n    \"SPA\": \"Spain\",\n    \"MON\": \"Monaco\",\n    \"AZE\": \"Azerbaijan\",\n    \"CAN\": \"Canada\",\n    \"GBR\": \"Great Britain\",\n    \"AUT\": \"Austria\",\n    \"FRA\": \"France\",\n    \"HUN\": \"Hungary\",\n    \"BEL\": \"Belgium\",\n    \"ITA\": \"Italy\",\n    \"SGP\": \"Singapore\",\n    \"JAP\": \"Japan\",\n    \"USA\": \"United States\",\n    \"MEX\": \"Mexico\",\n    \"BRA\": \"Brazil\",\n    \"UAE\": \"Abu Dhabi\",\n    \"NED\": \"Netherlands\",\n    \"VEG\": \"Vegas\",\n    \"QAT\": \"Qatar\",\n    \"CHI\": \"China\"\n};\n\n//seasonViewer\nexport let driversTableLogosDict = {\n    \"stake\": \"logo-stake-table\", \"audi\": \"logo-up-down-extra\", \"alfa\": \"logo-merc-table\", \"sauber\": \"logo-sauber-table\", \"visarb\": \"logo-visarb-table\", \"hugo\": \"logo-hugo-table\",\n    \"brawn\": \"logo-brawn-table\", \"toyota\": \"logo-toyota-table\", \"alphatauri\": \"logo-alphatauri-table\", \"porsche\": \"logo-porsche-table\",\n    \"renault\": \"logo-renault-table\", \"andretti\": \"logo-andretti-table\", \"lotus\": \"logo-lotus-table\", \"alpine\": \"logo-alpine-table\",\n    \"cadillac\": \"logo-cadillac-table\", \"ford\": \"logo-ford-table\", \"racingpoint\": \"logo-racingpoint-table\", \"jordan\": \"logo-jordan-table\"\n}\n\nexport const races_map = { 2: \"bah0\", 1: \"aus0\", 11: \"sau0\", 24: \"imo0\", 22: \"mia0\", 5: \"spa0\", 6: \"mon0\", 4: \"aze0\", 7: \"can0\", 10: \"gbr0\", 9: \"aut0\", 8: \"fra0\", 12: \"hun0\", 13: \"bel0\", 14: \"ita0\", 15: \"sgp0\", 17: \"jap0\", 19: \"usa0\", 18: \"mex0\", 20: \"bra0\", 21: \"uae0\", 23: \"ned0\", 25: \"veg0\", 26: \"qat0\", 3: \"chi0\" };\nexport const invertedRacesMap = { \"bah0\": 2, \"aus0\": 1, \"sau0\": 11, \"imo0\": 24, \"mia0\": 22, \"spa0\": 5, \"mon0\": 6, \"aze0\": 4, \"can0\": 7, \"gbr0\": 10, \"aut0\": 9, \"fra0\": 8, \"hun0\": 12, \"bel0\": 13, \"ita0\": 14, \"sgp0\": 15, \"jap0\": 17, \"usa0\": 19, \"mex0\": 18, \"bra0\": 20, \"uae0\": 21, \"ned0\": 23, \"veg0\": 25, \"qat0\": 26, \"chi0\": 3 };\nexport const races_names = { 2: \"BAH\", 1: \"AUS\", 11: \"SAU\", 24: \"IMO\", 22: \"MIA\", 5: \"SPA\", 6: \"MON\", 4: \"AZE\", 7: \"CAN\", 10: \"GBR\", 9: \"AUT\", 8: \"FRA\", 12: \"HUN\", 13: \"BEL\", 14: \"ITA\", 15: \"SGP\", 17: \"JAP\", 19: \"USA\", 18: \"MEX\", 20: \"BRA\", 21: \"UAE\", 23: \"NED\", 25: \"VEG\", 26: \"QAT\", 3: \"CHI\" };\nexport const contintntRacesRegions = {\n    \"Europe\": [24, 5, 6, 10, 9, 12, 13, 14, 23],\n    \"Asia\": [17, 3, 15, 1],\n    \"America\": [19, 20, 18, 25, 22],\n    \"Middle East\": [2, 11, 21, 26, 4],\n}\nexport const continentDict = {\n    24: \"Europe\", 5: \"Europe\", 6: \"Europe\", 10: \"Europe\", 9: \"Europe\", 8: \"Europe\", 12: \"Europe\", 13: \"Europe\", 14: \"Europe\", 23: \"Europe\",\n    17: \"Asia\", 3: \"Asia\", 15: \"Asia\", 1: \"Asia\",\n    19: \"America\", 20: \"America\", 18: \"America\", 25: \"America\", 22: \"America\",\n    2: \"Middle East\", 11: \"Middle East\", 21: \"Middle East\", 26: \"Middle East\", 4: \"Middle East\"\n}\nexport const teams_full_name_dict = { 'FERRARI': 1, 'MCLAREN': 2, 'RED BULL': 3, 'MERCEDES': 4, 'ALPINE': 5, 'WILLIAMS': 6, 'HAAS': 7, 'ALPHA TAURI': 8, 'ALFA ROMEO': 9, 'ASTON MARTIN': 10 }\nexport let logos_disc = {\n    1: '../assets/images/logos/ferrari.png',\n    2: '../assets/images/logos/mclaren.png',\n    3: '../assets/images/logos/redbull.png',\n    4: '../assets/images/logos/mercedes.png',\n    5: '../assets/images/logos/alpine.png',\n    6: '../assets/images/logos/Williams_2026_logo.svg',\n    7: '../assets/images/logos/haas.png',\n    8: '../assets/images/logos/alphatauri.png',\n    9: '../assets/images/logos/alfaromeo.png',\n    10: '../assets/images/logos/astonMartin.png',\n    11: '../assets/images/logos/prema.png',\n    12: '../assets/images/logos/invicta.png',\n    13: '../assets/images/logos/rodin.png',\n    14: '../assets/images/logos/hitech.png',\n    15: '../assets/images/logos/art.png',\n    16: '../assets/images/logos/mp.png',\n    17: '../assets/images/logos/phm.png',\n    18: '../assets/images/logos/dams.png',\n    19: '../assets/images/logos/campos.png',\n    20: '../assets/images/logos/var.png',\n    21: '../assets/images/logos/trident.png',\n    22: '../assets/images/logos/prema.png',\n    23: '../assets/images/logos/trident.png',\n    24: '../assets/images/logos/art.png',\n    25: '../assets/images/logos/hitech.png',\n    26: '../assets/images/logos/var.png',\n    27: '../assets/images/logos/mp.png',\n    28: '../assets/images/logos/campos.png',\n    29: '../assets/images/logos/rodin.png',\n    30: '../assets/images/logos/jenzer.png',\n    31: '../assets/images/logos/phm.png',\n    32: '../assets/images/logos/placeholder.png'\n};\n\n\n\nexport const points_race = {\n    1: 25, 2: 18, 3: 15, 4: 12, 5: 10, 6: 8, 7: 6, 8: 4, 9: 2, 10: 1,\n    11: 0, 12: 0, 13: 0, 14: 0, 15: 0, 16: 0, 17: 0, 18: 0, 19: 0, 20: 0, \"DNF\": 0\n}\nexport const points_sprint = {\n    1: 8, 2: 7, 3: 6, 4: 5, 5: 4, 6: 3, 7: 2, 8: 1,\n    9: 0, 10: 0, 11: 0, 12: 0, 13: 0, 14: 0, 15: 0, 16: 0, 17: 0, 18: 0, 19: 0, 20: 0, \"-1\": 0\n}\nexport let default_points = [\"25\", \"18\", \"15\", \"12\", \"10\", \"8\", \"6\", \"4\", \"2\", \"1\", \"DNF\", \"0\", \"\", \"-\"]\n\n//stats\nexport let typeStaff_dict = { 0: \"fulldriverlist\", 1: \"fullTechnicalList\", 2: \"fullEngineerList\", 3: \"fullAeroList\", 4: \"fullDirectorList\" }\nexport let mentality_dict = { 0: \"enthusiastic\", 1: \"positive\", 2: \"neutral\", 3: \"negative\", 4: \"demoralized\" }\nexport let teamOrder = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 32, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31];\nexport const mentality_bonuses = { 0: 7, 1: 4, 2: 0, 3: -2, 4: -6 }\nexport const mentalityModifiers = {\n    5: -8,\n    9: -7,\n    15: -6,\n    20: -5,\n    24: -4,\n    29: -3,\n    35: -2,\n    39: -1,\n    59: 0,\n    63: 1,\n    69: 2,\n    77: 3,\n    79: 4,\n    83: 5,\n    85: 6,\n    96: 7,\n    100: 8\n};\nexport const mentality_to_global_menatality = {\n    0: 95,\n    1: 79,\n    2: 59,\n    3: 24,\n    4: 5,\n}\n\n//transfers\nexport const f1_teams = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 32]\nexport const f2_teams = [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]\nexport const f3_teams = [22, 23, 24, 25, 26, 27, 28, 29, 30, 31]\nexport const staff_positions = { 1: \"technical-chief\", 2: \"race-engineer\", 3: \"head-aero\", 4: \"sporting-director\" }\nexport const staff_pics = { 1: \"../assets/images/technicalChief.png\", 2: \"../assets/images/raceEngineer2.png\", 3: \"../assets/images/headAero.png\", 4: \"../assets/images/sportingDirector.png\" }\nexport let team_dict = { 1: \"fe\", 2: \"mc\", 3: \"rb\", 4: \"me\", 5: \"al\", 6: \"wi\", 7: \"ha\", 8: \"at\", 9: \"af\", 10: \"as\", 11: \"pre\", 12: \"vir\", 13: \"car\", 14: \"hit\", 15: \"art\", 16: \"mp\", 17: \"phm\", 18: \"dam\", 19: \"cam\", 20: \"var\", 21: \"tri\", 22: \"pre\", 23: \"tri\", 24: \"art\", 25: \"hit\", 26: \"var\", 27: \"mp\", 28: \"cam\", 29: \"car\", 30: \"jen\", 31: \"phm\", 32: \"ct\", 33: \"f2\", 34: \"f3\" }\nexport let inverted_dict = { 'ferrari': 1, 'mclaren': 2, 'redbull': 3, 'merc': 4, 'alpine': 5, 'williams': 6, 'haas': 7, 'alphatauri': 8, 'alfaromeo': 9, 'astonmartin': 10, 'custom': 32 }\n\n\n// news\nexport const countries_data = {\n    \"BAH\": { \"country\": \"Bahrain\", \"adjective\": \"Bahrain\", \"circuit\": \"Bahrain\", \"track\": \"Bahrain International Circuit\", \"rlToolsName\": \"sakhir.2005\" },\n    \"AUS\": { \"country\": \"Australia\", \"adjective\": \"Australian\", \"circuit\": \"Albert Park\", \"track\": \"Albert Park Circuit\", \"rlToolsName\": \"albert.park.2021\" },\n    \"SAU\": { \"country\": \"Saudi Arabia\", \"adjective\": \"Saudi Arabian\", \"circuit\": \"Jeddah\", \"track\": \"Jeddah Corniche Circuit\", \"rlToolsName\": \"jeddah.2021\" },\n    \"IMO\": { \"country\": \"Imola\", \"adjective\": \"Emilia Romagna\", \"circuit\": \"Imola\", \"track\": \"Autodromo Enzo e Dino Ferrari\", \"rlToolsName\": \"imola.2008\" },\n    \"MIA\": { \"country\": \"Miami\", \"adjective\": \"Miami\", \"circuit\": \"Miami\", \"track\": \"Miami International Autodrome\", \"rlToolsName\": \"miami.2022\" },\n    \"SPA\": { \"country\": \"Spain\", \"adjective\": \"Spanish\", \"circuit\": \"Barcelona\", \"track\": \"Circuit de Barcelona-Catalunya\", \"rlToolsName\": \"barcelona.2021\" },\n    \"MON\": { \"country\": \"Monaco\", \"adjective\": \"Monaco\", \"circuit\": \"Monaco\", \"track\": \"Circuit de Monaco\", \"rlToolsName\": \"monaco.2015\" },\n    \"AZE\": { \"country\": \"Azerbaijan\", \"adjective\": \"Azerbaijan\", \"circuit\": \"Baku\", \"track\": \"Baku City Circuit\", \"rlToolsName\": \"baku.2016\" },\n    \"CAN\": { \"country\": \"Canada\", \"adjective\": \"Canadian\", \"circuit\": \"Montreal\", \"track\": \"Circuit Gilles Villeneuve\", \"rlToolsName\": \"montreal.2002\" },\n    \"GBR\": { \"country\": \"Great Britain\", \"adjective\": \"British\", \"circuit\": \"Silverstone\", \"track\": \"Silverstone Circuit\", \"rlToolsName\": \"silverstone.2011\" },\n    \"AUT\": { \"country\": \"Austria\", \"adjective\": \"Austrian\", \"circuit\": \"Red Bull Ring\", \"track\": \"Red Bull Ring\", \"rlToolsName\": \"spielberg.2016\" },\n    \"FRA\": { \"country\": \"France\", \"adjective\": \"French\", \"circuit\": \"Paul Ricard\", \"track\": \"Circuit Paul Ricard\", \"rlToolsName\": \"paulricard.2005\" },\n    \"HUN\": { \"country\": \"Hungary\", \"adjective\": \"Hungarian\", \"circuit\": \"Hungaroring\", \"track\": \"Hungaroring\", \"rlToolsName\": \"hungaroring.2003\" },\n    \"BEL\": { \"country\": \"Belgium\", \"adjective\": \"Belgian\", \"circuit\": \"Spa\", \"track\": \"Circuit de Spa-Francorchamps\", \"rlToolsName\": \"spa.2007\" },\n    \"ITA\": { \"country\": \"Italy\", \"adjective\": \"Italian\", \"circuit\": \"Monza\", \"track\": \"Autodromo Nazionale Monza\", \"rlToolsName\": \"monza.2000\" },\n    \"SGP\": { \"country\": \"Singapore\", \"adjective\": \"Singapore\", \"circuit\": \"Marina Bay\", \"track\": \"Marina Bay Street Circuit\", \"rlToolsName\": \"singapore.2023\" },\n    \"JAP\": { \"country\": \"Japan\", \"adjective\": \"Japanese\", \"circuit\": \"Suzuka\", \"track\": \"Suzuka International Racing Course\", \"rlToolsName\": \"suzuka.2003\" },\n    \"USA\": { \"country\": \"United States\", \"adjective\": \"United States\", \"circuit\": \"COTA\", \"track\": \"Circuit of the Americas\", \"rlToolsName\": \"austin.2012\" },\n    \"MEX\": { \"country\": \"Mexico\", \"adjective\": \"Mexican\", \"circuit\": \"Mexico City\", \"track\": \"Autódromo Hermanos Rodríguez\", \"rlToolsName\": \"mexico.2015\" },\n    \"BRA\": { \"country\": \"Brazil\", \"adjective\": \"Brazilian\", \"circuit\": \"Interlagos\", \"track\": \"Autódromo José Carlos Pace\", \"rlToolsName\": \"interlagos.2000\" },\n    \"UAE\": { \"country\": \"Abu Dhabi\", \"adjective\": \"Abu Dhabi\", \"circuit\": \"Yas Marina\", \"track\": \"Yas Marina Circuit\", \"rlToolsName\": \"yasmarina.2021\" },\n    \"NED\": { \"country\": \"Netherlands\", \"adjective\": \"Netherlands\", \"circuit\": \"Zandvoort\", \"track\": \"Circuit Zandvoort\", \"rlToolsName\": \"zandvoort.2020\" },\n    \"VEG\": { \"country\": \"Vegas\", \"adjective\": \"Vegas\", \"circuit\": \"Las Vegas\", \"track\": \"Las Vegas Street Circuit\", \"rlToolsName\": \"las.vegas.2023\" },\n    \"QAT\": { \"country\": \"Qatar\", \"adjective\": \"Qatar\", \"circuit\": \"Lusail\", \"track\": \"Lusail International Circuit\", \"rlToolsName\": \"losail.2023\" },\n    \"CHI\": { \"country\": \"China\", \"adjective\": \"Chinese\", \"circuit\": \"Shanghai\", \"track\": \"Shanghai International Circuit\", \"rlToolsName\": \"shanghai.2004\" }\n};\n\n// custom news\nexport const CUSTOM_NEWS_TYPE_META = {\n    race_result: { label: \"Race result\", titleType: 2, group: \"normal\" },\n    quali_result: { label: \"Qualifying result\", titleType: 1, group: \"normal\" },\n    race_reaction: { label: \"Post-race reactions\", titleType: 16, group: \"normal\" },\n    fake_transfer: { label: \"Transfer rumor\", titleType: 7, group: \"normal\" },\n    big_transfer: { label: \"Big transfer confirmed\", titleType: 6, group: \"normal\" },\n    massive_exit: { label: \"Massive exit\", titleType: 17, group: \"normal\" },\n    massive_signing: { label: \"Massive signing\", titleType: 18, group: \"normal\" },\n    contract_renewal: { label: \"Contract renewal\", titleType: 10, group: \"normal\" },\n    silly_season_rumors: { label: \"Silly season rumors\", titleType: 4, group: \"normal\" },\n    team_comparison: { label: \"Team comparison\", group: \"normal\" },\n    driver_comparison: { label: \"Driver comparison\", titleType: 13, group: \"normal\" },\n    season_review: { label: \"Season review\", group: \"normal\" },\n    potential_champion: { label: \"Potential champion\", titleType: 8, group: \"normal\" },\n    world_champion: { label: \"World champion\", titleType: 9, group: \"normal\" },\n    next_season_grid: { label: \"Next season grid\", titleType: 19, group: \"normal\" },\n    feeder_series_review: { label: \"Feeder series review\", titleType: 20, group: \"normal\" },\n    turning_point_technical_directive: { label: \"Technical directive\", titleType: 100, turningPoint: true, group: \"turning_point\" },\n    turning_point_transfer: { label: \"Mid-season transfer\", titleType: 101, turningPoint: true, group: \"turning_point\" },\n    turning_point_investment: { label: \"Investment\", titleType: 102, turningPoint: true, group: \"turning_point\" },\n    turning_point_dsq: { label: \"DSQ\", titleType: 103, turningPoint: true, group: \"turning_point\" },\n    turning_point_race_substitution: { label: \"Race substitution\", titleType: 105, turningPoint: true, group: \"turning_point\" },\n    turning_point_injury: { label: \"Injury or illness\", titleType: 106, turningPoint: true, group: \"turning_point\" },\n    turning_point_engine_regulation: { label: \"Engine regulation\", titleType: 107, turningPoint: true, group: \"turning_point\" },\n    turning_point_young_drivers: { label: \"Young drivers\", titleType: 108, turningPoint: true, group: \"turning_point\" },\n    turning_point_aduo: { label: \"ADUO\", titleType: 109, turningPoint: true, group: \"turning_point\" },\n    custom_new: { label: \"Custom article\", group: \"custom\" }\n};\n\nexport const CUSTOM_NEWS_INVESTMENT_COUNTRIES = [\n    \"China\",\n    \"Saudi Arabia\",\n    \"United Arab Emirates\",\n    \"India\",\n    \"Russia\",\n    \"South Africa\",\n    \"Qatar\",\n    \"Bahrain\",\n    \"Singapore\",\n    \"Vietnam\"\n];\n\nexport const CUSTOM_NEWS_DSQ_COMPONENTS = [\n    \"engine brake map\",\n    \"fuel flow\",\n    \"front wing\",\n    \"rear wing\",\n    \"diffuser\",\n    \"floor\",\n    \"brake ducts\",\n    \"suspension\",\n    \"gearbox\",\n    \"cooling system\",\n    \"hydraulics\",\n    \"clutch\",\n    \"plank wear\"\n];\n\nexport const CUSTOM_NEWS_ENGINE_CHANGE_AREAS = [\n    \"fuel flow monitoring\",\n    \"ERS deployment limits\",\n    \"MGU-K usage rules\",\n    \"cooling system allowances\",\n    \"gearbox durability limits\",\n    \"turbo efficiency limits\",\n    \"oil consumption rules\",\n    \"hybrid system architecture\",\n    \"engine architecture layout\",\n    \"combustion concept rules\",\n    \"turbocharger design limits\",\n    \"energy recovery system redesign\",\n    \"fuel system design rules\",\n    \"power unit packaging regulations\"\n];\n\nexport const CUSTOM_NEWS_ADUO_QUARTERS = [\n    { value: \"1\", label: \"1st quarter\" },\n    { value: \"2\", label: \"2nd quarter\" },\n    { value: \"3\", label: \"3rd quarter\" }\n];\n\nexport const CUSTOM_NEWS_IMAGE_FILES = ['1_gar.webp', '1_media.webp', '1_pad.webp', '1_shot.webp', '10_gar.webp', '10_pad.webp', '102_pad.webp', '105_pad.webp', '107_pad.webp', '11_pad.webp', '116_pad.webp', '12_pad.webp', '13_pad.webp', '14_pad.webp', '142_pad.webp', '144_pad.webp', '15_pad.webp', '17_pad.webp', '18_pad.webp', '2_gar.webp', '2_media.webp', '2_pad.webp', '2_shot.webp', '23_pad.webp', '242_pad.webp', '245_pad.webp', '255_pad.webp', '279_pad.webp', '286_pad.webp', '3_gar.webp', '3_media.webp', '3_pad.webp', '3_shot.webp', '373_pad.webp', '376_pad.webp', '4_gar.webp', '4_media.webp', '4_shot.webp', '5_gar.webp', '5_media.webp', '5_shot.webp', '6_gar.webp', '6_pad.webp', '6_shot.webp', '7_shot.webp', '77_pad.webp', '8_gar.webp', '8_shot.webp', '81_pad.webp', '83_pad.webp', '87_pad.webp', '9_gar.webp', '95_pad.webp', 'af_factory.webp', 'af1.webp', 'af2.webp', 'al_factory.webp', 'al1.webp', 'al2.webp', 'as_factory.webp', 'as1.webp', 'as2.webp', 'at_factory.webp', 'at1.webp', 'at2.webp', 'aus.webp', 'aus_car.webp', 'aus_tra.webp', 'aut.webp', 'aut_car.webp', 'aut_tra.webp', 'aze.webp', 'aze_car.webp', 'aze_tra.webp', 'bah.webp', 'bah_car.webp', 'bah_inv.webp', 'bah_tra.webp', 'bel.webp', 'bel_car.webp', 'bel_tra.webp', 'bra.webp', 'bra_car.webp', 'bra_tra.webp', 'can.webp', 'can_car.webp', 'can_tra.webp', 'champ1.webp', 'champ2.webp', 'champ3.webp', 'champ4.webp', 'champ5.webp', 'chi.webp', 'chi_car.webp', 'chi_inv.webp', 'chi_tra.webp', 'con1.webp', 'con10.webp', 'con11.webp', 'con12.webp', 'con2.webp', 'con3.webp', 'con4.webp', 'con5.webp', 'con6.webp', 'con7.webp', 'con8.webp', 'con9.webp', 'ct_factory.webp', 'dsq_1.webp', 'dsq_2.webp', 'dsq_3.webp', 'dsq_4.webp', 'dsq_5.webp', 'dsq_6.webp', 'dsq_7.webp', 'dsq_8.webp', 'engine_1.webp', 'engine_10.webp', 'engine_2.webp', 'engine_3.webp', 'engine_4.webp', 'engine_5.webp', 'engine_6.webp', 'engine_7.webp', 'engine_8.webp', 'engine_9.webp', 'fe_factory.webp', 'fe1.webp', 'fe2.webp', 'fe3.webp', 'fe4.webp', 'fe5.webp', 'gbr.webp', 'gbr_car.webp', 'gbr_tra.webp', 'grid_1.webp', 'grid_2.webp', 'grid_3.webp', 'grid_4.webp', 'ha_factory.webp', 'ha1.webp', 'ha2.webp', 'hun.webp', 'hun_car.webp', 'hun_tra.webp', 'imo.webp', 'imo_car.webp', 'imo_tra.webp', 'ind_inv.webp', 'ita.webp', 'ita_car.webp', 'ita_tra.webp', 'jap.webp', 'jap_car.webp', 'jap_tra.webp', 'mc_factory.webp', 'mc1.webp', 'mc2.webp', 'me_factory.webp', 'me1.webp', 'me2.webp', 'me3.webp', 'me4.webp', 'mex.webp', 'mex_car.webp', 'mex_tra.webp', 'mia.webp', 'mia_car.webp', 'mia_tra.webp', 'mon.webp', 'mon_car.webp', 'mon_tra.webp', 'monaco_media.webp', 'ned.webp', 'ned_car.webp', 'ned_tra.webp', 'part_3_1.webp', 'part_3_2.webp', 'part_3_3.webp', 'part_4_1.webp', 'part_4_2.webp', 'part_4_3.webp', 'part_5_1.webp', 'part_5_2.webp', 'part_5_3.webp', 'part_6_1.webp', 'part_6_2.webp', 'part_6_3.webp', 'part_7_1.webp', 'part_7_2.webp', 'part_7_3.webp', 'part_8_1.webp', 'part_8_2.webp', 'part_8_3.webp', 'qat.webp', 'qat_car.webp', 'qat_inv.webp', 'qat_tra.webp', 'rb_factory.webp', 'rb1.webp', 'rb2.webp', 'rb3.webp', 'rb4.webp', 'rus_inv.webp', 'sau.webp', 'sau_car.webp', 'sau_inv.webp', 'sau_tra.webp', 'sgp.webp', 'sgp_car.webp', 'sgp_tra.webp', 'sin_inv.webp', 'sou_inv.webp', 'spa.webp', 'spa_car.webp', 'spa_tra.webp', 'uae.webp', 'uae_car.webp', 'uae_tra.webp', 'uni_inv.webp', 'usa.webp', 'usa_car.webp', 'usa_tra.webp', 'veg.webp', 'veg_car.webp', 'veg_tra.webp', 'vie_inv.webp', 'wi_factory.webp', 'wi1.webp', 'wi2.webp', 'wi3.webp', 'young_1.webp', 'young_2.webp', 'young_3.webp', 'young_4.webp', 'young_5.webp', 'young_6.webp', 'young_7.webp', 'young_8.webp', 'young_9.webp'];\n\nexport function getParamMap(data) {\n    return {\n        1: {\n            pole_driver: data.pole_driver,\n            season_year: data.seasonYear,\n            circuit: data.circuit,\n            country: data.country,\n            adjective: data.adjective\n        },\n        2: {\n            winner: data.winnerName,\n            season_year: data.seasonYear,\n            circuit: data.circuit,\n            country: data.country,\n            adjective: data.adjective\n        },\n        4: {\n            driver1: data.driver1,\n            driver2: data.driver2,\n            driver3: data.driver3,\n            team1: data.team1,\n            team2: data.team2,\n            team3: data.team3\n        },\n        6: {\n            driver1: data.driver1,\n            team1: data.team1,\n            team2: data.team2,\n            season_year: data.season_year\n        },\n        7: {\n            driver1: data.driver1,\n            team1: data.team1\n        },\n        8: {\n            driver_name: data.driver_name,\n            circuit: data.circuit,\n            country: data.country,\n            adjective: data.adjective,\n            season_year: data.season_year\n        },\n        9: {\n            driver_name: data.driver_name,\n            circuit: data.circuit,\n            country: data.country,\n            adjective: data.adjective,\n            season_year: data.season_year\n        },\n        10: {\n            driver1: data.driver1,\n            team1: data.team1\n        },\n        11: {\n            team1: data.teamId,\n        },\n        12: {\n            team1: data.teamId,\n        },\n        13: {\n            driver1: data.driver1,\n            driver2: data.driver2,\n            team: data.team\n        },\n        14: {\n            driver1: data.driver1,\n            driver2: data.driver2\n        },\n        15: {\n            season_year: data.season,\n            driver1: data.driver1,\n        },\n        16: {\n            happy_driver: data.randomHappyDriver?.name,\n            unhappy_driver: data.randomUnHappyDriver?.name,\n            happy_team: data.happyTeam,\n            unhappy_team: data.unhappyTeam,\n            circuit: data.circuit,\n            country: data.country,\n            adjective: data.adjective\n        },\n        17: {\n            driver1: data.driver1,\n            team1: data.team1,\n            season_year: data.season_year\n        },\n        18: {\n            driver1: data.driver1,\n            team2: data.team2\n        },\n        19: {\n            season_year: data.season_year\n        },\n        20: {\n            f2_champion: data.f2_champion,\n            f3_champion: data.f3_champion,\n            season_year: data.season_year\n        },\n        100: {\n            component: data.component\n        },\n        101: {\n            team: data.team,\n            driver_out: data.driver_out?.name ?? \"\",\n            driver_in: data.driver_in?.name ?? \"\"\n        },\n        102: {\n            team: data.teamName,\n            country: data.country,\n            amount: data.investmentAmount,\n            share: data.investmentShare\n        },\n        103: {\n            team: data.team,\n            adjective: data.adjective,\n            component: data.component,\n            country: data.country,\n            circuit: data.circuit\n        },\n        105: {\n            original_race: data.originalCountry,\n            substitute_race: data.substituteCountry,\n            reason: data.reason\n        },\n        106: {\n            driver: data.driver_affected?.name ?? \"\",\n            team: data.team ?? \"\",\n            next_race:\n                data.condition?.races_affected?.[0]?.country ??\n                data.condition?.expectedReturnCountry ??\n                \"\",\n            condition:\n                data.condition?.condition ??\n                data.condition?.type ??\n                \"\",\n            reserve_driver: data.reserve_driver?.name ?? \"\",\n            reason: data.condition?.reason ?? \"\",\n            races_affected_count: Array.isArray(data.condition?.races_affected)\n                ? data.condition.races_affected.length\n                : 0,\n            expected_return: data.condition?.expectedReturnCountry ?? \"\",\n            end_date: data.condition?.end_date ?? \"\"\n        },\n        107: {\n            type: data.changeType ?? \"\",\n            change_area: data.mainChangeArea ?? \"\"\n        },\n        108: {\n            driver1: data.driver1,\n            driver2: data.driver2,\n            driver3: data.driver3\n        },\n        109: {\n            manufacturers: data.manufacturers,\n            number_period: data.quarterString\n        }\n    };\n}\n\nexport const opinionDict = {\n    \"0\": \"Positive\",\n    \"1\": \"Neutral\",\n    \"2\": \"Negative\"\n}\n\n\n// renderer\nexport const difficultyConfig = {\n    \"default\": {\n        visible: [\"defaultDif\"],\n        lightDif: { className: \"dif-warning\", text: \"\" },\n        researchDif: { className: \"dif-warning\", text: \"\" },\n        statDif: { className: \"dif-warning\", text: \"\" },\n        designTimeDif: { className: \"dif-warning\", text: \"\" },\n        buildDif: { className: \"dif-warning\", text: \"\" }\n    },\n    \"reduced weight\": {\n        visible: [\"lightDif\"],\n        lightDif: { className: \"dif-warning extra-hard\", text: \"Lightweight parts\" },\n    },\n    \"extra-hard\": {\n        visible: [\"lightDif\", \"researchDif\", \"statDif\"],\n        lightDif: { className: \"dif-warning extra-hard\", text: \"Lightweight parts\" },\n        researchDif: { className: \"dif-warning extra-hard\", text: \"Small research boost\" },\n        statDif: { className: \"dif-warning extra-hard\", text: \"Stats boost +0.5%\" },\n    },\n    \"brutal\": {\n        visible: [\"lightDif\", \"researchDif\", \"statDif\", \"designTimeDif\"],\n        lightDif: { className: \"dif-warning extra-hard\", text: \"Lightweight parts\" },\n        researchDif: { className: \"dif-warning brutal\", text: \"Moderate research boost\" },\n        statDif: { className: \"dif-warning brutal\", text: \"Stats boost +0.8%\" },\n        designTimeDif: { className: \"dif-warning brutal\", text: \"Design times reduced 5%\" },\n    },\n    \"unfair\": {\n        visible: [\"lightDif\", \"researchDif\", \"statDif\", \"designTimeDif\"],\n        lightDif: { className: \"dif-warning extra-hard\", text: \"Lightweight parts\" },\n        researchDif: { className: \"dif-warning unfair\", text: \"Large research boost\" },\n        statDif: { className: \"dif-warning unfair\", text: \"Stats boost +1.5%\" },\n        designTimeDif: { className: \"dif-warning unfair\", text: \"Design times reduced 11%\" },\n    },\n    \"insane\": {\n        visible: [\"lightDif\", \"researchDif\", \"statDif\", \"designTimeDif\", \"buildDif\"],\n        lightDif: { className: \"dif-warning extra-hard\", text: \"Lightweight parts\" },\n        researchDif: { className: \"dif-warning insane\", text: \"Huge research boost\" },\n        statDif: { className: \"dif-warning insane\", text: \"Stats boost +2%\" },\n        designTimeDif: { className: \"dif-warning insane\", text: \"Design times reduced 16%\" },\n        buildDif: { className: \"dif-warning insane\", text: \"+1 part when design completed\" },\n    },\n    \"impossible\": {\n        visible: [\"lightDif\", \"researchDif\", \"statDif\", \"designTimeDif\", \"buildDif\"],\n        lightDif: { className: \"dif-warning impossible\", text: \"ULTRA-lightweight parts\" },\n        researchDif: { className: \"dif-warning impossible\", text: \"Massive research boost\" },\n        statDif: { className: \"dif-warning impossible\", text: \"Stats boost +3%\" },\n        designTimeDif: { className: \"dif-warning impossible\", text: \"Design times reduced 20%\" },\n        buildDif: { className: \"dif-warning impossible\", text: \"+2 parts when design completed\" },\n    }\n};\n\nexport const weightDifConfig = {0 : {text: \"Disabled\", className: \"disabled\"}, 1 : {text: \"Lightweight parts\", className: \"extra-hard\"},\n        5 : {text: \"ULTRA Lightweight parts\", className: \"impossible\"}}\n\nexport const defaultDifficultiesConfig = {0 : {text: \"Disabled\", className: \"disabled\"}, 1 : {text: \"Extra Hard\", className: \"extra-hard\"},\n        2 : {text: \"Brutal\", className: \"brutal\"}, 3 : {text: \"Unfair\", className: \"unfair\"},\n        4 : {text: \"Insane\", className: \"insane\"}, 5 : {text: \"Impossible\", className: \"impossible\"}}\n\nexport const defaultTurningPointsFrequencyPreset = 2;\n\nexport const turningPointsFrequencyLabels = [\n    \"Much less\",\n    \"Less\",\n    \"Default\",\n    \"More\",\n    \"Most\"\n];\n\nexport const turningPointsTuningByType = {\n    dsq: {\n        chance: [0.02, 0.05, 0.08, 0.15, 0.25],\n        max: [1, 1, 2, 3, 4],\n    },\n    midSeasonTransfers: {\n        chance: [0.05, 0.15, 0.25, 0.7, 0.9],\n        max: [1, 2, 2, 3, 3],\n    },\n    technicalDirective: {\n        chance: [0.1, 0.25, 0.4, 0.6, 0.8],\n        max: [1, 1, 2, 2, 2],\n    },\n    investment: {\n        chance: [0.02, 0.05, 0.1, 0.2, 0.35],\n        max: [1, 1, 1, 2, 3],\n    },\n    raceSubstitution: {\n        chance: [0.02, 0.05, 0.1, 0.2, 0.35],\n        max: [1, 1, 1, 2, 3],\n    },\n    injury: {\n        chance: [0.05, 0.12, 0.2, 0.35, 0.5],\n        max: [1, 1, 2, 3, 3],\n    },\n    engineRegulation: {\n        chance: [0.15, 0.3, 0.5, 0.75, 0.9],\n        max: [1, 1, 1, 1, 1],\n    },\n    youngDrivers: {\n        chance: [0.25, 0.5, 1, 1, 1],\n        max: [1, 1, 1, 1, 1],\n    },\n};\n\nexport const defaultColors = {\n  1: 4293394477,\n  2: 4294934528,\n  3: 4281758150,\n  4: 4280808658,\n  5: 4278227916,\n  6: 4284794111,\n  7: 4290165437,\n  8: 4284912383,\n  9: 4283621970,\n  10: 4280457585\n};\n\nexport const customColors = {\n    \"audi\": \"#C00A26\",\n    \"sauber\": \"#f50537\",\n    \"stake\": \"#54d650\",\n    \"visarb\": \"#6c8ff3\",\n    \"toyota\": \"#989898\",\n    \"brawn\": \"#d0e610\",\n    \"porsche\": \"#873AC4\",\n    \"alphatauri\": \"#5E8FAA\",\n    \"hugo\": \"#bd9514\",\n    \"lotus\": \"#b09247\",\n    \"renault\": \"#b09247\",\n    \"andretti\": \"#fac51c\",\n    \"alpine\": \"#F168BA\",\n    \"racingpoint\": \"#F395C7\",\n    \"jordan\": \"#e6e624\",\n    \"bmw\": \"#f1f1f1\",\n    \"cadillac\": \"#111111\",\n    \"ford\": \"#3172bf\"\n}\n"
  },
  {
    "path": "src/js/frontend/devTools.js",
    "content": "import { saveAs } from \"file-saver\";\nimport { Command } from \"../backend/command.js\";\n\nconst isLocalhost =\n  window.location.hostname === \"localhost\" ||\n  window.location.hostname === \"127.0.0.1\";\n\nif (isLocalhost) {\n  let windowEl = null;\n  let isOpen = false;\n  let isDragging = false;\n  let dragOffsetX = 0;\n  let dragOffsetY = 0;\n\n  function createWindow() {\n    windowEl = document.createElement(\"div\");\n    windowEl.className = \"devtools-window\";\n    windowEl.setAttribute(\"role\", \"dialog\");\n    windowEl.setAttribute(\"aria-modal\", \"false\");\n\n    const headerEl = document.createElement(\"div\");\n    headerEl.className = \"devtools-header\";\n\n    const chromeEl = document.createElement(\"div\");\n    chromeEl.className = \"devtools-chrome\";\n\n    const chromeDotRed = document.createElement(\"span\");\n    chromeDotRed.className = \"devtools-dot is-red\";\n\n    const chromeDotYellow = document.createElement(\"span\");\n    chromeDotYellow.className = \"devtools-dot is-yellow\";\n\n    const chromeDotGreen = document.createElement(\"span\");\n    chromeDotGreen.className = \"devtools-dot is-green\";\n\n    const titleEl = document.createElement(\"div\");\n    titleEl.className = \"devtools-title\";\n    titleEl.textContent = \"DEVTOOLS.EXE\";\n\n    const statusEl = document.createElement(\"div\");\n    statusEl.className = \"devtools-status\";\n    statusEl.textContent = \"LOCALHOST SESSION\";\n\n    const closeButton = document.createElement(\"button\");\n    closeButton.className = \"devtools-close\";\n    closeButton.type = \"button\";\n    closeButton.setAttribute(\"aria-label\", \"Close\");\n    closeButton.textContent = \"\\u00D7\";\n\n    const bodyEl = document.createElement(\"div\");\n    bodyEl.className = \"devtools-body\";\n\n    const hintEl = document.createElement(\"div\");\n    hintEl.className = \"devtools-hint\";\n    hintEl.textContent = \"Ctrl+D to toggle\";\n\n    const statsButton = document.createElement(\"button\");\n    statsButton.className = \"devtools-action\";\n    statsButton.type = \"button\";\n    statsButton.textContent = \"Set all drivers stats to 85\";\n\n    const downloadButton = document.createElement(\"button\");\n    downloadButton.className = \"devtools-action\";\n    downloadButton.type = \"button\";\n    downloadButton.textContent = \"Download database (.db)\";\n\n    chromeEl.appendChild(chromeDotRed);\n    chromeEl.appendChild(chromeDotYellow);\n    chromeEl.appendChild(chromeDotGreen);\n    headerEl.appendChild(chromeEl);\n    headerEl.appendChild(titleEl);\n    headerEl.appendChild(statusEl);\n    headerEl.appendChild(closeButton);\n    bodyEl.appendChild(hintEl);\n    bodyEl.appendChild(statsButton);\n    bodyEl.appendChild(downloadButton);\n    windowEl.appendChild(headerEl);\n    windowEl.appendChild(bodyEl);\n\n    document.body.appendChild(windowEl);\n\n    closeButton.addEventListener(\"click\", () => {\n      closeWindow();\n    });\n\n    closeButton.addEventListener(\"pointerdown\", (e) => {\n      e.stopPropagation();\n    });\n\n    statsButton.addEventListener(\"click\", () => {\n      statsButton.disabled = true;\n      statsButton.textContent = \"Working...\";\n\n      new Command(\"devSetAllDriversStats85\", {}).execute();\n\n      setTimeout(() => {\n        statsButton.disabled = false;\n        statsButton.textContent = \"Set all drivers stats to 85\";\n      }, 1200);\n    });\n\n    downloadButton.addEventListener(\"click\", async () => {\n      downloadButton.disabled = true;\n      downloadButton.textContent = \"Downloading...\";\n\n      try {\n        const response = await new Command(\"devDownloadDatabase\", {}).promiseExecute();\n        const filename = response?.content?.filename ?? \"database.db\";\n        const fileData = response?.content?.fileData;\n\n        if (!fileData) {\n          throw new Error(\"Missing database data\");\n        }\n\n        saveAs(new Blob([fileData], { type: \"application/vnd.sqlite3\" }), filename);\n        downloadButton.textContent = \"Downloaded\";\n      } catch (error) {\n        console.error(error);\n        downloadButton.textContent = \"Download failed\";\n      }\n\n      setTimeout(() => {\n        downloadButton.disabled = false;\n        downloadButton.textContent = \"Download database (.db)\";\n      }, 1200);\n    });\n\n    headerEl.addEventListener(\"pointerdown\", (e) => {\n      if (e.button !== 0) return;\n      if (e.target.closest(\".devtools-close\")) return;\n      isDragging = true;\n\n      const rect = windowEl.getBoundingClientRect();\n      dragOffsetX = e.clientX - rect.left;\n      dragOffsetY = e.clientY - rect.top;\n\n      windowEl.style.left = `${rect.left}px`;\n      windowEl.style.top = `${rect.top}px`;\n      windowEl.style.transform = \"none\";\n      windowEl.classList.add(\"dragging\");\n\n      headerEl.setPointerCapture(e.pointerId);\n      e.preventDefault();\n    });\n\n    headerEl.addEventListener(\"pointermove\", (e) => {\n      if (!isDragging) return;\n      const x = e.clientX - dragOffsetX;\n      const y = e.clientY - dragOffsetY;\n      windowEl.style.left = `${x}px`;\n      windowEl.style.top = `${y}px`;\n    });\n\n    headerEl.addEventListener(\"pointerup\", (e) => {\n      if (!isDragging) return;\n      isDragging = false;\n      windowEl.classList.remove(\"dragging\");\n      try {\n        headerEl.releasePointerCapture(e.pointerId);\n      } catch (err) {}\n    });\n  }\n\n  function openWindow() {\n    if (!windowEl) createWindow();\n    windowEl.classList.add(\"show\");\n    isOpen = true;\n  }\n\n  function closeWindow() {\n    if (!windowEl) return;\n    windowEl.classList.remove(\"show\");\n    isOpen = false;\n  }\n\n  function toggleWindow() {\n    if (isOpen) closeWindow();\n    else openWindow();\n  }\n\n  window.addEventListener(\n    \"keydown\",\n    (e) => {\n      if (e.repeat) return;\n      if (!e.ctrlKey) return;\n      if (e.altKey || e.shiftKey) return;\n      if (e.code !== \"KeyD\") return;\n      e.preventDefault();\n      toggleWindow();\n    },\n    true\n  );\n\n  window.addEventListener(\"keydown\", (e) => {\n    if (e.key === \"Escape\") closeWindow();\n  });\n}\n"
  },
  {
    "path": "src/js/frontend/dragFile.js",
    "content": "// dragDrop.js\nimport { gamePill, editorPill, setSaveName, new_update_notifications, setIsShowingNotification } from \"./renderer.js\";\nimport { saveHandleToRecents, getRecentHandles } from \"./recentsManager.js\";\nimport { Command } from \"../backend/command.js\";\n\nlet carAnalysisUtils = null;\nexport const dbWorker = new Worker(new URL('../backend/worker.js', import.meta.url));\n\nconst dropDiv = document.querySelector(\".drop-div\");\nconst statusCircle = document.getElementById(\"statusCircle\");\nconst statusIcon = document.getElementById(\"statusIcon\");\nconst statusTitle = document.getElementById(\"statusTitle\");\nconst loadingSpinner = document.querySelector(\".loading-spinner\");\nconst statusDesc = document.getElementById(\"statusDesc\");\nconst body = document.querySelector(\"body\");\n\nexport const handleDragEnter = (event) => {\n    event.preventDefault();\n    body.classList.add(\"drag-active\");\n};\n\nexport const handleDragOver = (event) => {\n    event.preventDefault();\n    event.dataTransfer.dropEffect = \"copy\";\n};\n\nexport const handleDragLeave = (event) => {\n    event.preventDefault();\n    body.classList.remove(\"drag-active\");\n};\n\nexport const handleDrop = async (event) => {\n    event.preventDefault();\n    body.classList.remove(\"drag-active\");\n\n    const item = event.dataTransfer.items[0];\n    \n    // ... el resto de tu lógica de drop ...\n    if (item && item.kind === 'file') {\n        try {\n            const handle = await item.getAsFileSystemHandle();\n            \n            if (handle) {\n                await saveHandleToRecents(handle);\n                const file = await handle.getFile();\n                await processSaveFile(file)\n            } else {\n                const file = item.getAsFile();\n                await processSaveFile(file);\n            }\n        } catch (e) {\n            console.error(\"Error with file handle:\", e);\n            const file = event.dataTransfer.files[0];\n            await processSaveFile(file);\n        }\n    }\n};\n\ndropDiv.addEventListener(\"dragenter\", handleDragEnter);\ndropDiv.addEventListener(\"dragover\", handleDragOver);\ndropDiv.addEventListener(\"dragleave\", handleDragLeave);\ndropDiv.addEventListener(\"drop\", handleDrop);\n\nconst wait = (ms) => new Promise(resolve => setTimeout(resolve, ms));\n\n\nexport async function processSaveFile(file) {\n    if (!file) return;\n\n    // --- Validaciones de archivo ---\n    if (file.name.split('.').pop() === \"vdf\") {\n        console.error(\"File not supported\");\n        new_update_notifications(\n            'File type not supported. See <a href=\"https://www.youtube.com/watch?v=w-USlPQxZm0\" target=\"_blank\">this video</a> to find your save file.',\n            \"error\"\n        );\n        return;\n    } else if (file.name.split('.').pop() === \"sav\") {\n        \n        const footerNotification = document.querySelector('.footer-notification');\n        if (footerNotification && footerNotification.classList.contains('error')) {\n            footerNotification.classList.remove('show');\n            setIsShowingNotification(false);\n        }\n        \n        setSaveName(file.name);\n\n        // 1. Ponemos el icono en modo SPINNER\n        await updateStatusUI('loading');\n\n        // 2. Definimos la tarea de carga\n        const dbLoadTask = new Promise((resolve, reject) => {\n            dbWorker.postMessage({ command: 'loadDB', data: { file: file } });\n\n            dbWorker.onmessage = (msg) => {\n                if (msg.data.responseMessage === \"Database loaded\") {\n                    console.log(\"[Main Thread] Database loaded in Worker\");\n                    const dateObj = new Date(msg.data.content);\n                    const day = dateObj.getDate();\n                    const month = new Intl.DateTimeFormat('en-US', { month: 'long' }).format(dateObj);\n                    const year = dateObj.getFullYear();\n                    const completeDay = day + (day % 10 == 1 && day != 11 ? \"st\" : day % 10 == 2 && day != 12 ? \"nd\" : day % 10 == 3 && day != 13 ? \"rd\" : \"th\");\n                    \n                    document.querySelector(\"#dateDay\").textContent = completeDay;\n                    document.querySelector(\"#dateMonth\").textContent = month;\n                    document.querySelector(\"#dateYear\").textContent = year;\n                    document.querySelector(\"#dateDay2026\").textContent = completeDay;\n                    document.querySelector(\"#dateMonth2026\").textContent = month;\n                    document.querySelector(\"#dateYear2026\").textContent = year;           \n\n                    resolve(); \n                } else if (msg.data.error) {\n                    console.error(\"[Main Thread] Error loading DB:\", msg.data.error);\n                    reject(new Error(msg.data.error));\n                }\n            };\n        });\n\n        // 3. Ejecutamos: Carga + Espera\n        try {\n            await Promise.all([\n                dbLoadTask,\n                wait(2000)\n            ]);\n\n            // 4. Ponemos el icono en modo CHECK VERDE\n            await updateStatusUI('success', { filename: file.name });\n\n            // 5. Esperamos 1 segundo extra\n            await wait(1000);\n\n            // 6. Finalmente mostramos el editor\n            editorPill.classList.remove(\"d-none\");\n            gamePill.classList.remove(\"d-none\");\n            patreonPill.classList.remove(\"d-none\");\n\n            const command = new Command(\"saveSelected\", {});\n            command.execute();\n\n            document.querySelector(\".script-selector\").classList.remove(\"hidden\");\n            document.querySelector(\".footer\").classList.remove(\"hidden\");\n\n        } catch (error) {\n            console.error(\"Error en el proceso:\", error);\n            // Aquí podrías manejar el error visualmente si quisieras\n        }\n    }\n}\n\n\nasync function updateStatusUI(type, textConfig) {\n    statusIcon.classList.add(\"icon-scale-0\");\n    \n    await wait(170);\n\n    if (type === 'loading') {\n        loadingSpinner.classList.add(\"show\");\n        statusCircle.classList.remove(\"success-mode\");\n        \n        statusTitle.textContent = \"Analyzing database...\";\n        statusDesc.innerText = \"This may take a few seconds.\";\n        \n    } else if (type === 'success') {\n        loadingSpinner.classList.remove(\"show\");\n        // Cambiar icono a Check y Colores\n        statusIcon.className = \"bi bi-check-lg\"; // Volvemos a poner clase de icono\n        statusIcon.classList.add(\"success-mode\"); // Color verde al icono\n        statusCircle.classList.add(\"success-mode\"); // Fondo verde al circulo\n        \n        // Textos\n        statusTitle.textContent = \"Save loaded successfully!\";\n        statusDesc.innerText = textConfig.filename;\n\n        await wait(50); \n        statusIcon.classList.remove(\"icon-scale-0\");\n    }\n    \n    \n}\n"
  },
  {
    "path": "src/js/frontend/head2head.js",
    "content": "import { races_names, team_dict, combined_dict, lightColors, theme_colors, logos_disc } from \"./config\";\nimport { game_version, custom_team, selectedTheme } from \"./renderer\";\nimport { insert_space, manageColor, format_name } from \"./transfers\";\nimport Chart from 'chart.js/auto';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport annotationPlugin from 'chartjs-plugin-annotation';\nimport { Command } from \"../backend/command.js\";;\n\n\nlet driver1_selected = false;\nlet driver2_selected = false;\nlet driver1Sel;\nlet driver2Sel;\nlet pos_dict = { 1: \"1st\", 2: \"2nd\", 3: \"3rd\" }\nlet d1_team\nlet d2_team\nlet wins = false;\nlet poles = false;\nlet sprints = false;\nlet race = 0;\nlet quali = 0;\nconst raceMenuLength = 7;\nconst qualiMenuLength = 6;\nlet driverGraph;\nlet pointsGraph;\nlet qualiGraph;\nlet gapWinnerGraph;\nlet gapPoleGraph;\nlet compData;\nlet annotationsToggle = true;\nlet h2hCount = 0;\nlet graphCount = 0;\nlet h2hList = []\nlet graphList = []\nlet h2hTeamList = []\nlet graphTeamList = []\nlet mode = \"driver\"\nlet h2hData;\nlet queuedAutoCompareDrivers = null;\n\nexport let mid_grid = 10;\nexport let max_races = 23;\nexport let relative_grid = 5;\n\nfunction formatSignedValue(value) {\n    if (value > 0) {\n        return `+${value}`;\n    }\n    return `${value}`;\n}\n\nfunction getCompletedRaceIdsSet(data) {\n    const completedRaceIds = data?.[data.length - 1];\n    if (!Array.isArray(completedRaceIds)) {\n        return new Set();\n    }\n    return new Set(completedRaceIds.map((raceId) => Number(raceId)));\n}\n\nfunction renderTeamLogo(container, teamId) {\n    if (!container) return;\n    const logoSrc = logos_disc[teamId];\n    const teamName = combined_dict[teamId] || \"\";\n    container.innerHTML = \"\";\n    container.parentNode.querySelector(\".team-h2h-name-bg\")?.remove();\n    container.title = teamName;\n    if (!logoSrc) {\n        container.textContent = teamName;\n        return;\n    }\n    const watermark = document.createElement(\"span\");\n    watermark.className = \"team-h2h-name-bg bold-font\";\n    watermark.textContent = teamName.toUpperCase();\n    container.parentNode.appendChild(watermark);\n    const logoImg = document.createElement(\"img\");\n    logoImg.className = \"drivers-table-logo team-h2h-logo\";\n    logoImg.src = logoSrc;\n    logoImg.alt = teamName;\n    container.appendChild(logoImg);\n}\n\nexport function setMidGrid(value) {\n    mid_grid = value\n}\n\nexport function setMaxRaces(value) {\n    max_races = value\n}\n\nexport function setRelativeGrid(value) {\n    relative_grid = value\n}\n\nexport let colors_dict;\n//changed as the ct colors changes, so it stays\n\nChart.register(ChartDataLabels);\nChart.register(annotationPlugin);\n\nexport function init_colors_dict(theme = \"default-theme\") {\n    console.log(\"Selected theme:\", theme);\n    colors_dict = { \"10\": \"#F91536\", \"11\": theme_colors[theme].general_secondary, \"20\": \"#F58020\", \"21\": \"#47c7fc\", \"30\": \"#3671C6\", \"31\": \"#ffd300\", \"40\": \"#6CD3BF\", \"41\": theme_colors[theme].general_secondary, \"50\": \"#F168BA\", \"51\":  theme_colors[theme].general_secondary, \"60\": \"#1868DB\", \"61\": theme_colors[theme].general_secondary, \"70\": \"#B6BABD\", \"71\": \"#f62039\", \"80\": \"#5E8FAA\", \"81\": theme_colors[theme].general_secondary, \"90\": \"#C92D4B\", \"91\": theme_colors[theme].general_secondary, \"100\": \"#358C75\", \"101\": \"#c3dc00\", \"320\": \"#ffffff\", \"321\": \"#000000\" }\n}\n\n\nexport function get_colors_dict() {\n    return colors_dict;\n}\n\nexport function edit_colors_dict(key, value) {\n    colors_dict[key] = value;\n}\n\n\n/**\n * Puts the bars of the head to head with the correct width for the drivers selected\n * @param {object} data object with all the info of the comparision between both drivers\n */\nexport function manage_h2h_bars(data) {\n    let relValue\n    let d1_width\n    let d2_width\n    compData = data\n    if (data[7].some(elem => elem >= 2)) {\n        data[4] = data[7]\n        document.getElementById(\"bestrh2h\").querySelector(\".only-name\").textContent = \"WINS\"\n        wins = true\n    }\n    else {\n        document.getElementById(\"bestrh2h\").querySelector(\".only-name\").textContent = \"BEST RACE\"\n        wins = false\n    }\n    if (data[8].some(elem => elem >= 2)) {\n        data[5] = data[8]\n        document.getElementById(\"bestqh2h\").querySelector(\".only-name\").textContent = \"POLES\"\n        poles = true\n    }\n    else {\n        document.getElementById(\"bestqh2h\").querySelector(\".only-name\").textContent = \"BEST QUALI\"\n        poles = false\n    }\n    if (data[9].some(elem => elem >= 1)) {\n        document.getElementById(\"bestrh2h\").querySelector(\".name-H2H\").style.justifyContent = \"space-between\"\n        document.getElementById(\"bestrh2h\").querySelectorAll(\"i\").forEach(function (elem) {\n            elem.classList.remove(\"d-none\")\n        })\n    }\n    else {\n        document.getElementById(\"bestrh2h\").querySelector(\".name-H2H\").style.justifyContent = \"center\"\n        document.getElementById(\"bestrh2h\").querySelectorAll(\"i\").forEach(function (elem) {\n            elem.classList.add(\"d-none\")\n        })\n    }\n\n    document.querySelectorAll(\".one-statH2H\").forEach(function (elem, index) {\n        if (elem.id === \"bestrh2h\" || elem.id === \"bestqh2h\") {\n            if (!wins && elem.id === \"bestrh2h\") {\n                d1_width = 100 - (data[index][0] - 1) * relative_grid\n                d2_width = 100 - (data[index][1] - 1) * relative_grid\n                if (data[index][0] <= 3) {\n                    elem.querySelector(\".driver1-number\").textContent = pos_dict[data[index][0]]\n                }\n                else {\n                    elem.querySelector(\".driver1-number\").textContent = data[index][0] + \"th\"\n                }\n                if (data[index][1] <= 3) {\n                    elem.querySelector(\".driver2-number\").textContent = pos_dict[data[index][1]]\n                }\n                else {\n                    elem.querySelector(\".driver2-number\").textContent = data[index][1] + \"th\"\n                }\n            }\n            else if (wins && elem.id === \"bestrh2h\") {\n                relValue = (100 / (data[index][0] + data[index][1])).toFixed(2)\n                d1_width = data[index][0] * relValue\n                d2_width = data[index][1] * relValue\n                elem.querySelector(\".driver1-number\").textContent = data[index][0]\n                elem.querySelector(\".driver2-number\").textContent = data[index][1]\n            }\n            if (!poles && elem.id === \"bestqh2h\") {\n                d1_width = 100 - (data[index][0] - 1) * relative_grid\n                d2_width = 100 - (data[index][1] - 1) * relative_grid\n                if (data[index][0] <= 3) {\n                    elem.querySelector(\".driver1-number\").textContent = pos_dict[data[index][0]]\n                }\n                else {\n                    elem.querySelector(\".driver1-number\").textContent = data[index][0] + \"th\"\n                }\n                if (data[index][1] <= 3) {\n                    elem.querySelector(\".driver2-number\").textContent = pos_dict[data[index][1]]\n                }\n                else {\n                    elem.querySelector(\".driver2-number\").textContent = data[index][1] + \"th\"\n                }\n            }\n            else if (poles && elem.id === \"bestqh2h\") {\n                relValue = (100 / (data[index][0] + data[index][1])).toFixed(2)\n                d1_width = data[index][0] * relValue\n                d2_width = data[index][1] * relValue\n                elem.querySelector(\".driver1-number\").textContent = data[index][0]\n                elem.querySelector(\".driver2-number\").textContent = data[index][1]\n            }\n        }\n        else {\n            if (elem.id === \"raceh2h\" || elem.id === \"qualih2h\") {\n\n                let index2\n                if (elem.id === \"raceh2h\") {\n                    index2 = 10\n                }\n                else {\n                    index2 = 11\n                }\n                let d1Num = elem.querySelector(\".avg-comparison\").querySelector(\".driver1-avg\")\n                d1Num.className = \"driver1-avg bold-font\"\n                let d2Num = elem.querySelector(\".avg-comparison\").querySelector(\".driver2-avg\")\n                d2Num.className = \"driver2-avg bold-font\"\n                let d1 = compData[index2][0];\n                if (compData[index2][0] > 0) {\n                    d1 = \"+\" + compData[index2][0]\n                    d1Num.classList.add(\"negative\")\n                    d2Num.classList.add(\"positive\")\n                }\n                d1Num.innerText = d1\n                let d2 = compData[index2][1];\n                if (compData[index2][1] > 0) {\n                    d2 = \"+\" + compData[index2][1]\n                    d1Num.classList.add(\"positive\")\n                    d2Num.classList.add(\"negative\")\n                }\n                d2Num.innerText = d2\n\n                if (elem.id === \"qualih2h\") {\n                    relValue = (100 / (data[0][0] + data[0][1])).toFixed(2)\n                    if (relValue == Infinity) {\n                        relValue = 0\n                    }\n                    d1_width = data[index][0] * relValue\n                    d2_width = data[index][1] * relValue\n                    elem.querySelector(\".driver1-number\").textContent = data[index][0]\n                    elem.querySelector(\".driver2-number\").textContent = data[index][1]\n                    if (quali === 2) {\n                        d1_width = 100 - (data[14][0] - 1) * relative_grid\n                        d2_width = 100 - (data[14][1] - 1) * relative_grid\n                        elem.querySelector(\".driver1-number\").textContent = data[14][0]\n                        elem.querySelector(\".driver2-number\").textContent = data[14][1]\n                    }\n                    else if (quali === 3) {\n                        d1_width = 100 - (data[15][0] - 1) * relative_grid\n                        d2_width = 100 - (data[15][1] - 1) * relative_grid\n                        elem.querySelector(\".driver1-number\").textContent = data[15][0]\n                        elem.querySelector(\".driver2-number\").textContent = data[15][1]\n                    }\n                    else if (quali === 4) {\n                        relValue = (100 / (data[19][0] + data[19][1])).toFixed(2)\n                        if (relValue == Infinity) {\n                            relValue = 0\n                        }\n                        d1_width = data[19][0] * relValue\n                        d2_width = data[19][1] * relValue\n                        elem.querySelector(\".driver1-number\").textContent = data[19][0]\n                        elem.querySelector(\".driver2-number\").textContent = data[19][1]\n                    }\n                    else if (quali === 5) {\n                        relValue = (100 / (data[20][0] + data[20][1])).toFixed(2)\n                        if (relValue == Infinity) {\n                            relValue = 0\n                        }\n                        d1_width = data[20][0] * relValue\n                        d2_width = data[20][1] * relValue\n                        elem.querySelector(\".driver1-number\").textContent = data[20][0]\n                        elem.querySelector(\".driver2-number\").textContent = data[20][1]\n                    }\n                }\n\n                if (elem.id === \"raceh2h\") {\n                    relValue = (100 / (data[0][0] + data[0][1])).toFixed(2)\n                    if (relValue == Infinity) {\n                        relValue = 0\n                    }\n                    d1_width = data[index][0] * relValue\n                    d2_width = data[index][1] * relValue\n                    elem.querySelector(\".driver1-number\").textContent = data[index][0]\n                    elem.querySelector(\".driver2-number\").textContent = data[index][1]\n\n                    if (race === 2) {\n                        d1_width = 100 - (data[12][0] - 1) * relative_grid\n                        d2_width = 100 - (data[12][1] - 1) * relative_grid\n                        elem.querySelector(\".driver1-number\").textContent = data[12][0]\n                        elem.querySelector(\".driver2-number\").textContent = data[12][1]\n                    }\n                    else if (race === 3) {\n                        d1_width = 100 - (data[13][0] - 1) * relative_grid\n                        d2_width = 100 - (data[13][1] - 1) * relative_grid\n                        elem.querySelector(\".driver1-number\").textContent = data[13][0]\n                        elem.querySelector(\".driver2-number\").textContent = data[13][1]\n                    }\n                    else if (race === 4) {\n                        d1_width = 100 - (data[16][0] - 1) * relative_grid\n                        d2_width = 100 - (data[16][1] - 1) * relative_grid\n                        elem.querySelector(\".driver1-number\").textContent = data[16][0]\n                        elem.querySelector(\".driver2-number\").textContent = data[16][1]\n                    }\n                    else if (race === 5) {\n                        let maxGain = Math.max(Math.abs(data[17][0]), Math.abs(data[17][1]))\n                        if (maxGain === 0) {\n                            maxGain = 1\n                        }\n                        d1_width = (Math.abs(data[17][0]) / maxGain) * 100\n                        d2_width = (Math.abs(data[17][1]) / maxGain) * 100\n                        elem.querySelector(\".driver1-number\").textContent = formatSignedValue(data[17][0])\n                        elem.querySelector(\".driver2-number\").textContent = formatSignedValue(data[17][1])\n                    }\n                    else if (race === 6) {\n                        relValue = (100 / (data[18][0] + data[18][1])).toFixed(2)\n                        if (relValue == Infinity) {\n                            relValue = 0\n                        }\n                        d1_width = data[18][0] * relValue\n                        d2_width = data[18][1] * relValue\n                        elem.querySelector(\".driver1-number\").textContent = data[18][0]\n                        elem.querySelector(\".driver2-number\").textContent = data[18][1]\n                    }\n                }\n\n            }\n            else if (elem.id === \"ptsh2h\") {\n                relValue = 100 / Math.max(data[index][0], data[index][1])\n                if (relValue == Infinity) {\n                    relValue = 0\n                }\n                d1_width = data[index][0] * relValue\n                d2_width = data[index][1] * relValue\n                elem.querySelector(\".driver1-number\").textContent = data[index][0]\n                elem.querySelector(\".driver2-number\").textContent = data[index][1]\n            }\n            else if (elem.id === \"dnfh2h\" || elem.id === \"podiumsh2h\") {\n                relValue = (100 / (data[index][0] + data[index][1])).toFixed(2)\n                if (relValue == Infinity) {\n                    relValue = 0\n                }\n                d1_width = data[index][0] * relValue\n                d2_width = data[index][1] * relValue\n                elem.querySelector(\".driver1-number\").textContent = data[index][0]\n                elem.querySelector(\".driver2-number\").textContent = data[index][1]\n            }\n\n        }\n        if (d1_width > 100) {\n            d1_width = 100\n        }\n        if (d2_width > 100) {\n            d2_width = 100\n        }\n        fill_bars(elem, d1_width, d2_width)\n\n    })\n}\n/**\n * Fills the bars for the elem with driver1 and 2 data\n * @param {div} elem general bar for the comparision\n * @param {Number} d1_width driver 1's width for his bar\n * @param {Number} d2_width driver 2's width for his bar\n */\nfunction fill_bars(elem, d1_width, d2_width) {\n    elem.querySelector(\".driver1-bar\").className = \"driver1-bar\"\n    elem.querySelector(\".driver2-bar\").className = \"driver2-bar\"\n    document.querySelector(\".driver1-name\").className = \"driver1-name\"\n    document.querySelector(\".driver2-name\").className = \"driver2-name\"\n    elem.querySelector(\".driver1-bar\").classList.add(team_dict[h2hTeamList[0]] + \"bar-primary\")\n    document.querySelector(\".driver1-name\").classList.add(team_dict[h2hTeamList[0]] + \"-back-normal\")\n    if (h2hTeamList[0] === h2hTeamList[1]) {\n        elem.querySelector(\".driver2-bar\").classList.add(team_dict[h2hTeamList[1]] + \"bar-secondary\")\n        document.querySelector(\".driver2-name\").classList.add(team_dict[h2hTeamList[1]] + \"-back-normal-secondary\")\n    }\n    else {\n        elem.querySelector(\".driver2-bar\").classList.add(team_dict[h2hTeamList[1]] + \"bar-primary\")\n        document.querySelector(\".driver2-name\").classList.add(team_dict[h2hTeamList[1]] + \"-back-normal\")\n    }\n    elem.querySelector(\".driver1-bar\").style.width = d1_width + \"%\"\n    elem.querySelector(\".driver2-bar\").style.width = d2_width + \"%\"\n}\n\n/**\n * Toggles the sprint wins comparision\n */\nfunction toggle_sprints() {\n    let elem = document.querySelector(\"#bestrh2h\")\n    let d1_width;\n    let d2_width;\n    let relValue;\n    if (sprints) {\n        elem.querySelector(\".only-name\").textContent = \"SPRINT WINS\"\n        relValue = (100 / (compData[9][0] + compData[9][1])).toFixed(2)\n        d1_width = compData[9][0] * relValue\n        d2_width = compData[9][1] * relValue\n        elem.querySelector(\".driver1-number\").textContent = compData[9][0]\n        elem.querySelector(\".driver2-number\").textContent = compData[9][1]\n    }\n    else {\n        if (wins) {\n            elem.querySelector(\".only-name\").textContent = \"WINS\"\n            relValue = (100 / (compData[4][0] + compData[4][1])).toFixed(2)\n            d1_width = compData[4][0] * relValue\n            d2_width = compData[4][1] * relValue\n            elem.querySelector(\".driver1-number\").textContent = compData[4][0]\n            elem.querySelector(\".driver2-number\").textContent = compData[4][1]\n        }\n        else {\n            elem.querySelector(\".only-name\").textContent = \"BEST RACE\"\n            d1_width = 100 - (compData[4][0] - 1) * 5\n            d2_width = 100 - (compData[4][1] - 1) * 5\n            if (compData[4][0] <= 3) {\n                elem.querySelector(\".driver1-number\").textContent = pos_dict[compData[4][0]]\n            }\n            else {\n                elem.querySelector(\".driver1-number\").textContent = compData[4][0] + \"th\"\n            }\n            if (compData[4][1] <= 3) {\n                elem.querySelector(\".driver2-number\").textContent = pos_dict[compData[4][1]]\n            }\n            else {\n                elem.querySelector(\".driver2-number\").textContent = compData[4][1] + \"th\"\n            }\n        }\n    }\n    fill_bars(elem, d1_width, d2_width)\n}\n\nfunction toggle_racePace() {\n    let d1_width;\n    let d2_width;\n    let relValue\n    let elem = document.querySelector(\"#raceh2h\")\n    if (race === 1) {\n        elem.querySelector(\".only-name\").textContent = \"AVG PACE DIFF (s)\"\n        elem.querySelector(\".bar-space\").classList.add(\"d-none\")\n        elem.querySelector(\".avg-comparison\").classList.remove(\"d-none\")\n        let d1Num = elem.querySelector(\".avg-comparison\").querySelector(\".driver1-avg\")\n        d1Num.className = \"driver1-avg bold-font\"\n        let d2Num = elem.querySelector(\".avg-comparison\").querySelector(\".driver2-avg\")\n        d2Num.className = \"driver2-avg bold-font\"\n        let d1 = compData[10][0];\n        if (compData[10][0] > 0) {\n            d1 = \"+\" + compData[10][0]\n            d1Num.classList.add(\"negative\")\n            d2Num.classList.add(\"positive\")\n        }\n        d1Num.innerText = d1\n        let d2 = compData[10][1];\n        if (compData[10][1] > 0) {\n            d2 = \"+\" + compData[10][1]\n            d1Num.classList.add(\"positive\")\n            d2Num.classList.add(\"negative\")\n        }\n        d2Num.innerText = d2\n    }\n    else {\n        elem.querySelector(\".bar-space\").classList.remove(\"d-none\")\n        elem.querySelector(\".avg-comparison\").classList.add(\"d-none\")\n        if (race === 0) {\n            elem.querySelector(\".only-name\").textContent = \"RACE\"\n            relValue = (100 / (compData[0][0] + compData[0][1])).toFixed(2)\n            d1_width = compData[0][0] * relValue\n            d2_width = compData[0][1] * relValue\n            elem.querySelector(\".driver1-number\").textContent = compData[0][0]\n            elem.querySelector(\".driver2-number\").textContent = compData[0][1]\n        }\n        else if (race === 2) {\n            elem.querySelector(\".only-name\").textContent = \"AVG RACE\"\n            d1_width = 100 - (compData[12][0] - 1) * 5\n            d2_width = 100 - (compData[12][1] - 1) * 5\n            elem.querySelector(\".driver1-number\").textContent = compData[12][0]\n            elem.querySelector(\".driver2-number\").textContent = compData[12][1]\n        }\n        else if (race === 3) {\n            elem.querySelector(\".only-name\").textContent = \"MEDIAN RACE\"\n            d1_width = 100 - (compData[13][0] - 1) * 5\n            d2_width = 100 - (compData[13][1] - 1) * 5\n            elem.querySelector(\".driver1-number\").textContent = compData[13][0]\n            elem.querySelector(\".driver2-number\").textContent = compData[13][1]\n        }\n        else if (race === 4) {\n            elem.querySelector(\".only-name\").textContent = \"AVG GRID\"\n            d1_width = 100 - (compData[16][0] - 1) * 5\n            d2_width = 100 - (compData[16][1] - 1) * 5\n            elem.querySelector(\".driver1-number\").textContent = compData[16][0]\n            elem.querySelector(\".driver2-number\").textContent = compData[16][1]\n        }\n        else if (race === 5) {\n            elem.querySelector(\".only-name\").textContent = \"AVG POS GAIN\"\n            let maxGain = Math.max(Math.abs(compData[17][0]), Math.abs(compData[17][1]))\n            if (maxGain === 0) {\n                maxGain = 1\n            }\n            d1_width = (Math.abs(compData[17][0]) / maxGain) * 100\n            d2_width = (Math.abs(compData[17][1]) / maxGain) * 100\n            elem.querySelector(\".driver1-number\").textContent = formatSignedValue(compData[17][0])\n            elem.querySelector(\".driver2-number\").textContent = formatSignedValue(compData[17][1])\n        }\n        else if (race === 6) {\n            elem.querySelector(\".only-name\").textContent = \"TOP 10s\"\n            relValue = (100 / (compData[18][0] + compData[18][1])).toFixed(2)\n            if (relValue == Infinity) {\n                relValue = 0\n            }\n            d1_width = compData[18][0] * relValue\n            d2_width = compData[18][1] * relValue\n            elem.querySelector(\".driver1-number\").textContent = compData[18][0]\n            elem.querySelector(\".driver2-number\").textContent = compData[18][1]\n        }\n        fill_bars(elem, d1_width, d2_width)\n    }\n\n}\n\nfunction toggle_qualiPace() {\n    let elem = document.querySelector(\"#qualih2h\")\n    let d1_width;\n    let d2_width;\n    let relValue;\n    if (quali === 1) {\n        elem.querySelector(\".only-name\").textContent = \"AVG QUALI DIFF (s)\"\n        elem.querySelector(\".bar-space\").classList.add(\"d-none\")\n        elem.querySelector(\".avg-comparison\").classList.remove(\"d-none\")\n        let d1Num = elem.querySelector(\".avg-comparison\").querySelector(\".driver1-avg\")\n        d1Num.className = \"driver1-avg bold-font\"\n        let d2Num = elem.querySelector(\".avg-comparison\").querySelector(\".driver2-avg\")\n        d2Num.className = \"driver2-avg bold-font\"\n        let d1 = compData[11][0];\n        if (compData[11][0] > 0) {\n            d1 = \"+\" + compData[11][0]\n\n            d1Num.classList.add(\"negative\")\n            d2Num.classList.add(\"positive\")\n        }\n        d1Num.innerText = d1\n        let d2 = compData[11][1];\n        if (compData[11][1] > 0) {\n            d2 = \"+\" + compData[11][1]\n\n            d1Num.classList.add(\"positive\")\n            d2Num.classList.add(\"negative\")\n        }\n        d2Num.innerText = d2\n    }\n    else {\n        elem.querySelector(\".bar-space\").classList.remove(\"d-none\")\n        elem.querySelector(\".avg-comparison\").classList.add(\"d-none\")\n        if (quali === 0) {\n            elem.querySelector(\".only-name\").textContent = \"QUALIFYING\"\n            relValue = (100 / (compData[0][0] + compData[0][1])).toFixed(2)\n            d1_width = compData[1][0] * relValue\n            d2_width = compData[1][1] * relValue\n            elem.querySelector(\".driver1-number\").textContent = compData[1][0]\n            elem.querySelector(\".driver2-number\").textContent = compData[1][1]\n        }\n        else if (quali === 2) {\n            elem.querySelector(\".only-name\").textContent = \"AVG QUALI\"\n            d1_width = 100 - (compData[14][0] - 1) * 5\n            d2_width = 100 - (compData[14][1] - 1) * 5\n            elem.querySelector(\".driver1-number\").textContent = compData[14][0]\n            elem.querySelector(\".driver2-number\").textContent = compData[14][1]\n        }\n        else if (quali === 3) {\n            elem.querySelector(\".only-name\").textContent = \"MEDIAN QUALI\"\n            d1_width = 100 - (compData[15][0] - 1) * 5\n            d2_width = 100 - (compData[15][1] - 1) * 5\n            elem.querySelector(\".driver1-number\").textContent = compData[15][0]\n            elem.querySelector(\".driver2-number\").textContent = compData[15][1]\n        }\n        else if (quali === 4) {\n            elem.querySelector(\".only-name\").textContent = \"Q3 APPEARANCES\"\n            relValue = (100 / (compData[19][0] + compData[19][1])).toFixed(2)\n            if (relValue == Infinity) {\n                relValue = 0\n            }\n            d1_width = compData[19][0] * relValue\n            d2_width = compData[19][1] * relValue\n            elem.querySelector(\".driver1-number\").textContent = compData[19][0]\n            elem.querySelector(\".driver2-number\").textContent = compData[19][1]\n        }\n        else if (quali === 5) {\n            elem.querySelector(\".only-name\").textContent = \"FRONT ROWS\"\n            relValue = (100 / (compData[20][0] + compData[20][1])).toFixed(2)\n            if (relValue == Infinity) {\n                relValue = 0\n            }\n            d1_width = compData[20][0] * relValue\n            d2_width = compData[20][1] * relValue\n            elem.querySelector(\".driver1-number\").textContent = compData[20][0]\n            elem.querySelector(\".driver2-number\").textContent = compData[20][1]\n        }\n        fill_bars(elem, d1_width, d2_width)\n    }\n}\n\n/**\n * Adds listeners for the arrows to change between sprints and races\n */\nexport function sprintsListeners() {\n    document.querySelector(\"#bestrh2h\").querySelectorAll(\"i\").forEach(function (elem) {\n        elem.removeEventListener('evento2', change_sprintView);\n        elem.addEventListener(\"click\", change_sprintView)\n    })\n}\n\n/**\n * listeners to the race head to head comparison\n */\nexport function racePaceListener() {\n    document.querySelector(\"#raceh2h\").querySelectorAll(\".bi-chevron-right\").forEach(function (elem) {\n        elem.removeEventListener('evento5', increase_racePaceView);\n        elem.addEventListener(\"click\", increase_racePaceView)\n    })\n    document.querySelector(\"#raceh2h\").querySelectorAll(\".bi-chevron-left\").forEach(function (elem) {\n        elem.removeEventListener('evento6', decrease_racePaceView);\n        elem.addEventListener(\"click\", decrease_racePaceView)\n    })\n}\n\n/**\n * listeners to the qualifying head to head comparison\n */\nexport function qualiPaceListener() {\n    document.querySelector(\"#qualih2h\").querySelectorAll(\".bi-chevron-right\").forEach(function (elem) {\n        elem.removeEventListener('evento3', increase_qualiPaceView);\n        elem.addEventListener(\"click\", increase_qualiPaceView)\n    })\n    document.querySelector(\"#qualih2h\").querySelectorAll(\".bi-chevron-left\").forEach(function (elem) {\n        elem.removeEventListener('evento4', decrease_qualiPaceView);\n        elem.addEventListener(\"click\", decrease_qualiPaceView)\n    })\n}\n\n\n/**\n * increases the race comparison showed\n */\nfunction increase_racePaceView() {\n    race += 1\n    race = race % raceMenuLength\n    toggle_racePace()\n}\n\n/**\n * decreases the race comparison showed\n */\nfunction decrease_racePaceView() {\n    race -= 1\n    race = (race + raceMenuLength) % raceMenuLength\n    toggle_racePace()\n}\n\n/**\n * increases the quali comparison showed\n */\nfunction increase_qualiPaceView() {\n    quali += 1\n    quali = quali % qualiMenuLength\n    toggle_qualiPace()\n}\n\n/**\n * decreases the quali comparison showed\n */\nfunction decrease_qualiPaceView() {\n    quali -= 1\n    quali = (quali + qualiMenuLength) % qualiMenuLength\n    toggle_qualiPace()\n}\n\n\n\n\n/**\n * Changes the sprint view\n */\nfunction change_sprintView() {\n    sprints = !sprints\n    toggle_sprints()\n}\n\n/**\n * Event listener for the annotatiosn switch\n */\ndocument.getElementById(\"annotationsToggle\").addEventListener(\"click\", function () {\n    annotationsToggle = !annotationsToggle\n    if (typeof driverGraph !== 'undefined' && driverGraph !== null) {\n        driverGraph.options.plugins.annotation.annotations.line1.display = annotationsToggle\n        driverGraph.options.plugins.annotation.annotations.line2.display = annotationsToggle\n        driverGraph.options.plugins.annotation.annotations.line3.display = annotationsToggle\n        driverGraph.options.plugins.annotation.annotations.line4.display = annotationsToggle\n        driverGraph.update();\n    }\n    if (typeof qualiGraph !== 'undefined' && qualiGraph !== null) {\n        qualiGraph.options.plugins.annotation.annotations.line1.display = annotationsToggle\n        qualiGraph.options.plugins.annotation.annotations.line2.display = annotationsToggle\n        qualiGraph.update();\n    }\n\n})\n\n/**\n * hides the comparison\n */\nexport function hideComp() {\n    document.querySelector(\".drivers-modal-zone\").innerHTML = \"\"\n    document.querySelector(\"#mainH2h\").classList.add(\"d-none\")\n    document.querySelectorAll(\".modal-team\").forEach(function (elem) {\n        elem.classList.add(\"d-none\")\n    })\n}\n\nexport function queueAutoCompareDrivers(driver1Id, driver2Id) {\n    const d1 = String(driver1Id);\n    const d2 = String(driver2Id);\n    if (!d1 || !d2 || d1 === \"undefined\" || d2 === \"undefined\" || d1 === d2) return;\n    queuedAutoCompareDrivers = { d1, d2 };\n}\n\nfunction applyQueuedAutoCompareDrivers() {\n    if (!queuedAutoCompareDrivers) return;\n    if (mode !== \"driver\") return;\n\n    const zone = document.querySelector(\".drivers-modal-zone\");\n    if (!zone) return;\n\n    const { d1, d2 } = queuedAutoCompareDrivers;\n    const d1El = zone.querySelector(`.modal-driver[data-driverid=\"${d1}\"]`);\n    const d2El = zone.querySelector(`.modal-driver[data-driverid=\"${d2}\"]`);\n    if (!d1El || !d2El) return;\n\n    queuedAutoCompareDrivers = null;\n\n    const selectDriver = (el) => {\n        const h2hBtn = el.querySelector(\".H2Hradio\");\n        if (h2hBtn && h2hBtn.dataset.state !== \"checked\") h2hBtn.click();\n        const graphBtn = el.querySelector(\".GraphButton\");\n        if (graphBtn && graphBtn.dataset.state !== \"checked\") graphBtn.click();\n    };\n\n    selectDriver(d1El);\n    selectDriver(d2El);\n\n    const confirm = document.getElementById(\"confirmComparison\");\n    if (confirm) confirm.click();\n}\n\n/**\n * Loads all the drivers into the menus of driver selection\n * @param {Object} drivers object with all the driver info\n */\nexport function load_drivers_h2h(drivers) {\n    let dest = document.querySelector(\".drivers-modal-zone\")\n    h2hCount = 0;\n    h2hList = []\n    graphList = []\n    h2hTeamList = []\n    graphTeamList = []\n    dest.innerHTML = \"\"\n    drivers.forEach(function (driver) {\n        let newDiv = document.createElement(\"div\");\n        newDiv.className = \"col modal-driver\";\n        newDiv.dataset.driverid = driver[1];\n        newDiv.dataset.teamid = driver[2];\n        let name = driver[0].split(\" \")\n        let spanName = document.createElement(\"span\")\n        let spanLastName = document.createElement(\"span\")\n        spanLastName.dataset.teamid = driver[2];\n        newDiv.dataset.teamid = driver[2];\n        newDiv.classList.add(team_dict[driver[2]] + \"-transparent\")\n        format_name(driver[0], name, spanName, spanLastName)\n        spanLastName.classList.add(\"bold-font\")\n        let h2hBut = document.createElement(\"div\")\n        h2hBut.dataset.driverid = driver[1]\n        h2hBut.dataset.teamid = driver[2]\n        let h2hLabel = document.createElement(\"div\")\n        h2hLabel.innerText = \"H2H\"\n        h2hLabel.className = \"no-pointer pos-relative\"\n        h2hBut.appendChild(h2hLabel)\n        h2hBut.className = \"H2Hradio\"\n        h2hBut.dataset.state = \"unchecked\"\n        h2hBut.addEventListener(\"click\", function () {\n            if (h2hBut.dataset.state === \"unchecked\" && h2hCount < 2) {\n                h2hBut.dataset.state = \"checked\"\n                h2hBut.classList.add(\"activated\")\n                h2hCount += 1\n                h2hList.push(h2hBut.dataset.driverid)\n                h2hTeamList.push(h2hBut.dataset.teamid)\n            }\n            else if (h2hBut.dataset.state === \"checked\") {\n                h2hBut.dataset.state = \"unchecked\"\n                h2hBut.classList.remove(\"activated\")\n                h2hCount -= 1\n                let ind = h2hList.indexOf(h2hBut.dataset.driverid)\n                h2hTeamList.splice(ind, 1)\n                h2hList = h2hList.filter(x => x !== h2hBut.dataset.driverid)\n            }\n            let text = document.querySelector(\".H2H-text\").querySelector(\".text-normal\")\n            text.innerText = \"- \" + h2hCount + \"/2 drivers selected\"\n            text.classList.add(\"h2h-highlight\");\n            setTimeout(function () {\n                text.classList.remove(\"h2h-highlight\");\n            }, 400);\n        })\n        let graphBut = document.createElement(\"div\")\n        let graphIcon = document.createElement(\"i\")\n        graphBut.dataset.driverid = driver[1]\n        graphBut.dataset.teamid = driver[2]\n        graphIcon.className = \"bi bi-graph-up no-pointer pos-relative \"\n        graphBut.appendChild(graphIcon)\n        graphBut.className = \"GraphButton\"\n        graphBut.dataset.state = \"unchecked\"\n        graphBut.addEventListener(\"click\", function () {\n            if (graphBut.dataset.state === \"unchecked\") {\n                graphBut.dataset.state = \"checked\"\n                graphBut.classList.add(\"activated\")\n                graphList.push(graphBut.dataset.driverid)\n                graphTeamList.push(graphBut.dataset.teamid)\n                graphCount += 1\n            }\n            else if (graphBut.dataset.state === \"checked\") {\n                graphBut.dataset.state = \"unchecked\"\n                graphBut.classList.remove(\"activated\")\n                let ind = graphList.indexOf(graphBut.dataset.driverid)\n                graphTeamList.splice(ind, 1)\n                graphList = graphList.filter(x => x !== graphBut.dataset.driverid)\n                graphCount -= 1\n            }\n            let text = document.querySelector(\".graph-text\").querySelector(\".text-normal\")\n            text.innerText = \"- \" + graphCount + \" drivers selected\"\n            text.classList.add(\"graph-highlight\");\n            setTimeout(function () {\n                text.classList.remove(\"graph-highlight\");\n            }, 400);\n        })\n\n        let buttons = document.createElement(\"div\")\n        buttons.classList = \"buttons-drivers-modal\"\n        let nameAndSurName = document.createElement(\"div\")\n        nameAndSurName.appendChild(spanName)\n        nameAndSurName.appendChild(spanLastName)\n        buttons.appendChild(h2hBut)\n        buttons.append(graphBut)\n        newDiv.appendChild(nameAndSurName)\n        newDiv.appendChild(buttons)\n        manageColor(newDiv, spanLastName)\n        dest.appendChild(newDiv)\n    });\n    buttonsListeners()\n\n    applyQueuedAutoCompareDrivers()\n\n\n\n}\n\ndocument.querySelector(\".teams-modal-zone\").querySelectorAll(\".H2Hradio\").forEach(function (h2hBut) {\n    h2hBut.addEventListener(\"click\", function () {\n        if (h2hBut.dataset.state === \"unchecked\" && h2hCount < 2) {\n            h2hBut.dataset.state = \"checked\"\n            h2hBut.classList.add(\"activated\")\n            h2hCount += 1\n            h2hTeamList.push(h2hBut.dataset.teamid)\n        }\n        else if (h2hBut.dataset.state === \"checked\") {\n            h2hBut.dataset.state = \"unchecked\"\n            h2hBut.classList.remove(\"activated\")\n            h2hCount -= 1\n            let ind = h2hTeamList.indexOf(h2hBut.dataset.teamid)\n            h2hTeamList.splice(ind, 1)\n        }\n        let text = document.querySelector(\".H2H-text\").querySelector(\".text-normal\")\n        text.innerText = \"- \" + h2hCount + \"/2 teams selected\"\n        text.classList.add(\"h2h-highlight\");\n        setTimeout(function () {\n            text.classList.remove(\"h2h-highlight\");\n        }, 400);\n    })\n})\n\ndocument.querySelector(\".teams-modal-zone\").querySelectorAll(\".GraphButton\").forEach(function (graphBut) {\n    graphBut.addEventListener(\"click\", function () {\n        if (graphBut.dataset.state === \"unchecked\") {\n            graphBut.dataset.state = \"checked\"\n            graphBut.classList.add(\"activated\")\n            graphTeamList.push(graphBut.dataset.teamid)\n            graphCount += 1\n        }\n        else if (graphBut.dataset.state === \"checked\") {\n            graphBut.dataset.state = \"unchecked\"\n            graphBut.classList.remove(\"activated\")\n            let ind = graphTeamList.indexOf(graphBut.dataset.teamid)\n            graphTeamList.splice(ind, 1)\n            graphCount -= 1\n        }\n        let text = document.querySelector(\".graph-text\").querySelector(\".text-normal\")\n        text.innerText = \"- \" + graphCount + \" teams selected\"\n        text.classList.add(\"graph-highlight\");\n        setTimeout(function () {\n            text.classList.remove(\"graph-highlight\");\n        }, 400);\n    })\n})\n\ndocument.querySelector(\"#driverspillmodal\").addEventListener(\"click\", function () {\n    document.querySelector(\".drivers-modal-section\").classList.remove(\"d-none\")\n    document.querySelector(\".teams-modal-section\").classList.add(\"d-none\")\n    mode = \"driver\"\n\n    resetH2H()\n})\n\ndocument.querySelector(\"#teamspillmodal\").addEventListener(\"click\", function () {\n    document.querySelector(\".drivers-modal-section\").classList.add(\"d-none\")\n    document.querySelector(\".teams-modal-section\").classList.remove(\"d-none\")\n    mode = \"team\"\n    resetH2H()\n})\n\n\nfunction buttonsListeners() {\n    document.querySelectorAll(\"H2HRadio\").forEach(function (button) {\n        button.addEventListener(\"click\", function () {\n\n        })\n    })\n}\n\ndocument.querySelector(\"#confirmComparison\").addEventListener(\"click\", function () {\n    H2HReady()\n    if (h2hCount === 2) {\n        let drivers = document.querySelectorAll(\".H2Hradio.activated\")\n        let d1\n        let d2\n        document.querySelectorAll(\".H2Hradio.activated\").forEach(function (elem) {\n            if (mode === \"driver\") {\n                if (elem.dataset.driverid === h2hList[0]) {\n                    d1 = elem;\n                }\n                else if (elem.dataset.driverid === h2hList[1]) {\n                    d2 = elem\n                }\n            }\n            else if (mode === \"team\") {\n                if (elem.dataset.teamid === h2hTeamList[0]) {\n                    d1 = elem;\n                }\n                else if (elem.dataset.teamid === h2hTeamList[1]) {\n                    d2 = elem\n                }\n            }\n\n        })\n        nameTitleD1(d1.parentElement.parentElement)\n        nameTitleD2(d2.parentElement.parentElement)\n    }\n    document.querySelector(\"#compConfigContent\").innerText = document.querySelector(\"#yearButtonH2H\").textContent\n    if (mode === \"driver\") {\n        document.querySelector(\"#qualiForm\").classList.remove(\"d-none\")\n        document.querySelector(\"#raceForm\").classList.remove(\"d-none\")\n        document.querySelector(\"#gapToWinner\").classList.remove(\"d-none\")\n        document.querySelector(\"#gapToPole\").classList.remove(\"d-none\")\n        document.querySelector(\"#raceForm\").click()\n        race = 0\n        quali = 0\n        document.getElementById(\"qualih2h\").querySelector(\".only-name\").innerText = \"QUALIFYING\"\n        document.getElementById(\"raceh2h\").querySelector(\".only-name\").innerText = \"RACE\"\n        document.getElementById(\"raceh2h\").querySelector(\".bar-space\").classList.remove(\"d-none\")\n        document.getElementById(\"raceh2h\").querySelector(\".avg-comparison\").classList.add(\"d-none\")\n        document.getElementById(\"qualih2h\").querySelector(\".bar-space\").classList.remove(\"d-none\")\n        document.getElementById(\"qualih2h\").querySelector(\".avg-comparison\").classList.add(\"d-none\")\n    }\n    else if (mode === \"team\") {\n        document.querySelector(\"#qualiForm\").classList.add(\"d-none\")\n        document.querySelector(\"#raceForm\").classList.add(\"d-none\")\n        document.querySelector(\"#gapToWinner\").classList.add(\"d-none\")\n        document.querySelector(\"#gapToPole\").classList.add(\"d-none\")\n        document.querySelector(\"#pointsProgression\").click()\n        race = 0\n        quali = 0\n        document.getElementById(\"qualih2h\").querySelector(\".only-name\").innerText = \"QUALIFYING\"\n        document.getElementById(\"raceh2h\").querySelector(\".only-name\").innerText = \"RACE\"\n        document.getElementById(\"raceh2h\").querySelector(\".bar-space\").classList.remove(\"d-none\")\n        document.getElementById(\"raceh2h\").querySelector(\".avg-comparison\").classList.add(\"d-none\")\n        document.getElementById(\"qualih2h\").querySelector(\".bar-space\").classList.remove(\"d-none\")\n        document.getElementById(\"qualih2h\").querySelector(\".avg-comparison\").classList.add(\"d-none\")\n    }\n\n})\n\ndocument.querySelector(\"#clearAll\").addEventListener(\"click\", function () {\n    resetH2H()\n})\n\nexport function resetH2H() {\n    h2hCount = 0;\n    graphCount = 0;\n    h2hList = []\n    graphList = []\n    h2hTeamList = []\n    graphTeamList = []\n    let h2htext = document.querySelector(\".H2H-text\").querySelector(\".text-normal\")\n    let graphtext = document.querySelector(\".graph-text\").querySelector(\".text-normal\")\n    if (mode === \"driver\") {\n        h2htext.innerText = \"- \" + h2hCount + \"/2 drivers selected\"\n        graphtext.innerText = \"- \" + graphCount + \" drivers selected\"\n    }\n    else if (mode === \"team\") {\n        h2htext.innerText = \"- \" + h2hCount + \"/2 teams selected\"\n        graphtext.innerText = \"- \" + graphCount + \" teams selected\"\n    }\n    document.querySelector(\".teams-modal-zone\").querySelectorAll(\".H2Hradio\").forEach(function (elem) {\n        elem.classList = \"H2Hradio\"\n        elem.dataset.state = \"unchecked\"\n    })\n    document.querySelector(\".teams-modal-zone\").querySelectorAll(\".GraphButton\").forEach(function (elem) {\n        elem.classList = \"GraphButton\"\n        elem.dataset.state = \"unchecked\"\n    })\n    document.querySelector(\".drivers-modal-zone\").querySelectorAll(\".H2Hradio\").forEach(function (elem) {\n        elem.classList = \"H2Hradio\"\n        elem.dataset.state = \"unchecked\"\n    })\n    document.querySelector(\".drivers-modal-zone\").querySelectorAll(\".GraphButton\").forEach(function (elem) {\n        elem.classList = \"GraphButton\"\n        elem.dataset.state = \"unchecked\"\n    })\n}\n\n/**\n * Event listeners for the 3 types of graphs\n */\ndocument.querySelector(\"#pointsProgression\").addEventListener(\"click\", function (elem) {\n    document.querySelector(\"#graphTypeButton span\").innerText = \"Points progression\"\n    document.querySelector(\"#qualiGraph\").classList.add(\"d-none\")\n    document.querySelector(\"#driverGraph\").classList.add(\"d-none\")\n    document.querySelector(\"#progressionGraph\").classList.remove(\"d-none\")\n    document.querySelector(\"#gapToWinnerGraph\").classList.add(\"d-none\")\n    document.querySelector(\"#gapToPoleGraph\").classList.add(\"d-none\")\n})\n\ndocument.querySelector(\"#raceForm\").addEventListener(\"click\", function (elem) {\n    document.querySelector(\"#graphTypeButton span\").innerText = \"Race form\"\n    document.querySelector(\"#qualiGraph\").classList.add(\"d-none\")\n    document.querySelector(\"#driverGraph\").classList.remove(\"d-none\")\n    document.querySelector(\"#progressionGraph\").classList.add(\"d-none\")\n    document.querySelector(\"#gapToWinnerGraph\").classList.add(\"d-none\")\n    document.querySelector(\"#gapToPoleGraph\").classList.add(\"d-none\")\n})\n\ndocument.querySelector(\"#qualiForm\").addEventListener(\"click\", function (elem) {\n    document.querySelector(\"#graphTypeButton span\").innerText = \"Qualifying form\"\n    document.querySelector(\"#qualiGraph\").classList.remove(\"d-none\")\n    document.querySelector(\"#driverGraph\").classList.add(\"d-none\")\n    document.querySelector(\"#progressionGraph\").classList.add(\"d-none\")\n    document.querySelector(\"#gapToWinnerGraph\").classList.add(\"d-none\")\n    document.querySelector(\"#gapToPoleGraph\").classList.add(\"d-none\")\n})\n\ndocument.querySelector(\"#gapToWinner\").addEventListener(\"click\", function (elem) {\n    document.querySelector(\"#graphTypeButton span\").innerText = \"Gap to winner\"\n    document.querySelector(\"#qualiGraph\").classList.add(\"d-none\")\n    document.querySelector(\"#driverGraph\").classList.add(\"d-none\")\n    document.querySelector(\"#progressionGraph\").classList.add(\"d-none\")\n    document.querySelector(\"#gapToWinnerGraph\").classList.remove(\"d-none\")\n    document.querySelector(\"#gapToPoleGraph\").classList.add(\"d-none\")\n\n})\n\ndocument.querySelector(\"#gapToPole\").addEventListener(\"click\", function (elem) {\n    document.querySelector(\"#graphTypeButton span\").innerText = \"Gap to pole\"\n    document.querySelector(\"#qualiGraph\").classList.add(\"d-none\")\n    document.querySelector(\"#driverGraph\").classList.add(\"d-none\")\n    document.querySelector(\"#progressionGraph\").classList.add(\"d-none\")\n    document.querySelector(\"#gapToWinnerGraph\").classList.add(\"d-none\")\n    document.querySelector(\"#gapToPoleGraph\").classList.remove(\"d-none\")\n\n})\n\n\n/**\n * Updates the driver 1 name card with the d1 information stored in aDriver1\n * @param {a} aDriver1 clickable element of the driver 1 dropdown\n */\nfunction nameTitleD1(aDriver1) {\n    driver1Sel = aDriver1\n    if (mode === \"driver\") {\n        document.querySelector(\".driver1-first\").classList.remove(\"d-none\")\n        document.querySelector(\".driver1-second\").classList.remove(\"d-none\")\n        document.querySelector(\".team1\").classList.add(\"d-none\")\n        document.querySelector(\".driver1-first\").textContent = driver1Sel.firstChild.children[0].innerText\n        document.querySelector(\".driver1-second\").textContent = driver1Sel.firstChild.children[1].innerText\n        document.querySelector(\".driver1-second\").dataset.teamid = driver1Sel.firstChild.children[1].dataset.teamid\n        d1_team = driver1Sel.firstChild.children[1].dataset.teamid\n        document.querySelector(\".driver1-second\").className = \"driver1-second bold-font\"\n        manageColor(document.querySelector(\".driver1-second\"), document.querySelector(\".driver1-second\"))\n    }\n    else if (mode === \"team\") {\n        document.querySelector(\".driver1-first\").classList.add(\"d-none\")\n        document.querySelector(\".driver1-second\").classList.add(\"d-none\")\n        document.querySelector(\".team1\").classList.remove(\"d-none\")\n        const teamId = Number(driver1Sel.dataset.teamid)\n        document.querySelector(\".team1\").dataset.teamid = teamId\n        renderTeamLogo(document.querySelector(\".team1\"), teamId)\n    }\n\n}\n\n/**\n * Updates the driver 2 name card with the d1 information stored in aDriver2\n * @param {a} aDriver2 clickable element of the driver 2 dropdown\n */\nfunction nameTitleD2(aDriver2) {\n    driver2Sel = aDriver2\n    if (mode === \"driver\") {\n        document.querySelector(\".driver2-first\").classList.remove(\"d-none\")\n        document.querySelector(\".driver2-second\").classList.remove(\"d-none\")\n        document.querySelector(\".team2\").classList.add(\"d-none\")\n        document.querySelector(\".driver2-first\").textContent = driver2Sel.firstChild.children[0].innerText\n        document.querySelector(\".driver2-second\").textContent = driver2Sel.firstChild.children[1].innerText\n        document.querySelector(\".driver2-second\").dataset.teamid = driver2Sel.firstChild.children[1].dataset.teamid\n        document.querySelector(\".driver2-second\").className = \"driver2-second bold-font\"\n\n        d2_team = driver2Sel.firstChild.children[1].dataset.teamid\n        manageColor(document.querySelector(\".driver2-second\"), document.querySelector(\".driver2-second\"))\n    }\n    else if (mode === \"team\") {\n        document.querySelector(\".driver2-first\").classList.add(\"d-none\")\n        document.querySelector(\".driver2-second\").classList.add(\"d-none\")\n        document.querySelector(\".team2\").classList.remove(\"d-none\")\n        const teamId = Number(driver2Sel.dataset.teamid)\n        document.querySelector(\".team2\").dataset.teamid = teamId\n        renderTeamLogo(document.querySelector(\".team2\"), teamId)\n    }\n}\n\n/**\n * Sends the message that the H2H is properly configured to fetch results\n */\nfunction H2HReady() {\n    document.querySelector(\"#mainH2h\").classList.remove(\"d-none\")\n    let list1, list2;\n    if (mode === \"driver\") {\n        list1 = h2hList\n        list2 = graphList\n    }\n    else if (mode === \"team\") {\n        list1 = h2hTeamList\n        list2 = graphTeamList\n    }\n\n\n    let isCurrentYear = false\n    if (document.querySelector(\"#yearMenuH2H\").firstChild.textContent === document.querySelector(\"#yearButtonH2H\").textContent) {\n        isCurrentYear = true\n    }\n\n    let data = {\n        h2h: h2hCount === 2 ? list1 : -1,\n        graph: list2,\n        year: document.querySelector(\"#yearButtonH2H\").textContent,\n        mode: mode,\n        isCurrentYear: isCurrentYear\n    }\n\n\n    manageH2hState()\n    const command = new Command(\"configuredH2H\", data);\n    command.execute();\n}\n\n\nfunction manageH2hState() {\n    if (h2hCount === 2) {\n        document.querySelector(\".blocking-h2h\").classList.add(\"d-none\")\n    }\n    else {\n        document.querySelector(\".blocking-h2h\").classList.remove(\"d-none\")\n        document.querySelector(\".driver1-name\").className = \"driver1-name\"\n        document.querySelector(\".driver2-name\").className = \"driver2-name\"\n        document.querySelector(\".driver1-first\").textContent = \"\"\n        document.querySelector(\".driver2-first\").textContent = \"\"\n        document.querySelector(\".driver1-second\").textContent = \"\"\n        document.querySelector(\".driver2-second\").textContent = \"\"\n        document.querySelectorAll(\".driver1-bar\").forEach(function (bar) {\n            bar.className = \"driver1-bar\"\n            bar.style.width = \"0px\"\n        })\n        document.querySelectorAll(\".driver2-bar\").forEach(function (bar) {\n            bar.className = \"driver2-bar\"\n            bar.style.width = \"0px\"\n        })\n        document.querySelectorAll(\".driver1-number\").forEach(function (num) {\n            num.innerText = \"\"\n        })\n        document.querySelectorAll(\".driver2-number\").forEach(function (num) {\n            num.innerText = \"\"\n        })\n    }\n}\n\nexport function load_labels_initialize_graphs(data) {\n    h2hData = data\n    var labels = [];\n    data[0].forEach(function (elem) {\n        labels.push(races_names[elem[1]])\n    })\n    if (typeof driverGraph !== 'undefined' && driverGraph !== null) {\n        driverGraph.destroy();\n    }\n    if (typeof pointsGraph !== 'undefined' && pointsGraph !== null) {\n        pointsGraph.destroy();\n    }\n    if (typeof qualiGraph !== 'undefined' && qualiGraph !== null) {\n        qualiGraph.destroy();\n    }\n    if (typeof gapWinnerGraph !== 'undefined' && gapWinnerGraph !== null) {\n        gapWinnerGraph.destroy();\n    }\n    if (typeof gapPoleGraph !== 'undefined' && gapPoleGraph !== null) {\n        gapPoleGraph.destroy();\n    }\n    createPointsChart(labels)\n    if (mode === \"driver\") {\n        let max = 20\n        let q2_line = 15\n        if (game_version === 2024 && custom_team) {\n            max = 22\n            q2_line = 16\n        }\n        else {\n            max = 20\n        }\n        createRaceChart(labels, max)\n        createQualiChart(labels, max, q2_line)\n        createGapCharts(labels)\n        load_graphs_data(data)\n\n    }\n    else if (mode === \"team\") {\n        load_teams_points_graph(data)\n    }\n\n}\n\nexport function reload_h2h_graphs() {\n    if (typeof qualiGraph !== 'undefined' && qualiGraph !== null) {\n        qualiGraph.destroy()\n    }\n    if (typeof driverGraph !== 'undefined' && driverGraph !== null) {\n        driverGraph.destroy()\n    }\n    if (typeof pointsGraph !== 'undefined' && pointsGraph !== null) {\n        pointsGraph.destroy()\n    }\n    if (typeof gapWinnerGraph !== 'undefined' && gapWinnerGraph !== null) {\n        gapWinnerGraph.destroy()\n    }\n    if (typeof gapPoleGraph !== 'undefined' && gapPoleGraph !== null) {\n        gapPoleGraph.destroy()\n    }\n    if (h2hData) {\n        load_labels_initialize_graphs(h2hData)\n\n    }\n}\n\nfunction load_teams_points_graph(data) {\n    data.forEach(function (team, ind) {\n        if (ind !== 0 && ind !== data.length - 1) {\n            let teamPoints = [];\n            team.forEach(function (driv, index) {\n                let points = get_one_driver_points_format(driv, data)\n                if (teamPoints.length === 0) {\n                    teamPoints = [...points];\n                } else {\n                    teamPoints = teamPoints.map((point, index) => {\n                        const pointA = point;\n                        const pointB = points[index];\n                        if (pointA == null && pointB == null) {\n                            return null;\n                        }\n                        return (pointA ?? 0) + (pointB ?? 0);\n                    });\n                }\n\n            })\n\n            let team_color = colors_dict[graphTeamList[ind - 1] + \"0\"]\n            pointsGraph.data.datasets.push({\n                label: combined_dict[graphTeamList[ind - 1]],\n                data: teamPoints,\n                borderColor: team_color,\n                pointBackgroundColor: team_color,\n                borderWidth: 2,\n                pointRadius: 0,\n                pointHoverRadius: 4,\n                fill: false,\n                spanGaps: false,\n                pointHitRadius: 7,\n                datalabels: {\n                    color: function () {\n                        if (lightColors.indexOf(team_color) !== -1) {\n                            return \"#272727\"\n                        }\n                        else {\n                            return '#eeeef1'\n                        }\n                    },\n                    backgroundColor: team_color,\n                    display: function (context) {\n                        if (context.dataIndex === findLastNonNaNIndex(context.dataset.data)) {\n                            return true;\n                        } else {\n                            return false;\n                        }\n                    },\n                    borderRadius: 5,\n                    font: {\n                        family: \"Formula1Bold\"\n                    }\n\n                },\n            })\n\n        }\n    })\n    pointsGraph.update()\n}\n\nfunction get_one_driver_points_format(driver, data) {\n    const completedRaceIds = getCompletedRaceIdsSet(data);\n    const pointsByRaceId = new Map();\n    let d1_points = [0]\n\n    driver[\"races\"].forEach(function (elem) {\n        const raceId = Number(elem[\"raceId\"]);\n        let ptsThatRace = Number(elem[\"points\"]);\n        if (Number.isNaN(ptsThatRace) || ptsThatRace < 0) {\n            ptsThatRace = 0;\n        }\n        const qualiPts = Number(elem[\"qualifyingPoints\"]);\n        const qPts = (!Number.isNaN(qualiPts) && qualiPts > 0) ? qualiPts : 0;\n        const sprintPts = Number(elem[\"sprintPoints\"]);\n        const sPts = (elem[\"sprintPoints\"] != null && !Number.isNaN(sprintPts) && sprintPts >= 0) ? sprintPts : 0;\n        pointsByRaceId.set(raceId, ptsThatRace + qPts + sPts);\n    })\n    data[0].forEach(function (elem) {\n        const raceId = Number(elem[0]);\n        const raceCompleted = completedRaceIds.has(raceId);\n        if (!raceCompleted) {\n            d1_points.push(null);\n            return;\n        }\n        if (pointsByRaceId.has(raceId)) {\n            d1_points.push(pointsByRaceId.get(raceId) + d1_points[d1_points.length - 1])\n        }\n        else {\n            d1_points.push(d1_points[d1_points.length - 1])\n        }\n\n    })\n    d1_points.shift()\n\n    return d1_points\n\n}\n\nfunction load_graphs_data(drivers) {\n    let max_gapPole = 0;\n    let max_gapWinner = 0;\n    const races_ids = drivers[0].map(r => r[0]); // array de raceId en orden\n    const races_done = drivers[drivers.length - 1]; // array de raceId ya corridas\n    const racesDoneSet = new Set(Array.isArray(races_done) ? races_done.map((raceId) => Number(raceId)) : []);\n\n    // drivers: array de objetos de piloto (NO metas pairTeamPos/pointsInfo aquí)\n    drivers.forEach(function (driv, index) {\n        // saltamos índices de “cabecera” si antes los tenías; ahora no hace falta,\n        // pero mantengo la condición por seguridad si llamas igual que antes\n        if (index !== 0 && index !== drivers.length - 1) {\n            // buffers\n            let d1_res = [];\n            let d1_races = [];\n            let d1_provisonal = [];\n            let d1_points_provisional = [];\n            let d1_points = [0];\n\n            let d1_qualis = [];\n            let d1_provisonal_q = [];\n\n            let d1_provisional_gapW = [];\n            let d1_provisional_gapP = [];\n            let d1_gapWinner = [];\n            let d1_gapPole = [];\n\n            let d1_backgroundColors = [];\n            let d1_backgroundColorsPole = [];\n\n            // --- construir arrays base a partir de driv.races ---\n            const races = Array.isArray(driv.races) ? driv.races : [];\n\n            races.forEach(function (r) {\n                // raceId / orden\n                d1_races.push(Number(r.raceId));\n\n                // posiciones carrera / quali\n                d1_provisonal.push(Number(r.finishingPos));\n                d1_provisonal_q.push(Number(r.qualifyingPos));\n\n                // gaps (se guardan como string \"(.xxx)\" o \"NR\"/\"...L\"; respetamos tu formato)\n                const gw = r.gapToWinner;\n                if (typeof gw === \"string\") {\n                    if (gw.slice(-1) !== \"L\") {\n                        // \"(0.123)\" → \"0.123\"\n                        d1_provisional_gapW.push(gw.slice(1, -1));\n                    } else {\n                        d1_provisional_gapW.push(gw); // \"…L\" → lo marcas como NaN luego\n                    }\n                } else if (gw == null) {\n                    d1_provisional_gapW.push(\"NR\");\n                } else {\n                    d1_provisional_gapW.push(String(gw));\n                }\n\n                const gp = r.gapToPole;\n                if (gp === \"NR\") {\n                    d1_provisional_gapP.push(\"NR\");\n                } else if (typeof gp === \"string\") {\n                    d1_provisional_gapP.push(gp.slice(1, -1)); // \"(0.123)\" → \"0.123\"\n                } else if (gp == null) {\n                    d1_provisional_gapP.push(\"NR\");\n                } else {\n                    d1_provisional_gapP.push(String(gp));\n                }\n\n                // puntos de esa carrera (+ sprint si existe y no es -1)\n                let ptsThatRace = Number(r.points);\n                if (ptsThatRace === -1) ptsThatRace = 0;\n\n                const qualiPts = Number(r.qualifyingPoints);\n                const qPts = (qualiPts > 0) ? qualiPts : 0;\n\n                const sprintPts = (r.sprintPoints != null && r.sprintPoints !== -1)\n                    ? Number(r.sprintPoints) : 0;\n\n                d1_points_provisional.push(ptsThatRace + qPts + sprintPts);\n            });\n\n            // --- color del piloto ---\n            const d1Id = graphList[index - 1];\n            const d1pos = graphList.indexOf(d1Id);\n            let d1_color;\n            if (d1pos === graphTeamList.indexOf(String(driv.latestTeamId))) {\n                d1_color = colors_dict[driv.latestTeamId + \"0\"];\n            } else {\n                d1_color = colors_dict[driv.latestTeamId + \"1\"];\n            }\n\n            races_ids.forEach(function (ridRaw) {\n                const rid = Number(ridRaw);\n                const idx = d1_races.indexOf(rid);\n                const raceCompleted = racesDoneSet.has(rid);\n\n                if (idx !== -1 && raceCompleted) {\n                    // resultado carrera\n                    if (d1_provisonal[idx] === -1) {\n                        d1_res.push(null);\n                        d1_gapWinner.push(null);\n                        d1_backgroundColors.push(d1_color + \"50\");\n                    } else {\n                        d1_res.push(d1_provisonal[idx]);\n\n                        // gap winner\n                        const gwRaw = d1_provisional_gapW[idx];\n                        if (typeof gwRaw === \"string\" && gwRaw.slice(-1) === \"L\") {\n                            d1_gapWinner.push(null);\n                            d1_backgroundColors.push(d1_color + \"76\");\n                        } else {\n                            const gw = parseFloat(gwRaw);\n                            d1_gapWinner.push(gw);\n                            if (gw > max_gapWinner) max_gapWinner = gw;\n                            d1_backgroundColors.push(d1_color);\n                        }\n                    }\n\n                    // puntos acumulados\n                    d1_points.push(d1_points_provisional[idx] + d1_points[d1_points.length - 1]);\n\n                    // quali\n                    d1_qualis.push(d1_provisonal_q[idx]);\n\n                    // gap pole\n                    const gpRaw = d1_provisional_gapP[idx];\n                    if (gpRaw === \"NR\") {\n                        d1_gapPole.push(null);\n                        d1_backgroundColorsPole.push(d1_color + \"60\");\n                    } else {\n                        const gp = parseFloat(gpRaw);\n                        d1_gapPole.push(gp);\n                        if (gp > max_gapPole) max_gapPole = gp;\n                        d1_backgroundColorsPole.push(d1_color);\n                    }\n                } else {\n                    // no corrió / no hay datos para este rid\n                    d1_res.push(null);\n                    d1_qualis.push(null);\n                    if (raceCompleted) {\n                        d1_points.push(d1_points[d1_points.length - 1]);\n                    } else {\n                        d1_points.push(null);\n                    }\n                }\n            });\n\n            // quitamos el 0 inicial\n            d1_points.shift();\n\n            // reemplace NaNs de gaps por la mitad del máximo (tu lógica)\n            d1_gapWinner = d1_gapWinner.map(function (elem) {\n                return elem == null ? max_gapWinner / 2 : elem;\n            });\n\n            d1_gapPole = d1_gapPole.map(function (elem) {\n                return elem == null ? max_gapPole / 2 : elem;\n            });\n\n            // ---- push datasets a los gráficos (Chart.js) ----\n            driverGraph.data.datasets.push({\n                label: driv.driverName,\n                data: d1_res,\n                borderColor: d1_color,\n                pointBackgroundColor: d1_color,\n                borderWidth: 2,\n                fill: false,\n                spanGaps: false,\n                pointHitRadius: 7\n            });\n\n            qualiGraph.data.datasets.push({\n                label: driv.driverName,\n                data: d1_qualis,\n                borderColor: d1_color,\n                pointBackgroundColor: d1_color,\n                borderWidth: 2,\n                fill: false,\n                spanGaps: false,\n                pointHitRadius: 7\n            });\n\n            pointsGraph.data.datasets.push({\n                label: driv.driverName,\n                data: d1_points,\n                borderColor: d1_color,\n                pointBackgroundColor: d1_color,\n                pointRadius: 0,\n                pointHoverRadius: 4,\n                fill: false,\n                spanGaps: false,\n                pointHitRadius: 7,\n                datalabels: {\n                    color: function () {\n                        return (lightColors.indexOf(d1_color) !== -1) ? \"#272727\" : \"#eeeef1\";\n                    },\n                    backgroundColor: d1_color,\n                    display: function (context) {\n                        return context.dataIndex === findLastNonNaNIndex(context.dataset.data);\n                    },\n                    borderRadius: 5,\n                    font: { family: \"Formula1Bold\" }\n                }\n            });\n\n            gapWinnerGraph.options.scales.y.max = max_gapWinner;\n            gapPoleGraph.options.scales.y.max = max_gapPole;\n\n            gapWinnerGraph.data.datasets.push({\n                label: driv.driverName,\n                data: d1_gapWinner,\n                borderColor: d1_color,\n                pointBackgroundColor: d1_color,\n                backgroundColor: d1_backgroundColors,\n                borderWidth: 1,\n                fill: true,\n                pointHitRadius: 7\n            });\n\n            gapPoleGraph.data.datasets.push({\n                label: driv.driverName,\n                data: d1_gapPole,\n                borderColor: d1_color,\n                pointBackgroundColor: d1_color,\n                backgroundColor: d1_backgroundColorsPole,\n                borderWidth: 1,\n                fill: true,\n                pointHitRadius: 7\n            });\n        }\n    });\n\n    // actualiza\n    driverGraph.update();\n    qualiGraph.update();\n    pointsGraph.update();\n    gapWinnerGraph.update();\n    gapPoleGraph.update();\n}\n\n\n/**\n * Finds tha last non NaN element in an array\n * @param {Array} arr array in which the function will look\n * @returns the indef on which is the last non NaN or -1 if there is none\n */\nfunction findLastNonNaNIndex(arr) {\n    for (let i = arr.length - 1; i >= 0; i--) {\n        if (arr[i] != null) {\n            return i;\n        }\n    }\n    return -1; // Devuelve -1 si todos los valores son NaN\n}\n\nfunction updateMaxYAxis(newMax) {\n    driverGraph.options.scales.y.max = newMax;\n    qualiGraph.options.scales.y.max = newMax;\n    driverGraph.update();\n    qualiGraph.update();\n}\n\nfunction getNoEntryAnimationWithHoverTransition() {\n    return {\n        animation: {\n            duration: 0\n        },\n        transitions: {\n            active: {\n                animation: {\n                    duration: 180,\n                    easing: 'easeOutQuad'\n                }\n            }\n        }\n    };\n}\n\n/**\n * Creates the head to head race chart\n * @param {Array} labelsArray array with all the labels for the races\n */\nfunction createRaceChart(labelsArray, max) {\n    const dataD = {\n        labels: labelsArray,\n    };\n    driverGraph = new Chart(\n        document.getElementById('driverGraph'),\n        {\n            type: 'line',\n            data: dataD,\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                ...getNoEntryAnimationWithHoverTransition(),\n                interaction: {\n                    mode: 'index'\n                },\n                layout: {\n                    padding: {\n                        top: 10,\n                        right: 25,\n                        boottom: 20,\n                        left: 10\n                    }\n                },\n                scales: {\n                    x: {\n                        grid: {\n                            color: theme_colors[selectedTheme].grid\n                        },\n                        ticks: {\n                            color: theme_colors[selectedTheme].labels,\n                            font: {\n                                family: \"Formula1Bold\"\n                            }\n                        }\n                    },\n                    y: {\n                        reverse: true,\n                        min: 1,\n                        max: max,\n                        grid: {\n                            color: theme_colors[selectedTheme].grid\n                        },\n                        ticks: {\n                            color: theme_colors[selectedTheme].labels,\n                            font: {\n                                family: \"Formula1Bold\"\n                            }\n                        }\n\n                    }\n                },\n                plugins: {\n                    datalabels: {\n                        display: false\n                    },\n                    annotation: {\n                        annotations: {\n                            line1: {\n                                type: 'line',\n                                display: annotationsToggle,\n                                yMin: 1,\n                                yMax: 1,\n                                borderColor: '#FDE06B',\n                                borderWidth: 1,\n                            },\n                            line2: {\n                                type: 'line',\n                                display: annotationsToggle,\n                                yMin: 2,\n                                yMax: 2,\n                                borderColor: '#AEB2B8',\n                                borderWidth: 1,\n                            },\n                            line3: {\n                                type: 'line',\n                                display: annotationsToggle,\n                                yMin: 3,\n                                yMax: 3,\n                                borderColor: '#d7985a',\n                                borderWidth: 1,\n                            },\n                            line4: {\n                                type: 'line',\n                                display: annotationsToggle,\n                                yMin: 10,\n                                yMax: 10,\n                                borderColor: theme_colors[selectedTheme].labels,\n                                borderWidth: 1,\n                            }\n                        }\n                    },\n                    legend: {\n                        labels: {\n                            boxHeight: 2,\n                            boxWidth: 25,\n                            color: theme_colors[selectedTheme].labels,\n                            font: {\n                                family: \"Formula1\"\n                            }\n                        },\n                    },\n                    tooltip: {\n                        titleFont: {\n                            family: 'Formula1Bold',\n                            size: 16\n\n                        },\n                        bodyFont: {\n                            family: 'Formula1',\n                            size: 14\n                        }\n                    }\n\n                }\n\n\n            }\n        }\n    );\n}\n\n/**\n * Creates the head to head qualifying chart\n * @param {Array} labelsArray array with all the labels for the races\n */\nfunction createQualiChart(labelsArray, max, q2_line) {\n    const dataD = {\n        labels: labelsArray,\n    };\n    qualiGraph = new Chart(\n        document.getElementById('qualiGraph'),\n        {\n            type: 'line',\n            data: dataD,\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                ...getNoEntryAnimationWithHoverTransition(),\n                interaction: {\n                    mode: 'index'\n                },\n                layout: {\n                    padding: {\n                        top: 10,\n                        right: 25,\n                        boottom: 20,\n                        left: 10\n                    }\n                },\n                scales: {\n                    x: {\n                        grid: {\n                            color: theme_colors[selectedTheme].grid\n                        },\n                        ticks: {\n                            color: theme_colors[selectedTheme].labels,\n                            font: {\n                                family: \"Formula1Bold\"\n                            }\n                        }\n                    },\n                    y: {\n                        reverse: true,\n                        min: 1,\n                        max: max,\n                        grid: {\n                            color: theme_colors[selectedTheme].grid\n                        },\n                        ticks: {\n                            color: theme_colors[selectedTheme].labels,\n                            font: {\n                                family: \"Formula1Bold\"\n                            }\n                        }\n\n                    }\n                },\n                plugins: {\n                    datalabels: {\n                        display: false\n                    },\n                    annotation: {\n                        annotations: {\n                            line1: {\n                                type: 'line',\n                                display: annotationsToggle,\n                                yMin: q2_line,\n                                yMax: q2_line,\n                                borderColor: 'red',\n                                borderWidth: 1,\n                                label: {\n                                    display: true,\n                                    color: \"white\",\n                                    backgroundColor: \"red\",\n                                    content: 'Q2',\n                                    position: 'start',\n                                    font: {\n                                        family: \"Formula1Bold\",\n                                        size: 12\n                                    }\n                                }\n                            },\n                            line2: {\n                                type: 'line',\n                                display: annotationsToggle,\n                                yMin: 10,\n                                yMax: 10,\n                                borderColor: 'red',\n                                borderWidth: 1,\n                                label: {\n                                    color: \"white\",\n                                    display: true,\n                                    backgroundColor: \"red\",\n                                    content: 'Q3',\n                                    position: 'start',\n                                    font: {\n                                        family: \"Formula1Bold\",\n                                        size: 12\n                                    }\n                                }\n                            }\n                        }\n                    },\n                    legend: {\n                        labels: {\n                            boxHeight: 2,\n                            boxWidth: 25,\n                            color: theme_colors[selectedTheme].labels,\n                            font: {\n                                family: \"Formula1\"\n                            }\n                        },\n                    },\n                    tooltip: {\n                        titleFont: {\n                            family: 'Formula1Bold',\n                            size: 16\n\n                        },\n                        bodyFont: {\n                            family: 'Formula1',\n                            size: 14\n                        }\n                    }\n\n                }\n\n\n            }\n        }\n    );\n}\n\n/**\n * Creates the head to head qualifying chart\n * @param {Array} labelsArray array with all the labels for the races\n */\nfunction createPointsChart(labelsArray) {\n    const dataD = {\n        labels: labelsArray,\n    };\n    pointsGraph = new Chart(\n        document.getElementById('progressionGraph'),\n        {\n            type: 'line',\n            data: dataD,\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                ...getNoEntryAnimationWithHoverTransition(),\n                interaction: {\n                    mode: 'index'\n                },\n                layout: {\n                    padding: {\n                        top: 10,\n                        right: 25,\n                        boottom: 20,\n                        left: 10\n                    }\n                },\n                scales: {\n                    x: {\n                        grid: {\n                            color: theme_colors[selectedTheme].grid\n                        },\n                        ticks: {\n                            color: theme_colors[selectedTheme].labels,\n                            font: {\n                                family: \"Formula1Bold\"\n                            }\n                        }\n                    },\n                    y: {\n                        grid: {\n                            color: theme_colors[selectedTheme].grid\n                        },\n                        ticks: {\n                            color: theme_colors[selectedTheme].labels,\n                            font: {\n                                family: \"Formula1Bold\"\n                            }\n                        }\n\n                    }\n                },\n                plugins: {\n                    legend: {\n                        labels: {\n                            boxHeight: 2,\n                            boxWidth: 25,\n                            color: theme_colors[selectedTheme].labels,\n                            font: {\n                                family: \"Formula1\"\n                            }\n                        },\n                    },\n                    tooltip: {\n                        titleFont: {\n                            family: 'Formula1Bold',\n                            size: 16\n\n                        },\n                        bodyFont: {\n                            family: 'Formula1',\n                            size: 14\n                        }\n                    }\n\n                }\n\n\n            }\n        }\n    );\n}\n\nfunction createGapCharts(labelsArray, maxGapWinner, maxGapPole) {\n    const dataD1 = {\n        labels: labelsArray,\n    };\n    const dataD2 = {\n        labels: labelsArray,\n    };\n    let commonOptions = {\n        responsive: true,\n        maintainAspectRatio: false,\n        ...getNoEntryAnimationWithHoverTransition(),\n        interaction: {\n            mode: 'index'\n        },\n        scales: {\n            x: {\n                grid: {\n                    color: theme_colors[selectedTheme].grid\n                },\n                ticks: {\n                    color: theme_colors[selectedTheme].labels,\n                    font: {\n                        family: \"Formula1Bold\"\n                    }\n                }\n            },\n            y: {\n                min: 0,\n                grid: {\n                    color: theme_colors[selectedTheme].grid\n                },\n                ticks: {\n                    color: theme_colors[selectedTheme].labels,\n                    font: {\n                        family: \"Formula1Bold\"\n                    }\n                }\n            }\n        },\n        plugins: {\n            datalabels: {\n                display: false\n            },\n            legend: {\n                labels: {\n                    boxHeight: 2,\n                    boxWidth: 25,\n                    color: theme_colors[selectedTheme].labels,\n                    font: {\n                        family: \"Formula1\"\n                    }\n                },\n            },\n            tooltip: {\n                titleFont: {\n                    family: 'Formula1Bold',\n                    size: 16\n                },\n                bodyFont: {\n                    family: 'Formula1',\n                    size: 14\n                },\n                callbacks: {\n                    label: function (tooltipItem) {\n                        let dataset = tooltipItem.dataset; // Acceder al dataset actual\n                        let index = tooltipItem.dataIndex; // Obtener el índice del dato\n                        let color = dataset.backgroundColor[index]; // Obtener el color de fondo del dato actual\n                        let result;\n                        if (color.endsWith(\"50\")) {\n                            result = 'DNF';\n                        }\n                        else if (color.endsWith(\"60\")) {\n                            result = \"Not representative\"\n                        }\n                        else if (color.endsWith(\"76\")) {\n                            result = \"Lapped\"\n                        }\n                        else {\n                            result = `${tooltipItem.raw}s`;\n                        }\n\n\n                        // Mostrar el nombre del piloto y el resultado (valor o DNF)\n                        return `${dataset.label}: ${result}`;\n                    }\n                }\n            }\n        },\n        options: {\n            layout: {\n                padding: {\n                    top: 10,\n                    right: 25,\n                    boottom: 20,\n                    left: 10\n                }\n            }\n        }\n\n    };\n\n\n    let gapWinnerOptions = {\n        ...commonOptions,\n        scales: {\n            ...commonOptions.scales,\n            y: {\n                ...commonOptions.scales.y,\n                max: maxGapWinner,\n            }\n        },\n        plugins: {\n            ...commonOptions.plugins\n\n        }\n    };\n\n    gapWinnerGraph = new Chart(\n        document.getElementById('gapToWinnerGraph'),\n        {\n            type: 'bar',\n            data: dataD1,\n            options: gapWinnerOptions\n        }\n    );\n\n\n\n    let gapPoleOptions = {\n        ...commonOptions,\n        scales: {\n            ...commonOptions.scales,\n            y: {\n                ...commonOptions.scales.y,\n                max: 20\n            }\n        },\n        plugins: {\n            ...commonOptions.plugins,\n        }\n    };\n\n    gapPoleGraph = new Chart(\n        document.getElementById('gapToPoleGraph'),\n        {\n            type: 'bar',\n            data: dataD2,\n            options: gapPoleOptions\n        }\n    );\n}\n"
  },
  {
    "path": "src/js/frontend/news.js",
    "content": "import { team_dict, combined_dict, races_names, names_full, countries_data, logos_disc, lightColors, part_full_names, CUSTOM_NEWS_TYPE_META, CUSTOM_NEWS_INVESTMENT_COUNTRIES, CUSTOM_NEWS_DSQ_COMPONENTS, CUSTOM_NEWS_ENGINE_CHANGE_AREAS, CUSTOM_NEWS_ADUO_QUARTERS, CUSTOM_NEWS_IMAGE_FILES } from \"./config\";\nimport { Command } from \"../backend/command\";\nimport { getCircuitInfo } from \"../backend/scriptUtils/newsUtils\";\nimport newsPromptsTemaplates from \"../../data/news/news_prompts_templates.json\";\nimport turningPointsTemplates from \"../../data/news/turning_points_prompts_templates.json\";\nimport newsTitleTemplates from \"../../data/news/news_titles_templates.json\";\nimport turningPointTitleTemplates from \"../../data/news/turning_points_titles_templates.json\";\nimport { currentSeason } from \"./transfers\";\nimport { colors_dict } from \"./head2head\";\nimport { excelToDate } from \"../backend/scriptUtils/eidtStatsUtils\";\nimport { generateNews, getSaveName, confirmModal, updateRateLimitsDisplay, new_update_notifications } from \"./renderer\";\nimport { marked } from 'marked';\nimport TurndownService from \"turndown\";\nimport DOMPurify from \"dompurify\";\nimport bootstrap from \"bootstrap/dist/js/bootstrap.bundle.min.js\";\n\nconst newsGrid = document.querySelector('.news-grid');\nconst newsModalEl = document.getElementById('newsModal');\nconst closeBtn = document.getElementById('closeNewsArticle');\nconst newsOptionsBtn = document.querySelector('.news-options');\nconst copyArticleBtn = document.getElementById('copyArticle');\nconst deleteArticleBtn = document.getElementById('deleteArticle');\nconst editArticleBtn = document.getElementById('editArticle');\nconst createCustomNewsBtn = document.getElementById('createCustomNews');\nconst customNewsModalEl = document.getElementById('customNewsModal');\nconst customNewsTypeButton = document.getElementById('customNewsTypeButton');\nconst customNewsTypeMenu = document.getElementById('customNewsTypeMenu');\nconst customNewsDateInput = document.getElementById('customNewsDateInput');\nconst customNewsTemplateWrap = document.getElementById('customNewsTemplateWrap');\nconst customNewsTemplateButton = document.getElementById('customNewsTemplateButton');\nconst customNewsTemplateMenu = document.getElementById('customNewsTemplateMenu');\nconst customNewsTemplateHelp = document.getElementById('customNewsTemplateHelp');\nconst customNewsTitleInput = document.getElementById('customNewsTitleInput');\nconst customNewsParams = document.getElementById('customNewsParams');\nconst customNewsError = document.getElementById('customNewsError');\nconst customNewsCreateBtn = document.getElementById('customNewsCreateBtn');\n\nlet interval2 = null;\nlet cleaning = false;\n\nlet currentModalNews = null;\nlet currentModalExtraContext = '';\nlet isEditingArticle = false;\nlet originalArticleHTML = '';\nlet editTextarea = null;\nlet editTitleInput = null;\nlet saveArticleBtn = null;\nlet cancelArticleBtn = null;\nlet originalTitleText = '';\nlet cachedNewsAvailable = { normal: false, turning: false };\n\nfunction isPaidNewsMember() {\n  return window.__USER_DATA__?.paidMember || false;\n}\n\nfunction canUseGenAiForNews(news) {\n  if (news?.type === \"turning_point_aduo\") {\n    return isPaidNewsMember();\n  }\n  return true;\n}\n\nfunction setAduoLockedHidden(el, hidden) {\n  if (!el) return;\n  if (hidden) {\n    el.classList.add('d-none');\n    el.dataset.aduoLocked = '1';\n  } else if (el.dataset.aduoLocked === '1') {\n    el.classList.remove('d-none');\n    delete el.dataset.aduoLocked;\n  }\n}\n\nfunction applyNewsModalGenAiLocks(news) {\n  const lockGenAi = news?.type === \"turning_point_aduo\" && !canUseGenAiForNews(news);\n  const regenerateButton = document.getElementById('regenerateArticle');\n  const regenerateWithContextButton = document.getElementById('regenerateWithContext');\n  const optionsContextContainer = document.getElementById('newsOptionsContext');\n\n  if (lockGenAi) {\n    setOptionsContextOpen(false);\n  }\n\n  setAduoLockedHidden(regenerateButton, lockGenAi);\n  setAduoLockedHidden(regenerateWithContextButton, lockGenAi);\n  setAduoLockedHidden(optionsContextContainer, lockGenAi);\n}\n\nconst DEFAULT_NEWS_LANGUAGE = \"English\";\nconst NEWS_LANGUAGE_STORAGE_KEY = \"newsLanguage\";\nconst NEWS_LANGUAGE_OPTIONS = [\n  { value: \"English\", label: \"English\" },\n  { value: \"Spanish\", label: \"Spanish\" },\n  { value: \"Italian\", label: \"Italian\" },\n  { value: \"French\", label: \"French\" },\n  { value: \"German\", label: \"German\" },\n  { value: \"Dutch\", label: \"Dutch\" },\n  { value: \"Polish\", label: \"Polish\" },\n  { value: \"Portuguese\", label: \"Portuguese\" },\n  { value: \"Russian\", label: \"Russian\" },\n  { value: \"Chinese\", label: \"Chinese\" },\n  { value: \"Japanese\", label: \"Japanese\" },\n\n];\n\n\nconst wait = (ms) => new Promise(r => setTimeout(r, ms));\nconst onTransitionEnd = (el, propName, timeoutMs) =>\n  new Promise(resolve => {\n    let done = false;\n    const handler = (e) => {\n      if (!propName || e.propertyName === propName) {\n        done = true;\n        el.removeEventListener('transitionend', handler);\n        resolve();\n      }\n    };\n    el.addEventListener('transitionend', handler, { once: true });\n    if (timeoutMs != null) {\n      setTimeout(() => { if (!done) { el.removeEventListener('transitionend', handler); resolve(); } }, timeoutMs);\n    }\n  });\n\nasync function finishGeneralLoader() {\n  const pageLoaderDiv = document.querySelector('.general-news-loader');\n  if (!pageLoaderDiv) return;\n\n  const pageProgressDiv =\n    pageLoaderDiv.querySelector('.general-news-progress-div') ||\n    document.querySelector('.general-news-progress-div');\n\n  const id = pageProgressDiv?._progressIntervalId;\n  if (id) {\n    clearInterval(id);\n    pageProgressDiv._progressIntervalId = null;\n  }\n\n  if (pageProgressDiv) {\n    await new Promise(requestAnimationFrame);     // asegura estado inicial\n    pageProgressDiv.style.width = '100%';\n    await Promise.race([\n      onTransitionEnd(pageProgressDiv, 'width', 220),\n      wait(200)\n    ]);\n  }\n\n  pageLoaderDiv.style.opacity = '0';\n  await Promise.race([\n    onTransitionEnd(pageLoaderDiv, 'opacity', 150),\n    wait(100)\n  ]);\n\n  pageLoaderDiv.remove();\n}\n\nfunction getNewsLanguage() {\n  try {\n    return localStorage.getItem(NEWS_LANGUAGE_STORAGE_KEY) || DEFAULT_NEWS_LANGUAGE;\n  } catch {\n    return DEFAULT_NEWS_LANGUAGE;\n  }\n}\n\nfunction replaceLanguagePlaceholder(text, language) {\n  if (typeof text !== 'string') return text;\n  return text.replace(/{{\\s*language\\s*}}/gi, language);\n}\n\nfunction syncNewsLanguageDropdown(selectedLanguage) {\n  const menu = document.getElementById('newsLanguageMenu');\n  const button = document.getElementById('newsLanguageButton');\n\n  if (button) {\n    const label = button.querySelector('span');\n    if (label) {\n      label.innerText = selectedLanguage;\n    }\n  }\n\n  if (menu) {\n    menu.querySelectorAll('.redesigned-dropdown-item').forEach(item => {\n      const isSelected = item.dataset.value === selectedLanguage;\n      item.querySelector('i')?.classList.toggle('unactive', !isSelected);\n    });\n  }\n}\n\nfunction setNewsLanguage(language) {\n  const selected = NEWS_LANGUAGE_OPTIONS.find(opt => opt.value === language)?.value || DEFAULT_NEWS_LANGUAGE;\n  try {\n    localStorage.setItem(NEWS_LANGUAGE_STORAGE_KEY, selected);\n  } catch {\n    // Ignore storage errors and keep using the selected value in memory\n  }\n  syncNewsLanguageDropdown(selected);\n}\n\nfunction setupNewsLanguageDropdown() {\n  const menu = document.getElementById('newsLanguageMenu');\n  const button = document.getElementById('newsLanguageButton');\n  if (!menu || !button) return;\n\n  menu.innerHTML = '';\n\n  NEWS_LANGUAGE_OPTIONS.forEach(({ value, label }) => {\n    const item = document.createElement('a');\n    item.classList.add('redesigned-dropdown-item');\n    item.dataset.value = value;\n    item.href = '#';\n    item.innerText = label;\n\n    const checkIcon = document.createElement('i');\n    checkIcon.classList.add('bi', 'bi-check');\n    item.appendChild(checkIcon);\n\n    item.addEventListener('click', (e) => {\n      e.preventDefault();\n      e.stopPropagation();\n      setNewsLanguage(value);\n    });\n\n    menu.appendChild(item);\n  });\n\n  syncNewsLanguageDropdown(getNewsLanguage());\n}\n\nasync function cleanupOpenedNewsItem() {\n  if (cleaning) return;\n  cleaning = true;\n\n  const newsItem = document.querySelector('.news-item.opened');\n  if (newsItem) {\n    newsItem.classList.remove('opened');\n    // Espera a que termine la transición del item (tu utilidad)\n    await onTransitionEnd(newsItem, 'transform', 150);\n    newsItem.classList.remove('with-transition');\n  }\n\n  cleaning = false;\n}\n\ncloseBtn.addEventListener('click', async () => {\n  await cleanupOpenedNewsItem();\n\n  const modal =\n    bootstrap.Modal.getInstance(newsModalEl) ||\n    new bootstrap.Modal(newsModalEl);\n\n  modal.hide();\n});\n\n\nnewsModalEl.addEventListener('hide.bs.modal', () => {\n  exitArticleEditMode();\n  cleanupOpenedNewsItem();\n});\n\nfunction exitArticleEditMode(opts = {}) {\n  const { restoreOriginal = true } = opts;\n  if (!isEditingArticle) return;\n\n  const newsArticle = document.querySelector('#newsModal .news-article');\n  const modalTitle = document.querySelector('#newsModal .modal-title');\n\n  if (newsArticle && restoreOriginal) {\n    newsArticle.innerHTML = originalArticleHTML;\n  }\n\n  if (modalTitle && restoreOriginal) {\n    modalTitle.innerHTML = originalTitleText;\n  }\n\n  if (saveArticleBtn) saveArticleBtn.remove();\n  if (cancelArticleBtn) cancelArticleBtn.remove();\n\n  closeBtn?.classList.remove('d-none');\n\n  isEditingArticle = false;\n  originalArticleHTML = '';\n  editTextarea = null;\n  editTitleInput = null;\n  saveArticleBtn = null;\n  cancelArticleBtn = null;\n  originalTitleText = '';\n}\n\nfunction hashStr(str) {\n  let h = 2166136261 >>> 0;\n  for (let i = 0; i < str.length; i++) {\n    h ^= str.charCodeAt(i);\n    h = Math.imul(h, 16777619) >>> 0;\n  }\n  return h >>> 0;\n}\n\nconst BUCKET_TURNING = 5;\nconst BUCKET_NORMAL = 7;\n\nasync function openContextModal(articleTitle = '') {\n  const modalEl = document.getElementById('newsContextModal');\n  if (!modalEl) return { confirmed: false, context: '' };\n\n  const bsModal =\n    bootstrap.Modal.getInstance(modalEl) ||\n    new bootstrap.Modal(modalEl, { keyboard: false });\n\n  const modalTitle = modalEl.querySelector('.modal-title');\n  const textarea = modalEl.querySelector('.news-context-textarea');\n  const confirmBtn = modalEl.querySelector('.context-confirm');\n  const cancelBtn = modalEl.querySelector('.context-cancel');\n\n  if (modalTitle) {\n    modalTitle.textContent = articleTitle\n      ? `Add context for \"${articleTitle}\"`\n      : \"Add context for this article\";\n  }\n\n  if (textarea) {\n    textarea.value = '';\n  }\n\n  return new Promise((resolve) => {\n    let clicked = false;\n    const controller = new AbortController();\n    const { signal } = controller;\n\n    confirmBtn?.addEventListener('click', () => {\n      clicked = true;\n      resolve({ confirmed: true, context: textarea?.value?.trim() || '' });\n      bsModal.hide();\n    }, { once: true, signal });\n\n    cancelBtn?.addEventListener('click', () => {\n      clicked = true;\n      resolve({ confirmed: false, context: '' });\n      bsModal.hide();\n    }, { once: true, signal });\n\n    modalEl.addEventListener('hidden.bs.modal', () => {\n      if (!clicked) resolve({ confirmed: false, context: '' });\n      controller.abort();\n    }, { once: true });\n\n    modalEl.addEventListener('shown.bs.modal', () => {\n      textarea?.focus();\n    }, { once: true });\n\n    bsModal.show();\n  });\n}\n\nfunction setOptionsContextOpen(isOpen) {\n  const container = document.getElementById('newsOptionsContext');\n  if (!container) return;\n\n  container.classList.toggle('open', isOpen);\n  container.setAttribute('aria-hidden', isOpen ? 'false' : 'true');\n\n  if (isOpen) {\n    setTimeout(() => {\n      const textarea = document.getElementById('newsOptionsContextTextarea');\n      textarea?.focus();\n    }, 0);\n  }\n}\n\nasync function openNewsModalFlow(news, newsItem, newsList, opts = {}) {\n  const { extraContext = '' } = opts;\n  exitArticleEditMode();\n  currentModalNews = news;\n  currentModalExtraContext = extraContext;\n  newsItem?.classList.add('with-transition', 'opened');\n  applyNewsModalGenAiLocks(news);\n\n  const newsModal = new bootstrap.Modal(document.getElementById('newsModal'), {\n    keyboard: false\n  });\n\n  if (!news.text) {\n    newsOptionsBtn.classList.add('d-none');\n  }\n  else {\n    newsOptionsBtn.classList.remove('d-none');\n  }\n\n  newsModal._element.setAttribute(\"data-article-id\", news.id || '');\n\n  newsOptionsBtn?.classList.remove('active');\n  setOptionsContextOpen(false);\n\n  const optionsContextTextarea = document.getElementById('newsOptionsContextTextarea');\n  if (optionsContextTextarea) {\n    optionsContextTextarea.value = currentModalExtraContext || '';\n  }\n\n  newsModal.show();\n  const modalTitle = document.querySelector('#newsModal .modal-title');\n  modalTitle.textContent = news.title;\n\n  const newsArticle = document.querySelector('#newsModal .news-article');\n  newsArticle.innerHTML = '';\n\n  const dateSpan = document.querySelector('#newsModal .news-article-date .dateSpan');\n  const date = excelToDate(news.date);\n\n  const day = String(date.getDate()).padStart(2, '0');\n  const month = String(date.getMonth() + 1).padStart(2, '0');\n  const year = date.getFullYear();\n  dateSpan.textContent = `${day}/${month}/${year}`;\n\n  const image = document.querySelector('#newsModal .news-image-background');\n\n  (async () => {\n    const url = news.image;\n    const exists = await imageExists(url);\n\n    if (exists) {\n      image.classList.remove('d-none');\n      image.src = news.image;\n    } else {\n      image.classList.add('d-none');\n    }\n  })();\n\n  await generateAndRenderArticle(news, newsList, \"Generating\", false, undefined, extraContext);\n\n  const optionsContextCancelButton = document.getElementById('newsOptionsContextCancel');\n  if (optionsContextCancelButton) {\n    optionsContextCancelButton.replaceWith(optionsContextCancelButton.cloneNode(true));\n    const newOptionsContextCancelButton = document.getElementById('newsOptionsContextCancel');\n\n    newOptionsContextCancelButton.addEventListener('click', (e) => {\n      e.preventDefault();\n      e.stopPropagation();\n      if (optionsContextTextarea) optionsContextTextarea.value = currentModalExtraContext || '';\n      setOptionsContextOpen(false);\n    });\n  }\n\n  const optionsContextRegenerateButton = document.getElementById('newsOptionsContextRegenerate');\n  if (optionsContextRegenerateButton) {\n    optionsContextRegenerateButton.replaceWith(optionsContextRegenerateButton.cloneNode(true));\n    const newOptionsContextRegenerateButton = document.getElementById('newsOptionsContextRegenerate');\n\n    newOptionsContextRegenerateButton.addEventListener('click', async (e) => {\n      e.preventDefault();\n      e.stopPropagation();\n      currentModalExtraContext = optionsContextTextarea?.value?.trim() || '';\n      setOptionsContextOpen(false);\n      newsOptionsBtn?.classList.remove('active');\n      await generateAndRenderArticle(news, newsList, \"Regenerating\", true, undefined, currentModalExtraContext);\n    });\n  }\n\n  const regenerateButton = document.getElementById('regenerateArticle');\n  if (regenerateButton) {\n    regenerateButton.replaceWith(regenerateButton.cloneNode(true));\n    const newRegenerateButton = document.getElementById('regenerateArticle');\n\n    newRegenerateButton.addEventListener('click', async () => {\n      await generateAndRenderArticle(news, newsList, \"Regenerating\", true, undefined, currentModalExtraContext);\n    });\n  }\n\n  const regenerateWithContextButton = document.getElementById('regenerateWithContext');\n  if (regenerateWithContextButton) {\n    regenerateWithContextButton.replaceWith(regenerateWithContextButton.cloneNode(true));\n    const newRegenerateWithContextButton = document.getElementById('regenerateWithContext');\n\n    newRegenerateWithContextButton.addEventListener('click', (e) => {\n      e.preventDefault();\n      e.stopPropagation();\n      if (optionsContextTextarea) {\n        optionsContextTextarea.value = currentModalExtraContext || '';\n      }\n      const container = document.getElementById('newsOptionsContext');\n      const isOpen = !!container?.classList.contains('open');\n      setOptionsContextOpen(!isOpen);\n    });\n  }\n}\n\nfunction addReadButtonListener(readButton, newsItem, news, newsList) {\n  readButton.addEventListener('click', async () => {\n    await openNewsModalFlow(news, newsItem, newsList);\n  });\n}\n\nasync function generateAndRenderArticle(news, newsList, label = \"Generating\", force = false, model, extraContext = '') {\n  exitArticleEditMode();\n  const newsArticle = document.querySelector('#newsModal .news-article');\n  newsArticle.innerHTML = '';\n\n  const loaderDiv = document.createElement('div');\n  loaderDiv.classList.add('loader-div');\n\n  const loadingSpan = document.createElement('span');\n  loadingSpan.textContent = label;\n\n  const loadingDots = document.createElement('span');\n  loadingDots.textContent = \".\";\n  loadingDots.classList.add('loading-dots');\n  loadingSpan.appendChild(loadingDots);\n\n  const dotsInterval = setInterval(() => {\n    loadingDots.textContent = loadingDots.textContent.length >= 3 ? \".\" : loadingDots.textContent + \".\";\n  }, 500);\n\n  const progressBar = document.createElement('div');\n  progressBar.classList.add('ai-progress-bar');\n  const progressDiv = document.createElement('div');\n  progressDiv.classList.add('progress-div');\n\n  progressBar.appendChild(progressDiv);\n  loaderDiv.appendChild(loadingSpan);\n  loaderDiv.appendChild(progressBar);\n  newsArticle.appendChild(loaderDiv);\n\n  let progress = 0;\n  const interval = setInterval(() => {\n    progress += 2;\n    if (progressDiv) progressDiv.style.width = progress + '%';\n    if (progress >= 20) clearInterval(interval);\n  }, 150);\n\n  try {\n    const articleText = await manageRead(news, newsList, progressDiv, interval, { force, extraContext });\n\n    clearInterval(interval);\n    clearInterval(dotsInterval);\n    progressDiv.style.width = '100%';\n\n    setTimeout(() => {\n      loaderDiv.style.opacity = '0';\n      newsArticle.style.opacity = '0';\n      setTimeout(() => {\n        loaderDiv.remove();\n        const rawHtml = marked.parse(articleText);\n        const cleanHtml = DOMPurify.sanitize(rawHtml);\n        newsArticle.innerHTML = cleanHtml;\n        newsArticle.style.opacity = '1';\n        newsOptionsBtn.classList.remove('d-none');\n      }, 150);\n    }, 200);\n  } catch (err) {\n    console.error(\"Error generating article:\", err);\n\n    clearInterval(interval);\n    clearInterval(dotsInterval);\n\n    loaderDiv.remove();\n\n    const errorDiv = document.createElement('div');\n    errorDiv.classList.add('news-error', 'model-error');\n\n    if (err.status === 429) {\n      errorDiv.innerText = \"Daily limit reached. Tomorrow you'll be able to generate more articles.\";\n      newsArticle.appendChild(errorDiv);\n    } else {\n      errorDiv.innerText = \"Error generating article. Please try again.\";\n      newsArticle.appendChild(errorDiv);\n    }\n  }\n}\n\nfunction manageTurningPointButtons(news, newsList, maxDate, newsBody, readbuttonContainer, newsAvailable) {\n  let approveButton, randomButton, cancelButton;\n  const isAduoTurningPoint = news.type === \"turning_point_aduo\";\n  const isFreeTier = !window.__USER_DATA__?.paidMember\n  if (isFreeTier && news.hiddenByAvailability && !isAduoTurningPoint) {\n    return;\n  }\n\n\n  if (news.turning_point_type === \"original\") {\n    const tpDiv = document.createElement('div');\n    tpDiv.classList.add('turning-point-div');\n\n    cancelButton = document.createElement('div');\n    cancelButton.classList.add('cancel-tp', 'tp-button');\n    const cancelIcon = document.createElement('i');\n    cancelIcon.classList.add('bi', 'bi-x', 'tp-icon');\n    cancelButton.appendChild(cancelIcon);\n    tpDiv.appendChild(cancelButton);\n\n    cancelButton.addEventListener('click', async () => {\n      randomButton.remove();\n      approveButton.remove();\n      cancelButton.classList.add('tp-button-selected');\n\n      const resultSpan = document.createElement('span');\n      resultSpan.classList.add('tp-result-span');\n      resultSpan.innerText = \"Cancelled\";\n      cancelButton.innerHTML = '';\n      cancelButton.appendChild(resultSpan);\n\n      cancelButton.replaceWith(cancelButton.cloneNode(true));\n\n      const command = new Command(\"cancelTurningPoint\", {\n        turningPointData: news.data,\n        type: news.type,\n        maxDate: maxDate,\n        id: news.id\n      });\n      let newResp = await command.promiseExecute();\n      place_turning_outcome(newResp.content, newsList);\n    });\n\n    randomButton = document.createElement('div');\n    randomButton.classList.add('random-tp', 'tp-button');\n    const randomIcon = document.createElement('i');\n    randomIcon.classList.add('bi', 'bi-shuffle', 'tp-icon');\n    randomButton.appendChild(randomIcon);\n    tpDiv.appendChild(randomButton);\n\n    approveButton = document.createElement('div');\n    approveButton.classList.add('approve-tp', 'tp-button');\n    const approveIcon = document.createElement('i');\n    approveIcon.classList.add('bi', 'bi-check', 'tp-icon');\n    approveButton.appendChild(approveIcon);\n    tpDiv.appendChild(approveButton);\n    let nonReadable = false;\n\n    approveButton.addEventListener('click', async () => {\n      //has the news text\n      if (!news.text || news.text.length === 0) {\n        const ok = await confirmModal({\n          title: \"Approve Turning Point\",\n          body: \"Are you sure you want to approve this turning point? If you approve it before reading the article, it will not be able to generate the article further down the line.\",\n          confirmText: \"Approve\",\n          cancelText: \"Cancel\"\n        });\n\n        if (!ok) return;\n        else {\n          const readButton = newsBody.querySelector('.read-button-container .read-button');\n          readButton.remove();\n          nonReadable = true;\n        }\n      }\n\n      //remove the other 2 buttons\n      randomButton.remove();\n      cancelButton.remove();\n      approveButton.classList.add('tp-button-selected');\n      //remove the icon and add text \"Approved\"\n      const resultSpan = document.createElement('span');\n      resultSpan.classList.add('tp-result-span');\n      resultSpan.innerText = \"Approved\";\n      approveButton.innerHTML = '';\n      approveButton.appendChild(resultSpan);\n\n      //remove the eventListener\n      approveButton.replaceWith(approveButton.cloneNode(true));\n\n      const command = new Command(\"approveTurningPoint\", {\n        turningPointData: news.data,\n        type: news.type,\n        maxDate: maxDate,\n        id: news.id,\n        nonReadable: nonReadable === true\n      });\n\n      const newResp = await command.promiseExecute();\n      place_turning_outcome(newResp.content, newsList);\n\n      if (news.type === \"turning_point_transfer\" || news.type === \"turning_point_injury\" ||\n        news.type === \"turning_point_young_drivers\" || news.type === \"turning_point_young_drivers\") {\n        const commandDrivers = new Command(\"driversRefresh\", {});\n        commandDrivers.execute();\n      }\n      else if (news.type === \"turning_point_technical_directive\") {\n        const commandTechDir = new Command(\"performanceRefresh\", {});\n        commandTechDir.execute();\n      }\n      else if (news.type === \"turning_point_race_substitution\") {\n        const commandYear = new Command(\"yearSelected\", {\n          year: news.data.season,\n          isCurrentYear: true\n        });\n        commandYear.execute();\n\n        const commandCalendar = new Command(\"calendarRefresh\", {});\n        commandCalendar.execute();\n      }\n      else if (news.type === \"turning_point_engine_regulation\") {\n        const commandEngines = new Command(\"enginesRefresh\", {});\n        commandEngines.execute();\n      }\n      else if (news.type === \"turning_point_aduo\") {\n        const commandEngines = new Command(\"enginesRefresh\", {});\n        commandEngines.execute();\n        const commandPerformance = new Command(\"performanceRefresh\", {});\n        commandPerformance.execute();\n      }\n    });\n\n\n\n    randomButton.addEventListener('click', () => {\n      // Evita dobles clics\n      randomButton.classList.add('tp-button-selected');\n      const span = document.createElement('span');\n      span.classList.add('tp-result-span');\n      span.innerText = 'Deciding...';\n      randomButton.innerHTML = '';\n      randomButton.appendChild(span);\n      randomButton.style.pointerEvents = 'none';\n\n      // 50-50\n      const approve = Math.random() < 0.5;\n\n      if (approve && approveButton?.isConnected) {\n        approveButton.click();\n      } else if (cancelButton?.isConnected) {\n        cancelButton.click();\n      } else if (approveButton) {\n        approveButton.click();\n      }\n    });\n\n    readbuttonContainer.appendChild(tpDiv);\n  }\n  else if (news.turning_point_type === \"approved\") {\n    const tpDiv = document.createElement('div');\n    tpDiv.classList.add('turning-point-div');\n    const approvedButton = document.createElement('div');\n    approvedButton.classList.add('approve-tp', 'tp-button', 'tp-button-selected');\n    const approvedSpan = document.createElement('span');\n    approvedSpan.classList.add('tp-result-span');\n    approvedSpan.innerText = \"Approved\";\n    approvedButton.appendChild(approvedSpan);\n    tpDiv.appendChild(approvedButton);\n    readbuttonContainer.appendChild(tpDiv);\n  }\n  else if (news.turning_point_type === \"cancelled\") {\n    const tpDiv = document.createElement('div');\n    tpDiv.classList.add('turning-point-div');\n    const cancelledButton = document.createElement('div');\n    cancelledButton.classList.add('cancel-tp', 'tp-button', 'tp-button-selected');\n    const cancelledSpan = document.createElement('span');\n    cancelledSpan.classList.add('tp-result-span');\n    cancelledSpan.innerText = \"Cancelled\";\n    cancelledButton.appendChild(cancelledSpan);\n    tpDiv.appendChild(cancelledButton);\n    readbuttonContainer.appendChild(tpDiv);\n  }\n\n\n  if (!newsAvailable.turning && !isAduoTurningPoint) {\n    const showInsiderModal = async () => {\n      await confirmModal({\n        title: \"Insider News Unavailable\",\n        body: \"Insider news are currently unavailable. To unlock insider news and be able to decide the outcome of turning points, please consider subscribing to the INSIDER tier on our Patreon page.\",\n        confirmText: \"Okay\"\n      });\n    };\n\n    const swap = (btn) => {\n      if (!btn) return null;\n      const clone = btn.cloneNode(true); // clona (sin listeners)\n      btn.replaceWith(clone);            // mete el clon en el DOM\n      clone.addEventListener('click', showInsiderModal); // añade el nuevo listener\n      return clone;                       // devuelve la nueva referencia\n    };\n\n    // ¡OJO!: usa let para poder reasignar\n    approveButton = swap(approveButton);\n    randomButton = swap(randomButton);\n    cancelButton = swap(cancelButton);\n  }\n}\n\nfunction createNewsItemElement(news, index, newsAvailable, newsList, maxDate, isCurrentSeason = true) {\n  const isTurning =\n    news.turning_point_type === 'original' ||\n    news.turning_point_type === 'approved' ||\n    news.turning_point_type === 'cancelled';\n  const isAduoTurningPoint = news.type === \"turning_point_aduo\";\n  const newsItem = document.createElement('div');\n  newsItem.classList.add('news-item', 'fade-in');\n  newsItem.setAttribute('style', '--order: ' + (index + 1));\n\n  if (news.hiddenByAvailability) {\n    newsItem.dataset.hiddenReason = news.hiddenReason || 'none';\n    newsItem.classList.add('hidden-by-availability'); // para que lo estilices si quieres\n  }\n\n  const newsBody = document.createElement('div');\n  newsBody.classList.add('news-body');\n  const titleAndArticle = document.createElement('div');\n  titleAndArticle.classList.add('title-and-article');\n\n  const newsTitle = document.createElement('span');\n  newsTitle.classList.add('news-title', 'bold-font');\n  newsTitle.textContent = news.title;\n\n  const imageContainer = document.createElement('div');\n  imageContainer.classList.add('news-image-container');\n\n  const readbuttonContainer = document.createElement('div');\n  readbuttonContainer.classList.add('read-button-container');\n\n  const readActions = document.createElement('div');\n  readActions.classList.add('read-actions');\n\n  const contextButton = document.createElement('div');\n  contextButton.classList.add('context-read-button');\n  contextButton.setAttribute('title', 'Add context');\n  const contextIcon = document.createElement('i');\n  contextIcon.classList.add('bi', 'bi-chat-text');\n  contextButton.appendChild(contextIcon);\n\n  const readButton = document.createElement('div');\n  readButton.classList.add('read-button');\n  const readButtonSpan = document.createElement('span');\n  readButtonSpan.innerText = \"Read\";\n  readButton.appendChild(readButtonSpan);\n\n  manage_overlay(imageContainer, news.overlay, news.data, news.image);\n\n  const image = document.createElement('img');\n  image.classList.add('news-image');\n  image.setAttribute('data-src', news.image);\n  image.src = news.image;\n  image.setAttribute('loading', 'lazy');\n\n  imageContainer.appendChild(image);\n\n\n  if (news.hiddenByAvailability) {\n    const blockedDiv = document.createElement('div');\n    blockedDiv.classList.add('no-image-by-availability');\n    const lockIcon = document.createElement('i');\n    lockIcon.classList.add('bi', 'bi-lock', 'no-image-lock-icon');\n    const infoSpan = document.createElement('span');\n    infoSpan.classList.add('no-image-info');\n    blockedDiv.appendChild(lockIcon);\n    blockedDiv.appendChild(infoSpan);\n    newsTitle.classList.add('disabled-title');\n    const secondLockIcon = document.createElement('i');\n    secondLockIcon.classList.add('bi', 'bi-lock-fill', 'disabled-title-lock-icon');\n    titleAndArticle.prepend(secondLockIcon);\n    newsTitle.textContent = \"Backer-only content\";\n    imageContainer.appendChild(blockedDiv);\n    if (news.turning_point_type === undefined) {\n      infoSpan.innerHTML = \"Subscribe to the <span class='bold-font'>BACKER</span> tier to unlock and read all news articles!\";\n      newsTitle.textContent = \"Backer-only content\";\n    }\n    else {\n      infoSpan.innerHTML = \"Subscribe to the <span class='bold-font'>INSIDER</span> tier to read and <span class='bold-font'>DECIDE</span> the outcome of turning points!\";\n      newsTitle.textContent = \"Insider-only content\";\n    }\n\n    const patreonButton = document.createElement('a');\n    patreonButton.classList.add('patreon-button');\n    patreonButton.href = \"https://www.patreon.com/cw/f1dbeditor/membership\";\n    //open in a new window\n    patreonButton.target = \"_blank\";\n    const patreonIcon = document.createElement('div');\n    patreonIcon.classList.add('patreon-button-logo');\n    const patreonSpan = document.createElement('span');\n    patreonSpan.classList.add('patreon-button-text');\n    patreonSpan.textContent = \"Support us on Patreon\";\n    patreonButton.appendChild(patreonIcon);\n    patreonButton.appendChild(patreonSpan);\n    blockedDiv.appendChild(patreonButton);\n  }\n\n\n  addReadButtonListener(readButton, newsItem, news, newsList);\n  contextButton.addEventListener('click', async () => {\n    const result = await openContextModal(news.title);\n    if (!result.confirmed) return;\n    await openNewsModalFlow(news, newsItem, newsList, { extraContext: result.context });\n  });\n\n  newsItem.appendChild(imageContainer);\n  titleAndArticle.appendChild(newsTitle);\n  newsBody.appendChild(titleAndArticle);\n\n  manageTurningPointButtons(news, newsList, maxDate, newsBody, readbuttonContainer, newsAvailable);\n\n\n  newsBody.appendChild(readbuttonContainer);\n\n  if (!news.nonReadable || news.nonReadable === false) { //first check - if the news is readable\n    const canUserRead =\n      (!isTurning && window.__USER_DATA__?.paidMember === true) ||\n      (isTurning && (window.__USER_DATA__?.tierNumber >= 2 || isAduoTurningPoint));\n\n    if (canUserRead) {\n      if (canUseGenAiForNews(news)) {\n        readActions.appendChild(contextButton);\n      }\n      readActions.appendChild(readButton);\n      readbuttonContainer.appendChild(readActions);\n    }\n\n  }\n\n  //if news has .isCurrentSeason and its false, remove read button and turning point buttons\n  if (isCurrentSeason === false && (news.text === undefined || news.text === null)) {\n    readButton.remove();\n    contextButton.remove();\n    const tpDiv = readbuttonContainer.querySelector('.turning-point-div');\n    if (tpDiv) tpDiv.remove();\n  }\n\n\n  newsItem.appendChild(newsBody);\n\n  if (news.type === \"race_result\" || news.type === \"quali_result\") {\n    newsItem.dataset.type = news.type;\n  }\n  else if (news.type === \"fake_transfer\" || news.type === \"big_transfer\" || news.type === \"contract_renewal\" || news.type === \"silly_season_rumors\") {\n    newsItem.dataset.type = \"driver_transfers\";\n  }\n  else if (news.type === \"massive_exit\" || news.type === \"massive_signing\") {\n    newsItem.dataset.type = \"driver_transfers\";\n  }\n  else if (news.type === \"potential_champion\" || news.type === \"world_champion\" || news.type === \"season_review\" || news.type === \"team_comparison\" || news.type === \"driver_comparison\") {\n    newsItem.dataset.type = \"others\";\n  }\n  else if (news.type.includes(\"turning_point\")) {\n    newsItem.dataset.type = \"turning_points\";\n  }\n  return newsItem;\n}\n\nfunction computeStableKey(n) {\n  if (n.id != null && n.id !== \"\") return String(n.id);\n  return \"h:\" + hashStr(`${n.title}|${n.date}`);\n}\n\n\n\nexport async function place_news(newsAndTurningPoints, newsAvailable) {\n  let newsList = newsAndTurningPoints.newsList;\n  let turningPointState = newsAndTurningPoints.turningPointState;\n  let isCurrentSeason = newsAndTurningPoints.isCurrentSeason;\n  await finishGeneralLoader();\n\n  let maxDate;\n  newsGrid.innerHTML = '';\n\n  for (let i = 0; i < newsList.length; i++) {\n    const news = newsList[i];\n\n    // clave estable\n    news.stableKey = news.stableKey ?? computeStableKey(news);\n\n    const isTurning = (\n      news.turning_point_type === 'original' ||\n      news.turning_point_type === 'approved' ||\n      news.turning_point_type === 'cancelled'\n    );\n    const isAduoTurningPoint = news.type === \"turning_point_aduo\";\n\n    const h = hashStr(news.stableKey);\n    const isFreeTier = !window.__USER_DATA__?.paidMember && !newsAvailable.normal && !newsAvailable.turning;\n    if (isFreeTier) {\n      news.hiddenByAvailability = !isAduoTurningPoint;\n      news.hiddenReason = news.hiddenByAvailability ? (isTurning ? 'turning' : 'normal') : null;\n    } else {\n      if (!newsAvailable.turning && isTurning) {\n        news.hiddenByAvailability = (h % BUCKET_TURNING) !== 0;\n        news.hiddenReason = news.hiddenByAvailability ? 'turning' : null;\n      } else if (!newsAvailable.normal && !isTurning) {\n        news.hiddenByAvailability = (h % BUCKET_NORMAL) !== 0;\n        news.hiddenReason = news.hiddenByAvailability ? 'normal' : null;\n      } else {\n        news.hiddenByAvailability = false;\n        news.hiddenReason = null;\n      }\n    }\n\n\n    if (!maxDate || news.date > maxDate) maxDate = news.date;\n\n    const newsItem = createNewsItemElement(news, i, newsAvailable, newsList, maxDate, isCurrentSeason);\n    newsGrid.appendChild(newsItem);\n    setTimeout(() => {\n      newsItem.classList.remove('fade-in');\n      newsItem.style.removeProperty('--order');\n      newsItem.style.opacity = '1';\n    }, 1500);\n  }\n\n  if (!isCurrentSeason && isCurrentSeason !== undefined) { //if it's undefined it should go to else\n    document.querySelector(\"#reloadNews\").classList.add(\"d-none\");\n    document.querySelector(\"#regenerateArticle\").classList.add(\"d-none\");\n    document.querySelector(\"#createCustomNews\")?.classList.add(\"d-none\");\n  }\n  else {\n    document.querySelector(\"#reloadNews\").classList.remove(\"d-none\");\n    document.querySelector(\"#regenerateArticle\").classList.remove(\"d-none\");\n    document.querySelector(\"#createCustomNews\")?.classList.remove(\"d-none\");\n  }\n}\n\nexport async function place_turning_outcome(turningPointResponse, newsList) {\n  if (!turningPointResponse) return;\n  let saveName = getSaveName();\n  saveName = saveName.split('.')[0];\n\n  const newsItem = document.createElement('div');\n  newsItem.classList.add('news-item', 'fade-in');\n\n  const newsBody = document.createElement('div');\n  newsBody.classList.add('news-body');\n  const titleAndArticle = document.createElement('div');\n  titleAndArticle.classList.add('title-and-article');\n  const newsTitle = document.createElement('span');\n  newsTitle.classList.add('news-title', 'bold-font');\n  newsTitle.textContent = turningPointResponse.title;\n\n  const imageContainer = document.createElement('div');\n  imageContainer.classList.add('news-image-container');\n\n  manage_overlay(imageContainer, turningPointResponse.overlay, turningPointResponse.data, turningPointResponse.image);\n\n  const image = document.createElement('img');\n  image.classList.add('news-image');\n  image.setAttribute('data-src', turningPointResponse.image);\n  image.src = turningPointResponse.image;\n  image.setAttribute(\"loading\", \"lazy\");\n\n  const readbuttonContainer = document.createElement('div');\n  readbuttonContainer.classList.add('read-button-container');\n\n  const readActions = document.createElement('div');\n  readActions.classList.add('read-actions');\n\n  const contextButton = document.createElement('div');\n  contextButton.classList.add('context-read-button');\n  contextButton.setAttribute('title', 'Add context');\n  const contextIcon = document.createElement('i');\n  contextIcon.classList.add('bi', 'bi-chat-text');\n  contextButton.appendChild(contextIcon);\n\n  const readButton = document.createElement('div');\n  readButton.classList.add('read-button');\n  const readButtonSpan = document.createElement('span');\n  readButtonSpan.innerText = \"Read\";\n  readButton.appendChild(readButtonSpan);\n\n  readButton.addEventListener('click', async () => {\n    await openNewsModalFlow(turningPointResponse, newsItem, newsList);\n  });\n\n  contextButton.addEventListener('click', async () => {\n    const result = await openContextModal(turningPointResponse.title);\n    if (!result.confirmed) return;\n    await openNewsModalFlow(turningPointResponse, newsItem, newsList, { extraContext: result.context });\n  });\n\n  imageContainer.appendChild(image);\n  newsItem.appendChild(imageContainer);\n  titleAndArticle.appendChild(newsTitle);\n  newsBody.appendChild(titleAndArticle);\n  readActions.appendChild(contextButton);\n  readActions.appendChild(readButton);\n  readbuttonContainer.appendChild(readActions);\n  newsBody.appendChild(readbuttonContainer);\n  newsItem.appendChild(newsBody);\n\n\n  //append it at the start of the news grid\n  prependAnimated(newsGrid, newsItem, 250, 'cubic-bezier(.2,.8,.2,1)');\n}\n\nasync function imageExists(url) {\n  try {\n    const res = await fetch(url, { method: 'HEAD' });\n    return res.ok;\n  } catch (err) {\n    return false;\n  }\n}\n\nfunction prependAnimated(container, newEl, duration = 250, easing = 'ease') {\n  // 1) Hijos actuales y posiciones BEFORE\n  const oldChildren = Array.from(container.children);\n  const before = new Map();\n  oldChildren.forEach(el => before.set(el, el.getBoundingClientRect()));\n\n  // 2) Inserta el nuevo al principio (todavía sin transición)\n  container.insertBefore(newEl, container.firstChild);\n\n  // 3) Forzamos reflow tras el insert (importante)\n  //    Leer una propiedad de layout obliga al navegador a calcular posiciones.\n  //    offsetHeight / getBoundingClientRect / getComputedStyle valen.\n  void container.offsetHeight;\n\n  // 4) Posiciones AFTER de los elementos que ya estaban\n  const after = new Map();\n  oldChildren.forEach(el => after.set(el, el.getBoundingClientRect()));\n\n  // 5) Preparar el NUEVO para entrar desde arriba (sin transición aún)\n  const newRect = newEl.getBoundingClientRect();\n  newEl.style.willChange = 'transform, opacity';\n  newEl.style.transform = `translateY(-${newRect.height}px)`;\n  newEl.style.opacity = '0';\n\n  // 6) Preparar los ANTIGUOS con el delta (sin transición aún)\n  oldChildren.forEach(el => {\n    const a = after.get(el);\n    const b = before.get(el);\n    if (!a || !b) return;\n    const dx = b.left - a.left;\n    const dy = b.top - a.top;\n    if (dx === 0 && dy === 0) return;\n    el.style.willChange = 'transform';\n    el.style.transform = `translate(${dx}px, ${dy}px)`;\n  });\n\n  // 7) Forzamos reflow otra vez para “congelar” los transforms iniciales\n  void container.offsetHeight;\n\n  // 8) Activamos transición y “soltamos” a 0 para que animen\n  newEl.style.transition = `transform ${duration}ms ${easing}, opacity ${duration}ms ${easing}`;\n  oldChildren.forEach(el => {\n    el.style.transition = `transform ${duration}ms ${easing}`;\n  });\n\n  // Usar rAF ayuda a que el navegador separe bien los pasos\n  requestAnimationFrame(() => {\n    newEl.style.transform = 'translate(0, 0)';\n    newEl.style.opacity = '1';\n    oldChildren.forEach(el => {\n      el.style.transform = 'translate(0, 0)';\n    });\n  });\n\n  // 9) Limpieza al terminar\n  const clean = (el, prop) => (e) => {\n    if (e.propertyName !== prop) return;\n    el.style.transition = '';\n    el.style.transform = '';\n    el.style.willChange = '';\n    if (el === newEl) el.style.opacity = '';\n    el.removeEventListener('transitionend', cleanupFns.get(el));\n    cleanupFns.delete(el);\n  };\n  const cleanupFns = new Map();\n  oldChildren.forEach(el => {\n    const fn = clean(el, 'transform');\n    cleanupFns.set(el, fn);\n    el.addEventListener('transitionend', fn);\n  });\n  const newFn = clean(newEl, 'opacity');\n  cleanupFns.set(newEl, newFn);\n  newEl.addEventListener('transitionend', newFn);\n}\n\nasync function getTurningPointEvents(date) {\n  const command = new Command(\"getNews\", {});\n  let resp = await command.promiseExecute();\n  let news = resp.content;\n\n  const newsWithId = Object.entries(news).map(([id, n]) => ({ id, ...n }));\n  const turningPointsOutcomes = newsWithId.filter(n => n.id.startsWith('turning_point_outcome_') || n.id.includes('_world_champion'));\n\n  const events = [];\n\n  if (turningPointsOutcomes.length > 0) {\n    turningPointsOutcomes.forEach(tp => {\n      const turningDate = tp.date;\n      if ((tp.turning_point_type === \"positive\" || tp.id.includes('_world_champion')) && Number(turningDate) <= Number(date)) {\n        if (tp.id.includes(\"investment\")) {\n          events.push({\n            type: \"investment\",\n            country: tp.data.country,\n            amount: tp.data.investmentAmount,\n            team: tp.data.teamName,\n            share: tp.data.investmentShare\n          });\n        }\n        else if (tp.id.includes(\"technical_directive\")) {\n          events.push({\n            type: \"technical_directive\",\n            component: tp.data.component,\n            reason: tp.data.reason\n          });\n        }\n        else if (tp.id.includes(\"dsq\")) {\n          events.push({\n            type: \"disqualification\",\n            country: tp.data.country,\n            team: tp.data.team,\n            component: tp.data.component\n          });\n        }\n        else if (tp.id.includes(\"substitution\")) {\n          events.push({\n            type: \"race_substitution\",\n            original: tp.data.originalCountry,\n            reason: tp.data.reason,\n            substitute: tp.data.substituteCountry\n          });\n        }\n        else if (tp.id.includes(\"transfer\")) {\n          events.push({\n            type: \"driver_transfer\",\n            driverOut: tp.data.driver_out?.name,\n            team: tp.data.team,\n            driverIn: tp.data.driver_in?.name\n          });\n        }\n        else if (tp.id.includes(\"injury\")) {\n          events.push({\n            type: \"driver_injury\",\n            driver: tp.data.driver_affected?.name,\n            condition: tp.data.condition?.condition,\n            reason: tp.data.condition?.reason,\n            racesMissed: tp.data.condition?.races_affected?.length || 1,\n            replacement: tp.data.reserve_driver?.name\n          });\n        }\n        else if (tp.id.includes(\"_world_champion\")) {\n          events.push({\n            type: \"world_champion_crowned\",\n            driver: tp.data.driver_name,\n            team: combined_dict[tp.data.driver_team_id],\n            season: tp.data.season_year,\n            race: tp.data.adjective\n          });\n        }\n      }\n    });\n  }\n  return events;\n}\n\n\n\nfunction buildContextData(data, config = {}) {\n  const {\n    driverStandings,\n    teamStandings,\n    driversResults,\n    racesNames,\n    champions,\n    driverQualiResults,\n    enrichedAllTime\n  } = data;\n  const { timing = '', teamId = null, teamName = '', seasonYear = '' } = config;\n\n  const contextData = {\n    timing,\n    seasonYear\n  };\n\n  if (driverStandings) {\n    contextData.driverStandings = driverStandings.map((d, i) => ({\n      position: i + 1,\n      name: d.name,\n      team: combined_dict[d.teamId],\n      points: d.points,\n      gapToLeader: d.gapToLeader || 0\n    }));\n  }\n\n  if (teamStandings) {\n    contextData.teamStandings = teamStandings.map((t, i) => ({\n      position: i + 1,\n      name: combined_dict[t.teamId] || `Team ${t.teamId}`,\n      points: t.points\n    }));\n  }\n\n  if (racesNames && racesNames.length > 0) {\n    contextData.previousRaces = racesNames;\n  }\n\n  if (driversResults) {\n    let resultsToProcess = driversResults;\n    if (teamId) {\n      resultsToProcess = driversResults.filter(d => d.teamId === teamId);\n    }\n    contextData.driverRaceResults = resultsToProcess.map(d => ({\n      name: d.name,\n      wins: d.nWins,\n      podiums: d.nPodiums,\n      pointsFinishes: d.nPointsFinishes,\n      resultsHistory: d.resultsString\n    }));\n  }\n\n  if (driverQualiResults) {\n    let resultsToProcess = driverQualiResults;\n    if (teamId) {\n      resultsToProcess = driverQualiResults.filter(d => d.teamId === teamId);\n    }\n    contextData.driverQualiResults = resultsToProcess.map(d => ({\n      name: d.name,\n      wins: d.nWins,\n      podiums: d.nPodiums,\n      pointsFinishes: d.nPointsFinishes,\n      resultsHistory: d.resultsString\n    }));\n  }\n\n  if (champions) {\n    contextData.championsHistory = Object.values(\n      champions.reduce((acc, { season, pos, name, points }) => {\n        if (!acc[season]) acc[season] = { season, drivers: [] };\n        acc[season].drivers.push({ position: pos, name, points });\n        return acc;\n      }, {})\n    ).sort((a, b) => b.season - a.season);\n  }\n\n  if (enrichedAllTime && enrichedAllTime.length > 0) {\n    let list = enrichedAllTime;\n    if (teamId && 'teamId' in (list[0] || {})) {\n      list = list.filter(d => d.teamId === teamId);\n    }\n    contextData.driverCareerStats = list.map(d => ({\n      name: d.name || `Driver ${d.id}`,\n      championships: d.totalChampionshipWins ?? 0,\n      wins: d.totalWins ?? 0,\n      podiums: d.totalPodiums ?? 0,\n      starts: d.totalStarts ?? 0,\n      isRookie: Number(seasonYear) === Number(d.firstRace.season)\n    }));\n  }\n\n  return contextData;\n}\n\nfunction buildContextualPrompt(data, config = {}) {\n  const {\n    driverStandings,\n    teamStandings,\n    driversResults,\n    racesNames,\n    champions,\n    driverQualiResults,\n    enrichedAllTime,\n    driverRaceResults\n  } = data;\n  const { timing = '', teamId = null, teamName = '', seasonYear = '' } = config;\n\n  let prompt = '';\n\n  if (driverStandings) {\n    const driversChamp = driverStandings\n      .map((d, i) => `${i + 1}. ${d.name} (${combined_dict[d.teamId]}) — ${d.points} pts (${d.gapToLeader ? `+${d.gapToLeader} pts to leader` : ''})`)\n      .join(\"\\n\");\n    prompt += `\\n\\nCurrent Drivers' Championship standings ${timing}:\\n${driversChamp}`;\n  }\n\n  if (teamStandings) {\n    const teamsChamp = teamStandings\n      .map((t, i) => {\n        const name = combined_dict[t.teamId] || `Team ${t.teamId}`;\n        return `${i + 1}. ${name} — ${t.points} pts`;\n      })\n      .join(\"\\n\");\n    prompt += `\\n\\nCurrent Constructors' Championship standings ${timing}:\\n${teamsChamp}`;\n  }\n\n  if (racesNames && racesNames.length > 0) {\n    let previousRaces = racesNames.join(', ');\n    prompt += `\\n\\nThe races that have already taken place before this one in ${seasonYear} are: ${previousRaces}\\n`;\n  }\n\n  if (driversResults) {\n    let resultsToProcess = driversResults;\n    if (teamId) {\n      resultsToProcess = driversResults.filter(d => d.teamId === teamId);\n    }\n\n    const previousResults = resultsToProcess.map((d) => {\n      const details = [\n        d.nWins > 0 ? `${d.nWins} wins` : '',\n        d.nPodiums > 0 ? `${d.nPodiums} podiums` : '',\n        (d.nWins === 0 && d.nPodiums === 0 && d.nPointsFinishes > 0) ? `${d.nPointsFinishes} points finishes` : ''\n      ].filter(Boolean).join(', ');\n\n      return `${d.name}${details ? ` (${details})` : ''} ${d.resultsString}`;\n    }).join(\"\\n\");\n\n    if (teamId && teamName) {\n      prompt += `\\n\\nHere are the previous race results for ${teamName}'s drivers:\\n${previousResults}`;\n    } else if (resultsToProcess.length > 0) {\n      prompt += `\\n\\nHere are the previous race results for each driver:\\n${previousResults}`;\n    }\n  }\n\n  if (driverQualiResults) {\n    let qualiResultsToProcess = driverQualiResults;\n    if (teamId) {\n      qualiResultsToProcess = driverQualiResults.filter(d => d.teamId === teamId);\n    }\n\n    const previousQualiResults = qualiResultsToProcess.map(d => {\n      const details = [\n        d.nWins > 0 ? `${d.nWins} poles` : '',\n        d.nPodiums > 0 ? `${d.nPodiums} top 3s` : '',\n        (d.nWins === 0 && d.nPodiums === 0 && d.nPointsFinishes > 0) ? `${d.nPointsFinishes} top 10s` : ''\n      ].filter(Boolean).join(', ');\n\n      return `${d.name}${details ? ` (${details})` : ''} ${d.resultsString}`;\n    }).join(\"\\n\");\n\n    if (teamId && teamName) {\n      prompt += `\\n\\nHere are the previous qualifying results for ${teamName}'s drivers:\\n${previousQualiResults}`;\n    } else if (qualiResultsToProcess.length > 0) {\n      prompt += `\\n\\nHere are the previous qualifying results for each driver:\\n${previousQualiResults}`;\n    }\n  }\n\n  if (champions) {\n    const previousChampions = Object.values(\n      champions.reduce((acc, { season, pos, name, points }) => {\n        if (!acc[season]) acc[season] = { season, drivers: [] };\n        acc[season].drivers.push(`${pos}. ${name} ${points}pts`);\n        return acc;\n      }, {})\n    )\n      .sort((a, b) => b.season - a.season)\n      .map(({ season, drivers }) => `${season}\\n${drivers.join('\\n')}`)\n      .join('\\n\\n');\n    prompt += `\\n\\nIf you want to mention that someone is the reigning champion, here are the last F1 world champions and runner ups:\\n${previousChampions}`;\n  }\n\n  if (enrichedAllTime.length > 0) {\n    let list = enrichedAllTime;\n\n    // Si los objetos tienen teamId y hay filtro, aplícalo\n    if (teamId && 'teamId' in (list[0] || {})) {\n      list = list.filter(d => d.teamId === teamId);\n    }\n\n    // Construye las líneas: \"<nombre>: X titles, Y wins, Z podiums, W race starts\"\n    const lines = list.map(d => {\n      const titles = d.totalChampionshipWins ?? 0;\n      const wins = d.totalWins ?? 0;\n      const podiums = d.totalPodiums ?? 0;\n      const starts = d.totalStarts ?? 0;\n      const name = d.name || `Driver ${d.id}`;\n      const isRookie = Number(seasonYear) === Number(d.firstRace.season);\n\n      const tLbl = titles === 1 ? 'drivers championship' : 'drivers championships';\n      const wLbl = wins === 1 ? 'race win' : 'race wins';\n      const pLbl = podiums === 1 ? 'podium' : 'podiums';\n      const sLbl = 'race starts';\n\n      return `${name} ${isRookie ? '(Rookie)' : ''}: ${titles} ${tLbl}, ${wins} ${wLbl}, ${podiums} ${pLbl}, ${starts} ${sLbl}`;\n    }).join('\\n');\n\n\n    if (lines) {\n      prompt += `\\n\\nHere are the stats for each driver in the grid. Drivers not marked with (Rookie) are not rookies anymore. Only mention them if relevant:\\n${lines}`;\n    }\n  }\n\n  return prompt;\n}\n\nconst ADUO_ENGINE_STAT_LABELS = {\n  10: \"Power\",\n  6: \"Fuel efficiency\",\n  14: \"Engine durability\",\n  18: \"ERS durability\",\n  19: \"Gearbox durability\"\n};\n\nconst ADUO_ENGINE_STAT_ORDER = [10, 6, 14, 18, 19];\n\nfunction describeAduoChange(pct) {\n  const v = Number(pct) || 0;\n  if (v > 0) {\n    if (v >= 7) return \"significantly improved\";\n    if (v >= 4) return \"notably improved\";\n    if (v >= 2) return \"improved\";\n    return \"slightly improved\";\n  }\n  if (v < 0) {\n    if (v <= -7) return \"significantly worsened\";\n    if (v <= -4) return \"notably worsened\";\n    if (v <= -2) return \"worsened\";\n    return \"slightly worsened\";\n  }\n  return \"unchanged\";\n}\n\nfunction buildAduoTemplateArticle(newData) {\n  const quarterString = newData?.data?.quarterString || \"current\";\n  const seasonYear = newData?.data?.season;\n  const engineImprovements = Array.isArray(newData?.data?.engineImprovements) ? newData.data.engineImprovements : [];\n\n  const headerBits = [\"## ADUO window\"];\n  if (seasonYear != null) headerBits.push(`(${quarterString} quarter, season ${seasonYear})`);\n  else headerBits.push(`(${quarterString} quarter)`);\n\n  if (!engineImprovements.length) {\n    return `${headerBits.join(\" \")}\\n\\nNo manufacturer upgrade data is available for this window.\\n\\n---\\n\\n*Patreon members can generate a full AI-written article (with quotes and extra context) for this turning point.*`;\n  }\n\n  const blocks = engineImprovements.map((entry) => {\n    const name = entry?.name || \"Unknown manufacturer\";\n    const improvements = entry?.improvements || {};\n\n    const lines = ADUO_ENGINE_STAT_ORDER.map((statId) => {\n      const raw = improvements[statId] ?? improvements[String(statId)];\n      if (raw === undefined || raw === null) return null;\n      const label = ADUO_ENGINE_STAT_LABELS[statId] || `Stat ${statId}`;\n      return `- ${label}: ${describeAduoChange(raw)}`;\n    }).filter(Boolean);\n\n    return `**${name}**\\n${lines.length ? lines.join(\"\\n\") : \"- No detailed stat breakdown available.\"}`;\n  }).join(\"\\n\\n\");\n\n  return `${headerBits.join(\" \")}\\n\\nThis turning point summary lists what each engine manufacturer is expected to improve or worsen in this ADUO window.\\n\\n${blocks}\\n\\n---\\n\\n*Patreon members can generate a full AI-written article (with quotes and extra context) for this turning point.*`;\n}\n\nasync function manageRead(newData, newsList, barProgressDiv, interval, opts = {}) {\n  const { force = false, extraContext = '' } = opts;\n  const stableKey = newData.stableKey ?? newData.id ?? computeStableKey(newData);\n\n  const normalizedType = newData?.type?.startsWith(\"turning_point_outcome_\")\n    ? newData.type.replace(\"turning_point_outcome_\", \"turning_point_\")\n    : newData?.type;\n\n  if (normalizedType === \"turning_point_aduo\" && !canUseGenAiForNews(newData)) {\n    clearInterval(interval);\n    if (barProgressDiv) barProgressDiv.style.width = '100%';\n    return buildAduoTemplateArticle(newData);\n  }\n\n  // 1) Si ya hay texto y NO forzamos, devolvemos el existente\n  if (newData.text && !force) {\n    clearInterval(interval);\n    if (barProgressDiv) barProgressDiv.style.width = '100%';\n    return newData.text;\n  }\n\n  // 2) Tabla de contextualizadores\n  const ctx = {\n    race_result: contextualizeRaceResults,\n    quali_result: contextualizeQualiResults,\n    fake_transfer: contextualizeFakeTransferNews,\n    silly_season_rumors: contextualizeSillySeasonTransferNews,\n    potential_champion: contextualizePotentialChampion,\n    world_champion: contextualizeWorldChampion,\n    big_transfer: contextualizeBigTransferConfirm,\n    massive_exit: contextualizeBigTransferConfirm,\n    massive_signing: contextualizeBigTransferConfirm,\n    contract_renewal: contextualizeRenewalNews,\n    team_comparison: contextualizeTeamComparison,\n    driver_comparison: contextualizeDriverComparison,\n    season_review: contextualizeSeasonReview,\n    race_reaction: contextualizeRaceReaction,\n    next_season_grid: contextualizeNextSeasonGrid,\n    feeder_series_review: contextualizeFeederSeriesReview,\n    custom_new: contextualizeCustomNews,\n\n    // Turning points: outcome_ y no-outcome comparten handler\n    turning_point_dsq: (nd) => contextualizeDSQ(nd, nd.turning_point_type),\n    turning_point_transfer: (nd) => contextualizeTurningPointTransfer(nd, nd.turning_point_type),\n    turning_point_technical_directive: (nd) => contextualizeTurningPointTechnicalDirective(nd, nd.turning_point_type),\n    turning_point_investment: (nd) => contextualizeTurningPointInvestment(nd, nd.turning_point_type),\n    turning_point_race_substitution: (nd) => contextualizeTurningPointRaceSubstitution(nd, nd.turning_point_type),\n    turning_point_injury: (nd) => contextualizeTurningPointInjury(nd, nd.turning_point_type),\n    turning_point_engine_regulation: (nd) => contextualizeTurningPointEngineRegulation(nd, nd.turning_point_type),\n    turning_point_young_drivers: (nd) => contextualizeTurningPointYoungDrivers(nd, nd.turning_point_type),\n    turning_point_aduo: (nd) => contextualizeTurningPointAduo(nd, nd.turning_point_type),\n  };\n\n  // 3) Normaliza tipos \"turning_point_outcome_*\" -> \"turning_point_*\"\n  const normalizeType = (t) =>\n    t?.startsWith(\"turning_point_outcome_\")\n      ? t.replace(\"turning_point_outcome_\", \"turning_point_\")\n      : t;\n\n  const type = normalizeType(newData.type);\n  const handler = ctx[type];\n  if (!handler) {\n    console.warn(\"No handler for news type:\", newData.type);\n  }\n\n  // 4) Progreso visual\n  clearInterval(interval); // detenemos el anterior\n  let progressInterval;\n  try {\n    if (barProgressDiv) barProgressDiv.style.width = '30%';\n    let progress = 30;\n    progressInterval = setInterval(() => {\n      progress = Math.min(progress + 1, 98);\n      if (barProgressDiv) barProgressDiv.style.width = progress + '%';\n      if (progress >= 98) clearInterval(progressInterval);\n    }, 450);\n\n    // 5) Construir prompt SOLO si hace falta\n    let messages = [];\n    const selectedLanguage = getNewsLanguage();\n    const expectsJson = selectedLanguage !== DEFAULT_NEWS_LANGUAGE;\n    if (handler) {\n      let { instruction, context } = await handler(newData);\n      const normalDate = excelToDate(newData.date);\n      const isoDate = new Date(\n        normalDate.getFullYear(),\n        normalDate.getMonth(),\n        normalDate.getDate()\n      ).toISOString().split(\"T\")[0];\n\n      // Add turning point events to context\n      let date = newData.date;\n      context = await addTurningPointContexts(context, date);\n\n      // Add additional contextual info to the prompt template\n      let finalInstruction = `The current date is ${isoDate}\\n\\n` +\n        `\\n\\nAdd any quote you find apporpiate from the drivers or team principals if involved in the article. ` +\n        `\\n\\nThe title of the article is: \"${newData.title}\"`;\n\n      finalInstruction += `\\n\\nEvery time a name has (team name) after it, it means their team.\\n\\nUse **Markdown** formatting in your response for better readability:\\n- Use \"#\" or \"##\" for main and secondary titles.\\n- Always use **bold** driver names and important phrases.\\n- ALWAYS use *italics* for quotes or emotional emphasis.\\n- Use bullet points or numbered lists if needed. Do not include any raw HTML or code blocks.\\nThe final output must be valid Markdown ready to render as HTML.\\n`;\n\n      if (expectsJson) {\n        finalInstruction += `\\n\\nReturn ONLY a JSON object with exactly two keys: \"title\" and \"body\".` +\n          ` The \"title\" must be the translated headline in ${selectedLanguage}.` +\n          ` The \"body\" must be the full article in ${selectedLanguage} using Markdown.` +\n          ` Do not include the title inside the body. Do not add extra keys or wrap the JSON in code fences.`;\n      }\n\n      finalInstruction = replaceLanguagePlaceholder(finalInstruction, selectedLanguage);\n      instruction = replaceLanguagePlaceholder(instruction, selectedLanguage);\n\n      // Message 1: Instruction\n      messages.push({\n        role: \"user\",\n        content: instruction\n      });\n\n      if (extraContext.trim()) {\n        const shortExtraContext = extraContext.slice(0, 1500);\n        messages.push({\n          role: \"user\",\n          content: `Additional context that you MUST incorporate:\\n${shortExtraContext.trim()}`\n        });\n      }\n\n      // Message 1: Context Data\n      messages.push({\n        role: \"user\",\n        content: `Here is context about  results, championship standings, driver stats and important events that happened throughout the season:\\n\\n${context}`\n      });\n\n      // Message 3: Final instructions\n      messages.push({\n        role: \"user\",\n        content: finalInstruction\n      });\n\n      // Ensure {{language}} placeholders are always substituted in every prompt message\n      messages = messages.map(m => ({\n        ...m,\n        content: replaceLanguagePlaceholder(m.content, selectedLanguage)\n      }));\n    }\n\n    console.log(\"Final messages for AI:\", messages);\n\n    // 6) Llama a la IA y guarda\n    const articleText = await askGenAI(messages);\n    const parsedJson = tryParseJsonObject(articleText);\n    let translatedTitle = \"\";\n    let cleanedArticleText = \"\";\n\n    if (parsedJson && typeof parsedJson.body === \"string\" && parsedJson.body.trim()) {\n      cleanedArticleText = cleanArticleOutput(parsedJson.body);\n      if (typeof parsedJson.title === \"string\") {\n        translatedTitle = parsedJson.title.trim();\n      }\n    } else {\n      cleanedArticleText = cleanArticleOutput(articleText);\n    }\n\n    newData.text = cleanedArticleText;\n    if (translatedTitle) {\n      newData.title = translatedTitle;\n      const modalTitle = document.querySelector('#newsModal .modal-title');\n      if (modalTitle) {\n        modalTitle.textContent = translatedTitle;\n      }\n      const openedNewsTitle = document.querySelector('.news-item.opened .news-title');\n      if (openedNewsTitle) {\n        openedNewsTitle.textContent = translatedTitle;\n      }\n    }\n    updateRateLimitsDisplay();\n\n    const patch = { text: cleanedArticleText };\n    if (translatedTitle) {\n      patch.title = translatedTitle;\n    }\n\n    new Command(\"updateNews\", {\n      stableKey,\n      patch\n    }).execute();\n\n    if (barProgressDiv) barProgressDiv.style.width = '100%';\n    return cleanedArticleText;\n\n  } finally {\n    if (progressInterval) clearInterval(progressInterval);\n  }\n}\n\nfunction cleanArticleOutput(rawMd) {\n  let md = rawMd || \"\";\n\n  md = removeLeading(md);\n  md = italicizeQuotes(md);\n\n  return md.trim();\n}\n\nfunction safeJsonParse(raw) {\n  try {\n    return JSON.parse(raw);\n  } catch {\n    return null;\n  }\n}\n\nfunction tryParseJsonObject(raw) {\n  if (typeof raw !== \"string\") return null;\n  let text = raw.trim();\n  if (!text) return null;\n\n  if (text.startsWith(\"```\")) {\n    text = text\n      .replace(/^```(?:json)?\\s*/i, \"\")\n      .replace(/```\\s*$/i, \"\")\n      .trim();\n  }\n\n  let parsed = safeJsonParse(text);\n  if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n    return parsed;\n  }\n\n  const first = text.indexOf(\"{\");\n  const last = text.lastIndexOf(\"}\");\n  if (first !== -1 && last !== -1 && last > first) {\n    parsed = safeJsonParse(text.slice(first, last + 1));\n    if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n      return parsed;\n    }\n  }\n\n  return null;\n}\n\nfunction removeLeading(md) {\n  return md.replace(/^\\s*#{1,3}\\s.*\\n+/, \"\").trimStart();\n}\n\nfunction italicizeQuotes(md) {\n  return md.replace(/\"([^\"]+)\"/g, (match, inner, offset, full) => {\n    const before = full[offset - 1] || \"\";\n    const after = full[offset + match.length] || \"\";\n    if (before === \"*\" || after === \"*\") {\n      return match;\n    }\n    return `*${match}*`;\n  });\n}\n\nasync function contextualizeCustomNews(newData) {\n  const seasonYear = Number(newData?.data?.season_year || currentSeason || 0);\n  const promptText = newData?.data?.prompt || \"Write a custom Formula 1 article.\";\n  const imageFile = newData?.data?.image || \"\";\n\n  let prompt =\n    `Write a Formula 1-style news article based on this custom request:\\n${promptText}\\n\\n` +\n    `The story must stay coherent with the save context, current standings, teams, and driver situation.\\n` +\n    `Do not mention raw filenames or that the story was AI-generated.`;\n\n  if (imageFile) {\n    prompt += `\\n\\nA supporting image has been selected for the article. Use it only as loose visual inspiration if it helps the tone.`;\n  }\n\n  const command = new Command(\"fullChampionshipDetailsRequest\", {\n    season: seasonYear,\n  });\n\n  let resp;\n  try {\n    resp = await command.promiseExecute();\n  } catch (err) {\n    console.error(\"Error fetching full championship details for custom news:\", err);\n    return {\n      instruction: prompt,\n      context: \"\"\n    };\n  }\n\n  const contextData = buildContextualPrompt(resp.content, { seasonYear });\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\nasync function contextualizeTurningPointInjury(newData, turningPointType) {\n  const promptTemplateEntry = turningPointsTemplates.find(t => t.new_type === 106);\n  let prompt;\n  let seasonYear = newData.data.season;\n  if (turningPointType.includes(\"positive\")) {\n    prompt = promptTemplateEntry.positive_prompt;\n  }\n  else if (turningPointType.includes(\"negative\")) {\n    prompt = promptTemplateEntry.negative_prompt;\n  }\n  else {\n    prompt = promptTemplateEntry.prompt;\n  }\n  prompt = prompt\n    .replace(/{{\\s*driver\\s*}}/g, newData.data.driver_affected?.name || 'the driver')\n    .replace(/{{\\s*team\\s*}}/g, newData.data.team || 'the team')\n    .replace(/{{\\s*condition\\s*}}/g, newData.data.condition?.condition || 'a physical issue')\n    .replace(/{{\\s*reason\\s*}}/g, newData.data.condition?.reason || 'a private medical matter')\n    .replace(/{{\\s*races_affected_count\\s*}}/g, (newData.data.condition?.races_affected?.length || 1))\n    .replace(/{{\\s*expectedReturnCountry\\s*}}/g, newData.data.condition?.expectedReturnCountry || 'a later round');\n\n  if (newData.data.reserve_driver) {\n    prompt = prompt.replace(/{{\\s*reserve_driver_part\\s*}}/g, () => {\n      const reserveName = newData.data.reserve_driver?.name || 'the reserve driver';\n      const isFreeAgent = !!newData.data.reserve_driver?.isFreeAgent;\n\n      const t = String(newData.data.turningPointType || newData.data.turning_point_type || '')\n        .toLowerCase();\n      const isPositive = t.includes('positive');\n      const isNegative = t.includes('negative');\n\n      // Destinos y contexto\n      const inTeam = newData.data.team || 'the team';                 // equipo que sufre la baja (lo usabas arriba)\n      const driverNameOut = newData.data.driver_affected?.name || 'the injured driver'; // piloto que se lesiona\n\n      if (isFreeAgent) {\n        if (isPositive) {\n          return `${reserveName} will join ${inTeam} as a free agent to replace ${driverNameOut}.`;\n        } else if (isNegative) {\n          return `${reserveName} would have joined ${inTeam} as a free agent to replace ${driverNameOut}.`;\n        } else {\n          return `${reserveName} is being considered as a free-agent option to replace ${driverNameOut} at ${inTeam}.`;\n        }\n      } else {\n        if (isPositive) {\n          return `${reserveName} will be promoted from ${inTeam}'s reserve/academy to replace ${driverNameOut} at ${inTeam}.`;\n        } else if (isNegative) {\n          return `${reserveName} would have been promoted from ${inTeam}'s reserve/academy to replace ${driverNameOut} at ${inTeam}.`;\n        } else {\n          return `${reserveName} is being discussed as a promotion candidate from ${inTeam}'s reserve/academy to replace ${driverNameOut} at ${inTeam}.`;\n        }\n      }\n    });\n  }\n\n  const command = new Command(\"fullChampionshipDetailsRequest\", {\n    season: seasonYear,\n  });\n  let resp;\n  try {\n    resp = await command.promiseExecute();\n  } catch (err) {\n    console.error(\"Error fetching full championship details:\", err);\n    return;\n  }\n\n  const contextData = buildContextualPrompt(resp.content, { seasonYear });\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\n\nasync function contextualizeTurningPointRaceSubstitution(newData, turningPointType) {\n  const promptTemplateEntry = turningPointsTemplates.find(t => t.new_type === 105);\n  let prompt;\n  let seasonYear = newData.data.season;\n  if (turningPointType.includes(\"positive\")) {\n    prompt = promptTemplateEntry.positive_prompt;\n  }\n  else if (turningPointType.includes(\"negative\")) {\n    prompt = promptTemplateEntry.negative_prompt;\n  }\n  else {\n    prompt = promptTemplateEntry.prompt;\n  }\n  prompt = prompt.replace(/{{\\s*original_race\\s*}}/g, newData.data.originalCountry || 'The original race').\n    replace(/{{\\s*substitute_race\\s*}}/g, newData.data.substituteCountry || 'The substituted race').\n    replace(/{{\\s*reason\\s*}}/g, newData.data.reason || 'The reason');\n\n  const command = new Command(\"fullChampionshipDetailsRequest\", {\n    season: seasonYear,\n  });\n\n  let resp;\n  try {\n    resp = await command.promiseExecute();\n  } catch (err) {\n    console.error(\"Error fetching full championship details:\", err);\n    return;\n  }\n\n  const contextData = buildContextualPrompt(resp.content, { seasonYear });\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\nasync function contextualizeTurningPointInvestment(newData, turningPointType) {\n  const promptTemplateEntry = turningPointsTemplates.find(t => t.new_type === 102);\n  let prompt;\n  let seasonYear = newData.data.season;\n  if (turningPointType.includes(\"positive\")) {\n    prompt = promptTemplateEntry.positive_prompt;\n  }\n  else if (turningPointType.includes(\"negative\")) {\n    prompt = promptTemplateEntry.negative_prompt;\n  }\n  else {\n    prompt = promptTemplateEntry.prompt;\n  }\n\n  prompt = prompt.replace(/{{\\s*team\\s*}}/g, newData.data.team || 'The team').\n    replace(/{{\\s*amount\\s*}}/g, newData.data.investmentAmount || 'X').\n    replace(/{{\\s*share\\s*}}/g, newData.data.investmentShare || 'X').\n    replace(/{{\\s*country\\s*}}/g, newData.data.country || 'X');\n\n  const command = new Command(\"fullChampionshipDetailsRequest\", {\n    season: seasonYear,\n  });\n\n  let resp;\n  try {\n    resp = await command.promiseExecute();\n  } catch (err) {\n    console.error(\"Error fetching full championship details:\", err);\n    return;\n  }\n\n  const contextData = buildContextualPrompt(resp.content, { seasonYear });\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\nasync function contextualizeDSQ(newData, type) {\n  const promptTemplateEntry = turningPointsTemplates.find(t => t.new_type === 103);\n  let prompt;\n  let currentSeason = newData.data.currentSeason;\n  let teamName = newData.data.team;\n  let teamId = newData.data.teamId;\n  if (type.includes(\"positive\")) {\n    prompt = promptTemplateEntry.positive_prompt;\n  }\n  else if (type.includes(\"negative\")) {\n    prompt = promptTemplateEntry.negative_prompt;\n  }\n  else {\n    prompt = promptTemplateEntry.prompt;\n  }\n\n  prompt = prompt.replace(/{{\\s*team\\s*}}/g, newData.data.team || 'The team').\n    replace(/{{\\s*adjective\\s*}}/g, newData.data.adjective || 'current').\n    replace(/{{\\s*component\\s*}}/g, newData.data.component || 'floor').\n    replace(/{{\\s*driver_1\\s*}}/g, newData.data.driver_1.name || 'Driver 1').\n    replace(/{{\\s*driver_2\\s*}}/g, newData.data.driver_2.name || 'Driver 2').\n    replace(/{{\\s*driver_1_pos\\s*}}/g, newData.data.driver_1.position !== undefined ? newData.data.driver_1.position.toString() : 'X').\n    replace(/{{\\s*driver_2_pos\\s*}}/g, newData.data.driver_2.position !== undefined ? newData.data.driver_2.position.toString() : 'X').\n    replace(/{{\\s*driver_1_points\\s*}}/g, newData.data.driver_1.points !== undefined ? newData.data.driver_1.points.toString() : 'X').\n    replace(/{{\\s*driver_2_points\\s*}}/g, newData.data.driver_2.points !== undefined ? newData.data.driver_2.points.toString() : 'X');\n\n  const command = new Command(\"fullChampionshipDetailsRequest\", {\n    season: currentSeason,\n  });\n\n  let resp;\n  try {\n    resp = await command.promiseExecute();\n  } catch (err) {\n    console.error(\"Error fetching full championship details:\", err);\n    return;\n  }\n\n  const timing = type.includes(\"positive\") ? \"after the disqualification\" : \"\";\n  const contextData = buildContextualPrompt(resp.content, { timing, teamId, teamName, seasonYear: currentSeason });\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n\n}\n\nasync function contextualizeTurningPointTechnicalDirective(newData, turningPointType) {\n  const promptTemplateEntry = turningPointsTemplates.find(t => t.new_type === 100);\n  let prompt;\n  if (turningPointType.includes(\"positive\")) {\n    prompt = promptTemplateEntry.positive_prompt;\n  }\n  else if (turningPointType.includes(\"negative\")) {\n    prompt = promptTemplateEntry.negative_prompt;\n  }\n  else {\n    prompt = promptTemplateEntry.prompt;\n  }\n  let seasonYear = newData.data.season;\n\n  const teams = newData.data.effectOnEachteam;\n  //get the best 2 teams and worse 2 by performanceGainLoss. Each team is an object where the key is the teamId and it has an object that has teamName and performanceGainLoss\n  const teamPerformances = Object.entries(teams).map(([teamId, { teamName, performanceGainLoss }]) => ({\n    teamId,\n    teamName,\n    performanceGainLoss\n  }));\n\n  const bestTeams = teamPerformances.sort((a, b) => b.performanceGainLoss - a.performanceGainLoss).slice(0, 2);\n  const worstTeams = teamPerformances.sort((a, b) => a.performanceGainLoss - b.performanceGainLoss).slice(0, 2);\n\n  prompt = prompt.replace(/{{\\s*component\\s*}}/g, newData.data.component || 'The component').\n    replace(/{{\\s*best_team\\s*}}/g, bestTeams[0]?.teamName || 'The team').\n    replace(/{{\\s*second_best\\s*}}/g, bestTeams[1]?.teamName || 'The team').\n    replace(/{{\\s*worse_team\\s*}}/g, worstTeams[0]?.teamName || 'The team').\n    replace(/{{\\s*second_worse\\s*}}/g, worstTeams[1]?.teamName || 'The team').\n    replace(/{{\\s*reason\\s*}}/g, newData.data.reason || 'The reason')\n\n  const command = new Command(\"fullChampionshipDetailsRequest\", {\n    season: seasonYear,\n  });\n\n  let resp;\n  try {\n    resp = await command.promiseExecute();\n  } catch (err) {\n    console.error(\"Error fetching full championship details:\", err);\n    return;\n  }\n\n  const contextData = buildContextualPrompt(resp.content, { seasonYear });\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\nasync function contextualizeTurningPointEngineRegulation(newData, turningPointType) {\n  const promptTemplateEntry = turningPointsTemplates.find(t => t.new_type === 107);\n  let prompt;\n  if (turningPointType.includes(\"positive\")) {\n    prompt = promptTemplateEntry.positive_prompt;\n  }\n  else if (turningPointType.includes(\"negative\")) {\n    prompt = promptTemplateEntry.negative_prompt;\n  }\n  else {\n    prompt = promptTemplateEntry.prompt;\n  }\n\n  const seasonYear = newData.data.season;\n  const changeType = newData.data.changeType || \"minor\";\n  const changeArea = newData.data.mainChangeArea || \"engine regulations\";\n  const winners = Array.isArray(newData.data.winnerNames) ? newData.data.winnerNames : [];\n  const losers = Array.isArray(newData.data.loserNames) ? newData.data.loserNames : [];\n\n  const formatList = (list, fallback) => {\n    if (!list.length) return fallback;\n    if (list.length === 1) return list[0];\n    if (list.length === 2) return `${list[0]} and ${list[1]}`;\n    return `${list.slice(0, -1).join(\", \")} and ${list[list.length - 1]}`;\n  };\n\n  const winnerNames = formatList(winners, \"several manufacturers\");\n  const loserNames = formatList(losers, \"a few rivals\");\n\n  prompt = prompt\n    .replace(/{{\\s*type\\s*}}/g, changeType)\n    .replace(/{{\\s*change_area\\s*}}/g, changeArea)\n    .replace(/{{\\s*winner_names\\s*}}/g, winnerNames)\n    .replace(/{{\\s*loser_names\\s*}}/g, loserNames);\n\n  const command = new Command(\"fullChampionshipDetailsRequest\", {\n    season: seasonYear,\n  });\n\n  let resp;\n  try {\n    resp = await command.promiseExecute();\n  } catch (err) {\n    console.error(\"Error fetching full championship details:\", err);\n    return;\n  }\n\n  const contextData = buildContextualPrompt(resp.content, { seasonYear });\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\nasync function contextualizeTurningPointAduo(newData, turningPointType) {\n  const promptTemplateEntry = turningPointsTemplates.find(t => t.new_type === 109);\n  let prompt = promptTemplateEntry?.prompt;\n  if (!prompt) {\n    console.warn(\"Missing turning point prompt template for ADUO (new_type 109).\");\n    return;\n  }\n\n  const seasonYear = newData.data.season;\n  const manufacturers = newData.data.manufacturers || \"several manufacturers\";\n  const numberPeriod = newData.data.quarterString || \"current\";\n  const engineImprovements = Array.isArray(newData.data.engineImprovements) ? newData.data.engineImprovements : [];\n\n  const getBoostLabel = (pct) => {\n    if (pct >= 7) return \"a huge boost\";\n    if (pct >= 4) return \"a big boost\";\n    if (pct >= 2) return \"a solid gain\";\n    if (pct > 0) return \"a small increase\";\n    if (pct === 0) return \"little to no change\";\n    if (pct > -1) return \"a slight step backwards\";\n    return \"a noticeable drop\";\n  };\n\n  const getAvgChange = (improvements) => {\n    if (!improvements) return 0;\n    let sum = 0;\n    let count = 0;\n    for (const statId of Object.keys(improvements)) {\n      sum += Number(improvements[statId]) || 0;\n      count += 1;\n    }\n    return count ? (sum / count) : 0;\n  };\n\n  const getPowerChange = (improvements) => {\n    if (!improvements) return null;\n    if (improvements[10] !== undefined) return Number(improvements[10]) || 0;\n    if (improvements[\"10\"] !== undefined) return Number(improvements[\"10\"]) || 0;\n    return null;\n  };\n\n  const upgradesSummary = engineImprovements.length\n    ? engineImprovements.map(e => {\n      const name = e.name || \"Unknown manufacturer\";\n      const improvements = e.improvements || {};\n\n      const avg = getAvgChange(improvements);\n      const power = getPowerChange(improvements);\n\n      if (power === null) {\n        return `- ${name}: expected to make ${getBoostLabel(avg)} overall.`;\n      }\n\n      const powerLabel = getBoostLabel(power);\n      const avgLabel = getBoostLabel(avg);\n      if (powerLabel === avgLabel) {\n        return `- ${name}: expected to make ${powerLabel} overall, including in power.`;\n      }\n      return `- ${name}: expected to get ${powerLabel} in power, with ${avgLabel} across the rest of the package.`;\n    }).join(\"\\n\")\n    : \"No manufacturers were clearly identified for upgrades in this ADUO window.\";\n\n  prompt = prompt\n    .replace(/{{\\s*manufacturers\\s*}}/g, manufacturers)\n    .replace(/{{\\s*number_period\\s*}}/g, numberPeriod)\n    .replace(/{{\\s*upgrade_summary\\s*}}/g, upgradesSummary);\n\n  const engineAllocations = window.__ENGINE_ALLOCATIONS__;\n  const engineNames = window.__ENGINE_NAMES__;\n  if (engineAllocations && typeof engineAllocations === \"object\") {\n    const teamIds = Object.keys(engineAllocations)\n      .map((id) => Number(id))\n      // Hide \"Team 32\" when custom team is not enabled (renderer removes combined_dict[32] in that case).\n      .filter((id) => id !== 32 || (32 in combined_dict))\n      .sort((a, b) => a - b);\n\n    const lines = teamIds.map((teamId) => {\n      const engineId = Number(engineAllocations[String(teamId)]);\n      const teamName = combined_dict[teamId] || `Team ${teamId}`;\n      const engineName = engineNames?.[engineId] || `Engine ${engineId}`;\n      return `- ${teamName}: ${engineName}`;\n    });\n\n    if (lines.length) {\n      prompt += `\\n\\nCurrent engine allocations:\\n${lines.join(\"\\n\")}`;\n    }\n  }\n\n  const command = new Command(\"fullChampionshipDetailsRequest\", {\n    season: seasonYear,\n  });\n\n  let resp;\n  try {\n    resp = await command.promiseExecute();\n  } catch (err) {\n    console.error(\"Error fetching full championship details:\", err);\n    return;\n  }\n\n  const contextData = buildContextualPrompt(resp.content, { seasonYear });\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\nasync function contextualizeTurningPointYoungDrivers(newData, turningPointType) {\n  const promptTemplateEntry = turningPointsTemplates.find(t => t.new_type === 108);\n  let prompt;\n  if (turningPointType.includes(\"positive\")) {\n    prompt = promptTemplateEntry.positive_prompt;\n  }\n  else if (turningPointType.includes(\"negative\")) {\n    prompt = promptTemplateEntry.negative_prompt;\n  }\n  else {\n    prompt = promptTemplateEntry.prompt;\n  }\n\n  const prospects = Array.isArray(newData.data.prospects) ? newData.data.prospects : [];\n  const prospectsList = prospects.map(p => {\n    const series = p.series || \"Junior\";\n    const age = p.age != null ? `age ${p.age}` : \"age unknown\";\n    const pos = p.position != null ? `P${p.position}` : \"\";\n    const points = p.points != null ? `${p.points} pts` : \"\";\n    return `${p.name} (${series}, ${age}, ${pos}, ${points})`;\n  }).join(\"\\n\");\n\n  const seriesSet = new Set(prospects.map(p => p.series).filter(Boolean));\n  const seriesList = Array.from(seriesSet).filter(s => s !== \"Free\");\n  let seriesContext = \"\";\n  if (seriesSet.size === 0) {\n    seriesContext = \"There is no confirmed series breakdown for these prospects.\";\n  } else if (seriesSet.size === 1 && seriesSet.has(\"Free\")) {\n    seriesContext = \"The standout names this year are drivers from regional formulas outside the main junior championships.\";\n  } else if (seriesSet.has(\"Free\") && seriesList.length) {\n    seriesContext = `The shortlist includes drivers from ${seriesList.join(\" and \")} as well as drivers from regional formulas outside those championships.`;\n  } else {\n    seriesContext = `The shortlist includes drivers from ${seriesList.join(\" and \")}.`;\n  }\n\n  prompt = prompt\n    .replace(/{{\\s*driver1\\s*}}/g, newData.data.driver1 || \"a leading prospect\")\n    .replace(/{{\\s*driver2\\s*}}/g, newData.data.driver2 || \"another leading prospect\")\n    .replace(/{{\\s*prospects_list\\s*}}/g, prospectsList || \"No prospect data available.\");\n\n  if (seriesContext) {\n    prompt += `\\n\\n${seriesContext}`;\n  }\n\n  const seasonYear = newData.data.season;\n  const command = new Command(\"fullChampionshipDetailsRequest\", {\n    season: seasonYear,\n  });\n\n  let resp;\n  try {\n    resp = await command.promiseExecute();\n  } catch (err) {\n    console.error(\"Error fetching full championship details:\", err);\n    return;\n  }\n\n  let contextData = buildContextualPrompt(resp.content, { seasonYear });\n  if (prospectsList) {\n    contextData += `\\n\\nYoung prospects summary:\\n${prospectsList}`;\n  }\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\nasync function contextualizeTurningPointTransfer(newData, turningPointType) {\n  const promptTemplateEntry = turningPointsTemplates.find(t => t.new_type === 101);\n  let prompt;\n  if (turningPointType.includes(\"positive\")) {\n    prompt = promptTemplateEntry.positive_prompt;\n  }\n  else if (turningPointType.includes(\"negative\")) {\n    prompt = promptTemplateEntry.negative_prompt;\n  }\n  else {\n    prompt = promptTemplateEntry.prompt;\n  }\n\n  let seasonYear = newData.data.season;\n  let driverInTeam = combined_dict[newData.data.driver_in.teamId] || 'the previous team';\n\n  prompt = prompt.replace(/{{\\s*driver_in\\s*}}/g, newData.data.driver_in.name || 'The driver').\n    replace(/{{\\s*driver_out\\s*}}/g, newData.data.driver_out.name || 'The driver').\n    replace(/{{\\s*team\\s*}}/g, newData.data.team || 'The team').\n    replace(/{{\\s*driver_in_team\\s*}}/g, driverInTeam || 'The previous team')\n\n  let drivers = [\n    {\n      driverId: newData.data.driver_in.id,\n      teamId: newData.data.driver_in.teamId,\n      name: newData.data.driver_in.name,\n      team: combined_dict[newData.data.driver_in.teamId]\n    }\n  ]\n\n  let date = newData.date;\n\n  const command = new Command(\"transferRumorRequest\", {\n    drivers,\n    date\n  });\n\n  let resp;\n  try {\n    resp = await command.promiseExecute();\n  } catch (err) {\n    console.error(\"Error fetching transfer rumor:\", err);\n    return;\n  }\n\n  if (newData.data.driver_substitute && turningPointType.includes(\"positive\")) {\n    let driverSubstituteTeam = combined_dict[newData.data.driver_substitute.teamId] || '';\n    prompt = prompt.replace(\n      /{{\\s*driver_substitute_part\\s*}}/g,\n      () => {\n        const substituteName = newData.data.driver_substitute.name;\n        const driverInName = newData.data.driver_in.name;\n        const inTeam = driverInTeam || 'the team';\n\n        let fromPart;\n\n        if (driverSubstituteTeam) {\n          if (driverSubstituteTeam === driverInTeam) {\n            fromPart = `from the ${inTeam}'s academy program`;\n          } else {\n            fromPart = `from ${driverSubstituteTeam}`;\n          }\n        } else {\n          fromPart = 'as a free agent';\n        }\n\n        return `${substituteName} will sign for ${inTeam} as a substitute for ${driverInName}, coming ${fromPart}.`;\n      }\n    );\n  }\n  else {\n    prompt = prompt.replace(/{{\\s*driver_substitute_part\\s*}}/g, '');\n  }\n\n  const contextData = buildContextualPrompt(resp.content, { seasonYear });\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\nasync function contextualizeWorldChampion(newData) {\n  const promptTemplateEntry = newsPromptsTemaplates.find(t => t.new_type === 9);\n  if (!promptTemplateEntry) {\n    console.error(\"Prompt template for new_type 8 not found!\");\n    return \"Error: Prompt template not found.\";\n  }\n  let prompt = promptTemplateEntry.prompt;\n\n  prompt = prompt.replace(/{{\\s*driver_name\\s*}}/g, newData.data.driver_name || 'The leading driver');\n  prompt = prompt.replace(/{{\\s*season_year\\s*}}/g, newData.data.season_year || 'the current season');\n  prompt = prompt.replace(/{{\\s*circuit\\s*}}/g, newData.data.circuit_name || 'the upcoming circuit');\n  prompt = prompt.replace(/{{\\s*rival_driver_name\\s*}}/g, newData.data.rival_driver_name || 'their closest rival');\n  prompt = prompt.replace(/{{\\s*driver_points\\s*}}/g, newData.data.driver_points !== undefined ? newData.data.driver_points.toString() : 'current');\n  prompt = prompt.replace(/{{\\s*rival_points\\s*}}/g, newData.data.rival_points !== undefined ? newData.data.rival_points.toString() : 'current');\n\n  const command = new Command(\"raceDetailsRequest\", {\n    raceid: newData.data.raceId,\n  });\n\n  let standingsResp = '';\n  let contextData = \"\";\n\n  try {\n    standingsResp = await command.promiseExecute();\n    if (standingsResp && standingsResp.content) {\n\n      const raceNumber = standingsResp.content.racesNames.length + 1;\n\n      const numberOfRace = `The title was sealed after race ${raceNumber} out of ${standingsResp.content.nRaces} in this season.`;\n\n      prompt += `\\n\\n${numberOfRace}`;\n\n      contextData = buildContextualPrompt(standingsResp.content, { timing: \"after this race\", seasonYear: newData.data.season_year });\n    } else {\n      prompt += \"\\n\\nCould not retrieve current championship standings.\";\n    }\n  } catch (err) {\n    console.error(\"Error fetching standings for potential champion news:\", err);\n    prompt += \"\\n\\nError fetching championship standings.\";\n  }\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\nasync function contextualizePotentialChampion(newData) {\n  const promptTemplateEntry = newsPromptsTemaplates.find(t => t.new_type === 8);\n  if (!promptTemplateEntry) {\n    console.error(\"Prompt template for new_type 8 not found!\");\n    return \"Error: Prompt template not found.\";\n  }\n  let prompt = promptTemplateEntry.prompt;\n\n\n  prompt = prompt.replace(/{{\\s*driver_name\\s*}}/g, newData.data.driver_name || 'The leading driver');\n  prompt = prompt.replace(/{{\\s*season_year\\s*}}/g, newData.data.season_year || 'the current season');\n  prompt = prompt.replace(/{{\\s*circuit\\s*}}/g, newData.data.circuit_name || 'the upcoming circuit');\n  prompt = prompt.replace(/{{\\s*rival_driver_name\\s*}}/g, newData.data.rival_driver_name || 'their closest rival');\n  prompt = prompt.replace(/{{\\s*driver_points\\s*}}/g, newData.data.driver_points !== undefined ? newData.data.driver_points.toString() : 'current');\n  prompt = prompt.replace(/{{\\s*rival_points\\s*}}/g, newData.data.rival_points !== undefined ? newData.data.rival_points.toString() : 'current');\n\n\n\n  const command = new Command(\"raceDetailsRequest\", {\n    raceid: parseInt(newData.data.raceId) - 1,\n  });\n\n  let standingsResp, previousRaces = '';\n  let contextData = \"\";\n\n  try {\n    standingsResp = await command.promiseExecute();\n    if (standingsResp && standingsResp.content) {\n      const c = standingsResp.content;\n      const raceNumber = c.racesNames.length + 1;\n\n      // Arregla el doble \"sealed sealed\"\n      const numberOfRace = `The title could be sealed after race ${raceNumber} out of ${c.nRaces} this season.`;\n      prompt += `\\n\\n${numberOfRace}`;\n\n      // Contexto antes de esta carrera\n      contextData = buildContextualPrompt(c, { timing: \"before this race\", seasonYear: newData.data.season_year });\n\n      // Reglas de puntos (tal cual las comunicas)\n      prompt += `\\n\\nThe maximum amount of points for the winner in each race is ${c.pointsSchema.twoBiggestPoints[0]}.\n      \\nIn each sprint race the maximum points for the winner is 8.\n      \\n${c.pointsSchema.isLastraceDouble ? 'The last race of the season awards double points.' : ''}\n      \\n${c.pointsSchema.fastestLapBonusPoint ? 'There is also 1 bonus point for the fastest lap (top 10 finish required).' : ''}\n      \\n${c.pointsSchema.poleBonusPoint ? 'There is also 1 bonus point for pole position in qualifying.' : ''}`;\n\n      // === NUEVO: carreras después de esta (quitamos la primera de remainingRaces) ===\n      const rem = Array.isArray(c.remainingRaces) ? c.remainingRaces : [];\n      const afterThis = rem.length > 0 ? rem.slice(1) : [];\n\n      if (afterThis.length > 0) {\n        const racesText = afterThis\n          .map(r => `${r.trackName}${r.sprint ? \" (Sprint)\" : \"\"}`)\n          .join(\", \");\n        prompt += `\\n\\nAfter this race, there will be ${afterThis.length} more: ${racesText}.`;\n      } else {\n        prompt += `\\n\\nAfter this race, there will be no more races left.`;\n      }\n\n      // === NUEVO: cálculo de puntos máximos aún disponibles DESPUÉS de esta carrera ===\n      const schema = c.pointsSchema;\n      const raceWinPts = Number(schema.twoBiggestPoints?.[0] ?? 25); // fallback 25\n      const sprintWinPts = 8; // según tu texto\n      const flBonus = schema.fastestLapBonusPoint ? 1 : 0;\n      const poleBonus = schema.poleBonusPoint ? 1 : 0;\n\n      // Sumamos por cada carrera restante (afterThis)\n      // Si isLastraceDouble, duplicamos SOLO los puntos de carrera de la última prueba.\n      let maxRemaining = 0;\n      for (let i = 0; i < afterThis.length; i++) {\n        const r = afterThis[i];\n        const isLast = i === afterThis.length - 1;\n        const baseRacePts = schema.isLastraceDouble && isLast ? raceWinPts * 2 : raceWinPts;\n        const sprintPts = r.sprint ? sprintWinPts : 0;\n\n        // Nota: asumimos que los bonus (pole/FL) NO se duplican aunque la última carrera tenga doble puntuación.\n        maxRemaining += baseRacePts + sprintPts + flBonus + poleBonus;\n      }\n\n      prompt += `\\n\\nThe maximum number of points still available after this race is ${maxRemaining}.`;\n    } else {\n      prompt += \"\\n\\nCould not retrieve current championship standings.\";\n    }\n  } catch (err) {\n    console.error(\"Error fetching standings for potential champion news:\", err);\n    prompt += \"\\n\\nError fetching championship standings.\";\n  }\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\nasync function contextualizeSillySeasonTransferNews(newData) {\n  let season = newData.season;\n  const date = newData.date || null;\n\n  let prompt = newsPromptsTemaplates.find(t => t.new_type === 4).prompt;\n  prompt = prompt.replace(/{{\\s*season\\s*}}/g, season);\n\n  const command = new Command(\"transferRumorRequest\", {\n    drivers: newData.data.drivers,\n    date: date\n  }\n  );\n\n  let resp;\n  try {\n    resp = await command.promiseExecute();\n  } catch (err) {\n    console.error(\"Error fetching race details:\", err);\n    return;\n  }\n\n  const contextData = buildContextualPrompt(resp.content, { seasonYear: season });\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\nasync function contextualizeFakeTransferNews(newData) {\n  let driverName = newData.data.drivers[0].name;\n  let teamName = newData.data.drivers[0].team;\n  const date = newData.date || null;\n\n  let prompt = newsPromptsTemaplates.find(t => t.new_type === 7).prompt;\n  prompt = prompt.replace(/{{\\s*driver1\\s*}}/g, driverName)\n    .replace(/{{\\s*team1\\s*}}/g, teamName);\n\n  const command = new Command(\"transferRumorRequest\", {\n    drivers: newData.data.drivers,\n    date: date\n  }\n  );\n\n  let resp;\n  try {\n    resp = await command.promiseExecute();\n  } catch (err) {\n    console.error(\"Error fetching race details:\", err);\n    return;\n  }\n\n  prompt += `\\n\\nHere are the transfers that you have to talk about:\\n`;\n\n  resp.content.driverMap.forEach((d) => {\n    prompt += `${d.name} could be leaving ${d.actualTeam} ${d.potentialTeam ? \" for \" + d.potentialTeam : \"\"} ${d.potentialSalary ? \"with an expected salary of around \" + d.potentialSalary : \"\"}\\n`;\n\n    prompt += `\\n\\nHere are the previous results of ${d.actualTeam} in recent years:\\n`;\n    d.actualTeamPreviousResults.forEach((t) => {\n      prompt += `${t.season} - ${getOrdinalSuffix(t.position)} ${t.points}pts\\n`;\n    })\n\n    prompt += `\\n\\nHere are the teams that ${d.name} has driven for in recent years:\\n`;\n    d.previouslyDrivenTeams.forEach((t) => {\n      prompt += `${t.season} - ${t.teamName}\\n`;\n    });\n  });\n\n  const contextData = buildContextualPrompt(resp.content, { timing: \"after the last race\", seasonYear: resp.content.season });\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\nasync function contextualizeNextSeasonGrid(newData) {\n  let season = newData.data.season_year;\n  const date = newData.date || null;\n\n  let prompt = newsPromptsTemaplates.find(t => t.new_type === 19).prompt;\n  prompt = prompt.replace(/{{\\s*season_year\\s*}}/g, season);\n  const command = new Command(\"fullChampionshipDetailsRequest\", {\n    season: season,\n    date: date\n  }\n  );\n  let resp;\n  try {\n    resp = await command.promiseExecute();\n  } catch (err) {\n    console.error(\"Error fetching race details:\", err);\n    return;\n  }\n\n  function buildTeamLineupSection(title, teams, driversKey) {\n    return [\n      `\\n\\n${title}\\n`,\n      ...Object.values(teams).map(team =>\n        [\n          `\\n\\n**${team.name}**:\\n\\n`,\n          team[driversKey].map(d => `- ${d.name}`).join('\\n'),\n        ].join('')\n      )\n    ].join('');\n  }\n\n  prompt += buildTeamLineupSection(\n    `Here is the confirmed team lineup for each team for the next season (${season}):`,\n    newData.data.teams,\n    'driversNextSeason'\n  );\n\n  prompt += buildTeamLineupSection(\n    `Here are the driver line ups for each team in the season that just ended (${season - 1}):`,\n    newData.data.teams,\n    'driversThisSeason'\n  );\n\n  const contextData = buildContextualPrompt(resp.content, { seasonYear: season - 1 });\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\nasync function contextualizeBigTransferConfirm(newData) {\n  let driverName = newData.data.driver1\n  let potentialTeam = newData.data.team1\n  let originalTeam = newData.data.team2\n  const date = newData.date || null;\n\n  let newType = 6;\n  if (newData.type.includes(\"massive_exit\")) {\n    newType = 18;\n  }\n\n  let prompt = newsPromptsTemaplates.find(t => t.new_type === newType).prompt;\n  prompt = prompt.replace(/{{\\s*driver1\\s*}}/g, driverName)\n    .replace(/{{\\s*team1\\s*}}/g, potentialTeam)\n    .replace(/{{\\s*team2\\s*}}/g, originalTeam);\n\n\n  let drivers = [{\n    driverId: newData.data.driverId,\n    name: driverName,\n    team: originalTeam,\n    teamId: newData.data.team2Id,\n    previouslyDrivenTeams: newData.data.previouslyDrivenTeams,\n    potentialSalary: newData.data.salary,\n    potentialYearEnd: newData.data.endSeason\n  }]\n\n  const command = new Command(\"transferRumorRequest\", {\n    drivers: drivers,\n    date: date\n  }\n  );\n\n  let resp;\n  try {\n    resp = await command.promiseExecute();\n  } catch (err) {\n    console.error(\"Error fetching race details:\", err);\n    return;\n  }\n\n  const confirmedTransfer = resp.content.driverMap.map(d => ({\n    driver: d.name,\n    leavingTeam: d.actualTeam,\n    joiningTeam: d.potentialTeam,\n    salary: d.potentialSalary,\n    currentTeamRecentHistory: d.actualTeamPreviousResults.map(t => ({\n      season: t.season,\n      position: t.position,\n      points: t.points\n    })),\n    driverHistory: d.previouslyDrivenTeams.map(t => ({\n      season: t.season,\n      team: t.teamName\n    }))\n  }));\n\n  const contextData = buildContextualPrompt(resp.content, { timing: \"after this race\", seasonYear: resp.content.season });\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\nasync function contextualizeRenewalNews(newData) {\n  let driverName = newData.data.driver1\n  let potentialTeam = newData.data.team1\n  let originalTeam = newData.data.team2\n\n  let prompt = newsPromptsTemaplates.find(t => t.new_type === 10).prompt;\n  prompt = prompt.replace(/{{\\s*driver1\\s*}}/g, driverName)\n    .replace(/{{\\s*team1\\s*}}/g, potentialTeam);\n\n\n  let drivers = [{\n    driverId: newData.data.driverId,\n    name: driverName,\n    team: originalTeam,\n    teamId: newData.data.team2Id,\n    previouslyDrivenTeams: newData.data.previouslyDrivenTeams,\n    potentialSalary: newData.data.salary,\n    potentialYearEnd: newData.data.endSeason\n  }]\n\n  const date = newData.date || null;\n\n  const command = new Command(\"transferRumorRequest\", {\n    drivers: drivers,\n    date: date\n  }\n  );\n\n  let resp;\n  try {\n    resp = await command.promiseExecute();\n  } catch (err) {\n    console.error(\"Error fetching race details:\", err);\n    return;\n  }\n\n  const contextData = buildContextualPrompt(resp.content, { timing: \"after this race\", seasonYear: resp.content.season });\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\nasync function contextualizeTeamComparison(newData) {\n  let team1 = combined_dict[newData.data.team.teamId];\n  let seasonYear = newData.data.season;\n  let compType = newData.data.compType;\n  let ptsDif = Math.abs(newData.data.team.drop);\n  let promptId;\n  if (compType === \"good\") {\n    promptId = 12\n  }\n  else {\n    promptId = 11\n  }\n\n\n  let prompt = newsPromptsTemaplates.find(t => t.new_type === promptId).prompt;\n  prompt = prompt.replace(/{{\\s*team1\\s*}}/g, team1)\n    .replace(/{{\\s*actualSeason\\s*}}/g, seasonYear)\n    .replace(/{{\\s*lastSeason\\s*}}/g, seasonYear - 1);\n\n  const command = new Command(\"teamComparisonRequest\", {\n    team: newData.data.team.teamId,\n    season: seasonYear,\n    date: newData.date\n  }\n  );\n\n  let resp;\n  try {\n    resp = await command.promiseExecute();\n  } catch (err) {\n    console.error(\"Error fetching race details:\", err);\n    return;\n  }\n\n  const currentContextData = {\n    driverStandings: resp.content.currentDriverStandings,\n    teamStandings: resp.content.currentTeamStandings,\n    driversResults: resp.content.currentDriversResults,\n    racesNames: resp.content.currentRacesNames,\n    enrichedAllTime: resp.content.enrichedAllTime\n  };\n\n  const contextData = buildContextualPrompt(currentContextData, { teamId: newData.data.team.teamId, teamName: team1, seasonYear });\n\n  const oldRacesNames = resp.content.oldRacesNames.join(', ');\n  const oldSeasonResults = resp.content.oldDriversResults\n    .filter(d => d.teamId === newData.data.team.teamId)\n    .map(d => `${d.name} - ${d.resultsString}`)\n    .join(\"\\n\");\n\n  prompt += `\\n\\nHere are the results from ${team1}'s drivers in ${seasonYear - 1}: ${oldRacesNames}\\n`;\n  prompt += `\\n\\n${oldSeasonResults}`;\n\n  prompt += `\\n\\nHere are the previous results of ${team1} in recent years:\\n`;\n  resp.content.previousResultsTeam.forEach((t) => {\n    if (t.season !== seasonYear) {\n      prompt += `${t.season} - ${getOrdinalSuffix(t.position)} ${t.points}pts\\n`;\n    }\n  });\n\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\nasync function contextualizeQualiResults(newData) {\n  let poleName = newData.data.first;\n  let seasonYear = newData.data.seasonYear\n  let circuit = countries_data[races_names[parseInt(newData.data.trackId)]].country;\n\n  let prompt = newsPromptsTemaplates.find(t => t.new_type === 1).prompt;\n  prompt = prompt.replace(/{{\\s*pole_driver\\s*}}/g, poleName)\n    .replace(/{{\\s*season_year\\s*}}/g, seasonYear)\n    .replace(/{{\\s*circuit\\s*}}/g, circuit);\n\n\n  const raceId = newData?.data?.raceId ?? Number.parseInt(newData?.id?.split(\"_\")?.[2], 10);\n\n  const command = new Command(\"qualiDetailsRequest\", {\n    raceid: raceId,\n  }\n  );\n\n  let resp;\n  try {\n    resp = await command.promiseExecute();\n  } catch (err) {\n    console.error(\"Error fetching race details:\", err);\n    return;\n  }\n\n  const raceNumber = resp.content.racesNames.length + 1;\n\n  const numberOfRace = `This was qualifying ${raceNumber} out of ${resp.content.nRaces} in this season.`;\n\n  prompt += `\\n\\n${numberOfRace}`;\n\n  const qualiResults = resp.content.details.map(row => ({\n    position: row.pos,\n    name: row.name,\n    team: combined_dict[row.teamId],\n    gapToPole: row.gapToPole.toFixed(3),\n    fastestLap: row.fastestLap\n  }));\n\n  prompt += `\\n\\nHere are the full qualifying results:\\n`;\n\n  const totalDrivers = qualiResults.length;\n\n  qualiResults.forEach((result, index) => {\n    const position = result.position;\n\n    if (position === 11) {\n      prompt += `\\n-- Q2 --\\n`;\n    }\n\n    if (\n      (totalDrivers <= 20 && position === 16) ||\n      (totalDrivers > 20 && position === 17)\n    ) {\n      prompt += `\\n-- Q1 --\\n`;\n    }\n\n    prompt += `${position}. ${result.name} (${result.team}) ${result.fastestLap}` +\n      `${result.gapToPole > 0 ? ` +${result.gapToPole}s` : ''}\\n`;\n  });\n\n  const contextData = buildContextualPrompt(resp.content, { timing: \"before this race\", seasonYear });\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\n\nasync function contextualizeRaceResults(newData) {\n  let winnerName = newData.data.first;\n  let seasonYear = newData.data.seasonYear\n  let circuit = countries_data[races_names[parseInt(newData.data.trackId)]].country;\n\n  let prompt = newsPromptsTemaplates.find(t => t.new_type === 2).prompt;\n  prompt = prompt.replace(/{{\\s*winner\\s*}}/g, winnerName)\n    .replace(/{{\\s*season_year\\s*}}/g, seasonYear)\n    .replace(/{{\\s*circuit\\s*}}/g, circuit);\n\n  const raceId = newData?.data?.raceId ?? Number.parseInt(newData?.id?.split(\"_\")?.[2], 10);\n  const command = new Command(\"raceDetailsRequest\", {\n    raceid: raceId,\n  }\n  );\n\n  let resp;\n  try {\n    resp = await command.promiseExecute();\n  } catch (err) {\n    console.error(\"Error fetching race details:\", err);\n    return;\n  }\n\n  const raceNumber = resp.content.racesNames.length + 1;\n  const numberOfRace = `This was race ${raceNumber} out of ${resp.content.nRaces} in this season.`;\n  prompt += `\\n\\n${numberOfRace}`;\n\n  const raceDetails = resp.content.details.map(row => ({\n    position: row.pos,\n    name: row.name,\n    team: combined_dict[row.teamId],\n    startPos: row.grid,\n    gap: row.gapToWinner > 0 ? `${Number(row.gapToWinner.toFixed(3))}s` : row.gapLaps > 0 ? `${row.gapLaps} laps` : ``,\n    status: row.dnf !== 1 ? `+${row.points} pts` : 'DNF'\n  }));\n\n  prompt += `\\n\\nHere are the full race results:\\n`;\n  raceDetails.forEach(result => {\n    prompt += `${result.position}. ${result.name} (${result.team}) | Grid P${result.startPos} | +${result.gap} | ${result.status}\\n`;\n  });\n\n  const safetyCars = resp.content.details[0].safetyCar;\n  const virtualSafetyCars = resp.content.details[0].virtualSafetyCar;\n  const safetyCarPhrase = `\\n\\nThere were ${safetyCars} safety car${safetyCars > 1 ? \"s\" : \"\"} and ${virtualSafetyCars} virtual safety car${virtualSafetyCars > 1 ? \"s\" : \"\"} during the race.`\n  prompt += safetyCarPhrase;\n\n  const top3 = resp.content.driverOfTheDayInfo;\n  if (Array.isArray(top3) && top3.length > 0) {\n    const first = top3[0];\n    const second = top3[1];\n    const third = top3[2];\n    const driverOfTheDayPhrase = `\n      \\n\\nThe Driver of the Day award went to ${first.name} (${combined_dict[first.teamId]}).\\n${second ? `In second place was ${second.name} (${combined_dict[second.teamId]}),` : ''}${third ? ` followed by ${third.name} (${combined_dict[third.teamId]}).` : ''}\\n\\nWrite a paragraph analyzing why ${first.name.split(' ')[0]} might have received the award, and why the fans also voted for ${second ? second.name.split(' ')[0] : ''}${second && third ? ' and ' : ''}${third ? third.name.split(' ')[0] : ''}.\n    `;\n    prompt += driverOfTheDayPhrase;\n  }\n\n  if (resp.content.sprintDetails.length > 0) {\n    prompt += `\\n\\nThere was a sprint race held on Saturday, which was won by ${resp.content.sprintDetails[0].name} (${combined_dict[resp.content.sprintDetails[0].teamId]}). Dedicate a paragraph discussing the sprint results`;\n  }\n\n  const contextData = buildContextualPrompt(resp.content, { timing: \"after this race\", seasonYear });\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\nasync function contextualizeDriverComparison(newData) {\n  let driver1 = newData.data.drivers[0].name;\n  let driver2 = newData.data.drivers[1].name;\n  let teamId = newData.data.teamId;\n  let seasonYear = newData.data.season;\n  let prompt = newsPromptsTemaplates.find(t => t.new_type === 13).prompt;\n  prompt = prompt.replace(/{{\\s*driver1\\s*}}/g, driver1)\n    .replace(/{{\\s*driver2\\s*}}/g, driver2)\n    .replace(/{{\\s*team1\\s*}}/g, combined_dict[teamId])\n    .replace(/{{\\s*actualSeason\\s*}}/g, seasonYear)\n\n  const command = new Command(\"fullChampionshipDetailsRequest\", {\n    season: seasonYear,\n  });\n\n  let resp;\n  try {\n    resp = await command.promiseExecute();\n  } catch (err) {\n    console.error(\"Error fetching full championship details:\", err);\n    return;\n  }\n\n  const contextData = buildContextualPrompt(resp.content, { teamId, teamName: combined_dict[teamId], seasonYear });\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\nasync function contextualizeRaceReaction(newData) {\n  let adjective = newData.data.adjective;\n  let seasonYear = newData.data.seasonYear;\n  let happyDriver = newData.data.randomHappyDriver.name;\n  let unhappyDriver = newData.data.randomUnHappyDriver.name;\n  let circuit = newData.data.circuit;\n\n  let prompt = newsPromptsTemaplates.find(t => t.new_type === 16).prompt;\n  prompt = prompt.replace(/{{\\s*adjective\\s*}}/g, adjective)\n    .replace(/{{\\s*season_year\\s*}}/g, seasonYear)\n    .replace(/{{\\s*happy_driver\\s*}}/g, happyDriver)\n    .replace(/{{\\s*unhappy_driver\\s*}}/g, unhappyDriver)\n    .replace(/{{\\s*circuit\\s*}}/g, circuit);\n\n  const command = new Command(\"raceDetailsRequest\", {\n    raceid: newData.data.raceId,\n  });\n  let resp;\n\n  try {\n    resp = await command.promiseExecute();\n  }\n  catch (err) {\n    console.error(\"Error fetching full championship details:\", err);\n    return;\n  }\n\n  const raceResults = resp.content.details.map(row => {\n    const gapStr =\n      row.gapToWinner > 0\n        ? `${Number(row.gapToWinner.toFixed(3))} seconds`\n        : row.gapLaps > 0\n          ? `${row.gapLaps} laps`\n          : `0 seconds`;\n    return {\n      position: row.pos,\n      name: row.name,\n      team: combined_dict[row.teamId],\n      startPos: row.grid,\n      gap: gapStr,\n      status: row.dnf !== 1 ? `+${row.points} pts` : 'DNF'\n    };\n  });\n\n  prompt += `\\n\\nHere are the race results:\\n`;\n  raceResults.forEach(r => {\n    prompt += `${r.position}. ${r.name} (${r.team}) - Started: P${r.startPos}, Gap: ${r.gap}, Status: ${r.status}\\n`;\n  });\n\n  const top3 = resp.content.driverOfTheDayInfo;\n\n  if (Array.isArray(top3) && top3.length > 0) {\n    const first = top3[0];\n    const second = top3[1];\n    const third = top3[2];\n\n    const driverOfTheDayPhrase = `\n      \\n\\nThe Driver of the Day award went to ${first.name} (${combined_dict[first.teamId]}).\\n${second ? `In second place was ${second.name} (${combined_dict[second.teamId]}),` : ''}${third ? ` followed by ${third.name} (${combined_dict[third.teamId]}).` : ''}\\n\\nWrite a paragraph analyzing why ${first.name.split(' ')[0]} might have received the award, and why the fans also voted for ${second ? second.name.split(' ')[0] : ''}${second && third ? ' and ' : ''}${third ? third.name.split(' ')[0] : ''}.\n    `;\n\n    prompt += driverOfTheDayPhrase;\n  }\n\n  const contextData = buildContextualPrompt(resp.content, { seasonYear });\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\nasync function contextualizeFeederSeriesReview(newData) {\n  let seasonYear = newData.data.season_year;\n  const f2ChampionData = newData.data.f2_champion;\n  const f3ChampionData = newData.data.f3_champion;\n  let f2_champion = (typeof f2ChampionData === \"string\") ? f2ChampionData : f2ChampionData?.name;\n  let f3_champion = (typeof f3ChampionData === \"string\") ? f3ChampionData : f3ChampionData?.name;\n  let prompt = newsPromptsTemaplates.find(t => t.new_type === 20).prompt;\n  prompt = prompt.replace(/{{\\s*season_year\\s*}}/g, seasonYear)\n    .replace(/{{\\s*f2_champion\\s*}}/g, f2_champion)\n    .replace(/{{\\s*f3_champion\\s*}}/g, f3_champion);\n\n  const command = new Command(\"fullFeederSeriesDetailsRequest\", {\n    season: seasonYear\n  });\n  let resp;\n  try {\n    resp = await command.promiseExecute();\n  }\n  catch (err) {\n    console.error(\"Error fetching full championship details:\", err);\n    return { instruction: prompt, context: \"\" };\n  }\n\n  const f2Context = buildContextualPrompt({ enrichedAllTime: [], ...(resp.content?.f2 || {}) }, {\n    seasonYear,\n    timing: \"(Formula 2)\"\n  });\n  const f3Context = buildContextualPrompt({ enrichedAllTime: [], ...(resp.content?.f3 || {}) }, {\n    seasonYear,\n    timing: \"(Formula 3)\"\n  });\n\n  const contextData =\n    `For Formula 2 and Formula 3, each race weekend includes a Sprint and a Main race.\\n` +\n    `In the driver results strings, the format is: Main result (SPR Sprint result).\\n` +\n    `\\n\\n=== Formula 2 ===\\n${f2Context}\\n\\n=== Formula 3 ===\\n${f3Context}`;\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\nasync function contextualizeSeasonReview(newData) {\n  let seasonYear = newData.data.season;\n  let driver1 = newData.data.firstDriver.name;\n  let driver2 = newData.data.secondDriver.name;\n  let team1 = combined_dict[newData.data.firstTeam.teamId];\n  let team2 = combined_dict[newData.data.secondTeam.teamId];\n  let part = newData.data.part;\n\n  let newType = part === 3 ? 15 : 14;\n\n  let prompt = newsPromptsTemaplates.find(t => t.new_type === newType).prompt;\n  prompt = prompt.replace(/{{\\s*season_year\\s*}}/g, seasonYear)\n    .replace(/{{\\s*part\\s*}}/g, part)\n    .replace(/{{\\s*driver1\\s*}}/g, driver1)\n    .replace(/{{\\s*driver2\\s*}}/g, driver2)\n    .replace(/{{\\s*team1\\s*}}/g, team1)\n    .replace(/{{\\s*team2\\s*}}/g, team2);\n\n  const command = new Command(\"fullChampionshipDetailsRequest\", {\n    season: seasonYear,\n  });\n\n  let resp;\n\n  try {\n    resp = await command.promiseExecute();\n  }\n  catch (err) {\n    console.error(\"Error fetching full championship details:\", err);\n    return;\n  }\n\n  const contextData = buildContextualPrompt(resp.content, { seasonYear });\n\n  const carPerformanceStart = Object.entries(resp.content.carsPerformance[0])\n    .sort((a, b) => b[1] - a[1])\n    .map(([team, value]) => `${team}: ${value.toFixed(2)}`)\n    .join(\"\\n\");\n\n  const carPerformanceEnd = Object.entries(resp.content.carsPerformance[resp.content.carsPerformance.length - 1])\n    .sort((a, b) => b[1] - a[1])\n    .map(([team, value]) => `${team}: ${value.toFixed(2)}`)\n    .join(\"\\n\");\n\n  prompt += `\\n\\nThe performance of each car is measured on a scale from 0 to 100, where 100 represents the ideal possible performance. A higher value indicates a better-performing car. The performance values should be taken with a grain of salt, as they are estimates, but they are very important to understand drivers and teams performance. Never ever mention the numbers given as they are only an estimate rather than an absolute truth and are only there to put into numbers the performance of each car. You can mention if a car is performing well or poorly, or how has it evolved but never give the exact numbers.\\n`;\n\n  prompt += `\\n\\nHere is the performance of each car at the start of the season:\\n${carPerformanceStart}`;\n  prompt += `\\n\\nHere is the performance of each car at the latest race:\\n${carPerformanceEnd}`;\n\n  return {\n    instruction: prompt,\n    context: contextData\n  };\n}\n\n\nasync function askGenAI(messages, opts = {}) {\n  const response = await fetch(\"/api/ask-openai\", {\n    method: \"POST\",\n    headers: { \"Content-Type\": \"application/json\" },\n    body: JSON.stringify({\n      messages,\n      max_tokens: opts.max_tokens || 4000\n    })\n  });\n\n  let data = {};\n  try {\n    data = await response.json();\n  } catch {\n    // ignore JSON parse errors\n  }\n\n  if (!response.ok) {\n    const error = new Error(data.error || \"AI request failed\");\n    error.status = response.status;\n    throw error;\n  }\n\n  return data.text;\n}\n\nnewsOptionsBtn.addEventListener(\"click\", (e) => {\n  const btn = e.currentTarget;\n  btn.classList.toggle(\"active\");\n  if (!btn.classList.contains('active')) {\n    setOptionsContextOpen(false);\n  }\n});\n\ndeleteArticleBtn.addEventListener(\"click\", async () => {\n  const articleId = document.querySelector(\"#newsModal\").getAttribute(\"data-article-id\");\n  const command = new Command(\"deleteNewsArticle\", { articleId });\n  command.promiseExecute().then(() => {\n    const openedNewsItem = document.querySelector('.news-item.opened');\n    if (openedNewsItem) {\n      openedNewsItem.remove();\n    }\n    closeBtn?.click();\n  });\n});\n\n\ncopyArticleBtn.addEventListener(\"click\", async () => {\n  const titleEl = document.querySelector(\"#newsModalTitle\");\n  const articleEl = document.querySelector(\"#newsModal .news-article\");\n\n  if (!titleEl || !articleEl) return;\n\n  const title = titleEl.innerText.trim();\n\n  const turndownService = new TurndownService({\n    headingStyle: \"atx\",\n    bulletListMarker: \"-\",\n    codeBlockStyle: \"fenced\",\n  });\n\n  const articleMarkdown = turndownService.turndown(articleEl.innerHTML);\n\n  const finalText = `# ${title}\\n\\n${articleMarkdown}`;\n\n  await navigator.clipboard.writeText(finalText);\n});\n\nfunction createEditFooterButtons(articleEl) {\n  const buttonsWrapper = closeBtn?.parentElement;\n  if (!buttonsWrapper) return;\n\n  closeBtn.classList.add('d-none');\n\n  saveArticleBtn = document.createElement('button');\n  saveArticleBtn.type = 'button';\n  saveArticleBtn.classList.add('confirm-modal');\n  saveArticleBtn.textContent = 'Save';\n\n  cancelArticleBtn = document.createElement('button');\n  cancelArticleBtn.type = 'button';\n  cancelArticleBtn.classList.add('close-modal');\n  cancelArticleBtn.textContent = 'Cancel';\n\n  buttonsWrapper.appendChild(cancelArticleBtn);\n  buttonsWrapper.appendChild(saveArticleBtn);\n\n\n  cancelArticleBtn.addEventListener('click', () => exitArticleEditMode());\n\n  saveArticleBtn.addEventListener('click', async () => {\n    if (!editTextarea || !editTitleInput) return;\n\n    const markdownText = editTextarea.value.trim();\n    const newTitle = editTitleInput.value.trim();\n    const parsedHtml = marked.parse(markdownText);\n    const safeHtml = DOMPurify.sanitize(parsedHtml);\n    const modalTitle = document.querySelector('#newsModal .modal-title');\n\n    articleEl.innerHTML = safeHtml;\n\n    if (modalTitle && newTitle) {\n      modalTitle.textContent = newTitle;\n    }\n\n    if (currentModalNews) {\n      if (newTitle) {\n        currentModalNews.title = newTitle;\n      }\n      currentModalNews.text = markdownText;\n\n      new Command(\"updateNews\", {\n        stableKey: currentModalNews.id ?? computeStableKey(currentModalNews),\n        patch: { text: markdownText, title: newTitle || currentModalNews.title }\n      }).execute();\n\n      const openedNewsTitle = document.querySelector('.news-item.opened .news-title');\n      if (openedNewsTitle && newTitle) {\n        openedNewsTitle.textContent = newTitle;\n      }\n    }\n    else {\n      new Command(\"updateNews\", {\n        stableKey: computeStableKey({ title: newTitle, date: null }),\n        patch: { text: markdownText, title: newTitle }\n      }).execute();\n    }\n\n    exitArticleEditMode({ restoreOriginal: false });\n    originalArticleHTML = articleEl.innerHTML;\n  });\n}\n\nfunction startArticleEditMode() {\n  if (isEditingArticle) return;\n\n  const articleEl = document.querySelector(\"#newsModal .news-article\");\n  if (!articleEl || !currentModalNews) return;\n\n  newsOptionsBtn?.classList.remove('active');\n\n  const turndownService = new TurndownService({\n    headingStyle: \"atx\",\n    bulletListMarker: \"-\",\n    codeBlockStyle: \"fenced\",\n  });\n\n  const markdownText = turndownService.turndown(\n    articleEl.innerHTML || currentModalNews.text || ''\n  );\n\n  const modalTitle = document.querySelector('#newsModal .modal-title');\n  const currentTitle = modalTitle?.textContent?.trim() || currentModalNews.title || '';\n  originalTitleText = currentTitle;\n\n  originalArticleHTML = articleEl.innerHTML;\n  articleEl.innerHTML = '';\n\n  const actualTitle = document.querySelector(\"#newsModalTitle\");\n  editTitleInput = document.createElement('textarea');\n  editTitleInput.rows = 1;\n  editTitleInput.classList.add('news-edit-title');\n  editTitleInput.value = currentTitle;\n  actualTitle.innerHTML = '';\n  actualTitle.appendChild(editTitleInput);\n\n  //get width of newsModal .modal-header\n  const modalHeader = document.querySelector('#newsModal .modal-header');\n  if (modalHeader) {\n    editTitleInput.style.maxWidth = (modalHeader.clientWidth - 60) + 'px';\n  }\n\n  editTextarea = document.createElement('textarea');\n  editTextarea.classList.add('news-edit-textarea');\n  editTextarea.value = markdownText;\n\n  articleEl.appendChild(editTextarea);\n\n  isEditingArticle = true;\n\n  createEditFooterButtons(articleEl);\n}\n\neditArticleBtn?.addEventListener(\"click\", startArticleEditMode);\n\n\nfunction buildEmergencyOverlay() {\n  const overlayDiv = document.createElement('div');\n  overlayDiv.classList.add('breaking-news-overlay', 'bold-font');\n\n  const breakingSpan = document.createElement('span');\n  breakingSpan.classList.add('breaking-news-breaking');\n  breakingSpan.innerText = 'BREAKING';\n  overlayDiv.appendChild(breakingSpan);\n\n  const newsSpan = document.createElement('span');\n  newsSpan.classList.add('breaking-news-news');\n  newsSpan.innerText = 'NEWS';\n  overlayDiv.appendChild(newsSpan);\n\n  const bar = document.createElement('div');\n  bar.classList.add('breaking-news-bar');\n  overlayDiv.appendChild(bar);\n\n  document.body.appendChild(overlayDiv);\n  return overlayDiv;\n}\n\nfunction ensureEmergencyOverlay(imageContainer) {\n  if (!imageContainer.querySelector('.breaking-news-overlay')) {\n    imageContainer.prepend(buildEmergencyOverlay());\n  }\n}\n\nfunction manage_overlay(imageContainer, overlay, data, image) {\n  let overlayDiv = null;\n  const teamColorForId = (teamId, fallback = '#ffffff') => {\n    const candidate = Number.parseInt(teamId, 10);\n    return colors_dict?.[`${candidate}0`] ?? fallback;\n  };\n\n  const buildCenteredOverlay = ({ overlayClass, title, subtitle, borderColor, subtitleClass } = {}) => {\n    const centeredOverlay = document.createElement('div');\n    centeredOverlay.classList.add('news-centered-overlay');\n    if (overlayClass) centeredOverlay.classList.add(overlayClass);\n\n    const blockDiv = document.createElement('div');\n    blockDiv.classList.add('news-centered-block');\n    if (borderColor) blockDiv.style.borderBottomColor = borderColor;\n\n    const titleDiv = document.createElement('div');\n    titleDiv.classList.add('news-centered-title');\n    titleDiv.innerText = title ?? '';\n\n    const subtitleDiv = document.createElement('div');\n    subtitleDiv.classList.add('news-centered-subtitle');\n    if (subtitleClass) subtitleDiv.classList.add(subtitleClass);\n    subtitleDiv.innerText = subtitle ?? '';\n\n    blockDiv.appendChild(titleDiv);\n    if (subtitleDiv.innerText) blockDiv.appendChild(subtitleDiv);\n    centeredOverlay.appendChild(blockDiv);\n\n    return centeredOverlay;\n  };\n\n  const pickRandom = (arr) => {\n    if (!Array.isArray(arr) || arr.length === 0) return '';\n    return arr[Math.floor(Math.random() * arr.length)];\n  };\n  const pickUnique = (arr, count) => {\n    const list = Array.isArray(arr) ? [...arr] : [];\n    for (let i = list.length - 1; i > 0; i--) {\n      const j = Math.floor(Math.random() * (i + 1));\n      [list[i], list[j]] = [list[j], list[i]];\n    }\n    return list.slice(0, Math.max(0, count));\n  };\n\n  if (overlay === \"race-overlay\" || overlay === \"quali-overlay\") {\n    overlayDiv = document.createElement('div');\n    overlayDiv.classList.add('race-overlay');\n\n    const first = document.createElement('div');\n    const firstTeam = document.createElement('div');\n    firstTeam.classList.add('position-team', 'firstpos');\n    firstTeam.innerText = combined_dict[data.firstTeam];\n    let borderClass = team_dict[data.firstTeam] + \"border-top\";\n    first.classList.add('position', 'firstpos', borderClass);\n    let numberSpan = document.createElement(\"span\");\n    numberSpan.className = \"new-number\";\n    numberSpan.textContent = \"1.\";\n\n    //take only the lastname if there are multiple names\n    let textNode = document.createTextNode(` ${data.first.split(\" \").pop()}`);\n\n    first.appendChild(numberSpan);\n    first.appendChild(textNode);\n\n    const second = document.createElement('div');\n    const secondTeam = document.createElement('div');\n    secondTeam.classList.add('position-team');\n    secondTeam.innerText = combined_dict[data.secondTeam];\n    borderClass = team_dict[data.secondTeam] + \"border-top\";\n    second.classList.add('position', borderClass);\n    numberSpan = document.createElement(\"span\");\n    numberSpan.className = \"new-number\";\n    numberSpan.textContent = \"2.\";\n\n    textNode = document.createTextNode(` ${data.second.split(\" \").pop()}`);\n\n    second.appendChild(numberSpan);\n    second.appendChild(textNode);\n\n    const third = document.createElement('div');\n    const thirdTeam = document.createElement('div');\n    thirdTeam.classList.add('position-team');\n    thirdTeam.innerText = combined_dict[data.thirdTeam];\n    borderClass = team_dict[data.thirdTeam] + \"border-top\";\n    third.classList.add('position', borderClass);\n    numberSpan = document.createElement(\"span\");\n    numberSpan.className = \"new-number\";\n    numberSpan.textContent = \"3.\";\n\n    textNode = document.createTextNode(` ${data.third.split(\" \").pop()}`);\n\n    third.appendChild(numberSpan);\n    third.appendChild(textNode);\n\n    const sessionDiv = document.createElement('div');\n    sessionDiv.classList.add('session');\n    sessionDiv.innerText = overlay === \"race-overlay\" ? \"Race\" : \"Qualifying\";\n\n    overlayDiv.appendChild(sessionDiv);\n    overlayDiv.appendChild(first);\n    overlayDiv.appendChild(firstTeam);\n    overlayDiv.appendChild(second);\n    overlayDiv.appendChild(secondTeam);\n    overlayDiv.appendChild(third);\n    overlayDiv.appendChild(thirdTeam);\n    imageContainer.appendChild(overlayDiv);\n  }\n  else if (overlay === \"reaction-overlay\") {\n    overlayDiv = document.createElement('div');\n    overlayDiv.classList.add('reaction-overlay');\n\n    const candidateTeamId = Number.parseInt(data?.driverTeamIdInTitle, 10);\n    const teamId = candidateTeamId >= 1 && candidateTeamId <= 10\n      ? candidateTeamId\n      : (Math.floor(Math.random() * 10) + 1);\n\n    const teamColor = colors_dict?.[`${teamId}0`] ?? '#ffffff';\n\n    const titleDiv = document.createElement('div');\n    titleDiv.classList.add('reaction-title');\n    titleDiv.style.borderBottomColor = teamColor;\n\n    const titleTextDiv = document.createElement('div');\n    titleTextDiv.classList.add('reaction-title-text');\n    titleTextDiv.innerText = 'POST RACE REACTIONS';\n\n    const raceNameDiv = document.createElement('div');\n    const raceGP = countries_data?.[races_names?.[data?.trackId]]?.adjective ?? 'Unknown GP';\n    raceNameDiv.classList.add('reaction-race-name');\n    raceNameDiv.innerText = `${data?.seasonYear ?? ''} ${raceGP} GP`.trim();\n\n    titleDiv.appendChild(titleTextDiv);\n    titleDiv.appendChild(raceNameDiv);\n\n    overlayDiv.appendChild(titleDiv);\n    imageContainer.appendChild(overlayDiv);\n  }\n  else if (overlay === \"fake-transfer-overlay\") {\n    const driver = data?.drivers?.[0];\n    const driverName = driver?.name ?? '';\n    const teamName = driver?.team ?? 'their current team';\n    const teamId = driver?.teamId;\n\n    const phrases = [\n      `Could be leaving ${teamName}`,\n      `Rumours of a departure from ${teamName}`,\n      `Exit talks at ${teamName}`,\n      `A possible move away from ${teamName}`,\n      `${teamName} future uncertain`,\n      `Departure from ${teamName} speculated`,\n      `Linked with a move away from ${teamName}`,\n      `Considering options beyond ${teamName}`,\n      `In talks to leave ${teamName}`,\n      `His manager weighing up options beyond ${teamName}`\n    ];\n\n    const borderColor = teamColorForId(teamId, '#ffffff');\n    overlayDiv = buildCenteredOverlay({\n      overlayClass: 'fake-transfer-overlay',\n      title: driverName,\n      subtitle: pickRandom(phrases),\n      borderColor\n    });\n    imageContainer.appendChild(overlayDiv);\n  }\n  else if (overlay === \"silly-season-overlay\") {\n    const drivers = Array.isArray(data?.drivers) ? data.drivers : [];\n    const surnames = drivers\n      .map(d => (typeof d?.name === 'string' ? d.name.trim().split(/\\s+/).pop() : ''))\n      .filter(Boolean);\n\n    const shown = pickUnique(surnames, 3);\n    const subtitle = shown.length ? shown.join(' • ') : '';\n\n    const candidateTeamId = drivers.find(d => d?.teamId != null)?.teamId;\n    const borderColor = teamColorForId(candidateTeamId ?? (Math.floor(Math.random() * 10) + 1), '#ffffff');\n\n    overlayDiv = buildCenteredOverlay({\n      overlayClass: 'silly-season-overlay',\n      title: 'SILLY SEASON',\n      subtitle,\n      subtitleClass: 'silly-season-names',\n      borderColor\n    });\n    imageContainer.appendChild(overlayDiv);\n  }\n  else if (overlay === \"contract-renewal-overlay\") {\n    const driverName = data?.driver1 ?? '';\n    const teamName = data?.team1 ?? '';\n    const teamId = data?.team1Id;\n\n    const phrases = [\n      `Stays with ${teamName}`,\n      `Renews with ${teamName}`,\n      `Extends deal at ${teamName}`,\n      `Signs a new contract with ${teamName}`,\n      `Commits future to ${teamName}`\n    ];\n\n    const borderColor = teamColorForId(teamId, '#ffffff');\n    overlayDiv = buildCenteredOverlay({\n      overlayClass: 'contract-renewal-overlay',\n      title: driverName,\n      subtitle: pickRandom(phrases.filter(p => !p.endsWith(' ') && p.trim())),\n      borderColor\n    });\n    imageContainer.appendChild(overlayDiv);\n  }\n  else if (overlay === \"massive-exit-overlay\") {\n    const driverName = data?.driver1 ?? '';\n    const teamName = data?.team1 ?? '';\n    const teamId = data?.team1Id;\n\n    const headlines = [\n      'CONFIRMED BREAKING',\n      'BREAKING CONFIRMED',\n      'OFFICIAL BREAKING',\n      'CONFIRMED BREAKING',\n      'OFFICIAL ANNOUNCEMENT',\n      \"HERE WE GO\",\n      \"IT'S OFFICIAL\",\n      \"EXCLUUSIVE BREAKING\",\n      \"BREAKING NEWS\",\n    ];\n\n    const borderColor = teamColorForId(teamId, '#ffffff');\n    overlayDiv = buildCenteredOverlay({\n      overlayClass: 'massive-exit-overlay',\n      title: pickRandom(headlines),\n      subtitle: `${driverName} leaving ${teamName}`.trim(),\n      borderColor\n    });\n    imageContainer.appendChild(overlayDiv);\n  }\n  else if (overlay === \"massive-signing-overlay\") {\n    const driverName = data?.driver1 ?? '';\n    const teamName = data?.team2 ?? '';\n    const teamId = data?.team2Id;\n\n    const headlines = [\n      'CONFIRMED BREAKING',\n      'BREAKING CONFIRMED',\n      'OFFICIAL BREAKING',\n      'CONFIRMED BREAKING',\n      'OFFICIAL ANNOUNCEMENT',\n      \"HERE WE GO\",\n      \"IT'S OFFICIAL\",\n      \"EXCLUUSIVE BREAKING\",\n      \"BREAKING NEWS\"\n    ];\n\n    const borderColor = teamColorForId(teamId, '#ffffff');\n    overlayDiv = buildCenteredOverlay({\n      overlayClass: 'massive-signing-overlay',\n      title: pickRandom(headlines),\n      subtitle: `${driverName} signing with ${teamName}`.trim(),\n      borderColor\n    });\n    imageContainer.appendChild(overlayDiv);\n  }\n  else if (overlay === \"driver-comparison-overlay\") {\n    const teamId = data.teamId;\n    overlayDiv = document.createElement('div');\n    overlayDiv.classList.add('driver-comparison-overlay');\n    const teamColor = colors_dict[teamId + \"0\"] ?? '#000000';\n\n    let contrastColor;\n    if (lightColors.includes(teamColor)) {\n      contrastColor = \"#272727\";\n    } else {\n      contrastColor = \"#eeeef1\";\n    }\n\n    let gradientColor = `color-mix(in srgb, ${teamColor} 30%, ${contrastColor})`;\n\n\n\n    const rareLogosTeams = [5, 8, 9];\n    if (rareLogosTeams.includes(teamId)) {\n\n      overlayDiv.style.background = `linear-gradient(to top right,\n          ${gradientColor} 0%,\n          ${teamColor} 25%,\n          ${teamColor} 75%,\n          ${gradientColor} 100%)`;\n      const textDiv = document.createElement('div');\n      textDiv.classList.add('new-team-text', 'bold-font');\n      if (lightColors.indexOf(teamColor) !== -1) {\n        textDiv.style.color = \"#272727\";\n      }\n      else {\n        textDiv.style.color = '#eeeef1';\n      }\n      const teamName = document.createElement('div');\n      teamName.classList.add('new-team-name');\n      teamName.innerText = combined_dict[teamId];\n      const driversDiv = document.createElement('div');\n      driversDiv.classList.add('new-drivers-names');\n      driversDiv.innerHTML = `${data.drivers[0].name} <span class=\"new-vs\">vs</span> ${data.drivers[1].name}`;\n      textDiv.appendChild(teamName);\n      textDiv.appendChild(driversDiv);\n      driversDiv.querySelector(\".new-vs\").style.backgroundColor = teamColor;\n      overlayDiv.appendChild(textDiv);\n    }\n    else {\n      overlayDiv.style.background = teamColor;\n      let value = logos_disc[teamId];\n      if (teamId === 2 || teamId === 6) {\n        value = value.replace(\".png\", \"2.png\");\n      }\n\n      const logoImg = document.createElement('img');\n\n      logoImg.src = value ?? '';\n      logoImg.dataset.src = value ?? '';\n\n      logoImg.classList.add('new-team-logo');\n      overlayDiv.appendChild(logoImg);\n\n    }\n\n    imageContainer.appendChild(overlayDiv);\n\n\n  }\n\n  try {\n    const url =\n      (image instanceof HTMLImageElement)\n        ? (image.currentSrc || image.src)\n        : (typeof image === 'string' ? image : null);\n\n    if (!url) {\n      ensureEmergencyOverlay(imageContainer);\n      return;\n    }\n    const probe = new Image();\n    probe.onload = () => { /* ok, no hacemos nada */ };\n    probe.onerror = () => { ensureEmergencyOverlay(imageContainer); };\n    probe.src = url;\n  } catch {\n    console.warn('Image probe failed unexpectedly');\n  }\n}\n\nfunction getOrdinalSuffix(n) {\n  let j = n % 10, k = n % 100;\n  if (j == 1 && k != 11) {\n    return n + \"st\";\n  }\n  if (j == 2 && k != 12) {\n    return n + \"nd\";\n  }\n  if (j == 3 && k != 13) {\n    return n + \"rd\";\n  }\n  return n + \"th\";\n}\n\nsetupNewsLanguageDropdown();\n\ndocument.querySelectorAll('#newsTypeMenu .redesigned-dropdown-item').forEach(item => {\n  item.addEventListener('click', function (e) {\n    e.preventDefault();\n    e.stopPropagation();\n\n    item.classList.toggle('inactive');\n\n    // sincroniza el icono\n    item.querySelector('i').classList.toggle('unactive', item.classList.contains('inactive'));\n\n    const type = item.dataset.value;\n    const hide = item.classList.contains('inactive');\n\n    document.querySelectorAll(`.news-item[data-type=\"${type}\"]`).forEach(n => {\n      n.style.display = hide ? 'none' : '';\n    });\n  });\n});\n\ndocument.querySelector(\"#reloadNews\").addEventListener(\"click\", async () => {\n  const newsGrid = document.querySelector(\".news-grid\");\n  newsGrid.innerHTML = '';\n\n  const command = new Command(\"deleteNews\");\n  command.execute();\n\n  generateNews();\n});\n\nconst CUSTOM_NEWS_TYPE_DEFS = Object.entries(CUSTOM_NEWS_TYPE_META).map(([value, meta]) => ({\n  value,\n  label: meta.label,\n  group: meta.group || \"normal\"\n}));\n\nlet customNewsModal = null;\nlet customNewsOptionsCache = null;\n\nfunction setCustomNewsError(msg) {\n  if (!customNewsError) return;\n  if (msg) {\n    customNewsError.textContent = msg;\n    customNewsError.classList.remove('custom-news-hidden');\n  } else {\n    customNewsError.textContent = '';\n    customNewsError.classList.add('custom-news-hidden');\n  }\n}\n\nfunction getCustomNewsTitlePlaceholder(type = getCustomNewsSelectedType()) {\n  return type === \"custom_new\" ? \"Write the article title\" : \"Automatic / default title\";\n}\n\nfunction getCustomNewsImageSrc(imageFile) {\n  return imageFile ? `../assets/images/news/${imageFile}` : \"\";\n}\n\nfunction toIsoDate(date) {\n  const d = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n  return d.toISOString().slice(0, 10);\n}\n\nfunction setRedesignedDropdownOpen(dropdown, isOpen) {\n  if (!dropdown) return;\n  dropdown.classList.toggle(\"open\", !!isOpen);\n  dropdown.setAttribute(\"aria-expanded\", isOpen ? \"true\" : \"false\");\n}\n\nfunction bindRedesignedDropdownToggle(dropdown) {\n  if (!dropdown || dropdown._customDropdownBound) return;\n  dropdown._customDropdownBound = true;\n\n  dropdown.addEventListener(\"click\", function (e) {\n    if (dropdown.disabled) return;\n    e.stopPropagation();\n\n    document.querySelectorAll(\".redesigned-dropdown.open\").forEach(openDropdown => {\n      if (openDropdown !== dropdown) {\n        setRedesignedDropdownOpen(openDropdown, false);\n      }\n    });\n\n    setRedesignedDropdownOpen(dropdown, !dropdown.classList.contains(\"open\"));\n  });\n}\n\nfunction getDropdownLabelSpan(buttonEl) {\n  return buttonEl?.querySelector(\".dropdown-label\") || buttonEl?.querySelector(\"span\") || null;\n}\n\nfunction setRedesignedDropdownSelection(buttonEl, menuEl, value, label) {\n  if (!buttonEl) return;\n  buttonEl.dataset.value = value == null ? \"\" : String(value);\n\n  const span = getDropdownLabelSpan(buttonEl);\n  if (span) span.textContent = label != null ? String(label) : \"\";\n\n  if (menuEl) {\n    menuEl.querySelectorAll(\".redesigned-dropdown-item\").forEach(item => {\n      const isSelected = item.dataset.value === String(value ?? \"\");\n      item.querySelector(\"i\")?.classList.toggle(\"unactive\", !isSelected);\n    });\n  }\n}\n\nfunction getRedesignedDropdownValue(buttonEl) {\n  const v = buttonEl?.dataset?.value;\n  return v == null ? \"\" : String(v);\n}\n\nfunction getCustomNewsSelectedType() {\n  return getRedesignedDropdownValue(customNewsTypeButton);\n}\n\nfunction populateCustomNewsTypeDropdown({\n  buttonEl,\n  menuEl,\n  items,\n  selectedValue = \"\",\n  onSelect\n} = {}) {\n  if (!buttonEl || !menuEl) return;\n\n  menuEl.replaceChildren();\n\n  const sections = [\n    { key: \"normal\", label: \"Normal articles\" },\n    { key: \"turning_point\", label: \"Turning points\" },\n    { key: \"custom\", label: \"Custom article\" }\n  ];\n\n  const mkSectionTitle = (label) => {\n    const el = document.createElement(\"li\");\n    el.className = \"custom-dropdown-section-title bold-font\";\n    el.textContent = label;\n    return el;\n  };\n\n  const mkItem = (item) => {\n    const a = document.createElement(\"a\");\n    a.className = \"redesigned-dropdown-item\";\n    a.href = \"#\";\n    a.dataset.value = String(item.value ?? \"\");\n\n    const text = document.createElement(\"span\");\n    text.textContent = String(item.label ?? \"\");\n\n    const icon = document.createElement(\"i\");\n    icon.className = \"bi bi-check unactive\";\n\n    a.append(text, icon);\n    a.addEventListener(\"click\", (e) => {\n      e.preventDefault();\n      e.stopPropagation();\n      setRedesignedDropdownSelection(buttonEl, menuEl, a.dataset.value, text.textContent);\n      setRedesignedDropdownOpen(buttonEl, false);\n      if (typeof onSelect === \"function\") onSelect(a.dataset.value);\n    });\n\n    return a;\n  };\n\n  sections.forEach(section => {\n    const sectionItems = (items || []).filter(item => (item.group || \"normal\") === section.key);\n    if (!sectionItems.length) return;\n\n    menuEl.appendChild(mkSectionTitle(section.label));\n    sectionItems.forEach(item => {\n      menuEl.appendChild(mkItem(item));\n    });\n  });\n\n  const selectedItem = (items || []).find(item => String(item.value ?? \"\") === String(selectedValue ?? \"\"));\n  if (selectedItem) {\n    setRedesignedDropdownSelection(buttonEl, menuEl, selectedItem.value, selectedItem.label);\n  } else {\n    setRedesignedDropdownSelection(buttonEl, menuEl, \"\", \"Select type\");\n  }\n}\n\nfunction populateRedesignedDropdown({\n  buttonEl,\n  menuEl,\n  items,\n  getValue,\n  getLabel,\n  placeholderLabel = \"Select...\",\n  includeEmpty = false,\n  emptyLabel = \"Select...\",\n  selectedValue = \"\",\n  bindToggle = true,\n  onSelect\n} = {}) {\n  if (!buttonEl || !menuEl) return;\n\n  if (bindToggle) bindRedesignedDropdownToggle(buttonEl);\n\n  const isDriverDropdownItem = (item) => {\n    if (!item || typeof item !== \"object\") return false;\n    const hasDriverId = item.driverId != null || item.id != null;\n    return hasDriverId && typeof item.name === \"string\";\n  };\n\n  const buildDriverDropdownContent = (item, label) => {\n    const wrap = document.createElement(\"div\");\n    wrap.className = \"custom-news-driver-option\";\n\n    const logoTeamId = Number(item?.displayTeamId ?? item?.teamId);\n    const logoSrc = logoTeamId > 0 ? logos_disc?.[logoTeamId] : null;\n    if (logoSrc) {\n      const logo = document.createElement(\"img\");\n      logo.className = \"custom-news-driver-option-logo\";\n      logo.src = logoSrc;\n      logo.alt = item?.displayTeamName || item?.teamName || `Team ${logoTeamId}`;\n      wrap.appendChild(logo);\n    }\n\n    const text = document.createElement(\"span\");\n    text.className = \"custom-news-driver-option-text\";\n    text.textContent = String(label ?? item?.name ?? \"\");\n    wrap.appendChild(text);\n\n    return wrap;\n  };\n\n  const mkItem = (value, label) => {\n    const a = document.createElement(\"a\");\n    a.className = \"redesigned-dropdown-item\";\n    a.href = \"#\";\n    a.dataset.value = value == null ? \"\" : String(value);\n\n    let text = document.createElement(\"span\");\n    text.textContent = String(label ?? \"\");\n    const sourceItem = (items || []).find(it => String(getValue(it)) === a.dataset.value);\n    if (isDriverDropdownItem(sourceItem)) {\n      text = buildDriverDropdownContent(sourceItem, label);\n    }\n\n    const icon = document.createElement(\"i\");\n    icon.className = \"bi bi-check unactive\";\n\n    a.appendChild(text);\n    a.appendChild(icon);\n\n    a.addEventListener(\"click\", (e) => {\n      e.preventDefault();\n      e.stopPropagation();\n\n      setRedesignedDropdownSelection(buttonEl, menuEl, a.dataset.value, text.textContent);\n      setRedesignedDropdownOpen(buttonEl, false);\n      if (typeof onSelect === \"function\") onSelect(a.dataset.value);\n    });\n\n    return a;\n  };\n\n  menuEl.replaceChildren();\n\n  if (includeEmpty) {\n    menuEl.appendChild(mkItem(\"\", emptyLabel));\n  }\n\n  (items || []).forEach(it => {\n    menuEl.appendChild(mkItem(getValue(it), getLabel(it)));\n  });\n\n  const selectedStr = selectedValue == null ? \"\" : String(selectedValue);\n  const selectedItem = Array.from(menuEl.querySelectorAll(\".redesigned-dropdown-item\"))\n    .find(a => a.dataset.value === selectedStr);\n\n  if (selectedItem) {\n    setRedesignedDropdownSelection(buttonEl, menuEl, selectedItem.dataset.value, selectedItem.querySelector(\"span\")?.textContent);\n  } else {\n    setRedesignedDropdownSelection(buttonEl, menuEl, \"\", placeholderLabel);\n  }\n}\n\nfunction resolveCustomNewsTitleType(type = getCustomNewsSelectedType()) {\n  if (type === \"team_comparison\") {\n    return getRedesignedDropdownValue(document.getElementById(\"customNewsCompTypeButton\")) === \"bad\" ? 11 : 12;\n  }\n  if (type === \"season_review\") {\n    return Number(getRedesignedDropdownValue(document.getElementById(\"customNewsPartButton\"))) === 3 ? 15 : 14;\n  }\n  return CUSTOM_NEWS_TYPE_META[type]?.titleType ?? null;\n}\n\nfunction getCustomNewsTitleTemplates(type = getCustomNewsSelectedType()) {\n  const meta = CUSTOM_NEWS_TYPE_META[type];\n  const titleType = resolveCustomNewsTitleType(type);\n  if (!meta || titleType == null) return [];\n\n  if (meta.turningPoint) {\n    const entry = turningPointTitleTemplates.find(t => t.new_type === titleType);\n    return Array.isArray(entry?.turning_titles) ? entry.turning_titles : [];\n  }\n\n  const entry = newsTitleTemplates.find(t => t.new_type === titleType);\n  return Array.isArray(entry?.titles) ? entry.titles : [];\n}\n\nfunction refreshCustomNewsTitleTemplates() {\n  if (!customNewsTemplateButton || !customNewsTemplateMenu) return;\n\n  const type = getCustomNewsSelectedType();\n  const templates = getCustomNewsTitleTemplates(type);\n  if (type === \"custom_new\") {\n    customNewsTemplateWrap?.classList.add(\"custom-news-hidden\");\n    customNewsTitleInput?.classList.remove(\"custom-news-hidden\");\n    if (customNewsTitleInput) {\n      customNewsTitleInput.placeholder = getCustomNewsTitlePlaceholder(type);\n    }\n    return;\n  }\n\n  customNewsTemplateWrap?.classList.remove(\"custom-news-hidden\");\n  customNewsTitleInput?.classList.add(\"custom-news-hidden\");\n  if (customNewsTitleInput) customNewsTitleInput.value = \"\";\n\n  customNewsTemplateButton.disabled = false;\n\n  populateRedesignedDropdown({\n    buttonEl: customNewsTemplateButton,\n    menuEl: customNewsTemplateMenu,\n    items: templates.map((template, index) => ({ value: String(index), label: template })),\n    getValue: item => item.value,\n    getLabel: item => item.label,\n    placeholderLabel: \"Automatic / default title\",\n    includeEmpty: true,\n    emptyLabel: \"Automatic / default title\",\n    selectedValue: getRedesignedDropdownValue(customNewsTemplateButton),\n    bindToggle: false\n  });\n\n}\n\nfunction updateCustomNewsImagePreview() {\n  const imageFile = document.getElementById(\"customNewsImageValue\")?.value || \"\";\n  document.querySelectorAll(\".custom-news-image-card\").forEach(card => {\n    card.classList.toggle(\"selected\", card.dataset.value === imageFile);\n  });\n}\n\nfunction bindCustomNewsLiveRefresh() {\n  if (!customNewsModalEl || customNewsModalEl.dataset.customNewsRefreshBound === \"1\") return;\n  customNewsModalEl.dataset.customNewsRefreshBound = \"1\";\n\n  const refreshAll = () => {\n    refreshCustomNewsTitleTemplates();\n    updateCustomNewsImagePreview();\n  };\n\n  customNewsModalEl.addEventListener(\"input\", refreshAll);\n  customNewsModalEl.addEventListener(\"change\", refreshAll);\n  customNewsModalEl.addEventListener(\"click\", (e) => {\n    if (e.target.closest(\".redesigned-dropdown-item\")) {\n      setTimeout(refreshAll, 0);\n    }\n  });\n}\n\nasync function loadCustomNewsOptions() {\n  if (customNewsOptionsCache) return customNewsOptionsCache;\n  const resp = await new Command(\"getCustomNewsOptions\", {}).promiseExecute();\n  customNewsOptionsCache = resp.content || null;\n  return customNewsOptionsCache;\n}\n\nfunction renderCustomNewsParams(type, options) {\n  if (!customNewsParams) return;\n\n  const teams = options?.teams || [];\n  const races = options?.races || [];\n  const rawOfficialDrivers = options?.drivers || [];\n  const rawAllDrivers = options?.allDrivers?.length ? options.allDrivers : rawOfficialDrivers;\n  const engines = options?.engines || [];\n  const isF1TeamId = (teamId) => (teamId >= 1 && teamId <= 10) || teamId === 32;\n  const isJuniorTeamId = (teamId) => teamId >= 11 && teamId <= 31;\n  const normalizeDriverOption = (driver) => {\n    const driverId = Number(driver?.id ?? driver?.driverId);\n    const teamId = Number(driver?.teamId);\n    const resolvedTeamId = teamId > 0 ? teamId : null;\n    const resolvedTeamName = resolvedTeamId\n      ? (combined_dict[resolvedTeamId] || driver?.teamName || `Team ${resolvedTeamId}`)\n      : (driver?.teamName || \"Free Agent\");\n    return {\n      ...driver,\n      id: driverId,\n      driverId: driver?.driverId != null ? Number(driver.driverId) : driverId,\n      teamId: resolvedTeamId,\n      displayTeamId: resolvedTeamId,\n      teamName: resolvedTeamName,\n      displayTeamName: resolvedTeamName\n    };\n  };\n  const getDriverPriority = (driver, preferredOfficialIds = new Set()) => {\n    const driverId = Number(driver?.id ?? driver?.driverId);\n    const teamId = Number(driver?.teamId ?? driver?.displayTeamId);\n    if (preferredOfficialIds.has(driverId) && isF1TeamId(teamId)) return 4;\n    if (isF1TeamId(teamId)) return 3;\n    if (isJuniorTeamId(teamId)) return 2;\n    if (teamId > 0) return 1;\n    return 0;\n  };\n  const dedupeDriverOptions = (list, preferredOfficialIds = new Set()) => {\n    const byId = new Map();\n    const orderedIds = [];\n\n    (Array.isArray(list) ? list : []).forEach((driver) => {\n      const normalized = normalizeDriverOption(driver);\n      const driverId = Number(normalized?.id);\n      if (!(driverId > 0)) return;\n\n      if (!byId.has(driverId)) {\n        byId.set(driverId, normalized);\n        orderedIds.push(driverId);\n        return;\n      }\n\n      const current = byId.get(driverId);\n      const currentPriority = getDriverPriority(current, preferredOfficialIds);\n      const nextPriority = getDriverPriority(normalized, preferredOfficialIds);\n      if (nextPriority > currentPriority || (nextPriority === currentPriority && current?.teamId == null && normalized?.teamId != null)) {\n        byId.set(driverId, normalized);\n      }\n    });\n\n    return orderedIds.map((driverId) => byId.get(driverId)).filter(Boolean);\n  };\n\n  const dedupedOfficialDrivers = dedupeDriverOptions(rawOfficialDrivers);\n  const officialDriverIds = new Set(dedupedOfficialDrivers.map(driver => Number(driver?.id)).filter(id => id > 0));\n  const allDrivers = dedupeDriverOptions(rawAllDrivers, officialDriverIds);\n  const driversById = new Map(allDrivers.map(driver => [Number(driver?.id), driver]));\n  const officialDrivers = dedupedOfficialDrivers.map(driver => driversById.get(Number(driver?.id)) || driver);\n  const drivers = officialDrivers;\n  const f1OfficialDrivers = officialDrivers.filter(driver => isF1TeamId(Number(driver?.teamId)));\n  const nonOfficialDrivers = allDrivers.filter(driver => !officialDriverIds.has(Number(driver?.id)));\n  const completedRaces = races.filter(race => Number(race?.state) === 2);\n\n  customNewsParams.replaceChildren();\n\n  const createEl = (tag, className) => {\n    const el = document.createElement(tag);\n    if (className) el.className = className;\n    return el;\n  };\n\n  const makeLabel = (_targetId, text) => {\n    const label = createEl(\"span\", \"custom-news-label bold-font\");\n    label.textContent = text;\n    return label;\n  };\n\n  const makeRow = () => createEl(\"div\", \"custom-news-row\");\n  const makeCol = (width = \"full\") => {\n    const col = createEl(\"div\", \"custom-news-stack\");\n    const span = width === \"quarter\" ? 3 : width === \"third\" ? 4 : width === \"half\" ? 6 : 12;\n    col.dataset.span = String(span);\n    return col;\n  };\n\n  const makeInput = ({ id, type = \"text\", placeholder = \"\", min = null, max = null, step = null, value = null } = {}) => {\n    const input = createEl(\"input\", \"custom-news-input\");\n    input.id = id;\n    input.type = type;\n    if (placeholder) input.placeholder = placeholder;\n    if (min != null) input.min = String(min);\n    if (max != null) input.max = String(max);\n    if (step != null) input.step = String(step);\n    if (value != null) input.value = String(value);\n    return input;\n  };\n\n  const makeTextarea = ({ id, placeholder = \"\" } = {}) => {\n    const textarea = createEl(\"textarea\", \"custom-news-input\");\n    textarea.id = id;\n    textarea.placeholder = placeholder;\n    return textarea;\n  };\n\n  const makeInfo = (text) => {\n    const info = createEl(\"div\", \"custom-news-info\");\n    info.textContent = text;\n    return info;\n  };\n\n  const makeHint = (text) => {\n    const hint = createEl(\"div\", \"custom-news-help\");\n    hint.textContent = text;\n    return hint;\n  };\n\n  const makeSwitch = ({ id, label, checked = false } = {}) => {\n    const wrap = createEl(\"div\", \"form-check form-switch custom-news-switch\");\n    const input = document.createElement(\"input\");\n    input.className = \"form-check-input custom-toggle\";\n    input.type = \"checkbox\";\n    input.role = \"switch\";\n    input.id = id;\n    input.checked = !!checked;\n\n    const labelEl = document.createElement(\"label\");\n    labelEl.className = \"form-check-label\";\n    labelEl.htmlFor = id;\n    labelEl.textContent = label;\n\n    wrap.append(input, labelEl);\n    return { wrap, input, labelEl };\n  };\n\n  const makeCheckbox = ({ id, label, checked = false } = {}) => {\n    const wrap = createEl(\"label\", \"custom-news-checkbox\");\n    wrap.htmlFor = id;\n\n    const input = document.createElement(\"input\");\n    input.className = \"form-check-input\";\n    input.type = \"checkbox\";\n    input.id = id;\n    input.checked = !!checked;\n\n    const text = createEl(\"span\", \"custom-news-checkbox-label\");\n    text.textContent = label;\n\n    wrap.append(input, text);\n    return { wrap, input, text };\n  };\n\n  const clampNumber = (value, min = null, max = null) => {\n    let nextValue = Number(value);\n    if (Number.isNaN(nextValue)) nextValue = 0;\n    if (min != null) nextValue = Math.max(Number(min), nextValue);\n    if (max != null) nextValue = Math.min(Number(max), nextValue);\n    return nextValue;\n  };\n\n  const formatNumberValue = (value, step = 1) => {\n    const decimals = (String(step).split(\".\")[1] || \"\").length;\n    const numericValue = Number(value) || 0;\n    return decimals > 0 ? numericValue.toFixed(decimals) : String(Math.round(numericValue));\n  };\n\n  const makeNumberControl = ({ id, value = 0, min = null, max = null, step = 1, placeholder = \"\" } = {}) => {\n    const wrap = createEl(\"div\", \"custom-news-number-control\");\n\n    const minus = document.createElement(\"button\");\n    minus.type = \"button\";\n    minus.className = \"bi bi-dash new-augment-button custom-news-step-button\";\n\n    const input = makeInput({ id, type: \"number\", placeholder, min, max, step });\n    input.classList.add(\"custom-news-number-input\");\n    input.value = formatNumberValue(clampNumber(value, min, max), step);\n\n    const plus = document.createElement(\"button\");\n    plus.type = \"button\";\n    plus.className = \"bi bi-plus new-augment-button custom-news-step-button\";\n\n    const applyDelta = (delta) => {\n      const currentValue = input.value === \"\" ? 0 : Number(input.value);\n      const nextValue = clampNumber((Number.isNaN(currentValue) ? 0 : currentValue) + delta, min, max);\n      input.value = formatNumberValue(nextValue, step);\n      input.dispatchEvent(new Event(\"change\", { bubbles: true }));\n    };\n\n    minus.addEventListener(\"click\", () => {\n      if (input.disabled) return;\n      applyDelta(-step);\n    });\n    plus.addEventListener(\"click\", () => {\n      if (input.disabled) return;\n      applyDelta(step);\n    });\n    input.addEventListener(\"change\", () => {\n      if (input.value === \"\") return;\n      input.value = formatNumberValue(clampNumber(input.value, min, max), step);\n    });\n\n    const setDisabled = (disabled) => {\n      input.disabled = !!disabled;\n      wrap.classList.toggle(\"disabled\", !!disabled);\n      minus.disabled = !!disabled;\n      plus.disabled = !!disabled;\n    };\n\n    wrap.append(minus, input, plus);\n    return { wrap, input, setDisabled };\n  };\n\n  const makeDropdown = ({ buttonId, menuId, placeholder }) => {\n    const wrap = createEl(\"div\", \"dropdown-global\");\n\n    const button = createEl(\"button\", \"redesigned-dropdown bold-font\");\n    button.type = \"button\";\n    button.id = buttonId;\n    button.setAttribute(\"aria-haspopup\", \"true\");\n    button.setAttribute(\"aria-expanded\", \"false\");\n    button.dataset.value = \"\";\n\n    const labelSpan = createEl(\"span\", \"dropdown-label\");\n    labelSpan.textContent = placeholder;\n\n    const chevron = createEl(\"i\", \"redesigned-chevron\");\n\n    button.append(labelSpan, chevron);\n\n    const menu = createEl(\"ul\", \"redesigned-dropdown-menu\");\n    menu.id = menuId;\n    menu.style.fontFamily = \"Formula1\";\n\n    wrap.append(button, menu);\n    return { wrap, button, menu };\n  };\n\n  const teamLabel = (t) => t?.name ?? \"\";\n  const raceLabel = (r) => `${r?.label ?? \"\"}${r?.state === 2 ? \" (Done)\" : \"\"}`;\n  const driverLabel = (d) => `${d?.name ?? \"\"}`;\n  const getTeamDrivers = (teamId) => officialDrivers.filter(driver => Number(driver?.teamId) === Number(teamId));\n  const getDriversOutsideTeam = (teamId) => allDrivers.filter(driver => Number(driver?.teamId) !== Number(teamId));\n  const getSwitchModeLabel = (checked) => checked ? \"Manual values\" : \"Random values\";\n  const setDropdownDisabled = (buttonEl, disabled) => {\n    if (!buttonEl) return;\n    buttonEl.disabled = !!disabled;\n    buttonEl.classList.toggle(\"disabled\", !!disabled);\n    if (disabled) setRedesignedDropdownOpen(buttonEl, false);\n  };\n\n  if (type === \"race_result\" || type === \"quali_result\" || type === \"potential_champion\" || type === \"world_champion\") {\n    const row = makeRow();\n    const col = makeCol(\"full\");\n    const { wrap } = makeDropdown({ buttonId: \"customNewsRaceButton\", menuId: \"customNewsRaceMenu\", placeholder: \"Select race\" });\n    col.append(makeLabel(\"customNewsRaceButton\", \"Race\"), wrap);\n    row.append(col);\n    customNewsParams.append(row);\n\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsRaceButton\"),\n      menuEl: document.getElementById(\"customNewsRaceMenu\"),\n      items: completedRaces,\n      getValue: r => r.id,\n      getLabel: raceLabel,\n      placeholderLabel: \"Select race\",\n      includeEmpty: true,\n      emptyLabel: \"Select race\",\n      selectedValue: \"\",\n      bindToggle: true\n    });\n    return;\n  }\n\n  if (type === \"race_reaction\") {\n    const row = makeRow();\n\n    const raceCol = makeCol(\"full\");\n    raceCol.append(\n      makeLabel(\"customNewsRaceButton\", \"Race\"),\n      makeDropdown({ buttonId: \"customNewsRaceButton\", menuId: \"customNewsRaceMenu\", placeholder: \"Select race\" }).wrap\n    );\n\n    const happyCol = makeCol(\"half\");\n    happyCol.append(\n      makeLabel(\"customNewsHappyDriverButton\", \"Happy driver (optional)\"),\n      makeDropdown({ buttonId: \"customNewsHappyDriverButton\", menuId: \"customNewsHappyDriverMenu\", placeholder: \"Random\" }).wrap\n    );\n\n    const unhappyCol = makeCol(\"half\");\n    unhappyCol.append(\n      makeLabel(\"customNewsUnhappyDriverButton\", \"Unhappy driver (optional)\"),\n      makeDropdown({ buttonId: \"customNewsUnhappyDriverButton\", menuId: \"customNewsUnhappyDriverMenu\", placeholder: \"Random\" }).wrap\n    );\n\n    row.append(raceCol, happyCol, unhappyCol);\n    customNewsParams.append(row);\n\n    const happyBtn = document.getElementById(\"customNewsHappyDriverButton\");\n    const happyMenu = document.getElementById(\"customNewsHappyDriverMenu\");\n    const unhappyBtn = document.getElementById(\"customNewsUnhappyDriverButton\");\n    const unhappyMenu = document.getElementById(\"customNewsUnhappyDriverMenu\");\n\n    const raceDriverLabel = (d) => `${d?.pos}. ${d?.name}`;\n\n    const resetRaceReactionDrivers = () => {\n      populateRedesignedDropdown({\n        buttonEl: happyBtn,\n        menuEl: happyMenu,\n        items: [],\n        getValue: d => d.driverId,\n        getLabel: raceDriverLabel,\n        placeholderLabel: \"Random\",\n        includeEmpty: true,\n        emptyLabel: \"Random\",\n        selectedValue: \"\",\n        bindToggle: true\n      });\n      populateRedesignedDropdown({\n        buttonEl: unhappyBtn,\n        menuEl: unhappyMenu,\n        items: [],\n        getValue: d => d.driverId,\n        getLabel: raceDriverLabel,\n        placeholderLabel: \"Random\",\n        includeEmpty: true,\n        emptyLabel: \"Random\",\n        selectedValue: \"\",\n        bindToggle: true\n      });\n    };\n\n    resetRaceReactionDrivers();\n\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsRaceButton\"),\n      menuEl: document.getElementById(\"customNewsRaceMenu\"),\n      items: completedRaces,\n      getValue: r => r.id,\n      getLabel: raceLabel,\n      placeholderLabel: \"Select race\",\n      includeEmpty: true,\n      emptyLabel: \"Select race\",\n      selectedValue: \"\",\n      bindToggle: true,\n      onSelect: async (raceIdValue) => {\n        const raceId = Number(raceIdValue);\n        if (!raceId || raceId <= 0) {\n          resetRaceReactionDrivers();\n          return;\n        }\n\n        try {\n          const resp = await new Command(\"customNewsRaceDrivers\", { raceId }).promiseExecute();\n          const list = Array.isArray(resp.content) ? resp.content : [];\n\n          populateRedesignedDropdown({\n            buttonEl: happyBtn,\n            menuEl: happyMenu,\n            items: list,\n            getValue: d => d.driverId,\n            getLabel: raceDriverLabel,\n            placeholderLabel: \"Random\",\n            includeEmpty: true,\n            emptyLabel: \"Random\",\n            selectedValue: \"\",\n            bindToggle: true\n          });\n          populateRedesignedDropdown({\n            buttonEl: unhappyBtn,\n            menuEl: unhappyMenu,\n            items: list,\n            getValue: d => d.driverId,\n            getLabel: raceDriverLabel,\n            placeholderLabel: \"Random\",\n            includeEmpty: true,\n            emptyLabel: \"Random\",\n            selectedValue: \"\",\n            bindToggle: true\n          });\n        } catch (e) {\n          console.error(\"Failed to load race drivers:\", e);\n        }\n      }\n    });\n    return;\n  }\n\n  if (type === \"fake_transfer\") {\n    const row = makeRow();\n    const col = makeCol(\"full\");\n    col.append(\n      makeLabel(\"customNewsDriverButton\", \"Driver\"),\n      makeDropdown({ buttonId: \"customNewsDriverButton\", menuId: \"customNewsDriverMenu\", placeholder: \"Select driver\" }).wrap\n    );\n    row.append(col);\n    customNewsParams.append(row);\n\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsDriverButton\"),\n      menuEl: document.getElementById(\"customNewsDriverMenu\"),\n      items: drivers,\n      getValue: d => d.id,\n      getLabel: driverLabel,\n      placeholderLabel: \"Select driver\",\n      includeEmpty: true,\n      emptyLabel: \"Select driver\",\n      selectedValue: \"\",\n      bindToggle: true\n    });\n    return;\n  }\n\n  if (type === \"big_transfer\" || type === \"massive_exit\" || type === \"massive_signing\") {\n    const row = makeRow();\n\n    const driverCol = makeCol(\"half\");\n    driverCol.append(\n      makeLabel(\"customNewsDriverButton\", \"Driver\"),\n      makeDropdown({ buttonId: \"customNewsDriverButton\", menuId: \"customNewsDriverMenu\", placeholder: \"Select driver\" }).wrap\n    );\n\n    const fromCol = makeCol(\"quarter\");\n    fromCol.append(\n      makeLabel(\"customNewsFromTeamButton\", \"From team\"),\n      makeDropdown({ buttonId: \"customNewsFromTeamButton\", menuId: \"customNewsFromTeamMenu\", placeholder: \"Select team\" }).wrap\n    );\n\n    const toCol = makeCol(\"quarter\");\n    toCol.append(\n      makeLabel(\"customNewsToTeamButton\", \"To team\"),\n      makeDropdown({ buttonId: \"customNewsToTeamButton\", menuId: \"customNewsToTeamMenu\", placeholder: \"Select team\" }).wrap\n    );\n\n    const salaryCol = makeCol(\"half\");\n    salaryCol.append(\n      makeLabel(\"customNewsSalary\", \"Salary (optional)\"),\n      makeInput({ id: \"customNewsSalary\", type: \"number\", placeholder: \"e.g. 2000000\", min: 0 })\n    );\n\n    const endSeasonCol = makeCol(\"half\");\n    endSeasonCol.append(\n      makeLabel(\"customNewsEndSeason\", \"Contract end season (optional)\"),\n      makeInput({ id: \"customNewsEndSeason\", type: \"number\", placeholder: \"e.g. 2028\", min: 0 })\n    );\n\n    row.append(driverCol, fromCol, toCol, salaryCol, endSeasonCol);\n    customNewsParams.append(row);\n\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsDriverButton\"),\n      menuEl: document.getElementById(\"customNewsDriverMenu\"),\n      items: drivers,\n      getValue: d => d.id,\n      getLabel: driverLabel,\n      placeholderLabel: \"Select driver\",\n      includeEmpty: true,\n      emptyLabel: \"Select driver\",\n      selectedValue: \"\",\n      bindToggle: true\n    });\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsFromTeamButton\"),\n      menuEl: document.getElementById(\"customNewsFromTeamMenu\"),\n      items: teams,\n      getValue: t => t.id,\n      getLabel: teamLabel,\n      placeholderLabel: \"Select team\",\n      includeEmpty: true,\n      emptyLabel: \"Select team\",\n      selectedValue: \"\",\n      bindToggle: true\n    });\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsToTeamButton\"),\n      menuEl: document.getElementById(\"customNewsToTeamMenu\"),\n      items: teams,\n      getValue: t => t.id,\n      getLabel: teamLabel,\n      placeholderLabel: \"Select team\",\n      includeEmpty: true,\n      emptyLabel: \"Select team\",\n      selectedValue: \"\",\n      bindToggle: true\n    });\n    return;\n  }\n\n  if (type === \"contract_renewal\") {\n    const row = makeRow();\n\n    const driverCol = makeCol(\"half\");\n    driverCol.append(\n      makeLabel(\"customNewsDriverButton\", \"Driver\"),\n      makeDropdown({ buttonId: \"customNewsDriverButton\", menuId: \"customNewsDriverMenu\", placeholder: \"Select driver\" }).wrap\n    );\n\n    const renewalCol = makeCol(\"quarter\");\n    renewalCol.append(\n      makeLabel(\"customNewsRenewalTeamButton\", \"Renewal team\"),\n      makeDropdown({ buttonId: \"customNewsRenewalTeamButton\", menuId: \"customNewsRenewalTeamMenu\", placeholder: \"Select team\" }).wrap\n    );\n\n    const currentCol = makeCol(\"quarter\");\n    currentCol.append(\n      makeLabel(\"customNewsCurrentTeamButton\", \"Current team\"),\n      makeDropdown({ buttonId: \"customNewsCurrentTeamButton\", menuId: \"customNewsCurrentTeamMenu\", placeholder: \"Select team\" }).wrap\n    );\n\n    const salaryCol = makeCol(\"half\");\n    salaryCol.append(\n      makeLabel(\"customNewsSalary\", \"Salary (optional)\"),\n      makeInput({ id: \"customNewsSalary\", type: \"number\", placeholder: \"e.g. 2000000\", min: 0 })\n    );\n\n    const endSeasonCol = makeCol(\"half\");\n    endSeasonCol.append(\n      makeLabel(\"customNewsEndSeason\", \"Contract end season (optional)\"),\n      makeInput({ id: \"customNewsEndSeason\", type: \"number\", placeholder: \"e.g. 2028\", min: 0 })\n    );\n\n    row.append(driverCol, renewalCol, currentCol, salaryCol, endSeasonCol);\n    customNewsParams.append(row);\n\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsDriverButton\"),\n      menuEl: document.getElementById(\"customNewsDriverMenu\"),\n      items: drivers,\n      getValue: d => d.id,\n      getLabel: driverLabel,\n      placeholderLabel: \"Select driver\",\n      includeEmpty: true,\n      emptyLabel: \"Select driver\",\n      selectedValue: \"\",\n      bindToggle: true\n    });\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsRenewalTeamButton\"),\n      menuEl: document.getElementById(\"customNewsRenewalTeamMenu\"),\n      items: teams,\n      getValue: t => t.id,\n      getLabel: teamLabel,\n      placeholderLabel: \"Select team\",\n      includeEmpty: true,\n      emptyLabel: \"Select team\",\n      selectedValue: \"\",\n      bindToggle: true\n    });\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsCurrentTeamButton\"),\n      menuEl: document.getElementById(\"customNewsCurrentTeamMenu\"),\n      items: teams,\n      getValue: t => t.id,\n      getLabel: teamLabel,\n      placeholderLabel: \"Select team\",\n      includeEmpty: true,\n      emptyLabel: \"Select team\",\n      selectedValue: \"\",\n      bindToggle: true\n    });\n    return;\n  }\n\n  if (type === \"silly_season_rumors\") {\n    const row = makeRow();\n    [1, 2, 3].forEach(i => {\n      const driverCol = makeCol(\"half\");\n      driverCol.append(\n        makeLabel(`customNewsSillyDriver${i}Button`, `Driver ${i}`),\n        makeDropdown({\n          buttonId: `customNewsSillyDriver${i}Button`,\n          menuId: `customNewsSillyDriver${i}Menu`,\n          placeholder: \"Select driver\"\n        }).wrap\n      );\n\n      const teamCol = makeCol(\"half\");\n      teamCol.append(\n        makeLabel(`customNewsSillyTeam${i}Button`, `Destination team ${i}`),\n        makeDropdown({\n          buttonId: `customNewsSillyTeam${i}Button`,\n          menuId: `customNewsSillyTeam${i}Menu`,\n          placeholder: \"Select team\"\n        }).wrap\n      );\n\n      row.append(driverCol, teamCol);\n    });\n\n    customNewsParams.append(row);\n\n    [1, 2, 3].forEach(i => {\n      populateRedesignedDropdown({\n        buttonEl: document.getElementById(`customNewsSillyDriver${i}Button`),\n        menuEl: document.getElementById(`customNewsSillyDriver${i}Menu`),\n        items: drivers,\n        getValue: d => d.id,\n        getLabel: driverLabel,\n        placeholderLabel: \"Select driver\",\n        includeEmpty: true,\n        emptyLabel: \"Select driver\",\n        selectedValue: \"\",\n        bindToggle: true\n      });\n      populateRedesignedDropdown({\n        buttonEl: document.getElementById(`customNewsSillyTeam${i}Button`),\n        menuEl: document.getElementById(`customNewsSillyTeam${i}Menu`),\n        items: teams,\n        getValue: t => t.id,\n        getLabel: teamLabel,\n        placeholderLabel: \"Select team\",\n        includeEmpty: true,\n        emptyLabel: \"Select team\",\n        selectedValue: \"\",\n        bindToggle: true\n      });\n    });\n    return;\n  }\n\n  if (type === \"team_comparison\") {\n    const row = makeRow();\n\n    const teamCol = makeCol(\"half\");\n    teamCol.append(\n      makeLabel(\"customNewsTeamButton\", \"Team\"),\n      makeDropdown({ buttonId: \"customNewsTeamButton\", menuId: \"customNewsTeamMenu\", placeholder: \"Select team\" }).wrap\n    );\n\n    const compCol = makeCol(\"quarter\");\n    compCol.append(\n      makeLabel(\"customNewsCompTypeButton\", \"Comparison\"),\n      makeDropdown({ buttonId: \"customNewsCompTypeButton\", menuId: \"customNewsCompTypeMenu\", placeholder: \"Select\" }).wrap\n    );\n\n    const dropCol = makeCol(\"quarter\");\n    dropCol.append(\n      makeLabel(\"customNewsDrop\", \"Points diff (optional)\"),\n      makeInput({ id: \"customNewsDrop\", type: \"number\", value: 0 })\n    );\n\n    row.append(teamCol, compCol, dropCol);\n    customNewsParams.append(row);\n\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsTeamButton\"),\n      menuEl: document.getElementById(\"customNewsTeamMenu\"),\n      items: teams,\n      getValue: t => t.id,\n      getLabel: teamLabel,\n      placeholderLabel: \"Select team\",\n      includeEmpty: true,\n      emptyLabel: \"Select team\",\n      selectedValue: \"\",\n      bindToggle: true\n    });\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsCompTypeButton\"),\n      menuEl: document.getElementById(\"customNewsCompTypeMenu\"),\n      items: [{ value: \"good\", label: \"Good\" }, { value: \"bad\", label: \"Bad\" }],\n      getValue: t => t.value,\n      getLabel: t => t.label,\n      placeholderLabel: \"Select\",\n      includeEmpty: false,\n      selectedValue: \"good\",\n      bindToggle: true\n    });\n    return;\n  }\n\n  if (type === \"driver_comparison\") {\n    const row = makeRow();\n\n    const teamCol = makeCol(\"third\");\n    teamCol.append(\n      makeLabel(\"customNewsTeamButton\", \"Team\"),\n      makeDropdown({ buttonId: \"customNewsTeamButton\", menuId: \"customNewsTeamMenu\", placeholder: \"Select team\" }).wrap\n    );\n\n    const driver1Col = makeCol(\"third\");\n    driver1Col.append(\n      makeLabel(\"customNewsDriver1Button\", \"Driver 1\"),\n      makeDropdown({ buttonId: \"customNewsDriver1Button\", menuId: \"customNewsDriver1Menu\", placeholder: \"Select driver\" }).wrap\n    );\n\n    const driver2Col = makeCol(\"third\");\n    driver2Col.append(\n      makeLabel(\"customNewsDriver2Button\", \"Driver 2\"),\n      makeDropdown({ buttonId: \"customNewsDriver2Button\", menuId: \"customNewsDriver2Menu\", placeholder: \"Select driver\" }).wrap\n    );\n\n    row.append(teamCol, driver1Col, driver2Col);\n    customNewsParams.append(row);\n\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsTeamButton\"),\n      menuEl: document.getElementById(\"customNewsTeamMenu\"),\n      items: teams,\n      getValue: t => t.id,\n      getLabel: teamLabel,\n      placeholderLabel: \"Select team\",\n      includeEmpty: true,\n      emptyLabel: \"Select team\",\n      selectedValue: \"\",\n      bindToggle: true\n    });\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsDriver1Button\"),\n      menuEl: document.getElementById(\"customNewsDriver1Menu\"),\n      items: drivers,\n      getValue: d => d.id,\n      getLabel: driverLabel,\n      placeholderLabel: \"Select driver\",\n      includeEmpty: true,\n      emptyLabel: \"Select driver\",\n      selectedValue: \"\",\n      bindToggle: true\n    });\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsDriver2Button\"),\n      menuEl: document.getElementById(\"customNewsDriver2Menu\"),\n      items: drivers,\n      getValue: d => d.id,\n      getLabel: driverLabel,\n      placeholderLabel: \"Select driver\",\n      includeEmpty: true,\n      emptyLabel: \"Select driver\",\n      selectedValue: \"\",\n      bindToggle: true\n    });\n    return;\n  }\n\n  if (type === \"season_review\") {\n    const row = makeRow();\n    const col = makeCol(\"half\");\n    col.append(\n      makeLabel(\"customNewsPartButton\", \"Season review part\"),\n      makeDropdown({ buttonId: \"customNewsPartButton\", menuId: \"customNewsPartMenu\", placeholder: \"Select part\" }).wrap\n    );\n    row.append(col);\n    customNewsParams.append(row);\n\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsPartButton\"),\n      menuEl: document.getElementById(\"customNewsPartMenu\"),\n      items: [{ value: \"1\", label: \"Part 1\" }, { value: \"2\", label: \"Part 2\" }, { value: \"3\", label: \"Part 3\" }],\n      getValue: t => t.value,\n      getLabel: t => t.label,\n      placeholderLabel: \"Select part\",\n      includeEmpty: false,\n      selectedValue: \"1\",\n      bindToggle: true\n    });\n    return;\n  }\n\n  if (type === \"turning_point_technical_directive\") {\n    const row = makeRow();\n\n    const componentCol = makeCol(\"half\");\n    componentCol.append(\n      makeLabel(\"customNewsComponentButton\", \"Component\"),\n      makeDropdown({ buttonId: \"customNewsComponentButton\", menuId: \"customNewsComponentMenu\", placeholder: \"Select component\" }).wrap\n    );\n\n    const reasonCol = makeCol(\"half\");\n    reasonCol.append(\n      makeLabel(\"customNewsReason\", \"Reason\"),\n      makeInput({ id: \"customNewsReason\", placeholder: \"e.g. improve safety\" })\n    );\n\n    const modeCol = makeCol(\"half\");\n    modeCol.append(\n      makeLabel(\"customNewsEffectModeButton\", \"Effect style\"),\n      makeDropdown({ buttonId: \"customNewsEffectModeButton\", menuId: \"customNewsEffectModeMenu\", placeholder: \"Select style\" }).wrap\n    );\n\n    const amountCol = makeCol(\"quarter\");\n    const tdAmountControl = makeNumberControl({ id: \"customNewsEffectAmount\", value: 5, min: 0.5, max: 15, step: 0.5 });\n    amountCol.append(\n      makeLabel(\"customNewsEffectAmount\", \"Max swing(%)\"),\n      tdAmountControl.wrap\n    );\n\n    row.append(componentCol, reasonCol, modeCol, amountCol);\n    customNewsParams.append(row);\n\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsComponentButton\"),\n      menuEl: document.getElementById(\"customNewsComponentMenu\"),\n      items: Object.entries(part_full_names)\n        .filter(([id]) => [\"3\", \"4\", \"5\", \"6\", \"7\", \"8\"].includes(String(id)))\n        .map(([id, label]) => ({ id, label })),\n      getValue: item => item.id,\n      getLabel: item => item.label,\n      placeholderLabel: \"Select component\",\n      includeEmpty: true,\n      emptyLabel: \"Select component\",\n      selectedValue: \"\",\n      bindToggle: true\n    });\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsEffectModeButton\"),\n      menuEl: document.getElementById(\"customNewsEffectModeMenu\"),\n      items: [\n        { value: \"spread\", label: \"Spread grid\" },\n        { value: \"compact\", label: \"Compact grid\" },\n        { value: \"random\", label: \"Random\" }\n      ],\n      getValue: item => item.value,\n      getLabel: item => item.label,\n      placeholderLabel: \"Select style\",\n      includeEmpty: false,\n      selectedValue: \"spread\",\n      bindToggle: true\n    });\n    return;\n  }\n\n  if (type === \"turning_point_transfer\") {\n    const row = makeRow();\n\n    const teamCol = makeCol(\"third\");\n    teamCol.append(\n      makeLabel(\"customNewsTeamButton\", \"Team\"),\n      makeDropdown({ buttonId: \"customNewsTeamButton\", menuId: \"customNewsTeamMenu\", placeholder: \"Select team\" }).wrap\n    );\n\n    const driverOutCol = makeCol(\"third\");\n    driverOutCol.append(\n      makeLabel(\"customNewsDriverOutButton\", \"Driver out\"),\n      makeDropdown({ buttonId: \"customNewsDriverOutButton\", menuId: \"customNewsDriverOutMenu\", placeholder: \"Select driver\" }).wrap\n    );\n\n    const driverInCol = makeCol(\"third\");\n    driverInCol.append(\n      makeLabel(\"customNewsDriverInButton\", \"Driver in\"),\n      makeDropdown({ buttonId: \"customNewsDriverInButton\", menuId: \"customNewsDriverInMenu\", placeholder: \"Select driver\" }).wrap\n    );\n\n    const reserveCol = makeCol(\"half\");\n    reserveCol.append(\n      makeLabel(\"customNewsReserveDriverButton\", \"Substitute driver for driver in\"),\n      makeDropdown({ buttonId: \"customNewsReserveDriverButton\", menuId: \"customNewsReserveDriverMenu\", placeholder: \"No substitute\" }).wrap\n    );\n\n    row.append(teamCol, driverOutCol, driverInCol, reserveCol);\n    customNewsParams.append(row);\n\n    const teamButton = document.getElementById(\"customNewsTeamButton\");\n    const driverOutButton = document.getElementById(\"customNewsDriverOutButton\");\n    const driverOutMenu = document.getElementById(\"customNewsDriverOutMenu\");\n    const driverInButton = document.getElementById(\"customNewsDriverInButton\");\n    const driverInMenu = document.getElementById(\"customNewsDriverInMenu\");\n    const reserveButton = document.getElementById(\"customNewsReserveDriverButton\");\n    const reserveMenu = document.getElementById(\"customNewsReserveDriverMenu\");\n\n    const syncTransferReserveDropdown = (driverInIdValue) => {\n      const driverInId = Number(driverInIdValue);\n      const isOfficialSeatDriver = officialDriverIds.has(driverInId);\n      const reserveLabel = isOfficialSeatDriver ? \"No substitute\" : \"Only available for drivers with an F1 seat\";\n\n      populateRedesignedDropdown({\n        buttonEl: reserveButton,\n        menuEl: reserveMenu,\n        items: isOfficialSeatDriver ? nonOfficialDrivers : [],\n        getValue: item => item.id,\n        getLabel: driverLabel,\n        placeholderLabel: reserveLabel,\n        includeEmpty: true,\n        emptyLabel: reserveLabel,\n        selectedValue: isOfficialSeatDriver ? getRedesignedDropdownValue(reserveButton) : \"\",\n        bindToggle: true\n      });\n      setDropdownDisabled(reserveButton, !isOfficialSeatDriver);\n    };\n\n    const syncTransferDriverDropdowns = (teamIdValue) => {\n      const selectedTeamId = Number(teamIdValue);\n      const selectedTeamDrivers = selectedTeamId > 0 ? getTeamDrivers(selectedTeamId) : [];\n      const externalDrivers = selectedTeamId > 0 ? getDriversOutsideTeam(selectedTeamId) : [];\n      const teamFirstLabel = selectedTeamId > 0 ? \"Select driver\" : \"Select team first\";\n\n      populateRedesignedDropdown({\n        buttonEl: driverOutButton,\n        menuEl: driverOutMenu,\n        items: selectedTeamDrivers,\n        getValue: item => item.id,\n        getLabel: driverLabel,\n        placeholderLabel: teamFirstLabel,\n        includeEmpty: true,\n        emptyLabel: teamFirstLabel,\n        selectedValue: getRedesignedDropdownValue(driverOutButton),\n        bindToggle: true\n      });\n      populateRedesignedDropdown({\n        buttonEl: driverInButton,\n        menuEl: driverInMenu,\n        items: externalDrivers,\n        getValue: item => item.id,\n        getLabel: driverLabel,\n        placeholderLabel: teamFirstLabel,\n        includeEmpty: true,\n        emptyLabel: teamFirstLabel,\n        selectedValue: getRedesignedDropdownValue(driverInButton),\n        bindToggle: true,\n        onSelect: syncTransferReserveDropdown\n      });\n\n      if (selectedTeamId > 0) {\n        syncTransferReserveDropdown(getRedesignedDropdownValue(driverInButton));\n      } else {\n        syncTransferReserveDropdown(\"\");\n      }\n    };\n\n    populateRedesignedDropdown({\n      buttonEl: teamButton,\n      menuEl: document.getElementById(\"customNewsTeamMenu\"),\n      items: teams,\n      getValue: item => item.id,\n      getLabel: teamLabel,\n      placeholderLabel: \"Select team\",\n      includeEmpty: true,\n      emptyLabel: \"Select team\",\n      selectedValue: \"\",\n      bindToggle: true,\n      onSelect: syncTransferDriverDropdowns\n    });\n    syncTransferDriverDropdowns(\"\");\n    return;\n  }\n\n  if (type === \"turning_point_investment\") {\n    const row = makeRow();\n\n    const teamCol = makeCol(\"half\");\n    teamCol.append(\n      makeLabel(\"customNewsTeamButton\", \"Team\"),\n      makeDropdown({ buttonId: \"customNewsTeamButton\", menuId: \"customNewsTeamMenu\", placeholder: \"Select team\" }).wrap\n    );\n\n    const countryCol = makeCol(\"half\");\n    countryCol.append(\n      makeLabel(\"customNewsCountryButton\", \"Investor country\"),\n      makeDropdown({ buttonId: \"customNewsCountryButton\", menuId: \"customNewsCountryMenu\", placeholder: \"Select country\" }).wrap\n    );\n\n    const amountCol = makeCol(\"half\");\n    amountCol.append(\n      makeLabel(\"customNewsInvestmentAmount\", \"Investment amount (millions)\"),\n      makeInput({ id: \"customNewsInvestmentAmount\", type: \"number\", min: 1, value: 60 })\n    );\n\n    const shareCol = makeCol(\"half\");\n    shareCol.append(\n      makeLabel(\"customNewsInvestmentShare\", \"Share purchased (%)\"),\n      makeInput({ id: \"customNewsInvestmentShare\", type: \"number\", min: 1, value: 20 })\n    );\n\n    row.append(teamCol, countryCol, amountCol, shareCol);\n    customNewsParams.append(row);\n\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsTeamButton\"),\n      menuEl: document.getElementById(\"customNewsTeamMenu\"),\n      items: teams,\n      getValue: item => item.id,\n      getLabel: teamLabel,\n      placeholderLabel: \"Select team\",\n      includeEmpty: true,\n      emptyLabel: \"Select team\",\n      selectedValue: \"\",\n      bindToggle: true\n    });\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsCountryButton\"),\n      menuEl: document.getElementById(\"customNewsCountryMenu\"),\n      items: CUSTOM_NEWS_INVESTMENT_COUNTRIES.map(country => ({ value: country, label: country })),\n      getValue: item => item.value,\n      getLabel: item => item.label,\n      placeholderLabel: \"Select country\",\n      includeEmpty: true,\n      emptyLabel: \"Select country\",\n      selectedValue: \"\",\n      bindToggle: true\n    });\n    return;\n  }\n\n  if (type === \"turning_point_dsq\") {\n    const row = makeRow();\n\n    const raceCol = makeCol(\"half\");\n    raceCol.append(\n      makeLabel(\"customNewsRaceButton\", \"Race\"),\n      makeDropdown({ buttonId: \"customNewsRaceButton\", menuId: \"customNewsRaceMenu\", placeholder: \"Select race\" }).wrap\n    );\n\n    const teamCol = makeCol(\"half\");\n    teamCol.append(\n      makeLabel(\"customNewsTeamButton\", \"Team\"),\n      makeDropdown({ buttonId: \"customNewsTeamButton\", menuId: \"customNewsTeamMenu\", placeholder: \"Select team\" }).wrap\n    );\n\n    const componentCol = makeCol(\"full\");\n    componentCol.append(\n      makeLabel(\"customNewsDsqComponentButton\", \"Component\"),\n      makeDropdown({ buttonId: \"customNewsDsqComponentButton\", menuId: \"customNewsDsqComponentMenu\", placeholder: \"Select component\" }).wrap\n    );\n\n    row.append(raceCol, teamCol, componentCol);\n    customNewsParams.append(row);\n\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsRaceButton\"),\n      menuEl: document.getElementById(\"customNewsRaceMenu\"),\n      items: completedRaces,\n      getValue: item => item.id,\n      getLabel: raceLabel,\n      placeholderLabel: \"Select race\",\n      includeEmpty: true,\n      emptyLabel: \"Select race\",\n      selectedValue: \"\",\n      bindToggle: true\n    });\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsTeamButton\"),\n      menuEl: document.getElementById(\"customNewsTeamMenu\"),\n      items: teams,\n      getValue: item => item.id,\n      getLabel: teamLabel,\n      placeholderLabel: \"Select team\",\n      includeEmpty: true,\n      emptyLabel: \"Select team\",\n      selectedValue: \"\",\n      bindToggle: true\n    });\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsDsqComponentButton\"),\n      menuEl: document.getElementById(\"customNewsDsqComponentMenu\"),\n      items: CUSTOM_NEWS_DSQ_COMPONENTS.map(component => ({ value: component, label: component })),\n      getValue: item => item.value,\n      getLabel: item => item.label,\n      placeholderLabel: \"Select component\",\n      includeEmpty: true,\n      emptyLabel: \"Select component\",\n      selectedValue: \"\",\n      bindToggle: true\n    });\n    return;\n  }\n\n  if (type === \"turning_point_race_substitution\") {\n    const row = makeRow();\n\n    const raceCol = makeCol(\"half\");\n    raceCol.append(\n      makeLabel(\"customNewsRaceButton\", \"Original race\"),\n      makeDropdown({ buttonId: \"customNewsRaceButton\", menuId: \"customNewsRaceMenu\", placeholder: \"Select race\" }).wrap\n    );\n\n    const replacementCol = makeCol(\"half\");\n    replacementCol.append(\n      makeLabel(\"customNewsReplacementTrackButton\", \"Replacement track\"),\n      makeDropdown({ buttonId: \"customNewsReplacementTrackButton\", menuId: \"customNewsReplacementTrackMenu\", placeholder: \"Select track\" }).wrap\n    );\n\n    const reasonCol = makeCol(\"half\");\n    reasonCol.append(\n      makeLabel(\"customNewsReason\", \"Reason\"),\n      makeInput({ id: \"customNewsReason\", placeholder: \"e.g. logistical challenges\" })\n    );\n\n    row.append(raceCol, replacementCol, reasonCol);\n    customNewsParams.append(row);\n\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsRaceButton\"),\n      menuEl: document.getElementById(\"customNewsRaceMenu\"),\n      items: races,\n      getValue: item => item.id,\n      getLabel: raceLabel,\n      placeholderLabel: \"Select race\",\n      includeEmpty: true,\n      emptyLabel: \"Select race\",\n      selectedValue: \"\",\n      bindToggle: true\n    });\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsReplacementTrackButton\"),\n      menuEl: document.getElementById(\"customNewsReplacementTrackMenu\"),\n      items: races,\n      getValue: item => item.trackId,\n      getLabel: item => countries_data?.[item?.code]?.country || item?.label || \"\",\n      placeholderLabel: \"Select track\",\n      includeEmpty: true,\n      emptyLabel: \"Select track\",\n      selectedValue: \"\",\n      bindToggle: true\n    });\n    return;\n  }\n\n  if (type === \"turning_point_injury\") {\n    const row = makeRow();\n\n    const driverCol = makeCol(\"half\");\n    driverCol.append(\n      makeLabel(\"customNewsDriverButton\", \"Affected driver\"),\n      makeDropdown({ buttonId: \"customNewsDriverButton\", menuId: \"customNewsDriverMenu\", placeholder: \"Select driver\" }).wrap\n    );\n\n    const reserveCol = makeCol(\"half\");\n    reserveCol.append(\n      makeLabel(\"customNewsReserveDriverButton\", \"Reserve driver (optional)\"),\n      makeDropdown({ buttonId: \"customNewsReserveDriverButton\", menuId: \"customNewsReserveDriverMenu\", placeholder: \"No reserve driver\" }).wrap\n    );\n\n    const conditionCol = makeCol(\"half\");\n    conditionCol.append(\n      makeLabel(\"customNewsInjuryCondition\", \"Condition\"),\n      makeInput({ id: \"customNewsInjuryCondition\", placeholder: \"e.g. a sprained wrist\" })\n    );\n\n    const reasonCol = makeCol(\"half\");\n    reasonCol.append(\n      makeLabel(\"customNewsReason\", \"Reason\"),\n      makeInput({ id: \"customNewsReason\", placeholder: \"e.g. a training accident\" })\n    );\n\n    const racesAffectedCol = makeCol(\"half\");\n    racesAffectedCol.append(\n      makeLabel(\"customNewsRacesAffected\", \"Races affected\"),\n      makeInput({ id: \"customNewsRacesAffected\", type: \"number\", min: 1, value: 1 })\n    );\n\n    row.append(driverCol, reserveCol, conditionCol, reasonCol, racesAffectedCol);\n    customNewsParams.append(row);\n\n    const affectedDriverButton = document.getElementById(\"customNewsDriverButton\");\n    const reserveDriverButton = document.getElementById(\"customNewsReserveDriverButton\");\n    const reserveDriverMenu = document.getElementById(\"customNewsReserveDriverMenu\");\n    const syncInjuryReserveDropdown = (driverIdValue) => {\n      const blockedIds = new Set([Number(driverIdValue)].filter(id => id > 0));\n      const filteredDrivers = nonOfficialDrivers.filter(driver => !blockedIds.has(Number(driver?.id)));\n      populateRedesignedDropdown({\n        buttonEl: reserveDriverButton,\n        menuEl: reserveDriverMenu,\n        items: filteredDrivers,\n        getValue: item => item.id,\n        getLabel: driverLabel,\n        placeholderLabel: \"No reserve driver\",\n        includeEmpty: true,\n        emptyLabel: \"No reserve driver\",\n        selectedValue: getRedesignedDropdownValue(reserveDriverButton),\n        bindToggle: true\n      });\n    };\n\n    populateRedesignedDropdown({\n      buttonEl: affectedDriverButton,\n      menuEl: document.getElementById(\"customNewsDriverMenu\"),\n      items: f1OfficialDrivers,\n      getValue: item => item.id,\n      getLabel: driverLabel,\n      placeholderLabel: \"Select driver\",\n      includeEmpty: true,\n      emptyLabel: \"Select driver\",\n      selectedValue: \"\",\n      bindToggle: true,\n      onSelect: syncInjuryReserveDropdown\n    });\n    syncInjuryReserveDropdown(\"\");\n    return;\n  }\n\n  if (type === \"turning_point_engine_regulation\") {\n    const row = makeRow();\n\n    const changeTypeCol = makeCol(\"half\");\n    changeTypeCol.append(\n      makeLabel(\"customNewsChangeTypeButton\", \"Change type\"),\n      makeDropdown({ buttonId: \"customNewsChangeTypeButton\", menuId: \"customNewsChangeTypeMenu\", placeholder: \"Select type\" }).wrap\n    );\n\n    const changeAreaCol = makeCol(\"half\");\n    changeAreaCol.append(\n      makeLabel(\"customNewsChangeAreaButton\", \"Main change area\"),\n      makeDropdown({ buttonId: \"customNewsChangeAreaButton\", menuId: \"customNewsChangeAreaMenu\", placeholder: \"Select area\" }).wrap\n    );\n\n    const modeCol = makeCol(\"full\");\n    const engineModeSwitch = makeSwitch({ id: \"customNewsEngineRegulationManualSwitch\", label: getSwitchModeLabel(false), checked: false });\n    modeCol.append(makeLabel(\"customNewsEngineRegulationManualSwitch\", \"Change mode\"), engineModeSwitch.wrap);\n\n    const infoCol = makeCol(\"full\");\n    infoCol.append(makeInfo(\"Set a rough percentage change per manufacturer or leave it on random.\"));\n\n    row.append(changeTypeCol, changeAreaCol, modeCol, infoCol);\n    customNewsParams.append(row);\n\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsChangeTypeButton\"),\n      menuEl: document.getElementById(\"customNewsChangeTypeMenu\"),\n      items: [{ value: \"minor\", label: \"Minor\" }, { value: \"major\", label: \"Major\" }],\n      getValue: item => item.value,\n      getLabel: item => item.label,\n      placeholderLabel: \"Select type\",\n      includeEmpty: false,\n      selectedValue: \"minor\",\n      bindToggle: true\n    });\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsChangeAreaButton\"),\n      menuEl: document.getElementById(\"customNewsChangeAreaMenu\"),\n      items: CUSTOM_NEWS_ENGINE_CHANGE_AREAS.map(area => ({ value: area, label: area })),\n      getValue: item => item.value,\n      getLabel: item => item.label,\n      placeholderLabel: \"Select area\",\n      includeEmpty: true,\n      emptyLabel: \"Select area\",\n      selectedValue: \"\",\n      bindToggle: true\n    });\n\n    if (engines.length) {\n      const enginesRow = makeRow();\n      const engineControls = [];\n\n      engines.forEach((engine) => {\n        const engineCol = makeCol(\"quarter\");\n        engineCol.classList.add(\"custom-news-engine-change\");\n        engineCol.dataset.engineId = String(engine.id);\n\n        const deltaInputId = `customNewsEngineDelta${engine.id}`;\n        const deltaControl = makeNumberControl({ id: deltaInputId, value: 0, min: -20, max: 20, step: 0.5 });\n\n        engineCol.append(\n          makeLabel(deltaInputId, `${engine.name}`),\n          makeHint(\"Rough change (%)\"),\n          deltaControl.wrap\n        );\n\n        enginesRow.append(engineCol);\n        engineControls.push(deltaControl);\n      });\n\n      customNewsParams.append(enginesRow);\n\n      const syncEngineControls = () => {\n        const isManual = engineModeSwitch.input.checked;\n        engineModeSwitch.labelEl.textContent = getSwitchModeLabel(isManual);\n        engineControls.forEach(control => control.setDisabled(!isManual));\n      };\n\n      engineModeSwitch.input.addEventListener(\"change\", syncEngineControls);\n      syncEngineControls();\n    }\n    return;\n  }\n\n  if (type === \"turning_point_young_drivers\") {\n    const row = makeRow();\n    const infoCol = makeCol(\"full\");\n    infoCol.append(makeInfo(\"Pick two or three prospects. Approving this turning point will boost the selected drivers.\"));\n    row.append(infoCol);\n\n    [1, 2, 3].forEach(i => {\n      const col = makeCol(\"third\");\n      col.append(\n        makeLabel(`customNewsProspect${i}Button`, `Prospect ${i}${i === 3 ? \" (optional)\" : \"\"}`),\n        makeDropdown({ buttonId: `customNewsProspect${i}Button`, menuId: `customNewsProspect${i}Menu`, placeholder: i === 3 ? \"Optional\" : \"Select driver\" }).wrap\n      );\n      row.append(col);\n\n      populateRedesignedDropdown({\n        buttonEl: document.getElementById(`customNewsProspect${i}Button`),\n        menuEl: document.getElementById(`customNewsProspect${i}Menu`),\n        items: officialDrivers,\n        getValue: item => item.id,\n        getLabel: driverLabel,\n        placeholderLabel: i === 3 ? \"Optional\" : \"Select driver\",\n        includeEmpty: true,\n        emptyLabel: i === 3 ? \"Optional\" : \"Select driver\",\n        selectedValue: \"\",\n        bindToggle: true\n      });\n    });\n\n    customNewsParams.append(row);\n    return;\n  }\n\n  if (type === \"turning_point_aduo\") {\n    const row = makeRow();\n    const quarterCol = makeCol(\"half\");\n    quarterCol.append(\n      makeLabel(\"customNewsAduoQuarterButton\", \"ADUO quarter\"),\n      makeDropdown({ buttonId: \"customNewsAduoQuarterButton\", menuId: \"customNewsAduoQuarterMenu\", placeholder: \"Select quarter\" }).wrap\n    );\n    const modeCol = makeCol(\"half\");\n    const aduoModeSwitch = makeSwitch({ id: \"customNewsAduoManualSwitch\", label: getSwitchModeLabel(false), checked: false });\n    modeCol.append(makeLabel(\"customNewsAduoManualSwitch\", \"Change mode\"), aduoModeSwitch.wrap);\n\n    row.append(quarterCol, modeCol);\n    customNewsParams.append(row);\n\n    populateRedesignedDropdown({\n      buttonEl: document.getElementById(\"customNewsAduoQuarterButton\"),\n      menuEl: document.getElementById(\"customNewsAduoQuarterMenu\"),\n      items: CUSTOM_NEWS_ADUO_QUARTERS,\n      getValue: item => item.value,\n      getLabel: item => item.label,\n      placeholderLabel: \"Select quarter\",\n      includeEmpty: false,\n      selectedValue: \"1\",\n      bindToggle: true\n    });\n\n    if (engines.length) {\n      const enginesRow = makeRow();\n      const aduoControls = [];\n\n      engines.forEach((engine) => {\n        const engineCol = makeCol(\"quarter\");\n        engineCol.classList.add(\"custom-news-aduo-engine-change\");\n        engineCol.dataset.engineId = String(engine.id);\n\n        const engineCheck = makeCheckbox({ id: `customNewsAduoEnabled${engine.id}`, label: `${engine.name}`, checked: true });\n        const deltaInputId = `customNewsAduoDelta${engine.id}`;\n        const deltaControl = makeNumberControl({ id: deltaInputId, value: 3, min: -12, max: 12, step: 0.5 });\n\n        engineCol.append(\n          engineCheck.wrap,\n          makeHint(\"Rough change (%)\"),\n          deltaControl.wrap\n        );\n\n        enginesRow.append(engineCol);\n        aduoControls.push({ control: deltaControl, checkbox: engineCheck.input });\n      });\n\n      customNewsParams.append(enginesRow);\n\n      const syncAduoControls = () => {\n        const isManual = aduoModeSwitch.input.checked;\n        aduoModeSwitch.labelEl.textContent = getSwitchModeLabel(isManual);\n        aduoControls.forEach(({ control, checkbox }) => control.setDisabled(!isManual || !checkbox.checked));\n      };\n\n      aduoControls.forEach(({ checkbox }) => {\n        checkbox.addEventListener(\"change\", syncAduoControls);\n      });\n\n      aduoModeSwitch.input.addEventListener(\"change\", syncAduoControls);\n      syncAduoControls();\n    }\n    return;\n  }\n\n  if (type === \"custom_new\") {\n    const row = makeRow();\n\n    const galleryCol = makeCol(\"full\");\n    galleryCol.append(makeLabel(\"customNewsImageGrid\", \"Picture\"));\n\n    const imageValue = document.createElement(\"input\");\n    imageValue.type = \"hidden\";\n    imageValue.id = \"customNewsImageValue\";\n    galleryCol.append(imageValue);\n\n    const imageGrid = createEl(\"div\", \"custom-news-image-grid\");\n    imageGrid.id = \"customNewsImageGrid\";\n\n    CUSTOM_NEWS_IMAGE_FILES.forEach(file => {\n      const imageCard = document.createElement(\"button\");\n      imageCard.type = \"button\";\n      imageCard.className = \"custom-news-image-card\";\n      imageCard.dataset.value = file;\n\n      const thumbnail = document.createElement(\"img\");\n      thumbnail.src = getCustomNewsImageSrc(file);\n      thumbnail.alt = file;\n      thumbnail.loading = \"lazy\";\n\n      imageCard.append(thumbnail);\n      imageCard.addEventListener(\"click\", () => {\n        imageValue.value = file;\n        updateCustomNewsImagePreview();\n      });\n\n      imageGrid.appendChild(imageCard);\n    });\n\n    galleryCol.append(imageGrid);\n\n    const promptCol = makeCol(\"full\");\n    const infoCol = makeCol(\"full\");\n    promptCol.append(\n      makeLabel(\"customNewsPrompt\", \"Article prompt\"),\n      makeTextarea({ id: \"customNewsPrompt\", placeholder: \"Describe the story you want the AI to write. The article will still be grounded in the save context and current standings.\" })\n    );\n\n    row.append(galleryCol, promptCol, infoCol);\n    customNewsParams.append(row);\n    updateCustomNewsImagePreview();\n    return;\n  }\n\n  const noParams = createEl(\"div\", \"custom-news-info\");\n  noParams.textContent = \"No extra parameters for this type.\";\n  customNewsParams.append(noParams);\n}\n\nasync function openCustomNewsModal() {\n  if (!customNewsModalEl || !customNewsTypeButton || !customNewsTypeMenu || !customNewsCreateBtn) return;\n  if (!customNewsModal) customNewsModal = new bootstrap.Modal(customNewsModalEl);\n\n  setCustomNewsError(null);\n\n  const options = await loadCustomNewsOptions();\n  if (!options) {\n    setCustomNewsError(\"Failed to load custom news options.\");\n    return;\n  }\n\n  const defaultType = CUSTOM_NEWS_TYPE_DEFS[0]?.value || \"\";\n  populateCustomNewsTypeDropdown({\n    buttonEl: customNewsTypeButton,\n    menuEl: customNewsTypeMenu,\n    items: CUSTOM_NEWS_TYPE_DEFS,\n    selectedValue: defaultType,\n    onSelect: (value) => {\n      setCustomNewsError(null);\n      renderCustomNewsParams(String(value), options);\n      refreshCustomNewsTitleTemplates();\n    }\n  });\n\n  const defaultDate = options.currentDay ? excelToDate(options.currentDay) : new Date();\n  if (customNewsDateInput) customNewsDateInput.value = toIsoDate(defaultDate);\n  if (customNewsTitleInput) customNewsTitleInput.value = \"\";\n  if (customNewsTemplateButton) {\n    customNewsTemplateButton.disabled = false;\n    customNewsTemplateMenu?.replaceChildren();\n    setRedesignedDropdownSelection(customNewsTemplateButton, customNewsTemplateMenu, \"\", getCustomNewsTitlePlaceholder());\n    setRedesignedDropdownOpen(customNewsTemplateButton, false);\n  }\n  customNewsTemplateWrap?.classList.remove(\"custom-news-hidden\");\n  customNewsTitleInput?.classList.add(\"custom-news-hidden\");\n\n  renderCustomNewsParams(getRedesignedDropdownValue(customNewsTypeButton), options);\n  refreshCustomNewsTitleTemplates();\n  bindCustomNewsLiveRefresh();\n\n  customNewsModal.show();\n}\n\nasync function submitCustomNews() {\n  if (!customNewsTypeButton) return;\n  setCustomNewsError(null);\n\n  const type = getCustomNewsSelectedType();\n  if (!type) {\n    setCustomNewsError(\"Select a type first.\");\n    return;\n  }\n  const dateIso = customNewsDateInput?.value || null;\n  const title = customNewsTitleInput?.value || \"\";\n  const titleTemplateRaw = getRedesignedDropdownValue(customNewsTemplateButton);\n  const titleTemplateValue = titleTemplateRaw !== \"__custom__\" ? Number(titleTemplateRaw) : null;\n  const titleTemplateIndex = Number.isInteger(titleTemplateValue) ? titleTemplateValue : null;\n\n  const params = {};\n\n  const numFromButtonId = (id) => {\n    const btn = document.getElementById(id);\n    const raw = getRedesignedDropdownValue(btn);\n    if (raw === \"\" || raw == null) return null;\n    return Number(raw);\n  };\n  const strFromButtonId = (id) => {\n    const btn = document.getElementById(id);\n    const raw = getRedesignedDropdownValue(btn);\n    return raw || null;\n  };\n  const strFromInputId = (id) => {\n    const el = document.getElementById(id);\n    return el?.value?.trim?.() || null;\n  };\n  const numFromInputId = (id) => {\n    const el = document.getElementById(id);\n    if (!el || el.value === \"\") return null;\n    return Number(el.value);\n  };\n\n  const raceId = numFromButtonId(\"customNewsRaceButton\");\n  if (raceId != null && raceId > 0) params.raceId = raceId;\n\n  const driverId = numFromButtonId(\"customNewsDriverButton\");\n  if (driverId != null && driverId > 0) params.driverId = driverId;\n\n  const fromTeamId = numFromButtonId(\"customNewsFromTeamButton\");\n  if (fromTeamId != null && fromTeamId > 0) params.fromTeamId = fromTeamId;\n\n  const toTeamId = numFromButtonId(\"customNewsToTeamButton\");\n  if (toTeamId != null && toTeamId > 0) params.toTeamId = toTeamId;\n\n  const renewalTeamId = numFromButtonId(\"customNewsRenewalTeamButton\");\n  if (renewalTeamId != null && renewalTeamId > 0) params.renewalTeamId = renewalTeamId;\n\n  const currentTeamId = numFromButtonId(\"customNewsCurrentTeamButton\");\n  if (currentTeamId != null && currentTeamId > 0) params.currentTeamId = currentTeamId;\n\n  const teamId = numFromButtonId(\"customNewsTeamButton\");\n  if (teamId != null && teamId > 0) params.teamId = teamId;\n\n  const compType = strFromButtonId(\"customNewsCompTypeButton\");\n  if (compType) params.compType = compType;\n\n  const drop = numFromInputId('customNewsDrop');\n  if (drop != null) params.drop = drop;\n\n  const driver1Id = numFromButtonId(\"customNewsDriver1Button\");\n  if (driver1Id != null && driver1Id > 0) params.driver1Id = driver1Id;\n\n  const driver2Id = numFromButtonId(\"customNewsDriver2Button\");\n  if (driver2Id != null && driver2Id > 0) params.driver2Id = driver2Id;\n\n  const part = numFromButtonId(\"customNewsPartButton\");\n  if (part != null && part > 0) params.part = part;\n\n  const salary = numFromInputId('customNewsSalary');\n  if (salary != null) params.salary = salary;\n\n  const endSeason = numFromInputId('customNewsEndSeason');\n  if (endSeason != null) params.endSeason = endSeason;\n\n  const happyDriverId = numFromButtonId(\"customNewsHappyDriverButton\");\n  if (happyDriverId != null && happyDriverId > 0) params.happyDriverId = happyDriverId;\n\n  const unhappyDriverId = numFromButtonId(\"customNewsUnhappyDriverButton\");\n  if (unhappyDriverId != null && unhappyDriverId > 0) params.unhappyDriverId = unhappyDriverId;\n\n  if (type === \"silly_season_rumors\") {\n    const list = [1, 2, 3].map(i => {\n      const dBtn = document.getElementById(`customNewsSillyDriver${i}Button`);\n      const tBtn = document.getElementById(`customNewsSillyTeam${i}Button`);\n      const sEl = document.getElementById(`customNewsSillySalary${i}`);\n      const eEl = document.getElementById(`customNewsSillyEndSeason${i}`);\n      return {\n        driverId: (() => {\n          const v = getRedesignedDropdownValue(dBtn);\n          const n = Number(v);\n          return n > 0 ? n : null;\n        })(),\n        potentialTeam: (() => {\n          const v = getRedesignedDropdownValue(tBtn);\n          const n = Number(v);\n          return n > 0 ? n : null;\n        })(),\n        salary: sEl && sEl.value !== \"\" ? Number(sEl.value) : null,\n        endSeason: eEl && eEl.value !== \"\" ? Number(eEl.value) : null\n      };\n    });\n    params.drivers = list;\n  }\n\n  if (type === \"turning_point_technical_directive\") {\n    params.componentId = numFromButtonId(\"customNewsComponentButton\");\n    params.reason = strFromInputId(\"customNewsReason\");\n    params.effectMode = strFromButtonId(\"customNewsEffectModeButton\");\n    params.effectAmount = numFromInputId(\"customNewsEffectAmount\");\n  }\n\n  if (type === \"turning_point_transfer\") {\n    params.driverOutId = numFromButtonId(\"customNewsDriverOutButton\");\n    params.driverInId = numFromButtonId(\"customNewsDriverInButton\");\n    params.reserveDriverId = numFromButtonId(\"customNewsReserveDriverButton\");\n  }\n\n  if (type === \"turning_point_investment\") {\n    params.country = strFromButtonId(\"customNewsCountryButton\");\n    params.investmentAmount = numFromInputId(\"customNewsInvestmentAmount\");\n    params.investmentShare = numFromInputId(\"customNewsInvestmentShare\");\n  }\n\n  if (type === \"turning_point_dsq\") {\n    params.component = strFromButtonId(\"customNewsDsqComponentButton\");\n  }\n\n  if (type === \"turning_point_race_substitution\") {\n    params.newRaceTrackId = numFromButtonId(\"customNewsReplacementTrackButton\");\n    params.reason = strFromInputId(\"customNewsReason\");\n  }\n\n  if (type === \"turning_point_injury\") {\n    params.reserveDriverId = numFromButtonId(\"customNewsReserveDriverButton\");\n    params.condition = strFromInputId(\"customNewsInjuryCondition\");\n    params.reason = strFromInputId(\"customNewsReason\");\n    params.racesAffected = numFromInputId(\"customNewsRacesAffected\");\n  }\n\n  if (type === \"turning_point_engine_regulation\") {\n    params.changeType = strFromButtonId(\"customNewsChangeTypeButton\");\n    params.changeArea = strFromButtonId(\"customNewsChangeAreaButton\");\n    params.manualMode = !!document.getElementById(\"customNewsEngineRegulationManualSwitch\")?.checked;\n    params.engineChanges = Array.from(document.querySelectorAll(\".custom-news-engine-change\")).map((engineEl) => {\n      const engineId = Number(engineEl.dataset.engineId);\n      return {\n        engineId,\n        value: numFromInputId(`customNewsEngineDelta${engineId}`)\n      };\n    });\n  }\n\n  if (type === \"turning_point_young_drivers\") {\n    params.prospectDriverIds = [1, 2, 3]\n      .map(i => numFromButtonId(`customNewsProspect${i}Button`))\n      .filter(id => id > 0);\n  }\n\n  if (type === \"turning_point_aduo\") {\n    params.quarter = numFromButtonId(\"customNewsAduoQuarterButton\");\n    params.manualMode = !!document.getElementById(\"customNewsAduoManualSwitch\")?.checked;\n    params.engineChanges = Array.from(document.querySelectorAll(\".custom-news-aduo-engine-change\")).map((engineEl) => {\n      const engineId = Number(engineEl.dataset.engineId);\n      return {\n        engineId,\n        enabled: !!document.getElementById(`customNewsAduoEnabled${engineId}`)?.checked,\n        value: numFromInputId(`customNewsAduoDelta${engineId}`)\n      };\n    });\n  }\n\n  if (type === \"custom_new\") {\n    params.image = document.getElementById(\"customNewsImageValue\")?.value || null;\n    params.prompt = strFromInputId(\"customNewsPrompt\");\n\n    if (!title.trim()) {\n      setCustomNewsError(\"Custom articles need a title.\");\n      return;\n    }\n    if (!params.image) {\n      setCustomNewsError(\"Select an image for the custom article.\");\n      return;\n    }\n    if (!params.prompt) {\n      setCustomNewsError(\"Write the prompt for the custom article.\");\n      return;\n    }\n  }\n\n  try {\n    await new Command(\"createCustomNews\", { type, title, titleTemplateIndex, dateIso, params }).promiseExecute();\n    customNewsModal?.hide();\n    customNewsOptionsCache = null;\n\n    const newsGrid = document.querySelector(\".news-grid\");\n    newsGrid.innerHTML = '';\n\n    generateNews();\n  } catch (e) {\n    console.error(e);\n    setCustomNewsError(e?.message || \"Failed to create custom news.\");\n  }\n}\n\ncreateCustomNewsBtn?.addEventListener(\"click\", async () => {\n  try {\n    await openCustomNewsModal();\n  } catch (e) {\n    console.error(e);\n  }\n});\n\ncustomNewsCreateBtn?.addEventListener(\"click\", async () => {\n  await submitCustomNews();\n});\n\nexport function updateNewsYearsButton(message) {\n  let years = message.yearsAvailable;\n  const newsYearsMenu = document.getElementById(\"newsSeasonMenu\");\n  const newsYearsButton = document.getElementById(\"newsSeasonButton\");\n  newsYearsMenu.innerHTML = '';\n\n  if (!Array.isArray(years) || years.length === 0) {\n    newsYearsButton.querySelector(\"span\").innerText = \"Season\";\n    return;\n  }\n\n  years.forEach((year) => {\n    const item = document.createElement(\"a\");\n    item.classList.add(\"redesigned-dropdown-item\");\n    item.href = \"#\";\n    item.dataset.value = year;\n    item.innerText = year;\n    item.addEventListener(\"click\", function (e) {\n      console.log(\"Selected news year:\", year);\n      newsYearsButton.querySelector(\"span\").innerText = year;\n      const command = new Command(\"getNewsFromSeason\", { season: year });\n      command.execute();\n    });\n    newsYearsMenu.appendChild(item);\n  });\n  //set the text in the button to the current year\n  const lastYear = Math.max(...years);\n  newsYearsButton.querySelector(\"span\").innerText = lastYear;\n\n}\n\nasync function addTurningPointContexts(prompt, date) {\n  const command = new Command(\"getNews\", {});\n  let resp = await command.promiseExecute();\n  let news = resp.content;\n\n  const newsWithId = Object.entries(news).map(([id, n]) => ({ id, ...n }));\n  const turningPointsOutcomes = newsWithId.filter(n => n.id.startsWith('turning_point_outcome_') || n.id.includes('_world_champion'));\n  const aduoTurningPoints = newsWithId.filter(n => n.type === \"turning_point_aduo\");\n\n  if (turningPointsOutcomes.length > 0 || aduoTurningPoints.length > 0) {\n    let number = 1;\n    const lines = [];\n\n    const addLine = (text) => {\n      if (!text) return;\n      lines.push(`${number++}. ${text}`);\n    };\n\n    const formatList = (list) => {\n      if (!list.length) return \"\";\n      if (list.length === 1) return list[0];\n      if (list.length === 2) return `${list[0]} and ${list[1]}`;\n      return `${list.slice(0, -1).join(\", \")} and ${list[list.length - 1]}`;\n    };\n\n    const getAduoEnginesSummary = (engineImprovements) => {\n      if (!Array.isArray(engineImprovements) || !engineImprovements.length) return null;\n\n      const getAvgChange = (improvements) => {\n        if (!improvements) return 0;\n        let sum = 0;\n        let count = 0;\n        for (const statId of Object.keys(improvements)) {\n          sum += Number(improvements[statId]) || 0;\n          count += 1;\n        }\n        return count ? (sum / count) : 0;\n      };\n\n      const getPowerChange = (improvements) => {\n        if (!improvements) return null;\n        if (improvements[10] !== undefined) return Number(improvements[10]) || 0;\n        if (improvements[\"10\"] !== undefined) return Number(improvements[\"10\"]) || 0;\n        return null;\n      };\n\n      const ranked = engineImprovements.map((e) => {\n        const improvements = e?.improvements || {};\n        const power = getPowerChange(improvements);\n        const score = power === null ? getAvgChange(improvements) : power;\n        return { name: e?.name || \"Unknown manufacturer\", score };\n      })\n        .sort((a, b) => b.score - a.score);\n\n      if (!ranked.length) return null;\n\n      const top = ranked.slice(0, 3);\n      const best = Number(top[0].score) || 0;\n\n      const labelFor = (score) => {\n        if (best <= 0) return \"changed\";\n        const ratio = score / best;\n        if (ratio >= 0.8) return \"improved a lot\";\n        if (ratio >= 0.4) return \"improved a bit\";\n        return \"improved slightly\";\n      };\n\n      const phrases = top.map((e, idx) => {\n        const label = labelFor(e.score);\n        if (idx === 0) return `${e.name} ${label}`;\n        return `${e.name} ${label.replace(\"improved \", \"\")}`;\n      });\n\n      return formatList(phrases);\n    };\n\n    for (const tp of turningPointsOutcomes) {\n      const turningDate = tp.date;\n      if ((tp.turning_point_type === \"positive\" || tp.id.includes('_world_champion')) && Number(turningDate) <= Number(date)) {\n        if (tp.id.includes(\"investment\")) {\n          addLine(`${tp.data.country} made an investment of ${tp.data.investmentAmount} million dollars into ${tp.data.teamName}, buying a ${tp.data.investmentShare}% of their racing division.`);\n        }\n        else if (tp.id.includes(\"technical_directive\")) {\n          addLine(`The FIA introduced a technical directive in relation to the ${tp.data.component} because of ${tp.data.reason}.`);\n        }\n        else if (tp.id.includes(\"dsq\")) {\n          addLine(`After the post-race technical inspection of the ${tp.data.country} GP, both cars from ${tp.data.team} were disqualified due to an ilegality with their ${tp.data.component}.`);\n        }\n        else if (tp.id.includes(\"substitution\")) {\n          addLine(`The race that was going to be held in ${tp.data.originalCountry} was cancelled due to ${tp.data.reason} and was substituted by a race in ${tp.data.substituteCountry}.`);\n        }\n        else if (tp.id.includes(\"transfer\")) {\n          addLine(`${tp.data.driver_out?.name} lost his seat at ${tp.data.team} and ${tp.data.driver_in?.name} has been signed to replace him.`);\n        }\n        else if (tp.id.includes(\"injury\")) {\n          addLine(`${tp.data.driver_affected?.name} suffered ${tp.data.condition?.condition} due to \"${tp.data.condition?.reason}\", causing him to miss ${tp.data.condition?.races_affected?.length || 1} race(s). ${tp.data.reserve_driver ? `He was replaced by ${tp.data.reserve_driver?.name}.` : ''}`);\n        }\n        else if (tp.id.includes(\"_world_champion\")) {\n          addLine(`${tp.data.driver_name} (${combined_dict[tp.data.driver_team_id]}) won the ${tp.data.season_year} world championship at the ${tp.data.adjective} GP`);\n        }\n      }\n    }\n\n    for (const tp of aduoTurningPoints) {\n      if (Number(tp.date) > Number(date)) continue;\n      const summary = getAduoEnginesSummary(tp?.data?.engineImprovements);\n      if (!summary) continue;\n      const quarterString = tp?.data?.quarterString ? `${tp.data.quarterString} quarter` : \"this period\";\n      addLine(`ADUO engine upgrades (${quarterString}): ${summary}.`);\n    }\n\n    if (lines.length) {\n      prompt += `\\n\\nHere are some other events that happened through the season. Talk about them if relevant to the article:\\n${lines.join(\"\\n\")}`;\n    }\n  }\n  return prompt;\n}\n"
  },
  {
    "path": "src/js/frontend/performance.js",
    "content": "import { races_names, part_codes_abreviations, codes_dict, combined_dict, races_map, abreviations_dict, pars_abreviations, engine_stats_dict,\n    theme_colors\n  } from \"./config\";\nimport { colors_dict, get_colors_dict } from \"./head2head\";\nimport { manageSaveButton, game_version, attachHold, first_show_animation, selectedTheme, confirmModal } from \"./renderer\";\nimport { Command } from \"../backend/command.js\";\nimport Chart from 'chart.js/auto';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport annotationPlugin from 'chartjs-plugin-annotation';\nimport { getEngineLogoSrc } from \"./seasonViewer.js\";\n\nconst teamsPill = document.getElementById(\"teamsPill\");\nconst enginesPill = document.getElementById(\"enginesPill\");\n\nconst teamsDiv = document.getElementById(\"teamsDiv\");\nconst enginesDiv = document.getElementById(\"enginesDiv\");\n\nconst divsTeamsArray = [teamsDiv, enginesDiv]\n\n\nexport let teamSelected;\nlet engineSelected;\nlet teamEngineSelected;\nlet performanceGraph;\nexport let teamsEngine = \"teams\"\nexport let viewingGraph = true;\nexport let performanceDetailsMode = \"performance\";\nlet actualMaxDesign = 0;\nlet customEnginesCopy;\nlet currentData;\nlet performanceView = \"graph\";\nlet currentPartsStats = null;\nlet currentTeamExpertise = null;\nlet performanceDraftStats = null;\nlet expertiseDraftStats = null;\nlet performanceAnnotationsToggle = true;\n\nChart.register(ChartDataLabels);\nChart.register(annotationPlugin);\n\nconst overviewAttributes = [\n    { key: \"top_speed\", label: \"Top speed\" },\n    { key: \"acceleration\", label: \"Acceleration\" },\n    { key: \"low_speed\", label: \"Low speed\" },\n    { key: \"medium_speed\", label: \"Medium speed\" },\n    { key: \"high_speed\", label: \"High speed\" },\n    { key: \"drs\", label: \"DRS Effectiveness\" },\n    { key: \"dirty_air\", label: \"Dirty air tolerance\" },\n    { key: \"brake_cooling\", label: \"Brake cooling\" },\n    { key: \"engine_power\", label: \"Engine power\" },\n    { key: \"engine_cooling\", label: \"Engine cooling\" }\n    \n];\n\nfunction clampPercent(value) {\n    let numericValue = Number(value);\n    if (Number.isNaN(numericValue)) {\n        return 0;\n    }\n    return Math.max(0, numericValue);\n}\n\nfunction setBarWidth(bar, value) {\n    if (!bar) return;\n    bar.style.width = clampPercent(value) + \"%\";\n}\n\nfunction normalizeData(data) {\n    let values = Object.values(data);\n\n    let min = Math.min(...values);\n    let max = Math.max(...values);\n\n    let adjustedMin = min - 5;\n    let adjustedMax = max + 5;\n\n    let normalizedData = {};\n    for (let key in data) {\n        if (data.hasOwnProperty(key)) {\n            normalizedData[key] = ((data[key] - adjustedMin) / (adjustedMax - adjustedMin)) * 100;\n        }\n    }\n\n    return normalizedData;\n}\n\nfunction readPartsStatsFromDom() {\n    let data = {};\n    document.querySelectorAll(\".part-performance\").forEach(function (elem) {\n        const partKey = elem.dataset.part;\n        data[partKey] = {};\n        elem.querySelectorAll(\".part-performance-stat\").forEach(function (stat) {\n            const statNum = stat.dataset.attribute;\n            if (statNum === \"-1\" || statNum === \"15\") return;\n            const input = stat.querySelector(\".custom-input-number\");\n            if (!input) return;\n            const value = Number(String(input.value).split(\" \")[0]);\n            data[partKey][statNum] = Number.isFinite(value) ? value : 0;\n        });\n    });\n    return data;\n}\n\nfunction applyPartsStatsToDom(data) {\n    if (!data) return;\n    for (let key in data) {\n        const part = document.querySelector(`.part-performance[data-part='${key}']`);\n        if (!part) continue;\n        for (let stat in data[key]) {\n            if (stat === \"15\") continue;\n            const statInput = part.querySelector(`.part-performance-stat[data-attribute='${stat}'] .custom-input-number`);\n            if (!statInput) continue;\n            statInput.value = Number(data[key][stat]).toFixed(2);\n        }\n    }\n}\n\nfunction updateExpertiseModeUi() {\n    const teamsShow = document.querySelector(\".performance-show.teams-show\");\n    if (!teamsShow) return;\n\n    const isExpertise = performanceDetailsMode === \"expertise\";\n    teamsShow.classList.toggle(\"expertise-mode\", isExpertise);\n\n    document.querySelectorAll(\".part-performance\").forEach(function (part) {\n        const arrows = part.querySelector(\".part-performance-title .arrows\");\n        if (arrows) arrows.classList.toggle(\"d-none\", isExpertise);\n\n        const chevron = part.querySelector(\".part-performance-title .redesigned-chevron\");\n        if (chevron) chevron.classList.toggle(\"d-none\", isExpertise);\n\n        if (isExpertise) {\n            const statsContainer = part.querySelector(\".part-performance-stats\");\n            if (statsContainer) statsContainer.classList.remove(\"hidden\");\n\n            const partButtons = part.querySelector(\".part-performance-title .part-buttons\");\n            if (partButtons) partButtons.classList.remove(\"d-none\");\n\n            if (chevron) chevron.classList.remove(\"clicked\");\n        }\n\n        const list = part.querySelector(\".parts-list\");\n        if (list) list.classList.toggle(\"d-none\", isExpertise);\n\n        const subtitle = part.querySelector(\".part-subtitle\");\n        if (!subtitle) return;\n        if (isExpertise) {\n            if (subtitle.innerText !== \"Expertise\") {\n                subtitle.dataset.performanceText = subtitle.innerText;\n            }\n            subtitle.innerText = \"Expertise\";\n        }\n        else if (subtitle.dataset.performanceText) {\n            subtitle.innerText = subtitle.dataset.performanceText;\n        }\n    });\n}\n\nfunction setPerformanceDetailsMode(mode) {\n    if (mode !== \"performance\" && mode !== \"expertise\") return;\n    if (mode === performanceDetailsMode) return;\n\n    if (performanceDetailsMode === \"performance\") {\n        performanceDraftStats = readPartsStatsFromDom();\n    }\n    else {\n        expertiseDraftStats = readPartsStatsFromDom();\n    }\n\n    performanceDetailsMode = mode;\n    updatePerformanceExpertiseButton();\n    updateExpertiseModeUi();\n\n    if (mode === \"performance\") {\n        applyPartsStatsToDom(performanceDraftStats || currentPartsStats);\n    }\n    else {\n        applyPartsStatsToDom(expertiseDraftStats || currentTeamExpertise);\n    }\n}\n\nfunction updatePerformanceExpertiseButton() {\n    const button = document.getElementById(\"performanceExpertiseButton\");\n    if (!button) return;\n\n    const icon = button.querySelector(\"i\");\n    const text = button.querySelector(\"span\");\n\n    button.dataset.value = performanceDetailsMode;\n    if (performanceDetailsMode === \"expertise\") {\n        if (icon) icon.className = \"bi bi-stars\";\n        if (text) text.textContent = \"Expertise\";\n    }\n    else {\n        if (icon) icon.className = \"bi bi-speedometer2\";\n        if (text) text.textContent = \"Performance\";\n    }\n}\n\n\n\nexport function load_performance(teams) {\n    // let teams = normalizeData(teams);\n    for (let key in teams) {\n        if (teams.hasOwnProperty(key)) {\n            let teamPerformance = document.querySelector(`#teamsDiv .team-performance[data-teamid='${key}']`);\n            if (teamPerformance) {\n                let performanceBarProgress = teamPerformance.querySelector('.performance-bar-progress');\n                let team_value = teamPerformance.querySelector('.team-title-value');\n                if (performanceBarProgress) {\n                    setBarWidth(performanceBarProgress, teams[key]);\n                    team_value.innerText = teams[key].toFixed(2) + ' %';\n                    performanceBarProgress.dataset.overall = teams[key];\n                }\n            }\n        }\n    }\n}\n\nexport function load_cars(data) {\n    for (let key in data) {\n        let cars = document.querySelectorAll(`#carsDiv .car[data-teamid='${key}']`);\n        cars.forEach(function (car, index) {\n            let carNumber = parseInt(car.dataset.carnumber);\n            index = index + 1;\n            let bar = car.querySelector('.performance-bar-progress');\n            bar.dataset.overall = data[key][carNumber][0];\n            setBarWidth(bar, data[key][carNumber][0]);\n            let name = car.querySelector('.team-title-name');\n            name.innerText = car.dataset.teamshow + \" \" + carNumber.toString() + \" -  #\" + data[key][carNumber][1];\n            let missing_parts = data[key][carNumber][2];\n            let missing_copntainer = car.querySelector(\".car-missing-parts\")\n            missing_copntainer.innerHTML = \"<span class='value'></span>\"\n            if (missing_parts.length > 0) {\n                let list = document.createElement(\"span\")\n                let string = \"\"\n                missing_parts.forEach(function (part) {\n                    let partName = part_codes_abreviations[part]\n                    string += partName + \" \"\n                })\n                list.innerText = string\n                missing_copntainer.appendChild(list)\n                let icon = document.createElement(\"i\")\n                icon.classList.add(\"bi\", \"bi-exclamation-triangle-fill\")\n                missing_copntainer.appendChild(icon)\n            }\n            else {\n                let icon = document.createElement(\"i\")\n                icon.classList.add(\"bi\", \"bi-check-all\")\n                missing_copntainer.appendChild(icon)\n            }\n            let value = car.querySelector(\".car-missing-parts .value\")\n            value.innerText = data[key][carNumber][0].toFixed(2) + \" %\"\n            missing_copntainer.appendChild(value)\n        })\n    }\n}\n\nexport function load_attributes(teams) {\n    for (let key in teams) {\n        for (let attribute in teams[key]) {\n            let team = document.querySelector(`#teamsDiv .team-performance[data-teamid='${key}']`);\n            let bar = team.querySelector(`.performance-bar-progress`);\n            let attributeValue = teams[key][attribute];\n            bar.dataset[attribute] = attributeValue.toFixed(3);\n        }\n    }\n    load_overview();\n}\n\nexport function load_car_attributes(teams) {\n    for (let key in teams) {\n        for (let car in teams[key]) {\n            let carDiv = document.querySelector(`#carsDiv .car[data-teamid='${key}'][data-carnumber='${car}']`);\n            for (let attribute in teams[key][car]) {\n                let bar = carDiv.querySelector(`.performance-bar-progress`);\n                let attributeValue = teams[key][car][attribute];\n                bar.dataset[attribute] = attributeValue.toFixed(3);\n            }\n        }\n    }\n}\n\nexport function order_by(criterion) {\n    let teams = document.querySelectorAll(\".team-performance\");\n    let teamsArray = Array.from(teams);\n    teamsArray.sort(function (a, b) {\n        return b.querySelector(\".performance-bar-progress\").dataset[criterion] - a.querySelector(\".performance-bar-progress\").dataset[criterion];\n    })\n    teamsArray.forEach(function (team, index) {\n        document.getElementById(\"teamsDiv\").appendChild(team);\n        let bar = team.querySelector(\".performance-bar-progress\");\n        setBarWidth(bar, bar.dataset[criterion]);\n        team.querySelector(\".team-title-value\").innerText = parseFloat(bar.dataset[criterion]).toFixed(2) + \" %\";\n        let number = team.querySelector(\".team-number\")\n        number.innerText = index + 1\n    })\n\n    let cars = document.querySelectorAll(\".car-performance\");\n    let carsArray = Array.from(cars);\n    carsArray.sort(function (a, b) {\n        return b.querySelector(\".performance-bar-progress\").dataset[criterion] - a.querySelector(\".performance-bar-progress\").dataset[criterion];\n    })\n    carsArray.forEach(function (car, index) {\n        document.getElementById(\"carsDiv\").appendChild(car);\n        let bar = car.querySelector(\".performance-bar-progress\");\n        setBarWidth(bar, bar.dataset[criterion]);\n        let number = car.querySelector(\".performance-number\")\n        let value = car.querySelector(\".car-missing-parts .value\")\n        value.innerText = parseFloat(bar.dataset[criterion]).toFixed(2) + \" %\";\n        number.innerText = index + 1\n    })\n\n\n\n}\n\nconst teamsCarsButton = document.getElementById(\"teamsCarsButton\");\nconst teamsCarsIcon = teamsCarsButton.querySelector(\"i\");\nconst teamsCarsText = teamsCarsButton.querySelector(\"span\");\n\nfunction updateTeamsCarsButton() {\n    const mode = teamsCarsButton.dataset.value;\n    teamsCarsIcon.className = mode === \"cars\" ? \"bi bi-person-fill\" : \"bi bi-people-fill\";\n    teamsCarsText.textContent = mode === \"cars\" ? \"Cars\" : \"Teams\";\n}\n\nteamsCarsButton.addEventListener(\"click\", function () {\n    if (teamsCarsButton.dataset.value === \"teams\") {\n        teamsCarsButton.dataset.value = \"cars\";\n        document.getElementById(\"teamsDiv\").classList.add(\"d-none\");\n        document.getElementById(\"carsDiv\").classList.remove(\"d-none\");\n    }\n    else {\n        teamsCarsButton.dataset.value = \"teams\";\n        document.getElementById(\"carsDiv\").classList.add(\"d-none\");\n        document.getElementById(\"teamsDiv\").classList.remove(\"d-none\");\n    }\n    updateTeamsCarsButton();\n})\n\nupdateTeamsCarsButton();\n\n\ndocument.querySelector(\"#attributeMenu\").querySelectorAll(\"a\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function () {\n        document.querySelector(\"#attributeButton span\").innerText = elem.innerText;\n        order_by(elem.dataset.attribute);\n    })\n})\n\n\n/**\n * Pills that manage engines and teams screens and lists\n */\nteamsPill.addEventListener(\"click\", function () {\n    teamsEngine = \"teams\"\n    document.querySelector(\"#enginesPerformance\").classList.add(\"d-none\")\n    document.querySelector(\"#teamsPerformance\").classList.remove(\"d-none\")\n    document.querySelector(\"#carAttributeSelector\").classList.remove(\"d-none\")\n    document.querySelector(\"#customEnginesButtonContainer\").classList.add(\"d-none\")\n    if (performanceExpertiseButton) {\n        performanceExpertiseButton.classList.toggle(\"d-none\", performanceView !== \"details\");\n    }\n    removeSelected()\n    if (performanceView === \"details\") {\n        document.querySelector(\".save-button\").classList.remove(\"d-none\")\n        first_show_animation()\n    }\n    else {\n        document.querySelector(\".save-button\").classList.add(\"d-none\")\n    }\n})\n\nenginesPill.addEventListener(\"click\", function () {\n    teamsEngine = \"engines\"\n    document.querySelector(\"#teamsPerformance\").classList.add(\"d-none\")\n    document.querySelector(\"#enginesPerformance\").classList.remove(\"d-none\")\n    document.querySelector(\"#carAttributeSelector\").classList.add(\"d-none\")\n    document.querySelector(\"#customEnginesButtonContainer\").classList.remove(\"d-none\")\n    if (performanceExpertiseButton) {\n        performanceExpertiseButton.classList.add(\"d-none\");\n    }\n    removeSelected()\n    document.querySelector(\".save-button\").classList.remove(\"d-none\")\n    first_show_animation()\n})\n\nexport function gather_engines_data() {\n    let engines = document.querySelectorAll(\"#enginesPerformance .engine-performance\")\n    let enginesData = {}\n    engines.forEach(function (engine) {\n        let engineID = engine.dataset.engineid\n        let engineStats = {}\n        engine.querySelectorAll(\".engine-performance-stat\").forEach(function (stat) {\n            let attribute = stat.dataset.attribute\n            let value = stat.querySelector(\".custom-input-number\").value.split(\" \")[0]\n            engineStats[attribute] = value\n        })\n        enginesData[engineID] = engineStats\n    })\n    return enginesData\n\n}\n\n\nexport function update_max_design(data) {\n    actualMaxDesign = parseInt(data) + 1;\n}\n\n/**\n * Manages the engine stats for all manufacturers\n * @param {Object} engineData engine stats for all manufacturers\n */\nexport function manage_engineStats(engineData) {\n    let officialEngines = engineData.filter(function (elem) {\n        return elem[0] <= 10\n    })\n    let customEngines = engineData.filter(function (elem) {\n        return elem[0] > 10\n    })\n    officialEngines.forEach(function (elem) {\n        let engineId = elem[0]\n        let engineStats = elem[1];\n        let engine = document.querySelector(`[data-engineId=\"${engineId}\"]`);\n        for (let key in engineStats) {\n            let value = engineStats[key];\n            let attribute = engine.querySelector(`.engine-performance-stat[data-attribute=\"${key}\"]`);\n            let input = attribute.querySelector(\".custom-input-number\");\n            let bar = attribute.querySelector(\".engine-performance-progress\");\n            input.value = value.toFixed(1);\n            setBarWidth(bar, value);\n        }\n    })\n    load_custom_engines(customEngines)\n}\n\n\n/**\n * removes the team or engine selected anc changes the icon if necesssary\n */\nfunction removeSelected() {\n    let elemsSelected = document.querySelectorAll('.selected');\n    elemsSelected.forEach(item => {\n        item.classList.remove('selected')\n    });\n}\n\n/**\n * eventListeners for all teams and engines\n */\ndocument.querySelectorAll(\".team\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function () {\n        removeSelected()\n        manageSaveButton(true, \"performance\")\n        setPerformanceView(\"details\")\n        elem.classList.toggle('selected');\n        teamSelected = elem.dataset.teamid;\n        performanceDraftStats = null;\n        expertiseDraftStats = null;\n        currentPartsStats = null;\n        currentTeamExpertise = null;\n        const command = new Command(\"performanceRequest\",  { teamID: teamSelected});\n        command.execute();\n    })\n})\n\ndocument.querySelectorAll(\".car\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function () {\n        removeSelected()\n        manageSaveButton(true, \"performance\")\n        setPerformanceView(\"details\")\n        elem.classList.toggle('selected');\n        teamSelected = elem.dataset.teamid;\n        performanceDraftStats = null;\n        expertiseDraftStats = null;\n        currentPartsStats = null;\n        currentTeamExpertise = null;\n        const command = new Command(\"performanceRequest\",  { teamID: teamSelected});\n        command.execute();\n    })\n})\n\ndocument.querySelectorAll(\".engine\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function () {\n        removeSelected()\n        elem.classList.toggle('selected');\n        engineSelected = elem.dataset.engineid;\n        teamEngineSelected = elem.dataset.teamengine\n        document.querySelector(\".engines-show\").classList.remove(\"d-none\")\n        resetBarsEngines(elem)\n    })\n})\n\nexport function load_parts_stats(data) {\n    currentPartsStats = data;\n    performanceDraftStats = null;\n\n    if (performanceDetailsMode !== \"performance\") {\n        return;\n    }\n\n    applyPartsStatsToDom(data);\n}\n\nexport function load_team_expertise(data) {\n    currentTeamExpertise = data;\n    expertiseDraftStats = null;\n\n    updateExpertiseModeUi();\n\n    if (performanceDetailsMode !== \"expertise\") {\n        return;\n    }\n\n    applyPartsStatsToDom(data);\n}\n\nexport function gather_team_expertise_data() {\n    let expertise = {};\n    document.querySelectorAll(\".part-performance\").forEach(function (elem) {\n        const partType = elem.dataset.partid;\n        if (!partType) return;\n        expertise[partType] = {};\n        elem.querySelectorAll(\".part-performance-stat\").forEach(function (stat) {\n            const statNum = stat.dataset.attribute;\n            if (statNum === \"-1\" || statNum === \"15\") return;\n            const input = stat.querySelector(\".custom-input-number\");\n            if (!input) return;\n            const value = input.value.split(\" \")[0];\n            expertise[partType][statNum] = value;\n        });\n    });\n    return expertise;\n}\n\nexport function load_parts_list(data) {\n    for (let key in data) {\n        let list = document.querySelector(`.part-performance[data-part='${key}'] .parts-list`)\n        let partLoadouts = document.querySelector(`.part-performance[data-part='${key}']`)\n        list.innerHTML = \"\"\n        let index = 1;\n        for (let part in data[key]) {\n            let partElem = document.createElement(\"div\")\n            partElem.classList.add(\"one-part\")\n            if (index === 1) {\n                partElem.classList.add(\"one-part-default\")\n            }\n            let partTitle = document.createElement(\"div\")\n            partTitle.classList.add(\"one-part-title\")\n            let partName = document.createElement(\"div\")\n            partName.dataset.designId = data[key][part][0]\n            partName.classList.add(\"one-part-name\")\n            let partNameText = abreviations_dict[teamSelected] + \"-\" + pars_abreviations[key] + \"-\" + index\n            partName.innerText = partNameText\n            let subtitle = document.querySelector(`.part-performance[data-part='${key}'] .part-subtitle`)\n            subtitle.innerText = partNameText\n            subtitle.dataset.editing = data[key][part][0]\n            delete subtitle.dataset.performanceText;\n            partTitle.appendChild(partName)\n            add_partName_listener(partName, subtitle)\n            let loadoutContainer = document.createElement(\"div\")\n            loadoutContainer.classList.add(\"fitted-icons\")\n            let n_parts = document.createElement(\"div\")\n            n_parts.classList.add(\"n-parts\")\n            n_parts.innerText = \"x\" + data[key][part][6]\n            loadoutContainer.appendChild(n_parts)\n            add_n_parts_buttons(loadoutContainer)\n            let loadout1 = document.createElement(\"i\")\n            loadout1.classList.add(\"bi\", \"bi-check\", \"loadout-1\")\n            loadoutContainer.appendChild(loadout1)\n            if (data[key][part][4] === 1) {\n                loadout1.classList.add(\"fitted\")\n                let number = document.createElement(\"div\")\n                number.classList.add(\"number\")\n                number.innerText = \"1\"\n                loadout1.appendChild(number)\n                partLoadouts.dataset.loadout1 = data[key][part][0]\n            }\n            loadout_listener(loadout1, \"1\", partLoadouts)\n            let loadout2 = document.createElement(\"i\")\n            loadout2.classList.add(\"bi\", \"bi-check\", \"loadout-2\")\n            loadoutContainer.appendChild(loadout2)\n            if (data[key][part][5] === 1) {\n                loadout2.classList.add(\"fitted\")\n                let number = document.createElement(\"div\")\n                number.classList.add(\"number\")\n                number.innerText = \"2\"\n                loadout2.appendChild(number)\n                partLoadouts.dataset.loadout2 = data[key][part][0]\n            }\n            loadout_listener(loadout2, \"2\", partLoadouts)\n            partTitle.appendChild(loadoutContainer)\n            let posRelative = document.createElement(\"div\")\n            posRelative.classList.add(\"one-part-flag-and-text\")\n            if (data[key][part][1] !== data[key][part][2]) {\n                let flag = document.createElement(\"img\")\n                flag.classList.add(\"one-part-flag\")\n                let code = data[key][part][3]\n                let codeFlag = races_map[code]\n                let flagSrc = codes_dict[codeFlag]\n                flag.src = flagSrc\n                flag.setAttribute(\"loading\",\"lazy\");\n                let flagName = document.createElement(\"div\")\n                flagName.classList.add(\"one-part-flag-title\")\n                flagName.innerText = races_names[code]\n                posRelative.appendChild(flag)\n                posRelative.appendChild(flagName)\n            }\n            else {\n                posRelative.innerText = \"BASE\"\n            }\n            partElem.appendChild(partTitle)\n            partElem.appendChild(posRelative)\n            partElem.dataset.partid = part\n            list.appendChild(partElem)\n            if (index === data[key].length) {\n                partName.classList.add(\"editing\")\n            }\n            index++;\n\n        }\n        add_new_part_button(list)\n    }\n    updateExpertiseModeUi();\n}\n\nfunction add_new_part_button(list) {\n    let new_part_div = document.createElement(\"div\")\n    new_part_div.classList.add(\"new-part\")\n    let icon = document.createElement(\"i\")\n    let generalPart = list.parentNode\n    icon.classList.add(\"bi\", \"bi-plus-circle\")\n    icon.textContent = \"Add new part\"\n    new_part_div.appendChild(icon)\n    list.appendChild(new_part_div)\n    icon.addEventListener(\"click\", function () {\n        let previousPart = list.childNodes[list.childNodes.length - 2]\n        let previous_name = previousPart.querySelector(\".one-part-name\").innerText\n        let new_name = previous_name.split(\"-\")[0] + \"-\" + previous_name.split(\"-\")[1] + \"-\" + (parseInt(previous_name.split(\"-\")[2]) + 1)\n        let part = document.createElement(\"div\")\n        part.classList.add(\"one-part\")\n        let partTitle = document.createElement(\"div\")\n        partTitle.classList.add(\"one-part-title\")\n        let partName = document.createElement(\"div\")\n        partName.dataset.designId = actualMaxDesign\n        partName.classList.add(\"one-part-name\")\n        partName.innerText = new_name\n        let subtitle = list.parentNode.querySelector(`.part-subtitle`)\n        subtitle.dataset.editing = \"-1\"\n        actualMaxDesign += 1\n        subtitle.innerText = new_name\n        partTitle.appendChild(partName)\n        let parts = list.querySelectorAll(\".one-part\")\n        parts.forEach(function (part) {\n            part.querySelector(\".one-part-name\").classList.remove(\"editing\")\n        })\n        add_partName_listener(partName, subtitle, \"new\")\n        let loadoutContainer = document.createElement(\"div\")\n        loadoutContainer.classList.add(\"fitted-icons\")\n        let n_parts = document.createElement(\"div\")\n        n_parts.classList.add(\"n-parts\")\n        n_parts.innerText = \"x0\"\n        loadoutContainer.appendChild(n_parts)\n        add_n_parts_buttons(loadoutContainer)\n        let loadout1 = document.createElement(\"i\")\n        loadout1.classList.add(\"bi\", \"bi-check\", \"loadout-1\")\n        loadoutContainer.appendChild(loadout1)\n        loadout_listener(loadout1, \"1\", generalPart)\n        let loadout2 = document.createElement(\"i\")\n        loadout2.classList.add(\"bi\", \"bi-check\", \"loadout-2\")\n        loadoutContainer.appendChild(loadout2)\n        loadout_listener(loadout2, \"2\", generalPart)\n        partTitle.appendChild(loadoutContainer)\n        part.appendChild(partTitle)\n        list.insertBefore(part, new_part_div)\n        partName.classList.add(\"editing\")\n        new_part_div.remove()\n    })\n}\n\nfunction add_n_parts_buttons(loadoutContainer) {\n    let buttonsContainer = document.createElement(\"div\")\n    buttonsContainer.classList.add(\"n-parts-buttons\")\n    let up = document.createElement(\"i\")\n    up.classList.add(\"bi\", \"bi-chevron-up\", \"new-augment-button\")\n    let down = document.createElement(\"i\")\n    down.classList.add(\"bi\", \"bi-chevron-down\", \"new-augment-button\")\n    buttonsContainer.appendChild(up)\n    buttonsContainer.appendChild(down)\n    up.addEventListener(\"click\", function () {\n        let n_parts = loadoutContainer.querySelector(\".n-parts\")\n        let n = parseInt(n_parts.innerText.split(\"x\")[1])\n        n += 1\n        n_parts.innerText = \"x\" + n\n    })\n    down.addEventListener(\"click\", function () {\n        let fitted_parts = loadoutContainer.parentNode.querySelectorAll(\".fitted\")\n        let fitted_parts_numb = fitted_parts.length\n        let n_parts = loadoutContainer.querySelector(\".n-parts\")\n        let n = parseInt(n_parts.innerText.split(\"x\")[1])\n        if (n > fitted_parts_numb) {\n            n -= 1\n            if (n < 0) {\n                n = 0\n            }\n            n_parts.innerText = \"x\" + n\n        }\n        else {\n            fitted_parts.forEach(function (part) {\n                let errorClass = \"\"\n                if (part.classList.contains(\"loadout-1\")) {\n                    errorClass = \"loadout-1-error\";\n                }\n                else if (part.classList.contains(\"loadout-2\")) {\n                    errorClass = \"loadout-2-error\";\n                }\n                part.classList.add(errorClass);\n                setTimeout(() => {\n                    part.classList.remove(errorClass);\n                }, 500);\n            })\n        }\n    })\n    loadoutContainer.appendChild(buttonsContainer)\n}\n\nexport function load_one_part(data) {\n    let key = Object.keys(data)[0]\n    if (!currentPartsStats) {\n        currentPartsStats = {};\n    }\n    currentPartsStats[key] = data[key];\n    performanceDraftStats = null;\n\n    if (performanceDetailsMode !== \"performance\") {\n        return;\n    }\n\n    applyPartsStatsToDom(data);\n}\n\nfunction add_partName_listener(div, subtitle, type = \"old\") {\n    div.addEventListener(\"click\", function () {\n        if (performanceDetailsMode === \"expertise\") {\n            return;\n        }\n        if (type === \"new\") {\n            subtitle.dataset.editing = -1\n        }\n        else {\n            subtitle.dataset.editing = div.dataset.designId\n        }\n        subtitle.innerText = div.innerText\n        let parts = div.parentNode.parentNode.parentNode.querySelectorAll(\".one-part\")\n        parts.forEach(function (part) {\n            part.querySelector(\".one-part-name\").classList.remove(\"editing\")\n        })\n        div.classList.add(\"editing\")\n        if (type === \"old\") {\n            const command = new Command(\"partRequest\", { designID: div.dataset.designId});\n            command.execute();\n        }\n    })\n}\n\nfunction loadout_listener(icon, loadout_n, partTitle) {\n    icon.addEventListener(\"click\", function () {\n        let part_design = icon.parentNode.parentNode.querySelector(\".one-part-name\").dataset.designId;\n        let n_parts_elem = icon.parentNode.querySelector(\".n-parts\");\n        let n_parts = n_parts_elem.innerText.split(\"x\")[1];\n        let parts_fitted = icon.parentNode.parentNode.querySelectorAll(\".fitted\").length;\n\n        if (parts_fitted < n_parts) {\n            partTitle.dataset[`loadout${loadout_n}`] = part_design;\n            if (loadout_n === \"1\") {\n                let oldFitted = partTitle.querySelector(\".loadout-1.fitted\");\n                if (oldFitted) {\n                    oldFitted.classList.remove(\"fitted\");\n                    oldFitted.querySelector(\".number\").remove();\n                }\n                icon.classList.toggle(\"fitted\");\n                let number = document.createElement(\"div\");\n                number.classList.add(\"number\");\n                number.innerText = \"1\";\n                icon.appendChild(number);\n            } else {\n                let oldFitted = partTitle.querySelector(\".loadout-2.fitted\");\n                if (oldFitted) {\n                    oldFitted.classList.remove(\"fitted\");\n                    oldFitted.querySelector(\".number\").remove();\n                }\n                icon.classList.toggle(\"fitted\");\n                let number = document.createElement(\"div\");\n                number.classList.add(\"number\");\n                number.innerText = \"2\";\n                icon.appendChild(number);\n            }\n        } else {\n            n_parts_elem.classList.add(\"n-parts-error\");\n            setTimeout(() => {\n                n_parts_elem.classList.remove(\"n-parts-error\");\n            }, 500);\n        }\n    });\n}\ndocument.querySelector(\"#fitButton\").addEventListener(\"click\", function () {\n    let data = {\n        command: \"fitParts\",\n        teamID: teamSelected\n\n    }\n    //pending\n})\n\ndocument.querySelectorAll(\".part-performance-title .redesigned-chevron\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function () {\n        elem.classList.toggle(\"clicked\")\n        let generalPart = elem.parentNode.parentNode\n        elem.parentNode.querySelector(\".part-buttons\").classList.toggle(\"d-none\")\n        if (elem.classList.contains(\"clicked\")) {\n            generalPart.querySelector(\".part-performance-stats\").classList.add(\"hidden\")\n        }\n        else {\n            generalPart.querySelector(\".part-performance-stats\").classList.remove(\"hidden\")\n        }\n    })\n})\n\nfunction buildHoldOptions(input, extra = {}) {\n    const min = parseFloat(input.min);\n    const max = parseFloat(input.max);\n    const isEngineStat = !!input.closest(\".engine-performance-stat\");\n    const hasMin = input.min !== \"\";\n    const hasMax = input.max !== \"\";\n    const format = extra.format ?? ((val) => (\n        val.toFixed(2)\n    ));\n    const opts = { ...extra, format };\n    if (hasMin) {\n        opts.min = min;\n    }\n    if (hasMax) {\n        opts.max = max;\n    }\n    if (isEngineStat && !hasMin) {\n        opts.min = 0;\n    }\n    if (isEngineStat && !hasMax) {\n        opts.max = 100;\n    }\n    return opts;\n}\n\ndocument.querySelector(\".performance-show\").querySelectorAll(\".part-name-buttons .bi-plus.new-augment-button\").forEach(function (elem) {\n    const part = elem.closest(\".part-performance\");\n    if (!part) return;\n    const inputs = part.querySelectorAll(\".custom-input-number\");\n    inputs.forEach(function (input) {\n        const increment = input.max === \"100\" ? 0.5 : 0.025;\n        attachHold(elem, input, increment, buildHoldOptions(input));\n    });\n});\n\ndocument.querySelector(\".performance-show\").querySelectorAll(\".part-name-buttons .bi-dash.new-augment-button\").forEach(function (elem) {\n    const part = elem.closest(\".part-performance\");\n    if (!part) return;\n    const inputs = part.querySelectorAll(\".custom-input-number\");\n    inputs.forEach(function (input) {\n        const increment = input.max === \"100\" ? -0.5 : -0.025;\n        attachHold(elem, input, increment, buildHoldOptions(input));\n    });\n});\n\ndocument.querySelector(\".performance-show\").querySelectorAll(\".stat-number .bi-plus.new-augment-button\").forEach(button => {\n    const input = button.parentNode.querySelector(\".custom-input-number\");\n    if (!input) return;\n    attachHold(button, input, 0.01, buildHoldOptions(input));\n});\n\ndocument.querySelector(\".performance-show\").querySelectorAll(\".stat-number .bi-dash.new-augment-button\").forEach(button => {\n    const input = button.parentNode.querySelector(\".custom-input-number\");\n    if (!input) return;\n    attachHold(button, input, -0.01, buildHoldOptions(input));\n});\n\ndocument.querySelector(\".engines-show\").querySelectorAll(\".stat-number .bi-plus.new-augment-button\").forEach(button => {\n    const stat = button.closest(\".engine-performance-stat\");\n    const input = button.parentNode.querySelector(\".custom-input-number\");\n    const bar = stat ? stat.querySelector(\".engine-performance-progress\") : null;\n    if (!input) return;\n    attachHold(button, input, 0.5, buildHoldOptions(input, {\n        onChange: (val) => {\n            setBarWidth(bar, val);\n        }\n    }));\n});\n\ndocument.querySelector(\".engines-show\").querySelectorAll(\".stat-number .bi-dash.new-augment-button\").forEach(button => {\n    const stat = button.closest(\".engine-performance-stat\");\n    const input = button.parentNode.querySelector(\".custom-input-number\");\n    const bar = stat ? stat.querySelector(\".engine-performance-progress\") : null;\n    if (!input) return;\n    attachHold(button, input, -0.5, buildHoldOptions(input, {\n        onChange: (val) => {\n            setBarWidth(bar, val);\n        }\n    }));\n});\ndocument.querySelector(\".performance-show\").querySelectorAll(\".new-or-existing-part div\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function () {\n        let parent = elem.parentNode;\n        let options = parent.querySelectorAll(\"div\");\n        options.forEach(function (option) {\n            option.classList.remove(\"active-part\");\n        })\n        elem.classList.add(\"active-part\");\n        parent.parentNode.parentNode.dataset.new = elem.dataset.new;\n    })\n})\n\nconst performanceGraphButton = document.getElementById(\"performanceGraphButton\");\nconst performanceGraphIcon = performanceGraphButton.querySelector(\"i\");\nconst performanceGraphText = performanceGraphButton.querySelector(\"span\");\nconst performanceOverview = document.getElementById(\"performanceOverview\");\nconst performanceExpertiseButton = document.getElementById(\"performanceExpertiseButton\");\nconst performanceAnnotationsToggleInput = document.getElementById(\"performanceAnnotationsToggle\");\n\nif (performanceAnnotationsToggleInput) {\n    performanceAnnotationsToggle = performanceAnnotationsToggleInput.checked;\n    performanceAnnotationsToggleInput.addEventListener(\"change\", function () {\n        performanceAnnotationsToggle = performanceAnnotationsToggleInput.checked;\n        if (!performanceGraph?.options?.plugins?.annotation) return;\n        if (!Array.isArray(performanceGraph?.data?.labels)) return;\n\n        applyAduoUpgradeAnnotations(currentData?.[2], currentData?.[1], performanceGraph.data.labels.length);\n        performanceGraph.update();\n    });\n}\n\nfunction setPerformanceView(view) {\n    performanceView = view;\n    viewingGraph = view === \"graph\";\n\n    performanceGraphButton.classList.add(\"active\");\n    if (view === \"graph\") {\n        performanceGraphIcon.className = \"bi bi-graph-up\";\n        performanceGraphText.textContent = \"Graph\";\n    }\n    else if (view === \"details\") {\n        performanceGraphIcon.className = \"bi bi-list-ul\";\n        performanceGraphText.textContent = \"Details\";\n    }\n    else {\n        performanceGraphIcon.className = \"bi bi-grid-3x2-gap\";\n        performanceGraphText.textContent = \"Overview\";\n    }\n\n    document.querySelector(\"#performanceGraph\").classList.toggle(\"d-none\", view !== \"graph\");\n    document.querySelector(\".teams-show\").classList.toggle(\"d-none\", view !== \"details\");\n    performanceOverview.classList.toggle(\"d-none\", view !== \"overview\");\n    if (performanceExpertiseButton) {\n        performanceExpertiseButton.classList.toggle(\"d-none\", view !== \"details\" || teamsEngine !== \"teams\");\n    }\n\n    document.querySelector(\".save-button\").classList.toggle(\"d-none\", view !== \"details\");\n\n    if (view === \"details\") {\n        first_show_animation();\n    }\n    if (view === \"overview\") {\n        load_overview();\n    }\n}\n\nif (performanceExpertiseButton) {\n    performanceExpertiseButton.addEventListener(\"click\", function () {\n        const next = performanceDetailsMode === \"performance\" ? \"expertise\" : \"performance\";\n        setPerformanceDetailsMode(next);\n    });\n}\n\nfunction createOverviewCard(attributeConfig) {\n    let card = document.createElement(\"div\");\n    card.classList.add(\"overview-card\");\n\n    let title = document.createElement(\"div\");\n    title.classList.add(\"overview-card-title\", \"bold-font\");\n    title.textContent = attributeConfig.label;\n    if (attributeConfig.key === \"brake_cooling\" && game_version === 2024) {\n        title.textContent = \"Tyre preservation\";\n    }\n    card.appendChild(title);\n\n    let teamsContainer = document.createElement(\"div\");\n    teamsContainer.classList.add(\"overview-card-teams\");\n\n    let teamsData = [];\n    document.querySelectorAll(\"#teamsDiv .team-performance\").forEach(function (teamElem) {\n        let teamId = teamElem.dataset.teamid;\n        let sourceBar = teamElem.querySelector(\".performance-bar-progress\");\n        if (!sourceBar) {\n            return;\n        }\n\n        let teamRow = document.createElement(\"div\");\n        teamRow.classList.add(\"overview-team\", \"bold-font\");\n        if (teamElem.classList.contains(\"d-none\")) {\n            teamRow.classList.add(\"d-none\");\n        }\n\n        let carTitle = document.createElement(\"div\");\n        carTitle.classList.add(\"car-title\");\n\n        let leftContainer = document.createElement(\"div\");\n        leftContainer.classList.add(\"overview-team-left\");\n\n        let rank = document.createElement(\"span\");\n        rank.classList.add(\"overview-team-rank\");\n        leftContainer.appendChild(rank);\n\n        let teamName = document.createElement(\"span\");\n        teamName.className = teamElem.querySelector(\".team-title-name\").className;\n        teamName.textContent = teamElem.querySelector(\".team-title-name\").textContent;\n        leftContainer.appendChild(teamName);\n        carTitle.appendChild(leftContainer);\n\n        let teamValue = document.createElement(\"span\");\n        teamValue.classList.add(\"overview-team-value\");\n        carTitle.appendChild(teamValue);\n\n        let performanceBar = document.createElement(\"div\");\n        performanceBar.classList.add(\"performance-bar\");\n        let progressBar = document.createElement(\"div\");\n        progressBar.className = sourceBar.className;\n        performanceBar.appendChild(progressBar);\n\n        teamRow.appendChild(carTitle);\n        teamRow.appendChild(performanceBar);\n\n        let sourceKey = attributeConfig.source || attributeConfig.key;\n        let value = parseFloat(sourceBar.dataset[sourceKey] || 0);\n        setBarWidth(progressBar, value);\n        teamValue.textContent = value.toFixed(2) + \" %\";\n\n        teamRow.dataset.teamid = teamId;\n        teamRow.dataset.attribute = attributeConfig.key;\n\n        teamsData.push({\n            teamRow: teamRow,\n            teamId: teamId,\n            value: value,\n            isHidden: teamElem.classList.contains(\"d-none\"),\n            rank: rank\n        });\n    });\n\n    let visibleTeams = teamsData.filter(t => !t.isHidden);\n    visibleTeams.sort(function (a, b) {\n        if (a.value === b.value) {\n            return Number(a.teamId) - Number(b.teamId);\n        }\n        return b.value - a.value;\n    });\n\n    const visibleCount = visibleTeams.length;\n    visibleTeams.forEach(function (entry, index) {\n        entry.rank.textContent = String(index + 1);\n        teamsContainer.appendChild(entry.teamRow);\n    });\n\n    teamsData.filter(t => t.isHidden).forEach(function (entry) {\n        entry.rank.textContent = \"\";\n        teamsContainer.appendChild(entry.teamRow);\n    });\n\n    card.appendChild(teamsContainer);\n    return card;\n}\n\nfunction load_overview() {\n    if (!performanceOverview) {\n        return;\n    }\n    performanceOverview.innerHTML = \"\";\n    overviewAttributes.forEach(function (attributeConfig) {\n        performanceOverview.appendChild(createOverviewCard(attributeConfig));\n    });\n}\n\ndocument.querySelector(\"#performanceGraphButton\").addEventListener(\"click\", function () {\n    if (performanceView === \"graph\") {\n        setPerformanceView(\"details\");\n    }\n    else if (performanceView === \"details\") {\n        setPerformanceView(\"overview\");\n    }\n    else {\n        removeSelected();\n        setPerformanceView(\"graph\");\n    }\n})\n\nsetPerformanceView(\"graph\");\nupdatePerformanceExpertiseButton();\nupdateExpertiseModeUi();\n\ndocument.querySelectorAll(\".part-performance-title .bi-chevron-up\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function () {\n        let title = elem.parentNode.parentNode\n        let list = title.parentNode.querySelector(\".parts-list\")\n        let partEditing = list.querySelector('.one-part-name.editing').parentNode.parentNode\n        let newPart = partEditing.previousElementSibling\n        if (!newPart) {\n            let lastValidPart = list.lastElementChild;\n            while (lastValidPart && lastValidPart.classList.contains('new-part')) {\n                lastValidPart = lastValidPart.previousElementSibling;\n            }\n            newPart = lastValidPart;\n        }\n        newPart.querySelector(\".one-part-name\").click()\n    })\n})\n\ndocument.querySelectorAll(\".part-performance-title .bi-chevron-down\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function () {\n        let title = elem.parentNode.parentNode;\n        let list = title.parentNode.querySelector(\".parts-list\");\n        let partEditing = list.querySelector('.one-part-name.editing').parentNode.parentNode;\n        let newPart = partEditing.nextElementSibling;\n\n        // Si el siguiente es 'new-part', nos movemos al primero\n        if (newPart && newPart.classList.contains('new-part')) {\n            newPart = list.firstElementChild;\n        }\n\n        // Simulamos el click en el nuevo elemento encontrado (si es válido)\n        if (newPart) {\n            newPart.querySelector(\".one-part-name\").click();\n        }\n    });\n});\n\n/**\n * Puts the bars of the engine to their appropiate values\n * @param {div} div element of the dom that contains the stats of the engine\n */\nfunction resetBarsEngines(div) {\n    let statsString = div.dataset.stats\n    var statsArray = statsString.split(' ').map(function (item) {\n        return parseFloat(item, 10) / 10;\n    });\n    document.querySelector(\".engines-show\").querySelectorAll(\".custom-progress\").forEach(function (elem, index) {\n        elem.dataset.progress = statsArray[index]\n        manage_bar(elem, elem.dataset.progress)\n    })\n}\n\n/**\n * resets all bars to 0\n */\nfunction resetBars() {\n    document.querySelectorAll(\".custom-progress\").forEach(function (elem) {\n        elem.dataset.progress = 0\n        manage_bar(elem, elem.dataset.progress)\n    })\n}\n\nfunction add_custom_engine(name, stats) {\n    let generalEngineDiv = document.createElement(\"div\")\n    let engineTitle = document.createElement(\"input\")\n    engineTitle.type = \"text\"\n    if (name !== \"\") {\n        engineTitle.value = name\n    }\n    else {\n        engineTitle.value = \"New Engine\"\n    }\n    let engineCount = document.querySelectorAll(\".custom-engines-div > div\").length;\n    let engineStatsId = `engineStats${engineCount + 1}`;\n    let engineStats = document.createElement(\"div\")\n    let caret = document.createElement(\"i\")\n    let trash = document.createElement(\"i\")\n    trash.classList.add(\"bi\", \"bi-trash\")\n    caret.classList.add(\"redesigned-chevron\", \"clicked\")\n    generalEngineDiv.classList.add(\"engine-performance\")\n    engineTitle.classList.add(\"engine-performance-title\")\n    engineStats.classList.add(\"engine-performance-stats\", \"collapse\", \"show\")\n    engineStats.id = engineStatsId\n\n    caret.addEventListener(\"click\", function () {\n        caret.classList.toggle(\"clicked\")\n    })\n\n    trash.addEventListener(\"click\", function () {\n        generalEngineDiv.remove()\n    })\n\n    caret.setAttribute(\"data-bs-toggle\", \"collapse\");\n    caret.setAttribute(\"data-bs-target\", `#${engineStatsId}`);\n\n    for (let [key, value] of engine_stats_dict) {\n        if ((game_version === 2024 && key !== 11 && key !== 12) || game_version === 2023) {\n            let stat = document.createElement(\"div\")\n            stat.classList.add(\"engine-performance-stat\")\n            stat.dataset.attribute = key\n            let statTitle = document.createElement(\"div\")\n            statTitle.classList.add(\"part-performance-stat-title\")\n            statTitle.innerText = value + \" \";\n            const statUnit = document.createElement(\"span\")\n            statUnit.classList.add(\"text-secondary\")\n            statUnit.innerText = \"%\"\n            statTitle.appendChild(statUnit)\n            let stat_number = document.createElement(\"div\")\n            stat_number.classList.add(\"stat-number\")\n            stat_number.innerHTML = '<i class=\"bi bi-dash new-augment-button\"></i> <input type=\"text\" class=\"custom-input-number\"> <i class=\"bi bi-plus new-augment-button\"></i>'\n            let input = stat_number.querySelector(\".custom-input-number\");\n            let bar = document.createElement(\"div\")\n            bar.classList.add(\"engine-performance-bar\")\n            let bar_progress = document.createElement(\"div\")\n            bar_progress.classList.add(\"engine-performance-progress\")\n            if (stats[key.toString()] !== undefined) {\n                input.value = Number(stats[key]).toFixed(1);\n                setBarWidth(bar_progress, stats[key]);\n            }\n            else {\n                input.value = \"50.0\";\n            }\n            stat.appendChild(statTitle)\n            stat.appendChild(stat_number)\n            bar.appendChild(bar_progress)\n            stat.appendChild(bar)\n            engineStats.appendChild(stat)\n\n            let less = stat_number.querySelector(\".bi-dash.new-augment-button\");\n            let plus = stat_number.querySelector(\".bi-plus.new-augment-button\");\n            const holdOptions = buildHoldOptions(input, {\n                onChange: (val) => {\n                    setBarWidth(bar_progress, val);\n                }\n            });\n            attachHold(less, input, -0.5, holdOptions);\n            attachHold(plus, input, 0.5, holdOptions);\n\n        }\n    }\n    const blankSpace = document.createElement(\"div\");\n    blankSpace.classList.add(\"blank-engine-space\");\n    engineStats.appendChild(blankSpace);\n    generalEngineDiv.appendChild(engineTitle)\n    generalEngineDiv.appendChild(engineStats)\n    generalEngineDiv.appendChild(caret)\n    generalEngineDiv.appendChild(trash)\n    document.querySelector(\".custom-engines-div\").appendChild(generalEngineDiv)\n}\n\n\nfunction wireEngineStatButtons(container) {\n    container.querySelectorAll(\".engine-performance-stat\").forEach(function (stat) {\n        const input = stat.querySelector(\".custom-input-number\")\n        const bar = stat.querySelector(\".engine-performance-progress\")\n        if (!input) return\n\n        const holdOptions = buildHoldOptions(input, {\n            onChange: (val) => {\n                setBarWidth(bar, val)\n            }\n        })\n\n        const plus = stat.querySelector(\".bi-plus.new-augment-button\")\n        const less = stat.querySelector(\".bi-dash.new-augment-button\")\n        if (plus) {\n            attachHold(plus, input, 0.5, holdOptions)\n        }\n        if (less) {\n            attachHold(less, input, -0.5, holdOptions)\n        }\n    })\n}\n\nfunction createCustomEngineCard(engineId, name, stats) {\n    const engineDiv = document.createElement(\"div\")\n    engineDiv.classList.add(\"engine-performance\", \"custom-engine-card\")\n    engineDiv.dataset.engineid = engineId\n    engineDiv.dataset.customEngine = \"true\"\n\n    const title = document.createElement(\"div\")\n    title.classList.add(\"engine-performance-title\",  \"custom-engine-title\")\n\n    const logo = document.createElement(\"img\")\n    logo.classList.add(\"engine-performance-logo\")\n    logo.src = getEngineLogoSrc(name)\n    logo.alt = `${name || \"Custom engine\"} logo`\n\n    const nameInput = document.createElement(\"input\")\n    nameInput.type = \"text\"\n    nameInput.classList.add(\"custom-engine-name\")\n    nameInput.value = name || \"New Engine\"\n    nameInput.addEventListener(\"input\", function () {\n        logo.src = getEngineLogoSrc(nameInput.value)\n        const engineDropdownItem = document.querySelector(`#engineMenu a.custom-engine[data-engine=\"${engineId}\"]`)\n        if (engineDropdownItem) {\n            engineDropdownItem.innerText = nameInput.value\n        }\n    })\n\n    title.appendChild(logo)\n    title.appendChild(nameInput)\n    engineDiv.appendChild(title)\n\n    const customFlag = document.createElement(\"i\")\n    customFlag.classList.add(\"bi\", \"bi-sliders2\", \"custom-engine-flag\")\n    customFlag.setAttribute(\"title\", \"Delete custom engine\")\n\n    customFlag.addEventListener(\"mouseenter\", function () {\n        customFlag.classList.remove(\"bi-sliders2\")\n        customFlag.classList.add(\"bi-trash\")\n    })\n\n    customFlag.addEventListener(\"mouseleave\", function () {\n        customFlag.classList.remove(\"bi-trash\")\n        customFlag.classList.add(\"bi-sliders2\")\n    })\n\n    customFlag.addEventListener(\"click\", async function (e) {\n        e.preventDefault()\n        e.stopPropagation()\n\n        const ok = await confirmModal({\n            title: \"Delete custom engine\",\n            body: \"Are you sure you want to delete this custom engine? Any team using it will be assigned a different engine.\",\n            confirmText: \"Delete\",\n            cancelText: \"Cancel\"\n        })\n        if (!ok) return\n\n        const command = new Command(\"deleteCustomEngine\", { engineId: engineId })\n        command.execute()\n    })\n    engineDiv.appendChild(customFlag)\n\n    const engineStats = document.createElement(\"div\")\n    engineStats.classList.add(\"engine-performance-stats\")\n\n    for (let [key, value] of engine_stats_dict) {\n        const stat = document.createElement(\"div\")\n        stat.classList.add(\"engine-performance-stat\")\n        if (key === 11 || key === 12) {\n            stat.classList.add(\"engine24\", \"d-none\")\n        }\n        stat.dataset.attribute = key\n\n        const statTitle = document.createElement(\"div\")\n        statTitle.classList.add(\"part-performance-stat-title\")\n        statTitle.innerText = value + \" \"\n        const unit = document.createElement(\"span\")\n        unit.classList.add(\"unit-measure\", \"bold-font\")\n        unit.innerText = \"%\"\n        statTitle.appendChild(unit)\n\n        const statNumber = document.createElement(\"div\")\n        statNumber.classList.add(\"stat-number\")\n\n        const less = document.createElement(\"i\")\n        less.classList.add(\"bi\", \"bi-dash\", \"new-augment-button\", \"transparent\")\n\n        const input = document.createElement(\"input\")\n        input.type = \"text\"\n        input.classList.add(\"custom-input-number\")\n\n        const plus = document.createElement(\"i\")\n        plus.classList.add(\"bi\", \"bi-plus\", \"new-augment-button\", \"transparent\")\n\n        statNumber.appendChild(less)\n        statNumber.appendChild(input)\n        statNumber.appendChild(plus)\n\n        const bar = document.createElement(\"div\")\n        bar.classList.add(\"engine-performance-bar\")\n        const barProgress = document.createElement(\"div\")\n        barProgress.classList.add(\"engine-performance-progress\")\n        bar.appendChild(barProgress)\n\n        const rawValue = stats?.[String(key)] ?? stats?.[key]\n        const numericValue = rawValue !== undefined ? Number(rawValue) : 50\n        input.value = numericValue.toFixed(1)\n        setBarWidth(barProgress, numericValue)\n\n        stat.appendChild(statTitle)\n        stat.appendChild(statNumber)\n        stat.appendChild(bar)\n        engineStats.appendChild(stat)\n    }\n\n    engineDiv.appendChild(engineStats)\n    wireEngineStatButtons(engineDiv)\n    return engineDiv\n}\n\nfunction renderCustomEnginesInList(engines) {\n    const enginesContainer = document.getElementById(\"enginesPerformance\")\n    if (!enginesContainer) return\n\n    enginesContainer.querySelectorAll(\".engine-performance.custom-engine-card\").forEach(function (elem) {\n        elem.remove()\n    })\n\n    engines.forEach(function (engine) {\n        const engineId = engine[0]\n        const engineStats = engine[1] || {}\n        const engineName = engine[2] || \"\"\n        enginesContainer.appendChild(createCustomEngineCard(engineId, engineName, engineStats))\n    })\n}\n\nfunction getNextCustomEngineId() {\n    const ids = Array.from(document.querySelectorAll(\"#enginesPerformance .engine-performance[data-custom-engine=\\\"true\\\"]\"))\n        .map((elem) => Number(elem.dataset.engineid))\n\n    if (!ids.length) return 14\n\n    let nextId = Math.max(...ids) + 3\n    const used = new Set(ids)\n    while (used.has(nextId)) {\n        nextId += 3\n    }\n    return nextId\n}\n\nconst addCustomEngineButton = document.getElementById(\"customEngines\")\nif (addCustomEngineButton) {\n    addCustomEngineButton.addEventListener(\"click\", function () {\n        const enginesContainer = document.getElementById(\"enginesPerformance\")\n        if (!enginesContainer) return\n\n        enginesContainer.appendChild(createCustomEngineCard(getNextCustomEngineId(), \"\", {}))\n        enginesContainer.scrollTop = enginesContainer.scrollHeight\n    })\n}\n\nexport function gather_custom_engines_data() {\n    const engines = document.querySelectorAll(\"#enginesPerformance .engine-performance[data-custom-engine=\\\"true\\\"]\")\n    let enginesData = {}\n    engines.forEach(function (engine) {\n        const engineID = engine.dataset.engineid\n        const nameInput = engine.querySelector(\".custom-engine-name\")\n        const engineName = String(nameInput?.value || \"\").trim().toLowerCase()\n        let engineStats = {}\n        engine.querySelectorAll(\".engine-performance-stat\").forEach(function (stat) {\n            let attribute = stat.dataset.attribute\n            let value = stat.querySelector(\".custom-input-number\").value.split(\" \")[0]\n            engineStats[attribute] = value\n        })\n        enginesData[engineID] = {\n            stats: engineStats,\n            name: engineName || \"new engine\"\n        }\n    })\n    return enginesData\n}\n\nexport function load_custom_engines(data) {\n    const engines = data || []\n    customEnginesCopy = data\n\n    const engineDropdown = document.querySelector(\"#engineMenu\")\n    if (engineDropdown) {\n        engineDropdown.querySelectorAll(\"a.custom-engine\").forEach(function (elem) {\n            elem.remove()\n        })\n\n        engines.forEach(function (engine) {\n            let engineOption = document.createElement(\"a\")\n            engineOption.classList.add(\"redesigned-dropdown-item\", \"custom-engine\")\n            engineOption.innerText = engine[2]\n            engineOption.dataset.engine = engine[0]\n            engineOption.href = \"#\"\n            engineDropdown.appendChild(engineOption)\n            engineOption.addEventListener(\"click\", function () {\n                let engineid = engineOption.dataset.engine\n                let engineName = engineOption.innerText\n                document.querySelector(\"#engineLabel\").innerText = engineName\n                document.querySelector(\"#engineButton\").dataset.value = engineid\n            })\n        })\n    }\n\n    renderCustomEnginesInList(engines)\n}\n\n\n\n/**\n * Manages the progression of the bars \n * @param {div} bar bar that is about to be edited\n * @param {int} progress number that determines the progress of the bar \n */\nfunction manage_bar(bar, progress) {\n    if (bar.dataset.type === \"engine\") {\n        let whiteDiv = bar.querySelector(\".white-part\")\n        let newProgress = progress * 10\n        let newWidth = 0 + newProgress + \"%\"\n        whiteDiv.style.width = newWidth;\n    }\n    else {\n        let grayDiv = bar.querySelector(\".gray-part\")\n        let greenDiv = bar.querySelector(\".green-part\")\n        if (progress == 0) {\n            grayDiv.style.width = \"100%\"\n            greenDiv.style.width = \"0%\"\n            bar.parentNode.querySelector(\".performance-data\").className = \"performance-data bold-font\"\n        }\n        else if (progress > 0) {\n            grayDiv.style.width = \"100%\"\n            let newProgress = progress * 10\n            let newWidth = 0 + newProgress + \"%\"\n            greenDiv.style.width = newWidth;\n            bar.parentNode.querySelector(\".performance-data\").className = \"performance-data bold-font positive\"\n        }\n        else if (progress < 0) {\n            greenDiv.style.width = \"0%\"\n            let newProgress = progress * 10\n            let newWidth = 100 + newProgress + \"%\"\n            grayDiv.style.width = newWidth;\n            bar.parentNode.querySelector(\".performance-data\").className = \"performance-data bold-font negative\"\n        }\n    }\n\n    bar.parentNode.querySelector(\".performance-data\").innerHTML = progress * 10 + \"%\"\n}\n\nexport function reload_performance_graph() {\n    if (typeof performanceGraph !== 'undefined' && performanceGraph !== null) {\n        performanceGraph.destroy(); \n        load_performance_graph(currentData);\n    }\n    \n}\n\nexport function load_performance_graph(data) {\n    currentData = data\n    const aduoUpgradeRaceIds = Array.isArray(data?.[2]) ? data[2] : [];\n    let labelsArray = []\n    data[1].forEach(function (elem) {\n        labelsArray.push(races_names[elem[2]])\n    })\n    labelsArray.unshift(\"\")\n    if (typeof performanceGraph !== 'undefined' && performanceGraph !== null) {\n        performanceGraph.destroy();\n    }\n    createPerformanceChart(labelsArray)\n    applyAduoUpgradeAnnotations(aduoUpgradeRaceIds, data?.[1], labelsArray.length)\n    performanceGraph.update()\n    let teamPerformances = {};\n\n    // Inicializar un array vacío para cada equipo\n    for (let i = 1; i <= 10; i++) {\n        teamPerformances[i] = [];\n    }\n    teamPerformances[32] = [];\n    let minValue = Number.POSITIVE_INFINITY;\n    let maxValue = Number.NEGATIVE_INFINITY;\n    let performances = [...data[0]]\n    performances.forEach(race => {\n        for (let team in race) {\n            let value = race[team];\n            teamPerformances[team].push(value);\n            if (value < minValue) {\n                minValue = value;\n            }\n            if (value > maxValue) {\n                maxValue = value;\n            }\n        }\n    });\n    let yAxisMin = minValue - 5;\n    let yAxisMax = maxValue + 5;\n    for (let team in teamPerformances) {\n        let color = get_colors_dict()[team + \"0\"];\n        let data = teamPerformances[team];\n        performanceGraph.data.datasets.push({\n            label: combined_dict[team],\n            data: data,\n            borderColor: color,\n            backgroundColor: color,\n            pointRadius: 0,\n            fill: false,\n            tension: 0.1,\n            pointHitRadius: 7\n        });\n    }\n    performanceGraph.options.scales.y.min = yAxisMin;\n    performanceGraph.options.scales.y.max = yAxisMax;\n    performanceGraph.update();\n}\n\nfunction applyAduoUpgradeAnnotations(raceIds, races, labelCount) {\n    if (!performanceGraph?.options?.plugins?.annotation) return;\n\n    const ids = Array.isArray(raceIds)\n        ? raceIds.map(r => Number(r)).filter(r => Number.isFinite(r) && r > 0)\n        : [];\n\n    const raceIdToLabelIndex = new Map();\n    if (Array.isArray(races)) {\n        for (let i = 0; i < races.length; i++) {\n            const raceId = Number(races[i]?.[0]);\n            if (!Number.isFinite(raceId)) continue;\n            raceIdToLabelIndex.set(raceId, i + 1); // +1 because labelsArray.unshift(\"\")\n        }\n    }\n\n    const annotations = {};\n    for (const raceId of ids) {\n        const labelIndex = raceIdToLabelIndex.get(raceId);\n        if (!labelIndex || labelIndex <= 0 || labelIndex >= labelCount) continue;\n\n        const boundaryIndex = labelIndex - 1; // La línea se dibuja antes del índice de la etiqueta correspondiente\n        if (boundaryIndex <= 0) continue;\n\n        annotations[`aduo_engine_${raceId}`] = {\n            type: 'line',\n            xMin: boundaryIndex,\n            xMax: boundaryIndex,\n            display: performanceAnnotationsToggle,\n            borderColor: theme_colors[selectedTheme]?.engine_upgrade_line || 'rgba(253, 224, 107, 0.8)',\n            borderWidth: 2,\n            borderDash: [6, 6],\n            drawTime: 'beforeDatasetsDraw'\n        };\n    }\n\n    performanceGraph.options.plugins.annotation.annotations = annotations;\n}\n\n/**\n * Creates the head to head race chart\n * @param {Array} labelsArray array with all the labels for the races\n */\nfunction createPerformanceChart(labelsArray) {\n    const dataD = {\n        labels: labelsArray,\n    };\n    performanceGraph = new Chart(\n        document.getElementById('performanceGraph'),\n        {\n            type: 'line',\n            data: dataD,\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                animation: false,\n                interaction: {\n                    mode: 'index'\n                },\n                layout: {\n                    padding: {\n                        top: 25,\n                        right: 25,\n                        boottom: 20,\n                        left: 10\n                    }\n                },\n                scales: {\n                    x: {\n                        grid: {\n                            color: theme_colors[selectedTheme].grid\n                        },\n                        ticks: {\n                            color: theme_colors[selectedTheme].labels,\n                            font: {\n                                family: \"Formula1Bold\"\n                            }\n                        }\n                    },\n                    y: {\n                        min: 0,\n                        max: 100,\n                        grid: {\n                            color: theme_colors[selectedTheme].grid\n                        },\n                        ticks: {\n                            color: theme_colors[selectedTheme].labels,\n                            font: {\n                                family: \"Formula1Bold\"\n                            },\n                            callback: function (value) {\n                                return value.toFixed(1); // Mostrar solo un decimal\n                            }\n                        }\n\n                    }\n                },\n                plugins: {\n                    datalabels: {\n                        display: false\n                    },\n                    annotation: {\n                        annotations: {}\n                    },\n                    legend: {\n                        labels: {\n                            boxHeight: 2,\n                            boxWidth: 25,\n                            color: theme_colors[selectedTheme].labels,\n                            font: {\n                                family: \"Formula1\"\n                            }\n                        },\n                        display: false,\n                    },\n                    tooltip: {\n                        titleFont: {\n                            family: 'Formula1Bold',\n                            size: 16\n\n                        },\n                        bodyFont: {\n                            family: 'Formula1',\n                            size: 14\n                        }\n                    }\n\n                }\n\n\n            }\n        }\n    );\n}\n\n\n\n"
  },
  {
    "path": "src/js/frontend/recentsManager.js",
    "content": "import { get, set } from 'idb-keyval';\n\nconst DB_NAME = \"SaveEditorDB\";\nconst STORE_NAME = \"recentFileHandles\";\nconst DB_VERSION = 1; \n\nfunction openDB() {\n    return new Promise((resolve, reject) => {\n        const request = indexedDB.open(DB_NAME, DB_VERSION);\n\n        request.onupgradeneeded = (e) => {\n            const db = e.target.result;\n            if (!db.objectStoreNames.contains(STORE_NAME)) {\n                db.createObjectStore(STORE_NAME, { keyPath: \"name\" });\n            }\n        };\n        request.onsuccess = (e) => resolve(e.target.result);\n        request.onerror = (e) => reject(\"Error opening DB\");\n    });\n}\n\nexport async function saveHandleToRecents(handle) {\n    let recents = (await get('recentFiles')) || [];\n    \n    recents = recents.filter(r => r.name !== handle.name);\n    \n    recents.unshift({\n        name: handle.name,\n        handle: handle, \n        lastOpened: new Date()\n    });\n\n    await set('recentFiles', recents);\n}\n\nexport async function getRecentHandles() {\n    return (await get('recentFiles')) || [];\n}\n\nexport async function removeRecentHandle(name) {\n    let recents = (await get('recentFiles')) || [];\n    recents = recents.filter(r => r.name !== name);\n    await set('recentFiles', recents);\n}\n"
  },
  {
    "path": "src/js/frontend/regulations.js",
    "content": "import { attachHold } from \"./renderer\";\n\nlet regulationsState = null;\n\nconst root = document.getElementById(\"regulations\");\n\nconst spendingCapInput = document.getElementById(\"regSpendingCap\");\nconst engineLimitInput = document.getElementById(\"regEngineLimit\");\nconst ersLimitInput = document.getElementById(\"regErsLimit\");\nconst gearboxLimitInput = document.getElementById(\"regGearboxLimit\");\n\nconst doubleLastRacePointsToggle = document.getElementById(\"regDoubleLastRacePoints\");\nconst fastestLapBonusPointToggle = document.getElementById(\"regFastestLapBonusPoint\");\nconst polePositionBonusPointToggle = document.getElementById(\"regPolePositionBonusPoint\");\n\nconst createPointSchemeButton = document.getElementById(\"regCreatePointScheme\");\nconst createResourcePackageButton = document.getElementById(\"regCreateResourcePackage\");\n\nconst pointSchemeDropdownButton = document.getElementById(\"regPointSchemeButton\");\nconst pointSchemeMenu = document.getElementById(\"regPointSchemeMenu\");\nconst pointSchemeBody = document.getElementById(\"regPointSchemeBody\");\n\nconst resourcePackageDropdownButton = document.getElementById(\"regResourcePackageButton\");\nconst resourcePackageMenu = document.getElementById(\"regResourcePackageMenu\");\nconst resourcePackageBody = document.getElementById(\"regResourcePackageBody\");\n\nfunction getEnumChange(id) {\n  return regulationsState?.enumChanges?.[id] ?? null;\n}\n\nfunction parseIntSafe(val, fallback = 0) {\n  const n = Number.parseInt(String(val).replace(/[^\\d-]/g, \"\"), 10);\n  return n;\n}\n\nfunction formatMoney(val) {\n  const n = Number(val);\n  return n.toLocaleString(\"en-US\");\n}\n\nfunction getSchemeName(id) {\n  const n = Number(id);\n  if (n === 1) return \"2010–Present\";\n  if (n === 2) return \"2003–2009\";\n  if (n === 3) return \"1991–2002\";\n  return `Custom Scheme ${n}`;\n}\n\nfunction getPackageName(id) {\n  return `Custom Package ${Number(id)}`;\n}\n\nfunction getSelectedPointScheme() {\n  const row = getEnumChange(\"PointScheme\");\n  const current = row?.CurrentValue ?? 1;\n  return Number(current) || 1;\n}\n\nfunction getSelectedResourcePackage() {\n  const row = getEnumChange(\"PartDevResourceLimit\");\n  const current = row?.CurrentValue ?? 1;\n  return Number(current) || 1;\n}\n\nfunction setDropdownLabel(btn, label) {\n  const labelEl = btn?.querySelector(\".dropdown-label\");\n  if (labelEl) labelEl.textContent = label;\n}\n\nfunction updateMenus() {\n  if (!regulationsState || !pointSchemeMenu || !resourcePackageMenu) return;\n\n  const selectedScheme = getSelectedPointScheme();\n  const selectedPackage = getSelectedResourcePackage();\n\n  pointSchemeMenu.innerHTML = \"\";\n  Object.keys(regulationsState.pointSchemes || {})\n    .map(Number)\n    .sort((a, b) => a - b)\n    .forEach((id) => {\n      const item = document.createElement(\"a\");\n      item.className = \"redesigned-dropdown-item\";\n      item.dataset.value = String(id);\n      item.style.cursor = \"pointer\";\n      item.textContent = getSchemeName(id);\n      if (id === selectedScheme) {\n        const check = document.createElement(\"i\");\n        check.className = \"bi bi-check\";\n        item.appendChild(document.createTextNode(\" \"));\n        item.appendChild(check);\n      }\n      item.addEventListener(\n        \"click\",\n        () => {\n          regulationsState.enumChanges.PointScheme.CurrentValue = id;\n          setDropdownLabel(pointSchemeDropdownButton, getSchemeName(id));\n          updateMenus();\n          renderPointSchemeTable();\n        },\n        { once: true }\n      );\n      pointSchemeMenu.appendChild(item);\n    });\n\n  resourcePackageMenu.innerHTML = \"\";\n  Object.keys(regulationsState.partResources || {})\n    .map(Number)\n    .sort((a, b) => a - b)\n    .forEach((id) => {\n      const item = document.createElement(\"a\");\n      item.className = \"redesigned-dropdown-item\";\n      item.dataset.value = String(id);\n      item.style.cursor = \"pointer\";\n      item.textContent = getPackageName(id);\n      if (id === selectedPackage) {\n        const check = document.createElement(\"i\");\n        check.className = \"bi bi-check\";\n        item.appendChild(document.createTextNode(\" \"));\n        item.appendChild(check);\n      }\n      item.addEventListener(\n        \"click\",\n        () => {\n          regulationsState.enumChanges.PartDevResourceLimit.CurrentValue = id;\n          setDropdownLabel(resourcePackageDropdownButton, getPackageName(id));\n          updateMenus();\n          renderResourcePackageTable();\n        },\n        { once: true }\n      );\n      resourcePackageMenu.appendChild(item);\n    });\n}\n\nfunction renderPointSchemeTable() {\n  if (!regulationsState || !pointSchemeBody) return;\n  const schemeId = getSelectedPointScheme();\n  const rows = regulationsState.pointSchemes?.[schemeId] || [];\n\n  pointSchemeBody.innerHTML = \"\";\n  for (const row of rows) {\n    const wrapper = document.createElement(\"div\");\n    wrapper.className = \"regulations-row\";\n\n    const pos = document.createElement(\"div\");\n    pos.className = \"regulations-cell regulations-keycell\";\n    pos.textContent = String(row.RacePos);\n\n    const pointsCell = document.createElement(\"div\");\n    pointsCell.className = \"regulations-cell\";\n    const input = document.createElement(\"input\");\n    input.type = \"number\";\n    input.min = \"0\";\n    input.step = \"1\";\n    input.value = String(row.Points ?? 0);\n    input.className = \"custom-input-number\";\n    input.addEventListener(\"input\", () => {\n      row.Points = parseIntSafe(input.value, 0);\n      regulationsState.pointSchemes[schemeId] = rows;\n    });\n    pointsCell.appendChild(input);\n\n    wrapper.appendChild(pos);\n    wrapper.appendChild(pointsCell);\n    pointSchemeBody.appendChild(wrapper);\n  }\n}\n\nfunction renderResourcePackageTable() {\n  if (!regulationsState || !resourcePackageBody) return;\n  const packageId = getSelectedResourcePackage();\n  const rows = regulationsState.partResources?.[packageId] || [];\n\n  resourcePackageBody.innerHTML = \"\";\n  for (const row of rows) {\n    const wrapper = document.createElement(\"div\");\n    wrapper.className = \"regulations-row\";\n\n    const pos = document.createElement(\"div\");\n    pos.className = \"regulations-cell regulations-keycell\";\n    pos.textContent = String(row.StandingPos);\n\n    const windCell = document.createElement(\"div\");\n    windCell.className = \"regulations-cell\";\n    const windInput = document.createElement(\"input\");\n    windInput.type = \"number\";\n    windInput.min = \"0\";\n    windInput.step = \"1\";\n    windInput.value = String(row.WindTunnelBlocks ?? 0);\n    windInput.className = \"custom-input-number\";\n    windInput.addEventListener(\"input\", () => {\n      row.WindTunnelBlocks = parseIntSafe(windInput.value, 0);\n      regulationsState.partResources[packageId] = rows;\n    });\n    windCell.appendChild(windInput);\n\n    const cfdCell = document.createElement(\"div\");\n    cfdCell.className = \"regulations-cell\";\n    const cfdInput = document.createElement(\"input\");\n    cfdInput.type = \"number\";\n    cfdInput.min = \"0\";\n    cfdInput.step = \"1\";\n    cfdInput.value = String(row.CfdBlocks ?? 0);\n    cfdInput.className = \"custom-input-number\";\n    cfdInput.addEventListener(\"input\", () => {\n      row.CfdBlocks = parseIntSafe(cfdInput.value, 0);\n      regulationsState.partResources[packageId] = rows;\n    });\n    cfdCell.appendChild(cfdInput);\n\n    wrapper.appendChild(pos);\n    wrapper.appendChild(windCell);\n    wrapper.appendChild(cfdCell);\n    resourcePackageBody.appendChild(wrapper);\n  }\n}\n\nfunction initHoldControlsOnce() {\n  if (!root || root.dataset.holdInit === \"1\") return;\n  root.dataset.holdInit = \"1\";\n\n  const controls = [\n    { input: spendingCapInput, id: \"SpendingCap\", step: 1_000_000, format: (val) => formatMoney(val) },\n    { input: engineLimitInput, id: \"EngineLimit\", step: 1 },\n    { input: ersLimitInput, id: \"ErsLimit\", step: 1 },\n    { input: gearboxLimitInput, id: \"GearboxLimit\", step: 1 },\n  ];\n\n  if (spendingCapInput && spendingCapInput.dataset.moneyInit !== \"1\") {\n    spendingCapInput.dataset.moneyInit = \"1\";\n    spendingCapInput.addEventListener(\"blur\", () => {\n      spendingCapInput.value = formatMoney(parseIntSafe(spendingCapInput.value, 0));\n    });\n  }\n\n  for (const c of controls) {\n    const container = c.input?.closest(\".stat-number\");\n    if (!container) continue;\n\n    const minus = container.querySelector(\".bi-dash.new-augment-button\");\n    const plus = container.querySelector(\".bi-plus.new-augment-button\");\n\n    const change = getEnumChange(c.id);\n    const min = change?.MinValue ?? 0;\n    const max = change?.MaxValue ?? Number.POSITIVE_INFINITY;\n\n    const holdOpts = { min, max };\n    if (c.format) holdOpts.format = c.format;\n\n    if (plus) {\n      attachHold(plus, c.input, c.step, holdOpts);\n    }\n    if (minus) {\n      attachHold(minus, c.input, -c.step, holdOpts);\n    }\n  }\n}\n\nfunction createNewPointScheme() {\n  if (!regulationsState) return;\n  const ids = Object.keys(regulationsState.pointSchemes || {}).map(Number);\n  const nextId = (ids.length ? Math.max(...ids) : 0) + 1;\n  const baseLen = (regulationsState.pointSchemes?.[1] || []).length || 10;\n\n  regulationsState.pointSchemes[nextId] = Array.from({ length: baseLen }, (_, i) => ({\n    RacePos: i + 1,\n    Points: baseLen - i,\n  }));\n  regulationsState.enumChanges.PointScheme.CurrentValue = nextId;\n  setDropdownLabel(pointSchemeDropdownButton, getSchemeName(nextId));\n  updateMenus();\n  renderPointSchemeTable();\n}\n\nfunction createNewResourcePackage() {\n  if (!regulationsState) return;\n  const ids = Object.keys(regulationsState.partResources || {}).map(Number);\n  const nextId = (ids.length ? Math.max(...ids) : 0) + 1;\n  const baseLen = (regulationsState.partResources?.[1] || []).length || 10;\n\n  regulationsState.partResources[nextId] = Array.from({ length: baseLen }, (_, i) => ({\n    StandingPos: i + 1,\n    WindTunnelBlocks: 72,\n    CfdBlocks: 72,\n  }));\n  regulationsState.enumChanges.PartDevResourceLimit.CurrentValue = nextId;\n  setDropdownLabel(resourcePackageDropdownButton, getPackageName(nextId));\n  updateMenus();\n  renderResourcePackageTable();\n}\n\nexport function load_regulations(data) {\n  if (!root) return;\n  regulationsState = JSON.parse(JSON.stringify(data || {}));\n\n  const required = [\n    \"SpendingCap\",\n    \"EngineLimit\",\n    \"ErsLimit\",\n    \"GearboxLimit\",\n    \"DoubleLastRacePoints\",\n    \"FastestLapBonusPoint\",\n    \"PolePositionBonusPoint\",\n    \"PointScheme\",\n    \"PartDevResourceLimit\",\n  ];\n\n  for (const k of required) {\n    if (!regulationsState.enumChanges?.[k]) {\n      regulationsState.enumChanges = regulationsState.enumChanges || {};\n      regulationsState.enumChanges[k] = { CurrentValue: 0, MinValue: 0, MaxValue: 0 };\n    }\n  }\n\n  spendingCapInput.value = formatMoney(regulationsState.enumChanges.SpendingCap.CurrentValue ?? 0);\n  engineLimitInput.value = String(regulationsState.enumChanges.EngineLimit.CurrentValue ?? 0);\n  ersLimitInput.value = String(regulationsState.enumChanges.ErsLimit.CurrentValue ?? 0);\n  gearboxLimitInput.value = String(regulationsState.enumChanges.GearboxLimit.CurrentValue ?? 0);\n\n  doubleLastRacePointsToggle.checked = regulationsState.enumChanges.DoubleLastRacePoints.CurrentValue === 1;\n  fastestLapBonusPointToggle.checked = regulationsState.enumChanges.FastestLapBonusPoint.CurrentValue === 1;\n  polePositionBonusPointToggle.checked = regulationsState.enumChanges.PolePositionBonusPoint.CurrentValue === 1;\n\n  setDropdownLabel(pointSchemeDropdownButton, getSchemeName(getSelectedPointScheme()));\n  setDropdownLabel(resourcePackageDropdownButton, getPackageName(getSelectedResourcePackage()));\n\n  initHoldControlsOnce();\n  updateMenus();\n  renderPointSchemeTable();\n  renderResourcePackageTable();\n}\n\nexport function gather_regulations_data() {\n  if (!regulationsState) return null;\n\n  regulationsState.enumChanges.SpendingCap.CurrentValue = parseIntSafe(spendingCapInput.value, 0);\n  regulationsState.enumChanges.EngineLimit.CurrentValue = parseIntSafe(engineLimitInput.value, 0);\n  regulationsState.enumChanges.ErsLimit.CurrentValue = parseIntSafe(ersLimitInput.value, 0);\n  regulationsState.enumChanges.GearboxLimit.CurrentValue = parseIntSafe(gearboxLimitInput.value, 0);\n\n  regulationsState.enumChanges.DoubleLastRacePoints.CurrentValue = doubleLastRacePointsToggle.checked ? 1 : 0;\n  regulationsState.enumChanges.FastestLapBonusPoint.CurrentValue = fastestLapBonusPointToggle.checked ? 1 : 0;\n  regulationsState.enumChanges.PolePositionBonusPoint.CurrentValue = polePositionBonusPointToggle.checked ? 1 : 0;\n\n  return {\n    enumChanges: regulationsState.enumChanges,\n    pointSchemes: regulationsState.pointSchemes,\n    partResources: regulationsState.partResources,\n  };\n}\n\nif (createPointSchemeButton) {\n  createPointSchemeButton.addEventListener(\"click\", () => {\n    createNewPointScheme();\n  });\n}\n\nif (createResourcePackageButton) {\n  createResourcePackageButton.addEventListener(\"click\", () => {\n    createNewResourcePackage();\n  });\n}\n"
  },
  {
    "path": "src/js/frontend/renderer.js",
    "content": "import { marked } from 'marked';\nimport DOMPurify from 'dompurify';\n\nimport { resetTeamEditing, fillLevels, longTermObj, originalCostCap, gather_team_data, gather_pit_crew, teamCod } from './teams';\nimport {\n    resetViewer, generateYearsMenu, resetYearButtons, update_logo, setEngineAllocations, engine_names, new_drivers_table, new_teams_table,\n    new_load_drivers_table, new_load_teams_table, addEngineName, deleteEngineName, reloadTables,\n    populateSeasonReview,\n    onSessionResultsFetched\n} from './seasonViewer';\nimport { combined_dict, abreviations_dict, codes_dict, logos_disc, mentality_to_global_menatality, difficultyConfig, default_dict, weightDifConfig, defaultDifficultiesConfig, defaultTurningPointsFrequencyPreset, turningPointsFrequencyLabels, themeToolbarLogos } from './config';\nimport {\n    freeDriversDiv, insert_space, place_staff, remove_drivers, add_marquees_transfers, place_drivers, sortList, update_name,\n    manage_modal,\n    loadJuniorTeamDrivers,\n    initFreeDriversElems\n} from './transfers';\nimport { load_calendar } from './calendar';\n  import {\n      load_performance, load_performance_graph, load_attributes, manage_engineStats, load_cars, load_custom_engines,\n      order_by, load_car_attributes, viewingGraph, load_parts_stats, load_parts_list, update_max_design, teamsEngine, load_one_part,\n      teamSelected, gather_engines_data, gather_custom_engines_data, reload_performance_graph, load_team_expertise, gather_team_expertise_data, performanceDetailsMode\n  } from './performance';\nimport {\n    removeStatsDrivers, place_drivers_editStats, place_staff_editStats, typeOverall, setStatPanelShown, setTypeOverall,\n    typeEdit, setTypeEdit, change_elegibles, getName, calculateOverall, listenersStaffGroups,\n    initStatsDrivers, loadNumbers, loadRandomStaffDraft, isDraftProfileSelected, applyDraftForenameUpdate, applyDraftCountryLocale\n} from './stats';\nimport {\n    resetH2H, hideComp, colors_dict, load_drivers_h2h, sprintsListeners, racePaceListener, qualiPaceListener, manage_h2h_bars, load_labels_initialize_graphs,\n    reload_h2h_graphs, init_colors_dict, edit_colors_dict, setMidGrid, setMaxRaces, setRelativeGrid\n} from './head2head';\nimport { place_news, updateNewsYearsButton } from './news.js';\nimport { load_regulations, gather_regulations_data } from './regulations.js';\nimport { loadRecordsList, loadTeamRecordsList } from './seasonViewer';\nimport { resetStaffIDChanges, updateEditsWithModData } from '../backend/scriptUtils/modUtils.js';\nimport { dbWorker, handleDragEnter, handleDragLeave, handleDragOver, handleDrop, processSaveFile } from './dragFile';\nimport { Command } from \"../backend/command.js\";\nimport { saveAs } from \"file-saver\";\nimport members from \"../../data/members.json\"\nimport { createTeamReplacers, logos_configs, pretty_names } from \"./teamReplacements.js\";\n\nimport bootstrap from \"bootstrap/dist/js/bootstrap.bundle.min.js\";\nimport { getRecentHandles, saveHandleToRecents, removeRecentHandle } from './recentsManager.js';\nimport { initSeasonMods, syncAduoTpToggles, syncMods2025Dependencies, syncMods2026Dependencies, syncMods2026ApplyAllButtonState, updateMod2025Blocking, updateMod2026Blocking } from './seasonMods.js';\n\n\n\nconst driverTransferPill = document.getElementById(\"transferpill\");       \nconst editStatsPill = document.getElementById(\"statspill\");\nconst CalendarPill = document.getElementById(\"calendarpill\");\nconst regulationsPill = document.getElementById(\"regulationspill\");\nconst carPill = document.getElementById(\"carpill\");\nconst viewPill = document.getElementById(\"viewerpill\");\nconst h2hPill = document.getElementById(\"h2hpill\");\nconst constructorsPill = document.getElementById(\"constructorspill\")      \nconst newsPill = document.getElementById(\"newspill\")\nconst modPill = document.getElementById(\"modpill\")\n\nexport const editorPill = document.getElementById(\"editorPill\")\nexport const gamePill = document.getElementById(\"gamePill\")\nconst patreonPill = document.getElementById(\"patreonPill\")\n\nconst driverTransferDiv = document.getElementById(\"driver_transfers\");\nconst editStatsDiv = document.getElementById(\"edit_stats\");\nconst customCalendarDiv = document.getElementById(\"custom_calendar\");\nconst regulationsDiv = document.getElementById(\"regulations\");\nconst carPerformanceDiv = document.getElementById(\"car_performance\");\nconst viewDiv = document.getElementById(\"season_viewer\");\nconst h2hDiv = document.getElementById(\"head2head_viewer\");\nconst teamsDiv = document.getElementById(\"edit_teams\");\nconst seasonModsDiv = document.getElementById(\"season_mods\")\nconst newsDiv = document.getElementById(\"news\")\n\nconst patchNotesBody = document.getElementById(\"patchNotesBody\")\nconst selectImageButton = document.getElementById('selectImage');\nconst patreonLoginButton = document.getElementById('patreonLoginButton');\nconst patreonLogoutButton = document.getElementById('patreonLogoutButton');\nconst patreonToolLoginButton = document.getElementById('patreonToolLoginButton');\nconst userToolButton = document.getElementById('userToolButton');\nconst saveFileButton = document.getElementById('saveFileButton');\n\nconst scriptsArray = [newsDiv, h2hDiv, viewDiv, driverTransferDiv, editStatsDiv, teamsDiv, customCalendarDiv, regulationsDiv, carPerformanceDiv, seasonModsDiv]\ninitSeasonMods();\n\ndocument.addEventListener(\"random-staff-requested\", function (event) {\n    const data = event.detail || {};\n    const command = new Command(\"fetchRandomStaffDraft\", data);\n    command.execute();\n});\n\ndocument.addEventListener(\"random-forename-requested\", function (event) {\n    const data = event.detail || {};\n    const command = new Command(\"fetchRandomDraftForename\", data);\n    command.execute();\n});\n\ndocument.addEventListener(\"draft-nationality-selected\", function (event) {\n    const data = event.detail || {};\n    const command = new Command(\"fetchCountryLocaleForCode\", data);\n    command.execute();\n});\n\nconst dropDownMenu = document.getElementById(\"dropdownMenu\");\n\nconst notificationPanel = document.getElementById(\"notificationPanel\");\n\nconst logButton = document.getElementById(\"logFileButton\");\nconst patreonLogo = document.querySelector(\".footer .bi-custom-patreon\");\nconst patreonSlideUp = document.querySelector(\".patreon-slide-up\");\nconst slideUpClose = document.getElementById(\"patreonSlideUpClose\")\nconst patreonUnlockables = document.querySelector(\".patreon-unlockables\")       \nconst downloadSaveButton = document.querySelector(\".download-save-button\")      \nconst downloadSaveProgress = document.getElementById(\"downloadSaveProgress\");\nconst downloadSaveProgressFill = document.getElementById(\"downloadSaveProgressFill\");\n\nconst patreonThemes = document.querySelector(\".patreon-themes\");\n\nconst status = document.querySelector(\".status-info\")\nconst updateInfo = document.querySelector(\".update-info\")\n\nconst turningPointsFrequencyConfig = document.getElementById(\"turningPointsFrequencyConfig\");\nconst turningPointsFrequencySlider = document.getElementById(\"turningPointsFrequencySlider\");\nconst turningPointsFrequencyLabel = document.getElementById(\"turningPointsFrequencyLabel\");\nconst forceEditorMinimapColorsToggle = document.getElementById(\"forceEditorMinimapColorsToggle\");\n\nfunction updateTurningPointsFrequencyUI() {\n    if (!turningPointsFrequencySlider || !turningPointsFrequencyLabel) return;\n    const idx = parseInt(turningPointsFrequencySlider.value, 10);\n    turningPointsFrequencySlider.value = String(idx);\n    turningPointsFrequencyLabel.textContent = turningPointsFrequencyLabels[idx];\n    const directionClass =\n        idx === defaultTurningPointsFrequencyPreset\n            ? \"tp-default\"\n            : idx > defaultTurningPointsFrequencyPreset\n                ? \"tp-more\"\n                : \"tp-less\";\n    turningPointsFrequencyLabel.className = `option-state ${directionClass}`;\n}\n\nconst fileInput = document.getElementById('fileInput');\nconst saveFileInput = document.getElementById('saveFileInput');\nconst noNotifications = [\"Custom Engines fetched\", \"Cars fetched\", \"Part values fetched\", \"Parts stats fetched\", \"Team expertise fetched\", \"Expertise updated\", \"24 Year\", \"Game Year\", \"Performance fetched\", \"Season performance fetched\", \"Config\", \"ERROR\", \"Montecarlo fetched\", \"TeamData Fetched\", \"Progress\", \"JIC\", \"Calendar fetched\", \"Contract fetched\", \"Staff Fetched\", \"Engines fetched\", \"Results fetched\", \"Year fetched\", \"Numbers fetched\", \"H2H fetched\", \"DriversH2H fetched\", \"H2HDriver fetched\", \"Retirement fetched\", \"Prediction Fetched\", \"Events to Predict Fetched\", \"Events to Predict Modal Fetched\"]\nconst glowSpot = document.querySelector('.glow-spot');\nconst blockDiv = document.getElementById('blockDiv');\n\nlet difficulty_dict = {\n    \"-2\": \"Custom\",\n    0: \"default\",\n    1: \"reduced weight\",\n    2: \"extra-hard\",\n    3: \"brutal\",\n    4: \"unfair\",\n    5: \"insane\",\n    6: \"impossible\"\n}\n\nlet inverted_difficulty_dict = {\n    \"disabled\": -1,\n    \"default\": 0,\n    \"reduced weight\": 1,\n    \"extra-hard\": 2,\n    \"brutal\": 3,\n    \"unfair\": 4,\n    \"insane\": 5,\n    \"impossible\": 6\n}\nlet difcultyCustom = \"default\"\n\nexport let game_version = 2023;\nexport let custom_team = false;\nexport let nightlyBlock = false;\nexport let seasonModData = {};\nlet latestSaveYear = null;\nlet firstShow = false;\nlet configCopy;\n\nlet managingTeamChanged = false;\nlet isSaveSelected = 0;\nlet scriptSelected = 0;\nlet divBlocking = 1;\nlet saveName;\nlet tempImageData = null;\nlet lastVisibleIndex = 0;\nlet viewerLoaded = false;\n\nexport let selectedTheme = \"default-theme\";\nlet isNightlyHost = false;\nlet hasPatreonThemeAccess = false;\n\nlet newsAvailable = {\n    \"normal\": false,\n    \"turning\": false,\n}\n\nlet versionNow;\nconst versionPanel = document.querySelector('.version-panel');\nconst versionBadge = document.querySelector('.badge-version');\nconst parchModalTitle = document.getElementById(\"patchModalTitle\")\n\nlet notificationsQueue = [];\nlet isShowingNotification = false;\n\nconst repoOwner = 'IUrreta';\nconst repoName = 'DatabaseEditor';\n\n\n\n(function () {\n    const originalLog = console.log;\n    const originalError = console.error;\n\n    const logArray = [];\n\n    console.log = function (...args) {\n        logArray.push({\n            type: 'log',\n            message: args,\n            timestamp: new Date()\n        });\n        originalLog.apply(console, args);\n    };\n\n    console.error = function (...args) {\n        logArray.push({\n            type: 'error',\n            message: args,\n            timestamp: new Date()\n        });\n        originalError.apply(console, args);\n    };\n\n    window.getLogEntries = () => logArray;\n})();\n\n\nexport function setSaveName(name) {\n    saveName = name;\n}\n\nexport function getSaveName() {\n    return saveName;\n}\n\nexport function setIsShowingNotification(value) {\n    isShowingNotification = value;\n}\n\n\n\n/**\n * get the patch notes from the actual version fro the github api\n */\nasync function getPatchNotes() {\n    try {\n        if (versionNow.slice(-3) !== \"dev\" && !versionNow.includes(\"nightly\")) {\n            let response = await fetch(`https://api.github.com/repos/${repoOwner}/${repoName}/releases/tags/${versionNow}`);\n            let data = await response.json();\n            let changes = data.body;\n            let changesHTML = DOMPurify.sanitize(marked(changes));\n            patchNotesBody.innerHTML = changesHTML\n            let h1Elements = patchNotesBody.querySelectorAll(\"h1\");\n\n            h1Elements.forEach(function (h1Element) {\n                let h4Element = document.createElement(\"h4\");\n                h4Element.textContent = h1Element.textContent;\n                h4Element.classList.add(\"bold-font\")\n                patchNotesBody.replaceChild(h4Element, h1Element);\n            });\n\n            let h2Elements = patchNotesBody.querySelectorAll(\"h2\");\n            h2Elements.forEach(function (h1Element) {\n                let h4Element = document.createElement(\"h4\");\n                h4Element.textContent = h1Element.textContent;\n                h4Element.classList.add(\"bold-font\")\n                patchNotesBody.replaceChild(h4Element, h1Element);\n            });\n        }\n        else if (versionNow.includes(\"nightly\")) {\n            let response = await fetch('/data/nightly_patch_notes.md');\n            let changes = await response.text();\n            let changesHTML = DOMPurify.sanitize(marked(changes));\n            patchNotesBody.innerHTML = changesHTML\n            let h1Elements = patchNotesBody.querySelectorAll(\"h1\");\n\n            h1Elements.forEach(function (h1Element) {\n                let h4Element = document.createElement(\"h4\");\n                h4Element.textContent = h1Element.textContent;\n                h4Element.classList.add(\"bold-font\")\n                patchNotesBody.replaceChild(h4Element, h1Element);\n            });\n\n            let h2Elements = patchNotesBody.querySelectorAll(\"h2\");\n            h2Elements.forEach(function (h1Element) {\n                let h4Element = document.createElement(\"h4\");\n                h4Element.textContent = h1Element.textContent;\n                h4Element.classList.add(\"bold-font\")\n                patchNotesBody.replaceChild(h4Element, h1Element);\n            });\n        }\n    } catch {\n        console.log(\"Couldn't find patch notes\")\n    }\n\n\n}\n\n// Patreon OAuth Logic\nif (patreonLoginButton) {\n    patreonLoginButton.addEventListener('click', () => {\n        window.location.href = '/api/auth/patreon/login';\n    });\n}\n\nif (patreonToolLoginButton) {\n    patreonToolLoginButton.addEventListener('click', () => {\n        window.location.href = '/api/auth/patreon/login';\n    });\n}\n\nif (patreonLogoutButton) {\n    patreonLogoutButton.addEventListener('click', () => {\n        handleLogout();\n    });\n}\n\nif (userToolButton) {\n    userToolButton.addEventListener('click', () => {\n        const userToolMenu = document.querySelector('.userToolMenu');\n        if (userToolMenu) {\n            userToolMenu.classList.toggle('hidden');\n        }\n    });\n}\n\nif (saveFileButton && saveFileInput) {\n    saveFileInput.addEventListener('change', async (event) => {\n        const file = event.target.files[0];\n        if (file) {\n            await processSaveFile(file);\n        }\n        saveFileInput.value = '';\n    });\n\n    saveFileButton.addEventListener('click', async () => {\n        const ok = await confirmModal({\n            title: \"Warning about selecting your save file\",\n            body: \"Selecting your save file this way (in stead of drag and drop) will not save your save in the Recents section. Are you sure you want to continue?\",\n            confirmText: \"Continue\",\n            cancelText: \"Cancel\"\n        })\n        if (ok) {\n            saveFileInput.click();\n        }\n    });\n}\n\n\n\nasync function handleLogout() {\n    try {\n        const response = await fetch('/api/auth/patreon/logout');\n\n        if (response.ok) {\n            console.log(\"Logout successful\");\n\n            updatePatreonUI({ isLoggedIn: false, tier: 'Free', tierNumber: 0, whitelisted: false, paidMember: false });\n\n            window.location.reload();\n        }\n    } catch (error) {\n        console.error(\"Logout failed\", error);\n    }\n}\n\n/**\n * Retrieves the user's Patreon tier from the cookie.\n * @returns {Promise<{paidMember: boolean, tier: string, tierNumber?: number, whitelisted: boolean, isLoggedIn: boolean, user: {fullName: string}}>} An object containing the user's tier information.\n */\nexport async function getUserTier() {\n    try {\n        const response = await fetch('/api/me');\n        const data = await response.json();\n\n        // The structure matches what api/me.js returns\n        //set a window variable with the user data to be used in other places of the frontend without needing to call the api again\n        let windowData = {\n            paidMember: data.paidMember,\n            tier: data.tier,\n            tierNumber: data.tierNumber,\n            whitelisted: !!data.whitelisted,\n            isLoggedIn: data.isLoggedIn,\n        };\n        window.__USER_DATA__ = windowData;\n        windowData.user = { fullName: data.user?.fullName || '' };\n        return windowData;\n    } catch (error) {\n        console.error(\"Failed to check auth status\", error);\n        return { paidMember: false, tier: 'Free', whitelisted: false, isLoggedIn: false };\n    }\n}\n\nasync function validateSession() {\n    try {\n        const res = await fetch(\"/api/check-cookie\");\n        const data = await res.json();\n\n        // Only force an OAuth refresh when an existing cookie is detected but invalid/legacy.\n        // Not having a cookie simply means \"not logged in\" and should not redirect.\n        if (data.valid === false && data.hasCookie === true) {\n            console.log(\"Old Patreon cookie → redirecting to login\");\n            window.location.href = \"/api/auth/patreon/login\";\n            return false;\n        }\n\n        return true;\n\n    } catch (err) {\n        console.error(\"Error checking Patreon session:\", err);\n        return false;\n    }\n}\n\n// Check for OAuth code\nconst urlParams = new URLSearchParams(window.location.search);\nconst code = urlParams.get('code');\n\nif (code) {\n    console.log(\"There is code\")\n    // Clear the code from URL to prevent re-submission on refresh\n    window.history.replaceState({}, document.title, window.location.pathname);\n\n    fetch(`/api/auth/patreon/verify?code=${code}`)\n        .then(res => res.json())\n        .then(data => {\n            if (data.success) {\n                new_update_notifications(`Welcome ${data.user.fullName}! Tier: ${data.tier}`, \"success\");\n\n                // Update UI\n                updatePatreonUI(data);\n                maybeReloadForNightlyAccess(data);\n            } else {\n                new_update_notifications(`Login failed: ${data.error}`, \"error\");\n                updatePatreonUI(data);\n            }\n        })\n        .catch(err => {\n            console.error('Patreon verification error:', err);\n            new_update_notifications(\"Error verifying Patreon status\", \"error\");\n        });\n} else {\n    validateSession().then(() => {\n        getUserTier().then(updatePatreonUI);\n    });\n}\n\nfunction maybeReloadForNightlyAccess(tierInfo) {\n    const isNightly = window.location.hostname.includes(\"nightly\");\n    if (!isNightly) return;\n\n    const insiderOrFounder = tierInfo?.tier === \"Insider\" || tierInfo?.tier === \"Founder\";\n    if (nightlyBlock && tierInfo?.isLoggedIn && insiderOrFounder) {\n        setTimeout(() => window.location.reload(), 50);\n    }\n}\n\nfunction updatePatreonUI(tier) {\n    hasPatreonThemeAccess = !!tier.paidMember;\n    init_colors_dict(selectedTheme)\n\n    console.log(\"Updating Patreon UI with tier:\", tier);\n\n    if (tier.paidMember) {\n        patreonUnlockables.classList.remove(\"d-none\");\n        patreonThemes.classList.remove(\"d-none\");\n        document.getElementById(\"patreonStatusText\").textContent = tier.tier\n        loadTheme();\n    }\n    else {\n        patreonUnlockables.classList.add(\"d-none\");\n        patreonThemes.classList.add(\"d-none\");\n        document.getElementById(\"patreonStatusText\").textContent = tier.isLoggedIn ? tier.tier : \"Not logged in\"\n        selectedTheme = \"default-theme\";\n        document.querySelector(\"body\").className = \"font default-theme\";\n        init_colors_dict(selectedTheme);\n        updateToolbarThemeLogo();\n        syncNightlyIndicator();\n    }\n    syncNightlyThemeVisibility();\n\n    const hasCreateNewsAccess = tier?.tierNumber === 3 || tier?.tier === \"Founder\" || !!tier?.whitelisted;\n    if (!hasCreateNewsAccess){\n        //remove the button from the DOM entirely\n        document.querySelector(\"#createCustomNews\")?.remove();\n    }\n\n    if (tier.isLoggedIn) {\n        document.querySelector(\".user-name-and-logout-tool\").classList.remove(\"d-none\");\n        document.getElementById(\"userToolName\").textContent = tier.user.fullName;\n        patreonToolLoginButton.classList.add(\"d-none\");\n    }\n    else {\n        document.querySelector(\".user-name-and-logout-tool\").classList.add(\"d-none\");\n        patreonToolLoginButton.classList.remove(\"d-none\");\n    }\n\n    manageNewsStatus(tier);\n\n    if (turningPointsFrequencyConfig) {\n        const insiderOrFounder = tier?.tier === \"Insider\" || tier?.tier === \"Founder\";\n        if (tier?.isLoggedIn && insiderOrFounder) {\n            turningPointsFrequencyConfig.classList.remove(\"d-none\");\n        } else {\n            turningPointsFrequencyConfig.classList.add(\"d-none\");\n        }\n    }\n}\n\n\n\n\nfunction editModeHandler() {\n    if (isDraftProfileSelected()) {\n        new_update_notifications(\"Draft creation is not implemented yet. For now, this button only generates editable random values.\", \"error\");\n        return;\n    }\n\n    let stats = \"\";\n    document.querySelectorAll(\".elegible\").forEach(function (elem) {\n        stats += elem.value + \" \";\n    });\n    stats = stats.slice(0, -1);\n\n    let id;\n    if (document.querySelector(\".clicked\").dataset.driverid) {\n        id = document.querySelector(\".clicked\").dataset.driverid;\n    }\n    let driverName = getName(document.querySelector(\".clicked .name-div-edit-stats\"));\n    driverName = make_name_prettier(driverName);\n    document.querySelector(\".clicked\").dataset.stats = stats;\n    let globalMentality = 2\n    let mentality = -1\n    if (document.querySelector(\".clicked\").dataset.mentality0) {\n        mentality = \"\"\n        document.querySelectorAll(\".mentality-level-indicator\").forEach(function (elem, index) {\n            mentality += elem.dataset.value + \" \"\n            document.querySelector(\".clicked\").dataset[\"mentality\" + index] = elem.dataset.value\n            globalMentality += parseInt(elem.dataset.value)\n        })\n        mentality = mentality.slice(0, -1)\n        globalMentality = Math.floor(globalMentality / 3)\n    }\n    document.querySelector(\".clicked\").dataset.globalMentality = globalMentality\n    let new_ovr = calculateOverall(stats, typeOverall);\n    document.querySelector(\".clicked\").childNodes[1].childNodes[0].textContent = new_ovr\n\n    let retirement = document.querySelector(\".actual-retirement\").textContent\n    let age = document.querySelector(\".actual-age\").textContent\n    document.querySelector(\".clicked\").dataset.retirement = retirement;\n    let ageGap = parseInt(document.querySelector(\".clicked\").dataset.age - age);\n    document.querySelector(\".clicked\").dataset.age = age;\n    let newName = document.querySelector(\"#driverStatsTitle textarea\")?.value ?? document.querySelector(\"#driverStatsTitle\").textContent;\n    if (newName === document.querySelector(\".clicked\").dataset.name) {\n        newName = \"-1\"\n    }\n    else {\n        update_name(id, newName)\n    }\n    let newCode = document.querySelector(\"#driverCode textarea\")?.value ?? document.querySelector(\"#driverCode\").textContent;\n    if (newCode === document.querySelector(\".clicked\").dataset.code) {\n        newCode = \"-1\"\n    }\n    else {\n        document.querySelector(\".clicked\").dataset.driverCode = newCode\n    }\n    let driverNum = document.querySelector(\".number-holder\").textContent;\n    let wants1, superLicense, isRetired;\n    document.querySelector(\".clicked\").dataset.number = driverNum;\n    if (document.querySelector(\"#driverNumber1\").checked) {\n        wants1 = 1;\n        document.querySelector(\".clicked\").dataset.numWC = 1;\n    }\n    else {\n        wants1 = 0;\n        document.querySelector(\".clicked\").dataset.numWC = 0;\n    }\n    if (document.querySelector(\"#retiredInput\").checked) {\n        isRetired = 1;\n        document.querySelector(\".clicked\").dataset.isRetired = 1;\n    }\n    else {\n        isRetired = 0;\n        document.querySelector(\".clicked\").dataset.isRetired = 0;\n    }\n    document.querySelector(\".clicked\").dataset.numWC = wants1;\n    if (document.getElementById(\"superLicense\").checked) {\n        superLicense = 1;\n        document.querySelector(\".clicked\").dataset.superLicense = 1;\n    }\n    else {\n        superLicense = 0;\n        document.querySelector(\".clicked\").dataset.superLicense = 0;\n    }\n    let marketability = document.getElementById(\"marketabilityInput\").value;\n    let dataStats = {\n        driverID: id,\n        driver: driverName,\n        statsArray: stats,\n        typeStaff: typeEdit,\n        retirement: retirement,\n        age: ageGap,\n        isRetired: isRetired,\n        driverNum: driverNum,\n        wants1: wants1,\n        mentality: mentality,\n        superLicense: superLicense,\n        marketability: marketability,\n        newName: newName,\n        newCode: newCode,\n    };\n\n\n    const command = new Command(\"editStats\", dataStats);\n    command.execute();\n}\n\nfunction calendarModeHandler() {\n    const raceArray = [];\n\n    document.querySelectorAll(\".race-calendar\").forEach((race) => {\n        let raceData = {\n            trackId: race.dataset.trackid.toString(),\n            rainPractice: race.dataset.rainP.toString(),\n            rainQuali: race.dataset.rainQ.toString(),\n            rainRace: race.dataset.rainR.toString(),\n            type: race.dataset.type.toString(),\n            state: race.dataset.state.toString(),\n            isF2Race: race.dataset.isf2 ? Number(race.dataset.isf2) : 0,\n            isF3Race: race.dataset.isf3 ? Number(race.dataset.isf3) : 0,\n        };\n        raceArray.push(raceData);\n    });\n\n    let dataCalendar = {\n        racesData: raceArray\n    };\n\n    const command = new Command(\"editCalendar\", dataCalendar);\n    command.execute();\n}\n\nfunction regulationsModeHandler() {\n    const data = gather_regulations_data();\n    if (!data) {\n        new_update_notifications(\"Regulations not loaded\", \"error\");\n        return;\n    }\n    const command = new Command(\"editRegulations\", data);\n    command.execute();\n}\n\nfunction teamsModeHandler() {\n\n    let seasonObjData = document.querySelector(\"#seasonObjectiveInput\").value;\n    let longTermData = longTermObj;\n    let longTermYearData = document.querySelector(\"#longTermInput\").value;\n    let teamBudgetData = document.querySelector(\"#teamBudgetInput\").value.replace(/[$,]/g, \"\");\n    let costCapTransactionData = originalCostCap - document.querySelector(\"#costCapInput\").value.replace(/[$,]/g, \"\");\n    let confidenceData = document.querySelector(\"#confidenceInput\").value;\n    let facilitiesData = gather_team_data()\n    let pitCrew = gather_pit_crew()\n    let engine = document.querySelector(\"#engineButton\").dataset.value\n    let data = {\n        teamID: teamCod,\n        facilities: facilitiesData,\n        seasonObj: seasonObjData,\n        longTermObj: longTermData,\n        longTermYear: longTermYearData,\n        teamBudget: teamBudgetData,\n        costCapEdit: costCapTransactionData,\n        confidence: confidenceData,\n        pitCrew: pitCrew,\n        engine: engine,\n        teamName: default_dict[teamCod],\n    }\n\n    const command = new Command(\"editTeam\", data);\n    command.execute();\n}\n\nfunction performanceModeHandler() {\n    let data;\n    if (teamsEngine === \"teams\") {\n        if (performanceDetailsMode === \"expertise\") {\n            data = {\n                teamID: teamSelected,\n                expertise: gather_team_expertise_data(),\n                teamName: document.querySelector(\".selected\").dataset.teamname\n            }\n            const command = new Command(\"editExpertise\", data);\n            command.execute();\n            return;\n        }\n        let parts = {};\n        let n_parts_designs = {};\n        let loadouts = {}\n        document.querySelectorAll(\".part-performance\").forEach(function (elem) {\n            let part = elem.dataset.part;\n            let partID = elem.dataset.partid;\n            let loadout1 = elem.dataset.loadout1;\n            let loadout2 = elem.dataset.loadout2;\n            let stats = {};\n            elem.querySelectorAll(\".part-performance-stat\").forEach(function (stat) {\n                if (stat.dataset.attribute !== \"-1\") {\n                    let statNum = stat.dataset.attribute;\n                    let value = stat.querySelector(\"input\").value.split(\" \")[0];\n                    stats[statNum] = value;\n                }\n            });\n            stats[\"designEditing\"] = elem.querySelector(\".part-subtitle\").dataset.editing\n            parts[part] = stats;\n            loadouts[partID] = [loadout1, loadout2]\n        })\n        document.querySelectorAll(\".one-part\").forEach(function (elem) {\n            let designID = elem.querySelector(\".one-part-name\").dataset.designId\n            let number = elem.querySelector(\".n-parts\").innerText.split(\"x\")[1]\n            n_parts_designs[designID] = number\n        })\n        data = {\n            teamID: teamSelected,\n            parts: parts,\n            n_parts_designs: n_parts_designs,\n            loadouts: loadouts,\n            teamName: document.querySelector(\".selected\").dataset.teamname\n        }\n\n        const command = new Command(\"editPerformance\", data);\n        command.execute();\n    }\n    else if (teamsEngine === \"engines\") {\n        const engineData = gather_engines_data()\n        const officialEngines = {}\n        for (let engineId in engineData) {\n            if (Number(engineId) <= 10) {\n                officialEngines[engineId] = engineData[engineId]\n            }\n        }\n\n        if (Object.keys(officialEngines).length) {\n            const command = new Command(\"editEngine\", { engines: officialEngines })\n            command.execute()\n        }\n\n        const customEnginesData = gather_custom_engines_data()\n        if (Object.keys(customEnginesData).length) {\n            const command = new Command(\"customEngines\", { enginesData: customEnginesData })\n            command.execute()\n        }\n    }\n\n}\n\nexport function first_show_animation() {\n    let button = document.querySelector(\".save-button\")\n    if (!firstShow) {\n        firstShow = true;\n        button.classList.add(\"first-show\")\n        setTimeout(function () {\n            button.classList.remove('first-show');\n        }, 3000);\n    }\n}\n\nlet saveButtonCustomHandler = null;\n\nexport function manageSaveButton(show, mode, customHandler) {\n    let button = document.querySelector(\".save-button\")\n    button.removeEventListener(\"click\", editModeHandler);\n    button.removeEventListener(\"click\", calendarModeHandler);\n    button.removeEventListener(\"click\", regulationsModeHandler);\n    button.removeEventListener(\"click\", teamsModeHandler);\n    button.removeEventListener(\"click\", performanceModeHandler);\n    if (saveButtonCustomHandler) {\n        button.removeEventListener(\"click\", saveButtonCustomHandler);\n        saveButtonCustomHandler = null;\n    }\n\n    if (!show) {\n        button.classList.add(\"d-none\")\n    }\n    else {\n        button.classList.remove(\"d-none\")\n        first_show_animation()\n    }\n    if (mode === \"stats\") {\n        button.addEventListener(\"click\", editModeHandler);\n    }\n    else if (mode === \"calendar\") {\n        button.addEventListener(\"click\", calendarModeHandler);\n    }\n    else if (mode === \"regulations\") {\n        button.addEventListener(\"click\", regulationsModeHandler);\n    }\n    else if (mode === \"teams\") {\n        button.addEventListener(\"click\", teamsModeHandler);\n    }\n    else if (mode === \"performance\") {\n        button.addEventListener(\"click\", performanceModeHandler);\n    }\n    else if (mode === \"custom\" && typeof customHandler === \"function\") {\n        saveButtonCustomHandler = customHandler;\n        button.addEventListener(\"click\", saveButtonCustomHandler);\n    }\n}\n\nexport async function updateFront(data) {\n    console.log(\"UPDATING FRONT\")\n    console.log(data)\n    let responseTyppe = data.responseMessage\n    let message = data.content\n    let handler = messageHandlers[responseTyppe];\n    if (handler) {\n        handler(message);\n    }\n    if (data.noti_msg !== undefined) {\n        new_update_notifications(data.noti_msg, \"success\");\n    }\n    if (data.isEditCommand !== undefined) {\n        checkOpenSlideUp()\n    }\n    if (data.unlocksDownload !== undefined) {\n        downloadSaveButton.classList.remove(\"hidden\")\n    }\n}\n\nexport function new_update_notifications(message, type = \"success\") {\n    notificationsQueue.push(message);\n    showNextNotification(type);\n}\n\nfunction showNextNotification(type) {\n    if (isShowingNotification || notificationsQueue.length === 0) {\n        return;\n    }\n\n    isShowingNotification = true;\n\n    const nextMessage = notificationsQueue.shift();\n\n    const footerNotification = document.querySelector('.footer-notification');\n    footerNotification.innerHTML = nextMessage;\n    if (type === \"error\") {\n        footerNotification.classList.add('error');\n    }\n    else {\n        footerNotification.classList.remove('error');\n    }\n\n    footerNotification.classList.add('show');\n\n    if (type !== \"error\") {\n        setTimeout(() => {\n            footerNotification.classList.remove('show');\n\n            isShowingNotification = false;\n            //wait another 250ms\n            setTimeout(() => {\n                showNextNotification();\n            }, 550);\n        }, 4000);\n    }\n\n}\n\nexport function make_name_prettier(text) {\n    const words = text.trim().split(/\\s+/);\n\n    if (words.length < 2) {\n        return \"\";\n    }\n\n    const lastWord = words.pop();\n\n    return lastWord.charAt(0).toUpperCase() + lastWord.slice(1).toLowerCase();  \n}\n\nfunction orderTeamTemplatesByStandings(standingsRows) {\n    const parent = document.querySelector(\".main-columns-drag-section.teams-columns\");\n    if (!parent) return;\n\n    const templates = Array.from(parent.querySelectorAll(\":scope > .team-template\"));\n    if (templates.length === 0) return;\n\n    const positionByTeamId = new Map();\n    if (Array.isArray(standingsRows)) {\n        standingsRows.forEach((row) => {\n            if (!Array.isArray(row) || row.length < 2) return;\n            const teamId = Number(row[0]);\n            const position = Number(row[1]);\n            if (position <= 0) return;\n            const prev = positionByTeamId.get(teamId);\n            if (prev === undefined || position < prev) {\n                positionByTeamId.set(teamId, position);\n            }\n        });\n    }\n\n    const decorated = templates.map((el, index) => {\n        const staffSection = el.querySelector(\".staff-section[data-teamid]\");\n        const teamId = staffSection ? Number(staffSection.dataset.teamid) : NaN;\n        const position = positionByTeamId.get(teamId);\n        return { el, index, teamId, position };\n    });\n\n    decorated.sort((a, b) => {\n        const aPos = a.position ?? 999;\n        const bPos = b.position ?? 999;\n        return aPos - bPos || a.index - b.index;\n    });\n\n    const frag = document.createDocumentFragment();\n    decorated.forEach(({ el }) => frag.appendChild(el));\n    parent.appendChild(frag);\n}\n\n\nconst messageHandlers = {\n    \"ERROR\": (message) => {\n        update_notifications(message[1], \"error\");\n    },\n    \"Save loaded succesfully\": (message) => {\n        isSaveSelected = 1;\n        viewerLoaded = false;\n        remove_drivers();\n        removeStatsDrivers();\n        listenersStaffGroups();\n        place_drivers(message);\n        sortList(\"free-drivers\");\n        place_drivers_editStats(message);\n    },\n    \"Drivers fetched\": (message) => {\n        remove_drivers();\n        removeStatsDrivers();\n        listenersStaffGroups();\n        place_drivers(message);\n        sortList(\"free-drivers\");\n        place_drivers_editStats(message);\n        initFreeDriversElems();\n        initStatsDrivers();\n    },\n    \"Staff fetched\": (message) => {\n        remove_drivers(true);\n        removeStatsDrivers(true);\n        place_staff(message);\n        sortList(\"free-staff\")\n        place_staff_editStats(message);\n        initFreeDriversElems();\n        initStatsDrivers();\n    },\n    \"Random staff draft fetched\": (message) => {\n        loadRandomStaffDraft(message);\n    },\n    \"Random draft forename fetched\": (message) => {\n        applyDraftForenameUpdate(message);\n    },\n    \"Draft country locale fetched\": (message) => {\n        applyDraftCountryLocale(message);\n    },\n    \"Calendar fetched\": (message) => {\n        load_calendar(message)\n    },\n    \"Regulations fetched\": (message) => {\n        load_regulations(message)\n    },\n    \"Engines fetched\": (message) => {\n        manage_engineStats(message[0]);\n        update_engine_allocations(message);\n    },\n    \"Contract fetched\": (message) => {\n        manage_modal(message);\n    },\n    \"Junior team drivers fetched\": (message) => {\n        loadJuniorTeamDrivers(message);\n    },\n    \"Year fetched\": (message) => {\n        latestSaveYear = Number(message);\n        generateYearsMenu(message);\n    },\n    \"Previous year teams standings fetched\": (message) => {\n        const standings = message?.standings || message;\n        orderTeamTemplatesByStandings(standings);\n    },\n    \"Numbers fetched\": (message) => {\n        loadNumbers(message);\n    },\n    \"H2H fetched\": (message) => {\n        sprintsListeners();\n        racePaceListener();\n        qualiPaceListener()\n        manage_h2h_bars(message);\n    },\n    \"DriversH2H fetched\": (message) => {\n        load_drivers_h2h(message);\n    },\n    \"H2HDriver fetched\": (message) => {\n        load_labels_initialize_graphs(message);\n    },\n    \"Results fetched\": (message) => {\n        new_drivers_table(message[0]);\n        new_load_drivers_table(message.slice(1));\n        new_teams_table(message[0]);\n        new_load_teams_table(message.slice(1));\n    },\n    \"TeamData fetched\": (message) => {\n        fillLevels(message)\n    },\n    \"Events to Predict Fetched\": (message) => {\n        placeRaces(message.slice(1))\n    },\n    \"Events to Predict Modal Fetched\": (message) => {\n        placeRacesInModal(message.slice(1))\n    },\n    \"Prediction Fetched\": (message) => {\n        predictDrivers(message.slice(1))\n    },\n    \"Montecarlo Fetched\": (message) => {\n        loadMontecarlo(message.slice(1))\n    },\n    \"Progress\": (message) => {\n        manageProgress(message.slice(1))\n    },\n    \"Config\": (message) => {\n        manage_config(message)\n        document.querySelector(\"#transferpill\").click();\n    },\n    \"24 Year\": (message) => {\n        manage_config(message, true)\n    },\n    \"Performance fetched\": (message) => {\n        load_performance(message[0])\n        load_attributes(message[1])\n        //wait 100 ms\n        setTimeout(function () {\n            order_by(\"overall\")\n        }, 100)\n\n    },\n    \"Season performance fetched\": (message) => {\n        load_performance_graph(message)\n    },\n    \"Parts stats fetched\": (message) => {\n        load_parts_stats(message[0])\n        load_parts_list(message[1])\n        update_max_design(message[2])\n        if (message[3]) {\n            load_team_expertise(message[3])\n        }\n    },\n    \"Game Year\": (message) => {\n        manage_game_year(message)\n    },\n    \"Part values fetched\": (message) => {\n        load_one_part(message)\n    },\n    \"Team expertise fetched\": (message) => {\n        load_team_expertise(message)\n    },\n    \"Cars fetched\": (message) => {\n        load_cars(message[0])\n        load_car_attributes(message[1])\n        order_by(\"overall\")\n    },\n    \"Custom Engines fetched\": (message) => {\n        load_custom_engines(message.slice(1))\n    },\n    \"Mod data fetched\": (message) => {\n      seasonModData = message || {};\n      updateEditsWithModData(message)\n      syncAduoTpToggles(message?.aduo_tp_enabled);\n      syncMods2025Dependencies();\n      syncMods2026Dependencies();\n      syncMods2026ApplyAllButtonState();\n      if (latestSaveYear) {\n        generateYearsMenu(latestSaveYear);\n      }\n    },\n    \"Mod compatibility\": (message) => {\n        updateMod2025Blocking(message)\n    },\n    \"Mod 2026 compatibility\": (message) => {\n        updateMod2026Blocking(message)\n        resetStaffIDChanges();\n    },\n    \"News fetched\": (message) => {\n        place_news(message, newsAvailable)\n        updateNewsYearsButton(message)\n        askFixDoublePointsBug(message)\n    },\n    \"News from season fetched\": (message) => {\n        place_news(message, newsAvailable)\n    },\n    \"Save selected finished\": async (message) => {\n        await migrateLegacyNewsOnce();\n        generateNews();\n    },\n    \"Record fetched\": (message) => {\n        loadRecordsList(message)\n    },\n    \"Team record fetched\": (message) => {\n        loadTeamRecordsList(message)\n    },\n    \"Double points bug fixed\": (message) => {\n        //TODO CLICK ON THE FIRST EYAR OF yearMenu\n    },\n    \"Season review data fetched\": (message) => {\n        populateSeasonReview(message)\n    },\n    \"Session results fetched\": (message) => {\n        onSessionResultsFetched(message);\n    }\n};\n\nfunction removeLegacyKeys(base) {\n    const lsNewsKey = `${base}_news`;\n    const lsTPKey = `${base}_tps`;\n    try {\n        console.log(\"[migrate] Deleting legacy localStorage keys:\", lsNewsKey, lsTPKey);\n        localStorage.removeItem(lsNewsKey);\n        localStorage.removeItem(lsTPKey);\n    } catch (e) {\n        console.warn(\"[migrate] Failed to remove legacy keys:\", e);\n    }\n}\n\nasync function migrateLegacyNewsOnce() {\n    const base = getSaveName().split('.')[0];\n    const lsFlagKey = `${base}_migration_v1_done`;\n    const lsNewsKey = `${base}_news`;\n    const lsTPKey = `${base}_tps`;\n\n    // 1) Si ya está migrado, BORRAR SIEMPRE y salir\n    if (localStorage.getItem(lsFlagKey) === \"1\") {\n        removeLegacyKeys(base);\n        return;\n    }\n\n    // 2) Leer posibles datos legacy\n    const lsNewsTxt = localStorage.getItem(lsNewsKey);\n    const lsTPTxt = localStorage.getItem(lsTPKey);\n\n    // 3) Si no hay nada que migrar, marca flag y BORRA igual por si quedaron restos\n    if (!lsNewsTxt && !lsTPTxt) {\n        localStorage.setItem(lsFlagKey, \"1\");\n        removeLegacyKeys(base);\n        return;\n    }\n\n    // 4) Hay algo que migrar → pide al worker\n    try {\n        const resp = await new Command(\"migrateFromLocalStorage\", {\n            base,\n            lsNewsTxt, // pueden ser null; el worker ya valida\n            lsTPTxt\n        }).promiseExecute();\n\n        // Considera como éxito \"Migration done\" o \"Already migrated\" por si reintentas\n        if (resp?.responseMessage === \"Migration done\" || resp?.responseMessage === \"Already migrated\") {\n            localStorage.setItem(lsFlagKey, \"1\");\n            removeLegacyKeys(base); // BORRA tras éxito\n        } else {\n            console.warn(\"[migrate] Unexpected response:\", resp);\n            // Si quieres ser agresivo igualmente:\n            localStorage.setItem(lsFlagKey, \"1\");\n            removeLegacyKeys(base);\n        }\n    } catch (e) {\n        console.error(\"[migrate] Migration error (front):\", e);\n        // No marcamos flag en error para poder reintentar después.\n        // Pero si quieres limpiar sí o sí, podrías optar por:\n        // removeLegacyKeys(base);\n    }\n}\n\n\nif (glowSpot && blockDiv) {\n    const defaultPosition = {\n        left: '50%',\n        top: '0',\n        transform: 'translateX(-50%)',\n    };\n\n    let restoreTimeout;\n\n    const isLandingVisible = () => !blockDiv.classList.contains('disappear');\n\n    const rootStyle = document.documentElement.style;\n    const setGlowVars = (x, y) => {\n        rootStyle.setProperty('--glow-x', x);\n        rootStyle.setProperty('--glow-y', y);\n    };\n\n    const syncGlowVarsToGlowSpotCenter = () => {\n        const rect = glowSpot.getBoundingClientRect();\n        setGlowVars(`${rect.left + rect.width / 2}px`, `${rect.top + rect.height / 2}px`);\n    };\n\n    const resetGlowSpotPosition = () => {\n        glowSpot.style.left = defaultPosition.left;\n        glowSpot.style.top = defaultPosition.top;\n        glowSpot.style.transform = defaultPosition.transform;\n        syncGlowVarsToGlowSpotCenter();\n    };\n\n    const updateGlowSpotPosition = (event) => {\n        if (!isLandingVisible()) {\n            return;\n        }\n\n        glowSpot.classList.remove('glow-spot--off');\n        const x = `${event.clientX}px`;\n        const y = `${event.clientY}px`;\n        glowSpot.style.left = x;\n        glowSpot.style.top = y;\n        glowSpot.style.transform = 'translate(-50%, -50%)';\n        setGlowVars(x, y);\n    };\n\n    const fadeToDefaultPosition = () => {\n        glowSpot.classList.add('glow-spot--off');\n\n        clearTimeout(restoreTimeout);\n        restoreTimeout = setTimeout(() => {\n            resetGlowSpotPosition();\n            glowSpot.classList.remove('glow-spot--off');\n        }, 200);\n    };\n\n    const observer = new MutationObserver(() => {\n        if (isLandingVisible()) {\n            glowSpot.classList.remove('glow-spot--off');\n        } else {\n            fadeToDefaultPosition();\n        }\n    });\n\n    observer.observe(blockDiv, { attributes: true, attributeFilter: ['class'] });\n\n    resetGlowSpotPosition();\n    window.addEventListener('mousemove', updateGlowSpotPosition);\n}\n\nexport async function generateNews() {\n    const patreonTier = await getUserTier();\n    checkGenerableNews(patreonTier);\n\n    // lanzar sin payload, el worker lee de DB\n    new Command(\"generateNews\", {}).execute();\n\n    // loader UI (igual que antes si quieres)\n    const newsView = document.getElementById(\"news\");\n    const loaderDiv = document.createElement('div');\n    loaderDiv.classList.add('loader-div', 'general-news-loader');\n\n    const loadingSpan = document.createElement('span');\n    loadingSpan.textContent = \"Updating news\";\n    const loadingDots = document.createElement('span');\n    loadingDots.textContent = \".\";\n    loadingDots.classList.add('loading-dots');\n    loadingSpan.textContent = \"Updating news\";\n    loadingSpan.appendChild(loadingDots);\n\n\n    setInterval(() => {\n        if (loadingDots.textContent.length >= 3) loadingDots.textContent = \".\";\n        else loadingDots.textContent += \".\";\n    }, 500);\n\n    const progressBar = document.createElement('div');\n    progressBar.classList.add('ai-progress-bar');\n    const progressDiv = document.createElement('div');\n    progressDiv.classList.add('progress-div', 'general-news-progress-div');\n\n    loaderDiv.appendChild(loadingSpan);\n    progressBar.appendChild(progressDiv);\n    loaderDiv.appendChild(progressBar);\n\n    startGeneralNewsProgress(progressDiv);\n    newsView.appendChild(loaderDiv);\n}\n\n\nexport function startGeneralNewsProgress(progressDiv) {\n    let width = 0;\n    const id = setInterval(() => {\n        if (!progressDiv?.isConnected) { clearInterval(id); return; }\n\n        if (width >= 100) {\n            clearInterval(id);\n            return;\n        }\n        width++;\n        progressDiv.style.width = width + '%';\n    }, 150);\n\n    progressDiv._progressIntervalId = id;\n}\n\nfunction update_engine_allocations(message) {\n    let engine_map = {}\n    message[1].forEach(function (team) {\n        engine_map[team[0]] = team[1]\n    })\n    setEngineAllocations(engine_map)\n    window.__ENGINE_ALLOCATIONS__ = engine_map\n\n    for (let key in engine_names) {\n        if (key > 10) {\n            deleteEngineName(key)\n        }\n    }\n\n    message[0].forEach(function (engine) {\n        const engineId = Number(engine?.[0]);\n        if (engineId > 10 || engineId === 10) {\n            addEngineName(engineId, engine[2])\n        }\n    })\n    window.__ENGINE_NAMES__ = { ...engine_names }\n\n    reloadTables()\n}\n\n\nfunction resizeWindowToHeight(mode) {\n    if (mode === \"11teams\") {\n        document.querySelectorAll(\".main-resizable\").forEach(function (elem) {\n            elem.style.height = \"720.5px\"\n            if (elem.id === \"enginesPerformance\") {\n                elem.style.maxHeight = \"720px\"\n            }\n        })\n        document.querySelectorAll(\".staff-list\").forEach(function (elem) {\n            elem.style.height = \"672px\"\n        })\n        document.querySelectorAll(\".parts-list\").forEach(function (elem) {\n            elem.classList.remove(\"noCustom\")\n        })\n        document.getElementById(\"free-drivers\").style.height = \"672px\"\n        document.getElementById(\"free-staff\").style.height = \"672px\"\n    }\n    else if (mode === \"10teams\") {\n        document.querySelectorAll(\".main-resizable\").forEach(function (elem) {\n            elem.style.height = \"660px\"\n            if (elem.id === \"enginesPerformance\") {\n                elem.style.maxHeight = \"660px\"\n            }\n        })\n        document.querySelectorAll(\".parts-list\").forEach(function (elem) {\n            elem.classList.add(\"noCustom\")\n        })\n        document.querySelectorAll(\".staff-list\").forEach(function (elem) {\n            elem.style.height = \"612px\"\n        })\n        document.getElementById(\"free-drivers\").style.height = \"612px\"\n        document.getElementById(\"free-staff\").style.height = \"612px\"\n    }\n}\n\nfunction manage_game_year(info) {\n    let year = info[0]\n    if (year === \"24\") {\n        document.getElementById(\"year23\").classList.remove(\"activated\")\n        document.getElementById(\"year24\").classList.add(\"activated\")\n        document.getElementById(\"drs24\").classList.remove(\"d-none\")\n        document.getElementById(\"drs24\").dataset.attribute = \"3\"\n        game_version = 2024\n        setMaxRaces(24)\n        manage_custom_team(info)\n        document.querySelectorAll(\".brake-cooling-replace\").forEach(function (elem) {\n            elem.textContent = \"Tyre preservation\"\n        })\n        document.querySelectorAll(\".engine24\").forEach(function (elem) {\n            elem.classList.add(\"d-none\")\n        })\n        document.querySelector(\".only-mentality\").classList.remove(\"d-none\")\n\n    }\n    else if (year === \"23\") {\n        resizeWindowToHeight(\"10teams\")\n        document.getElementById(\"year24\").classList.remove(\"activated\")\n        document.getElementById(\"year23\").classList.add(\"activated\")\n        document.getElementById(\"drs24\").classList.add(\"d-none\")\n        document.getElementById(\"drs24\").dataset.attribute = \"-1\"\n        if (32 in combined_dict) {\n            delete combined_dict[32]\n        }\n        game_version = 2023\n        setMidGrid(10)\n        setMaxRaces(23)\n        setRelativeGrid(5)\n        manage_custom_team([null, null])\n        document.querySelectorAll(\".brake-cooling-replace\").forEach(function (elem) {\n            elem.textContent = \"Brake cooling\"\n        })\n        document.querySelectorAll(\".engine24\").forEach(function (elem) {\n            elem.classList.remove(\"d-none\")\n        })\n        document.querySelector(\".only-mentality\").classList.add(\"d-none\")\n    }\n    replace_modal_teams(game_version)\n}\n\nfunction manage_custom_team(nameColor) {\n    if (nameColor[1] !== null) {\n        resizeWindowToHeight(\"11teams\")\n        custom_team = true\n        combined_dict[32] = nameColor[1]\n        abreviations_dict[32] = nameColor[1].slice(0, 3).toUpperCase()\n        document.querySelectorAll(\".ct-teamname\").forEach(function (elem) {\n            elem.dataset.teamshow = nameColor[1]\n        })\n        const command = new Command(\"updateCombinedDict\", { teamID: 32, newName: nameColor[1] });\n        command.execute();\n\n        document.querySelector(\".lineup-team--cadillac\").classList.remove(\"d-none\")\n\n        document.getElementById(\"customTeamTransfers\").classList.remove(\"d-none\")\n        document.getElementById(\"customTeamPerformance\").classList.remove(\"d-none\")\n        document.getElementById(\"customTeamDropdown\").classList.remove(\"d-none\")\n        document.getElementById(\"customTeamComparison\").classList.remove(\"d-none\")\n        document.getElementById(\"customTeamContract\").classList.remove(\"d-none\")\n        document.getElementById(\"customizeTeam\").classList.remove(\"d-none\")\n        document.querySelectorAll(\".ct-replace\").forEach(function (elem) {\n            elem.textContent = nameColor[1].toUpperCase()\n        })\n        document.querySelectorAll(\".custom-car-performance\").forEach(function (elem) {\n            elem.classList.remove(\"d-none\")\n        })\n        replace_custom_team_color(nameColor[2], nameColor[3])\n        setMidGrid(11)\n        setRelativeGrid(4.54)\n    }\n    else {\n        resizeWindowToHeight(\"10teams\")\n        custom_team = false\n        document.querySelector(\".lineup-team--cadillac\").classList.add(\"d-none\")\n        document.getElementById(\"customTeamTransfers\").classList.add(\"d-none\")\n        document.getElementById(\"customTeamPerformance\").classList.add(\"d-none\")\n        document.getElementById(\"customTeamDropdown\").classList.add(\"d-none\")\n        document.getElementById(\"customTeamComparison\").classList.add(\"d-none\")\n        document.getElementById(\"customTeamContract\").classList.add(\"d-none\")\n        document.getElementById(\"customizeTeam\").classList.add(\"d-none\")\n        document.querySelectorAll(\".custom-car-performance\").forEach(function (elem) {\n            elem.classList.add(\"d-none\")\n        })\n        setMidGrid(10)\n        setRelativeGrid(5)\n        if (32 in combined_dict) {\n            delete combined_dict[32]\n        }\n    }\n}\n\nfunction replace_custom_team_color(primary, secondary) {\n    let root = document.documentElement;\n    root.style.setProperty('--custom-team-primary', primary);\n    root.style.setProperty('--custom-team-secondary', secondary);\n    root.style.setProperty('--custom-team-primary-transparent', primary + \"30\");\n    root.style.setProperty('--custom-team-secondary-transparent', secondary + \"30\");\n    edit_colors_dict(\"320\", primary)\n    edit_colors_dict(\"321\", secondary)\n    document.getElementById(\"primarySelector\").value = primary\n    document.getElementById(\"secondarySelector\").value = secondary\n    document.getElementById(\"primaryReader\").value = primary.toUpperCase()\n    document.getElementById(\"secondaryReader\").value = secondary.toUpperCase()\n}\n\n\nselectImageButton.addEventListener('click', () => {\n    fileInput.click();\n});\n\n\n\n// Función para manejar la selección de archivo\nfileInput.addEventListener('change', (event) => {\n    let file = event.target.files[0];\n    const reader = new FileReader();\n    reader.onload = function () {\n        tempImageData = reader.result;\n\n        document.querySelector(\".logo-preview\").src = reader.result;\n    };\n    reader.readAsDataURL(file);\n});\n\nexport function replace_custom_team_logo(path) {\n    //if not image selected, return\n    if (!path) {\n        return;\n    }\n    // Si el string base64 no tiene el prefijo, se lo agregamos.\n    if (!path.startsWith(\"data:image/\")) {\n        // Ajusta el tipo de imagen (\"png\", \"jpeg\", etc.) según corresponda.\n        path = \"data:image/png;base64,\" + path;\n    }\n\n    logos_disc[32] = path;\n    document.querySelectorAll(\".custom-replace\").forEach(function (elem) {\n        elem.src = path;\n    });\n    document.querySelector(\".logo-preview\").src = path;\n}\n\n\n\ndocument.querySelector(\".gear-container\").addEventListener(\"click\", function () {\n    let configDetailModal = new bootstrap.Modal(document.getElementById('configDetailModal'), {\n        keyboard: false\n    })\n    configDetailModal.show()\n})\n\nfunction manage_config(info, year_config = false) {\n    document.querySelector(\".bi-gear-fill#settingsIcon\").classList.remove(\"hidden\")\n    configCopy = info\n    manage_config_content(info, year_config)\n}\n\nfunction replace_all_teams(info) {\n    let teams = info[\"teams\"]\n    const alphatauri = teams[\"alphatauri\"]\n    const alpine = teams[\"alpine\"]\n    const alfa = teams[\"alfa\"]\n    const redbull = teams[\"redbull\"] || \"redbull\"\n    const aston = teams[\"aston\"] || \"aston\"\n    const williams = teams[\"williams\"] || \"williams\"\n    const haas = teams[\"haas\"] || \"haas\"\n\n    alphaTauriReplace(alphatauri)\n    alpineReplace(alpine)\n    williamsReplace(williams)\n    haasReplace(haas)\n    alfaReplace(alfa)\n    redbullReplace(redbull)\n    astonReplace(aston)\n    update_logo(\"alpine\", logos_configs[alpine], alpine)\n    update_logo(\"williams\", logos_configs[williams], williams)\n    update_logo(\"haas\", logos_configs[haas], haas)\n    update_logo(\"alfa\", logos_configs[alfa], alfa)\n    update_logo(\"alphatauri\", logos_configs[alphatauri], alphatauri)\n    update_logo(\"redbull\", logos_configs[redbull], redbull)\n    update_logo(\"aston\", logos_configs[aston], aston)\n\n    // Notify other screens (e.g. transfers lineups circle) that team names/logos changed.\n    document.dispatchEvent(new CustomEvent(\"teamsReplaced\", { detail: { teams } }));\n}\n\nfunction manage_config_content(info, year_config = false) {\n    if (info[\"renaultEngine\"] === \"honda\") {\n        setRenaultEnginePresentation(\"honda\");\n    }\n    else {\n        setRenaultEnginePresentation(\"renault\");\n    }\n    replace_all_teams(info)\n    if (!year_config) {\n        let image = localStorage.getItem(`${saveName}_image`);\n        if (image) {\n            replace_custom_team_logo(image);\n        }\n        if (info[\"primaryColor\"]) {\n            replace_custom_team_color(info[\"primaryColor\"], info[\"secondaryColor\"])\n        }\n        if (info[\"frozenMentality\"] === 1) {\n            document.getElementById(\"freezeMentalityToggle\").checked = true\n        }\n        else {\n            document.getElementById(\"freezeMentalityToggle\").checked = false\n        }\n        if (info[\"refurbish\"] === 1) {\n            document.getElementById(\"refurbishingToggle\").checked = true\n        }\n        else {\n            document.getElementById(\"refurbishingToggle\").checked = false\n        }\n        if (info[\"freezeDevelopment\"] === 1) {\n            document.getElementById(\"freezeDevelopmentToggle\").checked = true\n        }\n        else {\n            document.getElementById(\"freezeDevelopmentToggle\").checked = false\n        }\n\n        document.querySelector(`.team-logo-container[data-teamid=\"${info[\"playerTeam\"]}\"]`).classList.add(\"active\")\n        update_difficulty_info(info[\"triggerList\"])\n        update_mentality_span(info[\"frozenMentality\"])\n        update_refurbish_span(info[\"refurbish\"])\n        update_development_span(info[\"freezeDevelopment\"])\n        if (forceEditorMinimapColorsToggle) {\n            forceEditorMinimapColorsToggle.checked = parseInt(info[\"forceEditorMinimapColors\"] || 0, 10) === 1;\n        }\n\n        if (turningPointsFrequencySlider) {\n            let presetIndex = info?.turningPointsFrequencyPreset;\n            if (presetIndex === undefined || presetIndex === null) {\n                presetIndex = defaultTurningPointsFrequencyPreset;\n            }\n            turningPointsFrequencySlider.value = String(presetIndex);\n            updateTurningPointsFrequencyUI();\n        }\n    }\n}\n\nexport function setRenaultEnginePresentation(engineMode) {\n    const engineMenuItem = document.querySelector(\".renault-engine-menu-item\");\n    const engineTitleText = document.querySelector(\".renault-engine-title-text\");\n    const renaultLogo = document.querySelector(\".renault-engine-logo\");\n\n    if (engineMode === \"honda\") {\n        if (engineMenuItem) {\n            engineMenuItem.textContent = \"Honda\";\n        }\n        if (engineTitleText) {\n            engineTitleText.textContent = \"HONDA\";\n        }\n        if (renaultLogo) {\n            renaultLogo.src = \"../assets/images/logos/honda.png\";\n            renaultLogo.alt = \"Honda logo\";\n        }\n    }\n    else {\n        if (engineMenuItem) {\n            engineMenuItem.textContent = \"Renault\";\n        }\n        if (engineTitleText) {\n            engineTitleText.textContent = \"RENAULT\";\n        }\n        if (renaultLogo) {\n            renaultLogo.src = \"../assets/images/logos/renault.png\";\n            renaultLogo.alt = \"Renault logo\";\n        }\n    }\n\n    const renaultEngineTitle = document.querySelector(\".renault-engine-title\");\n    if (renaultEngineTitle) {\n        renaultEngineTitle.classList.remove(\"engine-re\", \"engine-ho\");\n        renaultEngineTitle.classList.add(engineMode === \"honda\" ? \"engine-ho\" : \"engine-re\");\n    }\n\n    if (renaultLogo) {\n        renaultLogo.style.display = \"inline-block\";\n    }\n\n}\n\nexport function updateJenzerToDams(mode = \"dams\") {\n    if (mode === \"dams\") {\n        logos_disc[30] = '../assets/images/logos/dams.png'\n        combined_dict[30] = \"DAMS (F3)\"\n    }\n    else if (mode === \"jenzer\") {\n        logos_disc[30] = '../assets/images/logos/jenzer.png'\n        combined_dict[30] = \"Jenzer Motorsport (F3)\"\n    }\n}\n\ndocument.querySelectorAll(\".color-picker\").forEach(function (elem) {\n    let reader = elem.parentNode.querySelector(\".color-reader\")\n    elem.addEventListener(\"input\", function () {\n        reader.value = elem.value.toUpperCase()\n    })\n    reader.value = elem.value.toUpperCase();\n})\n\ndocument.querySelectorAll(\".color-reader\").forEach(function (elem) {\n    elem.addEventListener(\"input\", function () {\n        let picker = elem.parentNode.querySelector(\".color-picker\")\n        picker.value = elem.value.toLowerCase()\n    })\n})\n\nfunction update_difficulty_info(triggerList) {\n    console.log(\"TRIGGER LIST\", triggerList)\n    //iterate through the objetc\n    for (let key in triggerList) {\n        let value = triggerList[key];\n        let nameSpan = document.getElementById(key)\n        if (!nameSpan) continue;\n        let status = nameSpan.parentNode.querySelector(\".dif-status\")\n        let options;\n        if (key === \"lightDif\"){\n            options = weightDifConfig\n        }\n        else{\n            options = defaultDifficultiesConfig\n        }\n        if (value < 0) {\n            value = 0;\n        }\n        status.dataset.value = value;\n        console.log(\"UPDATING DIFFICULTY\", key, value, options[value])\n        status.textContent = options[value].text;\n        status.className = `dif-status ${options[value].className}`;\n    }\n}\n\n\nfunction change_css_variables(oldVar, newVar) {\n    let root = document.documentElement;\n    let newVal = getComputedStyle(root).getPropertyValue(newVar).trim();\n    root.style.setProperty(oldVar, newVal);\n}\n\nconst { alphaTauriReplace, alpineReplace, williamsReplace, haasReplace, alfaReplace, redbullReplace, astonReplace } = createTeamReplacers({\n    combined_dict,\n    abreviations_dict,\n    edit_colors_dict,\n    change_css_variables\n});\n\nfunction replace_modal_teams(version) {\n    if (version === 2024) {\n        document.getElementById(\"alphaModalLogo\").src = logos_configs[\"visarb\"]\n        document.getElementById(\"alphaModalLogo\").className = \"visarblogo non-changable\"\n        document.getElementById(\"alphaModalName\").textContent = pretty_names[\"visarb\"]\n        document.getElementById(\"alfaModalLogo\").src = logos_configs[\"stake\"]\n        document.getElementById(\"alfaModalName\").textContent = pretty_names[\"stake\"]\n    }\n    else if (version === 2023) {\n        document.getElementById(\"alphaModalLogo\").src = logos_configs[\"alphatauri\"]\n        document.getElementById(\"alphaModalLogo\").className = \"alphataurilogo non-changable\"\n        document.getElementById(\"alphaModalName\").textContent = pretty_names[\"alphatauri\"]\n        document.getElementById(\"alfaModalLogo\").src = logos_configs[\"alfa\"]\n        document.getElementById(\"alfaModalName\").textContent = pretty_names[\"alfa\"]\n    }\n}\n\n//select all team-change-button\ndocument.querySelectorAll(\".team-change-button\").forEach(function (elem) {\n    elem.querySelectorAll(\"a\").forEach(function (a) {\n        a.addEventListener(\"click\", function () {\n            elem.querySelector(\"button span\").textContent = a.textContent\n            elem.querySelector(\"button\").dataset.value = a.dataset.value\n        })\n    })\n})\n\nexport function applyConfigFromEditorUI(overrides = {}) {\n    let alphatauri = document.querySelector(\"#alphaTauriReplaceButton\").querySelector(\"button\").dataset.value\n    let alpine = document.querySelector(\"#alpineReplaceButton\").querySelector(\"button\").dataset.value\n    let williams = document.querySelector(\"#williamsReplaceButton\").querySelector(\"button\").dataset.value\n    let haas = document.querySelector(\"#haasReplaceButton\").querySelector(\"button\").dataset.value\n    let alfa = document.querySelector(\"#alfaReplaceButton\").querySelector(\"button\").dataset.value\n    let redbull = document.querySelector(\"#redbullReplaceButton\").querySelector(\"button\").dataset.value\n    let aston = document.querySelector(\"#astonReplaceButton\").querySelector(\"button\").dataset.value\n\n    if (overrides && typeof overrides === \"object\") {\n        if (typeof overrides.alphatauri === \"string\") alphatauri = overrides.alphatauri;\n        if (typeof overrides.alpine === \"string\") alpine = overrides.alpine;\n        if (typeof overrides.williams === \"string\") williams = overrides.williams;\n        if (typeof overrides.haas === \"string\") haas = overrides.haas;\n        if (typeof overrides.alfa === \"string\") alfa = overrides.alfa;\n        if (typeof overrides.redbull === \"string\") redbull = overrides.redbull;\n        if (typeof overrides.aston === \"string\") aston = overrides.aston;\n    }\n\n    let mentalityFrozen = 0;\n    if (document.getElementById(\"freezeMentalityToggle\").checked) {\n        mentalityFrozen = 1;\n    }\n    let refurbish = 0;\n    if (document.getElementById(\"refurbishingToggle\").checked) {\n        refurbish = 1;\n    }\n    let freezeDevelopment = 0;\n    if (document.getElementById(\"freezeDevelopmentToggle\").checked) {\n        freezeDevelopment = 1;\n    }\n    let forceEditorMinimapColors = 0;\n    if (forceEditorMinimapColorsToggle && forceEditorMinimapColorsToggle.checked) {\n        forceEditorMinimapColors = 1;\n    }\n    let difficulty = 0;\n    let disabledList = {}\n    let triggerList = {}\n    let playerTeam = managingTeamChanged ? document.querySelector(\".team-logo-container.active\").dataset.teamid : -1\n    document.querySelectorAll(\".dif-status\").forEach(function (elem) {\n        let id = elem.parentNode.querySelector(\".dif-name\").id\n        triggerList[id] = elem.dataset.value\n    })\n    let data = {\n        alphatauri: alphatauri,\n        alpine: alpine,\n        williams: williams,\n        haas: haas,\n        alfa: alfa,\n        redbull: redbull,\n        aston: aston,\n        frozenMentality: mentalityFrozen,\n        refurbish: refurbish,\n        freezeDevelopment: freezeDevelopment,\n        forceEditorMinimapColors: forceEditorMinimapColors,\n        disabled: disabledList,\n        triggerList: triggerList,\n        playerTeam: playerTeam\n    }\n\n    const tpPresetIndex = parseInt(turningPointsFrequencySlider.value, 10);\n    data.turningPointsFrequencyPreset = tpPresetIndex;\n\n    changeTheme()\n    if (custom_team) {\n        data[\"primaryColor\"] = document.getElementById(\"primarySelector\").value\n        data[\"secondaryColor\"] = document.getElementById(\"secondarySelector\").value\n        replace_custom_team_color(data[\"primaryColor\"], data[\"secondaryColor\"])\n    }\n    reload_performance_graph()\n    reload_h2h_graphs()\n\n    if (isSaveSelected === 1) {\n        const command = new Command(\"configUpdate\", data);\n        command.execute();\n        let info = { teams: { alphatauri: alphatauri, alpine: alpine, williams: williams, haas: haas, alfa: alfa, redbull: redbull, aston: aston } }\n        replace_all_teams(info)\n        reloadTables()\n        reload_performance_graph()\n        reload_h2h_graphs()\n        if (tempImageData) {\n            localStorage.setItem(`${saveName}_image`, tempImageData);\n        }\n\n        replace_custom_team_logo(document.querySelector(\".logo-preview\").src)\n\n        if (!configCopy || typeof configCopy !== \"object\") {\n            configCopy = {};\n        }\n        if (!configCopy.teams || typeof configCopy.teams !== \"object\") {\n            configCopy.teams = {};\n        }\n        configCopy.teams.alphatauri = alphatauri;\n        configCopy.teams.alpine = alpine;\n        configCopy.teams.williams = williams;\n        configCopy.teams.haas = haas;\n        configCopy.teams.alfa = alfa;\n        configCopy.teams.redbull = redbull;\n        configCopy.teams.aston = aston;\n        configCopy.frozenMentality = mentalityFrozen;\n        configCopy.refurbish = refurbish;\n        configCopy.freezeDevelopment = freezeDevelopment;\n        configCopy.forceEditorMinimapColors = forceEditorMinimapColors;\n        configCopy.triggerList = triggerList;\n        configCopy.turningPointsFrequencyPreset = tpPresetIndex;\n        if (data.primaryColor) {\n            configCopy.primaryColor = data.primaryColor;\n            configCopy.secondaryColor = data.secondaryColor;\n        }\n        if (playerTeam !== -1) {\n            configCopy.playerTeam = Number(playerTeam);\n        }\n    }\n}\n\ndocument.querySelector(\"#configDetailsButton\").addEventListener(\"click\", function () {\n    applyConfigFromEditorUI();\n})\n\nasync function askFixDoublePointsBug(message){\n    const bugInfo = message.doublePointsBug;\n    if (!bugInfo.result) return;\n    if (localStorage.getItem(`${saveName}_doublePointsBugIgnored_${bugInfo.raceId}`) === 'true') {\n        return;\n    }\n    const ok = await confirmModal({\n        title: 'Fix Double Points Bug',\n        body: 'The current save has a known issue with double points being awarded in certain races where a double DSQ Turning point happened. Do you want to fix this issue now?',\n        confirmText: 'Yes, fix it',\n        cancelText: 'No, ignore',\n    })\n    if (ok) {\n        const command = new Command(\"fixDoublePointsBug\", { raceId: bugInfo.raceId });\n        command.execute();\n    }\n    else{\n        //save in lcoalstorage a flag that he didn't want to fix the bug with raceid bugInfo.raceId\n        localStorage.setItem(`${saveName}_doublePointsBugIgnored_${bugInfo.raceId}`, 'true');\n    }\n}\n\nlet isDownloadingSave = false;\nlet downloadSaveProgressStartedAt = 0;\nlet downloadSaveProgressValue = 0;\nlet downloadSaveProgressIntervalId = null;\nlet downloadSaveProgressTimeoutId = null;\nlet downloadSaveWorkerHandler = null;\n\nfunction setDownloadSaveProgress(percent) {\n    if (!downloadSaveProgressFill) return;\n    const clamped = Math.max(0, Math.min(100, percent));\n    downloadSaveProgressFill.style.width = `${clamped}%`;\n}\n\nfunction clearDownloadSaveWorkerHandler() {\n    if (!downloadSaveWorkerHandler) return;\n    dbWorker.removeEventListener(\"message\", downloadSaveWorkerHandler);\n    downloadSaveWorkerHandler = null;\n}\n\nfunction clearDownloadSaveProgressTimers() {\n    if (downloadSaveProgressIntervalId !== null) {\n        window.clearInterval(downloadSaveProgressIntervalId);\n        downloadSaveProgressIntervalId = null;\n    }\n    if (downloadSaveProgressTimeoutId !== null) {\n        window.clearTimeout(downloadSaveProgressTimeoutId);\n        downloadSaveProgressTimeoutId = null;\n    }\n}\n\nfunction resetDownloadSaveProgress() {\n    clearDownloadSaveProgressTimers();\n    clearDownloadSaveWorkerHandler();\n    isDownloadingSave = false;\n    downloadSaveProgressValue = 0;\n    setDownloadSaveProgress(0);\n    if (downloadSaveProgress) downloadSaveProgress.classList.add(\"hidden\");\n}\n\nfunction startDownloadSaveProgressSimulation() {\n    if (!downloadSaveProgress || !downloadSaveProgressFill) return;\n\n    clearDownloadSaveProgressTimers();\n\n    isDownloadingSave = true;\n    downloadSaveProgressStartedAt = performance.now();\n    downloadSaveProgressValue = 0;\n\n    setDownloadSaveProgress(0);\n    downloadSaveProgress.classList.remove(\"hidden\");\n\n    downloadSaveProgressIntervalId = window.setInterval(() => {\n        if (!isDownloadingSave) return;\n\n        const elapsed = performance.now() - downloadSaveProgressStartedAt;\n        const fastPhase = Math.min(elapsed / 500, 1) * 45; // 0 -> 45 quickly\n        const slowPhase = Math.min(Math.max(elapsed - 500, 0) / 4500, 1) * 50; // 45 -> 95 slower\n        const target = Math.min(95, fastPhase + slowPhase);\n\n        if (target > downloadSaveProgressValue) {\n            downloadSaveProgressValue = target;\n            setDownloadSaveProgress(downloadSaveProgressValue);\n        }\n    }, 100);\n\n    downloadSaveProgressTimeoutId = window.setTimeout(() => {\n        if (!isDownloadingSave) return;\n        resetDownloadSaveProgress();\n        new_update_notifications(\"Save export timed out.\", \"error\");\n    }, 20000);\n}\n\nfunction finishDownloadSaveProgress() {\n    if (!downloadSaveProgress || !downloadSaveProgressFill) return;\n\n    const elapsed = performance.now() - downloadSaveProgressStartedAt;\n    const minVisibleMs = 700;\n    const hideDelayMs = Math.max(250, minVisibleMs - elapsed);\n\n    clearDownloadSaveProgressTimers();\n    clearDownloadSaveWorkerHandler();\n    isDownloadingSave = false;\n\n    setDownloadSaveProgress(100);\n    window.setTimeout(() => resetDownloadSaveProgress(), hideDelayMs);\n}\n\nconst panicDownloadButton = document.getElementById(\"panicDownloadButton\");\nconst downloadSaveIcon = document.querySelector(\".bi-file-earmark-arrow-down\");\n\nfunction downloadExportedSave(command) {\n    if (isDownloadingSave) return;\n\n    startDownloadSaveProgressSimulation();\n\n    downloadSaveWorkerHandler = (msg) => {\n        if (!isDownloadingSave) return;\n\n        const response = msg?.data;\n        if (!response) return;\n\n        if (response.error) {\n            console.error(\"Error exporting save:\", response.error);\n            resetDownloadSaveProgress();\n            new_update_notifications(\"Error exporting save.\", \"error\");\n            return;\n        }\n\n        if (response.responseMessage !== \"Database exported\") return;\n\n        try {\n            const finalData = response?.content?.finalData;\n            const metadata = response?.content?.metadata;\n            const filename = metadata?.filename || saveName || \"save.sav\";\n\n            if (finalData == null) {\n                throw new Error(\"Missing exported data\");\n            }\n\n            saveAs(new Blob([finalData], { type: \"application/binary\" }), filename);\n            finishDownloadSaveProgress();\n        } catch (e) {\n            console.error(\"Failed to download exported save:\", e);\n            resetDownloadSaveProgress();\n            new_update_notifications(\"Error exporting save.\", \"error\");\n        }\n    };\n\n    dbWorker.addEventListener(\"message\", downloadSaveWorkerHandler);\n    dbWorker.postMessage({ command, data: {} });\n}\n\nif (downloadSaveIcon) {\n    downloadSaveIcon.addEventListener(\"click\", function () {\n        downloadExportedSave(\"exportSave\");\n    })\n}\n\nif (panicDownloadButton) {\n    panicDownloadButton.addEventListener(\"click\", function () {\n        downloadExportedSave(\"panicDownload\");\n    })\n}\n\n\n\n/**\n * checks if a save and a script have been selected to unlock the tool\n */\nfunction check_selected() {\n    if (isSaveSelected == 1 && scriptSelected == 1 && divBlocking == 1) {\n        document.getElementById(\"blockDiv\").classList.add(\"disappear\")\n        divBlocking = 0;\n    }\n\n}\n\nh2hPill.addEventListener(\"click\", function () {\n\n    manageScripts(\"hide\", \"show\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\")\n    scriptSelected = 1\n    check_selected()\n    manageSaveButton(false)\n})\n\nviewPill.addEventListener(\"click\", function () {\n    if (!viewerLoaded) {\n        viewerLoaded = true\n        document.getElementById(\"reviewpill\").click();\n    }\n    manageScripts(\"hide\", \"hide\", \"show\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\")\n    scriptSelected = 1\n    check_selected()\n    manageSaveButton(false)\n})\n\ndriverTransferPill.addEventListener(\"click\", function () {\n    manageScripts(\"hide\", \"hide\", \"hide\", \"show\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\")\n    scriptSelected = 1\n    check_selected()\n    manageSaveButton(false)\n})\n\neditStatsPill.addEventListener(\"click\", function () {\n    manageScripts(\"hide\", \"hide\", \"hide\", \"hide\", \"show\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\")\n    scriptSelected = 1\n    check_selected()\n    manageSaveButton(true, \"stats\")\n})\n\nconstructorsPill.addEventListener(\"click\", function () {\n    manageScripts(\"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"show\", \"hide\", \"hide\", \"hide\", \"hide\")\n    scriptSelected = 1\n    check_selected()\n    manageSaveButton(true, \"teams\")\n})\n\n\nCalendarPill.addEventListener(\"click\", function () {\n    manageScripts(\"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"show\", \"hide\", \"hide\", \"hide\")\n    scriptSelected = 1\n    check_selected()\n    manageSaveButton(true, \"calendar\")\n})\n\nregulationsPill.addEventListener(\"click\", function () {\n    manageScripts(\"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"show\", \"hide\", \"hide\")\n    scriptSelected = 1\n    check_selected()\n    manageSaveButton(true, \"regulations\")\n})\n\ncarPill.addEventListener(\"click\", function () {\n    manageScripts(\"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"show\", \"hide\")\n    scriptSelected = 1\n    check_selected()\n    manageSaveButton(!viewingGraph, \"performance\")\n})\n\nmodPill.addEventListener(\"click\", function () {\n    manageScripts(\"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"show\")\n    scriptSelected = 1\n    check_selected()\n    manageSaveButton(false)\n})\n\nnewsPill.addEventListener(\"click\", function () {\n    manageScripts(\"show\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\")\n    scriptSelected = 1\n    check_selected()\n    manageSaveButton(false)\n})\n\ndocument.querySelector(\".toolbar-logo-and-title\").addEventListener(\"click\", function () {\n    manageScripts(\"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\", \"hide\")\n    scriptSelected = 0\n    document.getElementById(\"blockDiv\").classList.remove(\"disappear\")    \n    if (document.querySelector(\".scriptPills.active\")) {\n        document.querySelector(\".scriptPills.active\").classList.remove(\"active\")\n    }\n    divBlocking = 1;\n    check_selected()\n})\n\ngamePill.addEventListener(\"click\", function () {\n    document.querySelector(\"#editorChanges\").classList.add(\"d-none\")\n    document.querySelector(\"#gameChanges\").classList.remove(\"d-none\")\n    document.querySelector(\"#patreonChanges\").classList.add(\"d-none\")\n})\n\neditorPill.addEventListener(\"click\", function () {\n    document.querySelector(\"#editorChanges\").classList.remove(\"d-none\")\n    document.querySelector(\"#gameChanges\").classList.add(\"d-none\")\n    document.querySelector(\"#patreonChanges\").classList.add(\"d-none\")\n})\n\npatreonPill.addEventListener(\"click\", function () {\n    document.querySelector(\"#patreonChanges\").classList.remove(\"d-none\")\n    document.querySelector(\"#editorChanges\").classList.add(\"d-none\")\n    document.querySelector(\"#gameChanges\").classList.add(\"d-none\")\n})\n\nif (turningPointsFrequencySlider) {\n    updateTurningPointsFrequencyUI();\n    turningPointsFrequencySlider.addEventListener(\"input\", updateTurningPointsFrequencyUI);\n}\n\n\n\n\ndocument.getElementById(\"freezeMentalityToggle\").addEventListener(\"change\", function () {\n    let value = this.checked;\n    update_mentality_span(value)\n});\n\nfunction update_mentality_span(value) {\n    let span = document.querySelector(\"#mentalitySpan\")\n    if (value) {\n        span.className = \"option-state frozen\"\n        span.textContent = \"Frozen\"\n    } else {\n        span.className = \"option-state default\"\n        span.textContent = \"Unfrozen\"\n    }\n}\n\ndocument.getElementById(\"refurbishingToggle\").addEventListener(\"change\", function () {\n    let value = this.checked;\n    update_refurbish_span(value)\n});\n\nfunction update_refurbish_span(value) {\n    let span = document.querySelector(\"#refurbishSpan\")\n    if (value) {\n        span.className = \"option-state fixed\"\n        span.textContent = \"Fixed\"\n    } else {\n        span.className = \"option-state default\"\n        span.textContent = \"Default\"\n    }\n}\n\ndocument.getElementById(\"freezeDevelopmentToggle\").addEventListener(\"change\", function () {\n    let value = this.checked;\n    update_development_span(value)\n});\n\nfunction update_development_span(value) {\n    let span = document.querySelector(\"#developmentSpan\")\n    if (value) {\n        span.className = \"option-state frozen\"\n        span.textContent = \"Frozen\"\n    } else {\n        span.className = \"option-state default\"\n        span.textContent = \"Active\"\n    }\n}\n\nfunction manage_difficulty_warnings(level, triggerList) {\n    const elements = [\n        \"defaultDif\", \"lightDif\", \"researchDif\", \"statDif\", \"designTimeDif\", \"buildDif\"\n    ];\n    const selectedConfig = difficultyConfig[level] || difficultyConfig[\"default\"];\n\n    elements.forEach(id => {\n        document.getElementById(id).classList.add(\"d-none\");\n    });\n\n    selectedConfig.visible.forEach(id => {\n        document.getElementById(id).classList.remove(\"d-none\");\n    });\n\n    elements.forEach(id => {\n        if (selectedConfig[id] && triggerList[id] !== -1) {\n            const elementConfig = selectedConfig[id];\n            const element = document.getElementById(id);\n            element.className = elementConfig.className;\n            element.textContent = elementConfig.text;\n        }\n        else if (triggerList[id] === -1) {\n            document.getElementById(id).classList.add(\"disabled\")\n        }\n    });\n\n}\n\nfunction load_difficulty_warnings(triggerList) {\n    for (let id in triggerList) {\n        let warn = document.getElementById(id)\n        let difName = difficulty_dict[triggerList[id]]\n        if (triggerList[id] !== -1) {\n            warn.className = difficultyConfig[difName][id].className\n            warn.textContent = difficultyConfig[difName][id].text\n        }\n        else {\n            warn.classList.add(\"disabled\")\n        }\n    }\n}\n\n\n\ndocument.querySelectorAll(\".one-difficulty .bi-plus\").forEach(function (elem) { \n    const title = elem.parentNode.parentNode\n    const status = title.querySelector(\".dif-status\")\n    const name = title.querySelector(\".dif-name\")\n    let options;\n    if (name.id === \"lightDif\") {\n        options = weightDifConfig\n    }\n    else{\n        options = defaultDifficultiesConfig\n    }\n    const optionKeys = Object.keys(options).map(Number).sort((a, b) => a - b);\n    elem.addEventListener(\"click\", function () {\n        const actualValue = Number(status.dataset.value);\n        const actualIndex = optionKeys.indexOf(actualValue);\n        const safeIndex = actualIndex === -1 ? 0 : actualIndex;\n        const newKeyIndex = (safeIndex + 1) % optionKeys.length;\n        const newValue = optionKeys[newKeyIndex];\n        status.dataset.value = newValue;\n        status.textContent = options[newValue].text;\n        status.className = `dif-status ${options[newValue].className}`;\n    });\n});\n\ndocument.querySelectorAll(\".one-difficulty .bi-dash\").forEach(function (elem) { \n    const title = elem.parentNode.parentNode\n    const status = title.querySelector(\".dif-status\")\n    const name = title.querySelector(\".dif-name\")\n    let options;\n    if (name.id === \"lightDif\"){\n        options = weightDifConfig\n    }\n    else{\n        options = defaultDifficultiesConfig\n    }\n    const optionKeys = Object.keys(options).map(Number).sort((a, b) => a - b);\n    elem.addEventListener(\"click\", function () {\n        const actualValue = Number(status.dataset.value);\n        const actualIndex = optionKeys.indexOf(actualValue);\n        const safeIndex = actualIndex === -1 ? 0 : actualIndex;\n        const newKeyIndex = (safeIndex - 1 + optionKeys.length) % optionKeys.length;\n        const newValue = optionKeys[newKeyIndex];\n        status.dataset.value = newValue;\n        status.textContent = options[newValue].text;\n        status.className = `dif-status ${options[newValue].className}`;\n    });\n});\n\n\n/**\n * Manages the stats of the divs associated with the pills\n * @param  {Array} divs array of state of the divs\n */\nfunction manageScripts(...divs) {\n    const newIndex = divs.findIndex(s => s === \"show\");\n    const prevIndex = lastVisibleIndex;\n\n\n    scriptsArray.forEach((div, i) => {\n\n        div.ontransitionend = null;\n        div.onanimationend = null;\n        div.classList.remove(\"enter-from-right\", \"enter-from-left\");\n\n        if (i === newIndex) {\n            div.classList.remove(\"unloaded\");\n\n            requestAnimationFrame(() => {\n                div.classList.remove(\"hide\");\n\n                const enterClass = newIndex > prevIndex\n                    ? \"enter-from-right\"\n                    : \"enter-from-left\";\n\n\n                div.classList.add(enterClass);\n\n                div.onanimationend = () => {\n                    div.classList.remove(enterClass);\n                    div.onanimationend = null;\n                };\n            });\n\n        } else {\n\n            requestAnimationFrame(() => {\n                div.classList.add(\"hide\");\n            });\n\n            div.ontransitionend = (e) => {\n                if (e.propertyName === \"opacity\" && div.classList.contains(\"hide\")) {\n                    div.classList.add(\"unloaded\");\n                    div.ontransitionend = null;\n                }\n            };\n        }\n    });\n\n    lastVisibleIndex = newIndex >= 0 ? newIndex : lastVisibleIndex;\n}\n\ndocument.querySelector(\"#cancelDetailsButton\").addEventListener(\"click\", function () {\n    manage_config_content(configCopy, false)\n})\n\n\n\n\n\n\nfunction manageNewsStatus(patreonTier) {\n    const generateNews = checkGenerableNews(patreonTier);\n    if (generateNews === \"yes\") {\n        const newsgenerationEnded = document.querySelector('.news-generation-ended');\n        if (newsgenerationEnded) {\n            newsgenerationEnded.remove();\n            const newsGrid = document.createElement('div');\n            newsGrid.className = 'news-grid';\n            document.querySelector('#news').appendChild(newsGrid);\n            generateNews();\n        }\n    }\n\n}\n\nfunction checkGenerableNews(patreonTier) {\n    let canGenerate = \"no\";\n    newsAvailable.normal = false;\n    newsAvailable.turning = false;\n    if (patreonTier.paidMember) {\n        canGenerate = \"yes\";\n        if (patreonTier.tier === \"Insider\" || patreonTier.tier === \"Founder\") {\n            newsAvailable.normal = true;\n            newsAvailable.turning = true;\n        }\n        else if (patreonTier.tier === \"Backer\") {\n            newsAvailable.normal = true;\n            newsAvailable.turning = false;\n        }\n    }\n    return canGenerate;\n}\n\n\nasync function checkOpenSlideUp() {\n    const tier = await getUserTier();\n    if (tier.paidMember) return;\n\n    const lastShownStr = localStorage.getItem('patreonModalLastShown');\n    if (!canShowPatreonModal(lastShownStr)) {\n        return;\n    }\n\n    const delaySec = 5;\n    setTimeout(() => {\n        showPatreonModal();\n        localStorage.setItem('patreonModalLastShown', new Date().toISOString());\n    }, delaySec * 1000);\n}\n\n\nfunction showPatreonModal() {\n    patreonLogo.classList.add(\"open-slide-up\")\n    setTimeout(() => {\n        patreonSlideUp.classList.add(\"open\")\n    }, 350);\n}\n\nslideUpClose.addEventListener('click', () => {\n    patreonSlideUp.classList.remove(\"open\");\n    patreonLogo.className = \"bi-custom-patreon close-slide-up\"\n});\n\n\nfunction canShowPatreonModal(lastShown) {\n    if (!lastShown) return true; // Nunca se mostró, podemos mostrarlo\n    const last = new Date(lastShown).getTime();\n    const now = Date.now();\n    const diffDays = (now - last) / (1000 * 60 * 60 * 24);\n    return diffDays >= 1;\n}\n\ninit_colors_dict()\ndocument.addEventListener('DOMContentLoaded', async () => {\n    const hostname = window.location.hostname;\n    const isNightly = hostname.includes(\"nightly\");\n    isNightlyHost = isNightly;\n    versionNow = APP_VERSION;\n\n    syncNightlyIndicator();\n\n    if (isNightly) {\n        const favicon = document.querySelector('link[rel=\"icon\"]'); //testing\n        if (favicon) favicon.href = \"../assets/images/logoNightly.png\";\n\n        const tierInfo = await getUserTier();\n        let restrictionMessage = null;\n        const insiderOrFounder = tierInfo.tier === \"Insider\" || tierInfo.tier === \"Founder\";\n\n        if (tierInfo.isLoggedIn && !insiderOrFounder) {\n            restrictionMessage = \"Please upgrade to the Insider or Founder tier on Patreon to access the nightly version.\";\n        } else if (!tierInfo.isLoggedIn) {\n            restrictionMessage = \"Please log in with your Patreon account to access the nightly version.\";\n        }\n\n        if (restrictionMessage !== null) {\n            nightlyBlock = true;\n            const dropDiv = document.querySelector(\".drop-div\");\n            dropDiv.removeEventListener(\"dragover\", handleDragOver);\n            dropDiv.removeEventListener(\"dragenter\", handleDragEnter);\n            dropDiv.removeEventListener(\"dragleave\", handleDragLeave);\n            dropDiv.removeEventListener(\"drop\", handleDrop);\n            document.getElementById(\"statusIcon\").className = \"bi bi-lock\";\n            document.getElementById(\"statusTitle\").textContent = \"Nightly version is only available for patrons.\";\n            document.getElementById(\"statusDesc\").textContent = restrictionMessage;\n\n            const recentsContainer = document.querySelector(\".recents-container\");\n            if (recentsContainer) recentsContainer.remove();\n\n            document.querySelectorAll(\".script-view\").forEach(div => {\n                div.remove();\n            });\n        }\n\n        const now = new Date();\n        const day = String(now.getDate()).padStart(2, '0');\n        const month = String(now.getMonth() + 1).padStart(2, '0');\n        const year = String(now.getFullYear());\n        const shortBuildId = BUILD_ID.startsWith(\"dpl_\")\n\n            ? BUILD_ID.replace(\"dpl_\", \"\").slice(0, 7)\n            : BUILD_ID.slice(0, 7);\n        versionNow = `${APP_VERSION.replace(\"-dev\", \"\")}.nightly.${day}-${month}-${year}.${shortBuildId}`;\n        //remove -dev from APP_VERSION\n\n        versionPanel.classList.add(\"nightly\");\n    }\n\n    updateToolbarThemeLogo();\n    syncNightlyThemeVisibility();\n\n    updateRateLimitsDisplay();\n\n    const storedVersion = localStorage.getItem('lastVersion'); // Última versión guardada\n    versionPanel.textContent = `${versionNow}`;\n    versionBadge.textContent = `Version ${versionNow}`;\n    parchModalTitle.textContent = \"Version \" + versionNow + \" patch notes\"\n    getPatchNotes()\n\n    if (shouldShowPatchModal(storedVersion, versionNow)) {\n        localStorage.setItem('lastVersion', versionNow); // Guardar nueva versión\n        const patchModal = new bootstrap.Modal(document.getElementById('patchModal'));\n        patchModal.show();\n    }\n\n    let recents = await getRecentHandles();\n    populateRecentHandles(recents);\n\n\n    let phrases = [\n        \"Change the contract of every staff available in game\",\n        \"Customize your calendar however you want it\",\n        \"Edit the attributes of each driver just how you want them\",\n        \"Create your own custom engines\",\n        \"Get stories from your save using AI\",\n        \"Compare drivers and teams with detailed graphs\",\n        \"Modify car performance to your liking\",\n        \"Fix game-breaking issues with ease\",\n        \"No installation required, works in your browser\",\n        \"Honda, for the love of god, give Alonso a good engine for once\",\n        \"In memory of Aloy\"\n    ];\n\n    //reorder them randomly\n    phrases = phrases.sort(() => Math.random() - 0.5);\n\n    const animatedText = document.getElementById('animatedText');\n    const fakeText = document.querySelector('.fake-text');\n    let phraseIndex = 0;\n\n    const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));\n\n    async function animateTextLoop() {\n        while (true) {\n            const currentPhrase = phrases[phraseIndex];\n            fakeText.textContent = currentPhrase;\n\n            // Typing phase\n            for (let i = 0; i < currentPhrase.length; i++) {\n                const char = currentPhrase[i];\n                const span = document.createElement('span');\n                span.className = 'char';\n                span.textContent = char;\n                animatedText.appendChild(span);\n                await sleep(10); // Typing speed\n            }\n\n            // Wait phase (read time)\n            await sleep(5000);\n\n            // Deleting phase\n            while (animatedText.firstChild) {\n                if (animatedText.lastChild) {\n                    animatedText.removeChild(animatedText.lastChild);\n                }\n                await sleep(8); // Deleting speed\n            }\n\n            // Move to next phrase\n            phraseIndex = (phraseIndex + 1) % phrases.length;\n\n            // Small pause before typing next one\n            await sleep(200);\n        }\n    }\n\n    // Clear initial text and start animation loop\n    animatedText.innerHTML = '';\n    animateTextLoop();\n});\n\nexport async function updateRateLimitsDisplay() {\n  try {\n    const res = await fetch(\"/api/usage-today\");\n    if (!res.ok) return;\n\n    const { used, limit, percentage } = await res.json();\n\n    const fill = document.getElementById(\"limitBarFill\");\n    const text = document.getElementById(\"limitText\");\n    const container = document.getElementById(\"rateLimitContainer\");\n\n    //100% corresponds to not using any\n    fill.style.width = `${100 - percentage}%`;\n\n    // limpiar estados previos\n    container.classList.remove(\n      \"rate-ok\",\n      \"rate-warning\",\n      \"rate-danger\",\n      \"rate-blocked\"\n    );\n\n    let message = \"\";\n    let state = \"\";\n\n    if (percentage === 0) {\n        state = \"rate-ok\";\n        message = \"All requests available\";\n    } else if (percentage < 50) {\n        state = \"rate-ok\";\n        message = \"Plenty of requests available\";\n    } else if (percentage < 80) {\n        state = \"rate-warning\";\n        message = \"You're halfway through today's limit\";\n    } else if (percentage < 100) {\n        state = \"rate-danger\";\n        message = \"Only a few requests left today\";\n    } else {\n        state = \"rate-blocked\";\n        message = \"Daily limit reached\";\n    }\n\n    container.classList.add(state);\n    text.textContent = message;\n\n  } catch (err) {\n    console.error(\"Failed to update rate limits display:\", err);\n  }\n}\n\n\nconst MS_PER_DAY = 24 * 60 * 60 * 1000;\n\nfunction getRecentsTimeLabel(openedDate, now = new Date()) {\n    const startNow = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n    const startOpened = new Date(openedDate.getFullYear(), openedDate.getMonth(), openedDate.getDate());\n    let diffDays = Math.round((startNow - startOpened) / MS_PER_DAY);\n    if (diffDays < 0) diffDays = 0;\n\n    if (diffDays === 0) {\n        return \"Today\";\n    }\n    if (diffDays === 1) {\n        return \"Yesterday\";\n    }\n    return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`;\n}\n\nfunction populateRecentHandles(recents) {\n    if (recents.length === 0) {\n        const recentsContainer = document.querySelector(\".recents-container\");\n        if (recentsContainer) recentsContainer.classList.add(\"d-none\");\n        return;\n    }\n    const recentList = document.getElementById(\"recentsList\");\n    recentList.innerHTML = \"\"; // Clear existing items\n\n    recents.forEach(handle => {\n        const listItem = document.createElement(\"div\");\n        listItem.className = \"recent-file\";\n\n        const fileName = document.createElement(\"span\");\n        fileName.classList.add(\"file-name\");\n        fileName.textContent = handle.name;\n        fileName.addEventListener(\"click\", async () => {\n            const fileHandle = handle.handle;\n            const hasPermission = await verifyPermission(fileHandle, false);\n\n            if (!hasPermission) {\n                console.error(\"No permission to access the file:\", handle.name);\n                return;\n            }\n            const file = await fileHandle.getFile();\n            await saveHandleToRecents(fileHandle);\n            handle.lastOpened = new Date();\n            updateTimeLabel();\n            processSaveFile(file);\n\n        });\n\n        const lastOpened = document.createElement(\"span\");\n        lastOpened.classList.add(\"last-opened-time\");\n        const updateTimeLabel = () => {\n            const openedDate = new Date(handle.lastOpened);\n            lastOpened.textContent = getRecentsTimeLabel(openedDate);\n        };\n\n        updateTimeLabel();\n\n        lastOpened.addEventListener(\"mouseenter\", () => {\n            lastOpened.textContent = \"Remove\";\n        });\n\n        lastOpened.addEventListener(\"mouseleave\", () => {\n            updateTimeLabel();\n        });\n\n        lastOpened.addEventListener(\"click\", async () => {\n            await removeRecentHandle(handle.name);\n            listItem.remove();\n            if (recentList.children.length === 0) {\n                const recentsContainer = document.querySelector(\".recents-container\");\n                if (recentsContainer) recentsContainer.classList.add(\"d-none\");\n            }\n        });\n\n        listItem.appendChild(fileName);\n        listItem.appendChild(lastOpened);\n        recentList.appendChild(listItem);\n    });\n}\n\nasync function verifyPermission(fileHandle) {\n    const options = { mode: 'read' };\n\n    if ((await fileHandle.queryPermission(options)) === 'granted') {\n        return true;\n    }\n\n    if ((await fileHandle.requestPermission(options)) === 'granted') {\n        return true;\n    }\n\n    return false;\n}\n\nfunction createMarqueeItem(name, tier) {\n    const span = document.createElement(\"span\");\n    span.textContent = name;\n    span.classList.add(tier);\n    return span;\n}\n\nfunction updateToolbarThemeLogo() {\n    const logoImg = document.querySelector(\".toolbar-logo\");\n    if (!logoImg) return;\n\n    Object.values(themeToolbarLogos).forEach((meta) => {\n        if (meta?.className) logoImg.classList.remove(meta.className);\n    });\n\n    if (!hasPatreonThemeAccess) {\n        logoImg.src = \"../assets/images/logoVector.svg\";\n        return;\n    }\n\n    const bodyThemeClass = Array.from(document.body.classList).find(className => className.endsWith(\"-theme\"));\n    const appliedTheme = (bodyThemeClass || selectedTheme || \"\").toLowerCase();\n\n    const themeKey = Object.keys(themeToolbarLogos).find((key) => appliedTheme.includes(key.replace(\"-theme\", \"\")));\n    if (themeKey) {\n        const meta = themeToolbarLogos[themeKey];\n        logoImg.src = meta.src;\n        if (meta.className) logoImg.classList.add(meta.className);\n        return;\n    }\n\n    logoImg.src = \"../assets/images/logoVector.svg\";\n}\n\nfunction syncNightlyIndicator() {\n    const titleEl = document.querySelector(\".toolbar-title\");\n    if (!titleEl) return;\n\n    const shouldShow = isNightlyHost;\n    titleEl.classList.toggle(\"nightly\", shouldShow);\n\n    const existingIcon = titleEl.querySelector(\".nightly-icon\");\n    if (shouldShow) {\n        if (!existingIcon) {\n            const moonIcon = document.createElement(\"i\");\n            moonIcon.className = \"bi bi-moon-fill nightly-icon\";\n            titleEl.appendChild(moonIcon);\n        }\n    } else {\n        if (existingIcon) existingIcon.remove();\n    }\n}\n\nfunction syncNightlyThemeVisibility() {\n    const nightlyCard = document.querySelector('.one-theme[data-theme=\"nightly-theme\"]');\n    if (!nightlyCard) return;\n\n    const showNightlyTheme = isNightlyHost && hasPatreonThemeAccess;\n    nightlyCard.classList.toggle(\"d-none\", !showNightlyTheme);\n\n    if (!showNightlyTheme && selectedTheme === \"nightly-theme\") {\n        selectedTheme = \"default-theme\";\n        localStorage.removeItem(\"theme\");\n        document.body.className = \"font default-theme\";\n        init_colors_dict(selectedTheme);\n        updateToolbarThemeLogo();\n    }\n}\n\n\ndocument.querySelectorAll(\".one-theme\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function () {\n        if (!hasPatreonThemeAccess) return;\n        if (elem.dataset.theme === \"nightly-theme\" && !isNightlyHost) return;\n        selectedTheme = elem.dataset.theme\n        document.querySelector(\".one-theme.active\").classList.remove(\"active\")\n        elem.classList.add(\"active\")\n        changeTheme()\n    })\n});\n\nfunction changeTheme() {\n    document.querySelector(\"body\").className = `font ${selectedTheme}`\n    localStorage.setItem(\"theme\", selectedTheme)\n    init_colors_dict(selectedTheme)\n    updateToolbarThemeLogo()\n    syncNightlyIndicator()\n    reload_performance_graph()\n    reload_h2h_graphs()\n\n}\n\nfunction loadTheme() {\n    let theme = localStorage.getItem(\"theme\")\n    const savedThemeButton = theme ? document.querySelector(`.one-theme[data-theme=\"${theme}\"]`) : null;\n\n    if (!theme && isNightlyHost && hasPatreonThemeAccess) {\n        theme = \"nightly-theme\"\n    }\n\n    if (theme === \"nightly-theme\" && !isNightlyHost) {\n        theme = null;\n        localStorage.removeItem(\"theme\");\n    }\n\n    selectedTheme = savedThemeButton ? theme : (theme === \"nightly-theme\" ? \"nightly-theme\" : \"default-theme\")\n    document.querySelector(\"body\").className = `font ${selectedTheme}`\n\n    const activeTheme = document.querySelector(\".one-theme.active\")\n    if (activeTheme) {\n        activeTheme.classList.remove(\"active\")\n    }\n\n    const currentThemeButton = document.querySelector(`.one-theme[data-theme=\"${selectedTheme}\"]`)\n    if (currentThemeButton) {\n        currentThemeButton.classList.add(\"active\")\n    }\n\n    if (theme && !savedThemeButton) {\n        localStorage.removeItem(\"theme\")\n    }\n    init_colors_dict(selectedTheme)\n    updateToolbarThemeLogo()\n    syncNightlyIndicator()\n    syncNightlyThemeVisibility()\n    reload_performance_graph()\n    reload_h2h_graphs()\n}\n\ndocument.getElementById('logButton').addEventListener('click', function () {\n    const logs = window.getLogEntries();\n\n    const logWindow = window.open('', '_blank');\n    const doc = logWindow.document;\n\n    const style = `\n        body { font-family: Arial, sans-serif; margin: 20px; }\n        table { width: 100%; border-collapse: collapse; }\n        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }\n        th { background-color: #f4f4f4; }\n        .log { color: green; }\n        .error { color: red; }\n        pre { white-space: pre-wrap; word-break: break-word; max-width: 600px; }\n    `;\n\n    const head = doc.createElement('head');\n    const title = doc.createElement('title');\n    title.textContent = 'Log Console';\n\n    const styleTag = doc.createElement('style');\n    styleTag.textContent = style;\n\n    head.appendChild(title);\n    head.appendChild(styleTag);\n    doc.head.appendChild(head);\n\n    const body = doc.createElement('body');\n    const heading = document.createElement('h2');\n    heading.textContent = 'Logs';\n\n    const table = document.createElement('table');\n    const thead = document.createElement('thead');\n    const headerRow = document.createElement('tr');\n    ['Type', 'Message', 'Timestamp'].forEach(text => {\n        const th = document.createElement('th');\n        th.textContent = text;\n        headerRow.appendChild(th);\n    });\n    thead.appendChild(headerRow);\n\n    const tbody = document.createElement('tbody');\n\n    logs.forEach(log => {\n        const row = document.createElement('tr');\n\n        const typeCell = document.createElement('td');\n        typeCell.textContent = log.type.toUpperCase();\n        typeCell.classList.add(log.type);\n\n        const messageCell = document.createElement('td');\n        const pre = document.createElement('pre');\n\n        // Si el mensaje es un objeto, lo formateamos como JSON\n        pre.textContent = log.message.map(msg =>\n            typeof msg === 'object' ? JSON.stringify(msg, null, 2) : msg\n        ).join(' ');\n\n        messageCell.appendChild(pre);\n\n        const timestampCell = document.createElement('td');\n        timestampCell.textContent = new Date(log.timestamp).toLocaleString();\n\n        row.appendChild(typeCell);\n        row.appendChild(messageCell);\n        row.appendChild(timestampCell);\n        tbody.appendChild(row);\n    });\n\n    table.appendChild(thead);\n    table.appendChild(tbody);\n\n    body.appendChild(heading);\n    body.appendChild(table);\n    doc.body.appendChild(body);\n});\n\n/**\n * Verifies if the patch modal should be shown\n * @param {string|null} storedVersion - Version stored in localStorage\n * @param {string} versionNow - Current version of the app\n * @returns {boolean} - True if the modal should be shown, false otherwise\n */\nfunction shouldShowPatchModal(storedVersion, versionNow) {\n    if (!storedVersion) return true; // Si no hay una versión guardada, mostrar el modal\n\n    const storedParts = storedVersion.split('.').map(Number);\n    const currentParts = versionNow.split('.').map(Number);\n\n    return storedParts[0] < currentParts[0] || storedParts[1] < currentParts[1];\n}\n\ndocument.querySelectorAll(\".team-logo-container\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function () {\n        let active = document.querySelector(\".team-logo-container.active\")\n        managingTeamChanged = true\n        if (active) {\n            active.classList.remove(\"active\")\n        }\n        elem.classList.add(\"active\")\n    })\n});\n\n\nexport async function confirmModal({\n    title,\n    body,\n    confirmText,\n    cancelText\n}) {\n    const modalEl = document.getElementById('confirmModal');\n    const bsModal = new bootstrap.Modal(modalEl, { keyboard: false });\n\n    // Elementos\n    const confirmTitle = modalEl.querySelector('.modal-title');\n    const confirmBody = modalEl.querySelector('.modal-body p');\n    const confirmBtn = modalEl.querySelector('.confirm-modal');\n    const cancelBtn = modalEl.querySelector('.close-modal');\n\n    if (confirmTitle) confirmTitle.textContent = title;\n    if (confirmBody) confirmBody.textContent = body;\n\n    if (confirmBtn) {\n        if (confirmText) {\n            confirmBtn.textContent = confirmText;\n            confirmBtn.classList.remove('d-none');\n        } else {\n            confirmBtn.classList.add('d-none');\n        }\n    }\n\n    if (cancelBtn) {\n        if (cancelText) {\n            cancelBtn.textContent = cancelText;\n            cancelBtn.classList.remove('d-none');\n        } else {\n            cancelBtn.classList.add('d-none');\n        }\n    }\n\n    return new Promise((resolve) => {\n        let clicked = false;\n        const controller = new AbortController();\n        const { signal } = controller;\n\n        confirmBtn?.addEventListener('click', () => {\n            clicked = true;\n            resolve(true);\n            bsModal.hide();\n        }, { once: true, signal });\n\n        cancelBtn?.addEventListener('click', () => {\n            clicked = true;\n            resolve(false);\n            bsModal.hide();\n        }, { once: true, signal });\n\n        modalEl.addEventListener('hidden.bs.modal', () => {\n            if (!clicked) resolve(false);\n            controller.abort();\n        }, { once: true });\n\n        bsModal.show();\n    });\n}\n\ndocument.querySelectorAll(\".redesigned-dropdown\").forEach(dropdown => {\n    dropdown.addEventListener(\"click\", function (e) {\n        e.stopPropagation();\n\n        document.querySelectorAll(\".redesigned-dropdown.open\").forEach(openDropdown => {\n            if (openDropdown !== dropdown) {\n                openDropdown.classList.remove(\"open\");\n            }\n        });\n\n        dropdown.classList.toggle(\"open\");\n    });\n});\n\ndocument.addEventListener(\"click\", function () {\n    document.querySelectorAll(\".redesigned-dropdown.open\").forEach(openDropdown => {\n        openDropdown.classList.remove(\"open\");\n    });\n});\n\nexport function attachHold(btn, el, step = 1, opts = {}) {\n    const min = opts.min ?? -Infinity;\n    const max = opts.max ?? Infinity;\n    const progressEl = opts.progressEl ?? null;\n    const values = Array.isArray(opts.values) && opts.values.length ? opts.values.slice() : null;\n    const loop = !!opts.loop;\n    const onChange = typeof opts.onChange === 'function' ? opts.onChange : () => { };\n\n    // NUEVO: Permitimos pasar una función de formateo\n    const format = opts.format || ((v) => v);\n\n    const initialDelay = opts.initialDelay ?? 400;\n    const tiers = opts.tiers ?? [\n        [0, 250],\n        [750, 150],\n        [1500, 80],\n        [3000, 40],\n    ];\n\n    let timer, start;\n\n    const getText = () => (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') ? (el.value ?? '') : (el.innerText ?? '');\n\n    const setText = (txt) => {\n        // NUEVO: Aplicamos el formato si es un número\n        const valToDisplay = (typeof txt === 'number') ? format(txt) : txt;\n\n        if (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') {\n            el.value = String(valToDisplay);\n            el.dispatchEvent(new Event('input', { bubbles: true }));\n        } else {\n            const current = el.innerText || '';\n            if (/-?\\d+(\\.\\d+)?/.test(current) && typeof txt === 'number') {\n                // Nota: Aquí el replace es delicado con formatos, \n                // para tu caso de Input suele bastar con la línea de arriba (el.value = ...)\n                // pero si usas span, reemplazamos todo para evitar romper el formato parcial.\n                el.innerText = String(valToDisplay);\n            } else {\n                el.innerText = String(valToDisplay);\n            }\n        }\n    };\n\n    const getNum = () => {\n        if (values) return NaN;\n        let raw = getText();\n\n        // NUEVO: Eliminamos las comas antes de intentar parsear el número\n        // Esto permite que \"100,000\" se convierta en \"100000\" para el cálculo\n        raw = String(raw).replace(/,/g, '');\n\n        const m = raw.match(/-?\\d+(\\.\\d+)?/);\n        return m ? parseFloat(m[0]) : 0;\n    };\n\n    const setNum = (val) => {\n        const clamped = Math.max(min, Math.min(max, val));\n        setText(clamped);\n        updateProgress(clamped);\n        onChange(clamped, currentPercent(clamped)); // Devuelve el valor numérico limpio\n    };\n\n    // ... El resto de funciones (findCurrentIndex, setIndex, etc.) se mantienen igual ...\n    // Solo asegúrate de copiar el resto de tu lógica original aquí abajo.\n\n    const findCurrentIndex = () => {\n        const raw = String(getText()).trim();\n        let idx = values.findIndex(v => String(v) === raw);\n        if (idx === -1) {\n            const numMatch = raw.replace(/,/g, '').match(/-?\\d+(\\.\\d+)?/); // Ajuste aquí también por si acaso\n            if (numMatch) {\n                const num = parseFloat(numMatch[0]);\n                idx = values.findIndex(v => Number(v) === num);\n            }\n        }\n        return idx === -1 ? 0 : idx;\n    };\n\n    const setIndex = (i) => {\n        const len = values.length;\n        let next = i;\n        if (loop) {\n            next = ((i % len) + len) % len;\n        } else {\n            next = Math.max(0, Math.min(len - 1, i));\n        }\n        const val = values[next];\n        setText(val);\n        updateProgress(next, true);\n        onChange(val, currentPercent(val, true));\n        return next;\n    };\n\n    const pickInterval = (heldMs) => {\n        let ms = tiers[0][1];\n        for (const [t, interval] of tiers) {\n            if (heldMs >= t) ms = interval; else break;\n        }\n        return ms;\n    };\n\n    const currentPercent = (valOrIdx, isIndex = false) => {\n        if (values) {\n            const len = values.length;\n            if (len <= 1) return 100;\n            const idx = isIndex ? valOrIdx : values.findIndex(v => String(v) === String(valOrIdx));\n            const i = idx < 0 ? 0 : idx;\n            return Math.round((i / (len - 1)) * 100);\n        }\n        if (max > min) {\n            const v = Number(valOrIdx);\n            const p = ((v - min) / (max - min)) * 100;\n            return Math.round(Math.max(0, Math.min(100, p)));\n        }\n        return 0;\n    };\n\n    const updateProgress = (valOrIdx, isIndex = false) => {\n        if (!progressEl) return;\n        const p = currentPercent(valOrIdx, isIndex);\n        progressEl.style.width = p + '%';\n        progressEl.ariaValueNow = String(p);\n    };\n\n    const tick = () => {\n        if (values) {\n            const cur = findCurrentIndex();\n            setIndex(cur + (step >= 0 ? +1 : -1));\n        } else {\n            const cur = getNum();\n            setNum(cur + step);\n        }\n    };\n\n    const startLoop = () => {\n        start = performance.now();\n        tick();\n        const loopFn = () => {\n            const held = performance.now() - start;\n            timer = setTimeout(() => {\n                tick();\n                loopFn();\n            }, pickInterval(held));\n        };\n        timer = setTimeout(loopFn, initialDelay);\n    };\n\n    const stopLoop = () => {\n        clearTimeout(timer);\n        timer = null;\n    };\n\n    const downEv = 'onpointerdown' in window ? 'pointerdown' : 'mousedown';\n    const upEv = 'onpointerup' in window ? 'pointerup' : 'mouseup';\n    const leaveEv = 'onpointerleave' in window ? 'pointerleave' : 'mouseleave';\n    const cancelEv = 'pointercancel';\n\n    btn.addEventListener(downEv, (e) => { e.preventDefault(); startLoop(); });\n    document.addEventListener(upEv, stopLoop, true);\n    document.addEventListener(cancelEv, stopLoop, true);\n    btn.addEventListener(leaveEv, stopLoop, true);\n}\n"
  },
  {
    "path": "src/js/frontend/seasonMods.js",
    "content": "import { set } from \"idb-keyval\";\nimport { Command } from \"../backend/command.js\";\nimport { applyConfigFromEditorUI, custom_team, replace_custom_team_logo, setRenaultEnginePresentation, updateJenzerToDams } from \"./renderer.js\";\n\nlet calendarEditMode = null, calendarEditMode2026 = null;\nlet mods2026IlluminationTimeout = null;\n\nfunction normalizeToggleEnabled(value) {\n  return value === true || value === 1 || value === \"1\";\n}\n\nfunction clearMods2026Illumination() {\n  if (mods2026IlluminationTimeout) {\n    clearTimeout(mods2026IlluminationTimeout);\n    mods2026IlluminationTimeout = null;\n  }\n\n  const mods2026View = document.getElementById(\"mods2026View\");\n  if (mods2026View) mods2026View.classList.remove(\"illuminated\");\n}\n\nfunction seasonModsIsVisible() {\n  const seasonModsDiv = document.getElementById(\"season_mods\");\n  if (!seasonModsDiv) return false;\n  return !seasonModsDiv.classList.contains(\"hide\") && !seasonModsDiv.classList.contains(\"unloaded\");\n}\n\nfunction scheduleMods2026Illumination() {\n  clearMods2026Illumination();\n\n  mods2026IlluminationTimeout = setTimeout(() => {\n    mods2026IlluminationTimeout = null;\n\n    if (!seasonModsIsVisible()) return;\n\n    const mods2026Pill = document.getElementById(\"mods2026Pill\");\n    if (mods2026Pill && !mods2026Pill.classList.contains(\"active\")) return;\n\n    const mods2026View = document.getElementById(\"mods2026View\");\n    if (mods2026View && !mods2026View.classList.contains(\"d-none\")) {\n      mods2026View.classList.add(\"illuminated\");\n    }\n  }, 2200);\n}\n\nfunction setAduoTpTogglesChecked(enabled) {\n  const aduoButton = document.querySelector(\"#mods2026View .change-aduo-tps-2026\");\n  if (aduoButton) aduoButton.classList.toggle(\"completed\", enabled);\n\n  const settingsToggle = document.getElementById(\"aduoTPSToggleSettings\");\n  if (settingsToggle) settingsToggle.checked = enabled;\n}\n\nfunction updateAduoTpEnabled(enabled) {\n  setAduoTpTogglesChecked(enabled);\n  const command = new Command(\"updateAduoTPEnabled\", { enabled });\n  command.execute();\n  syncMods2026ApplyAllButtonState();\n}\n\nfunction getCustomTeamName() {\n  const teamNode = document.querySelector(\".ct-teamname\");\n  return String(teamNode?.dataset.teamshow || teamNode?.dataset.teamname || \"\");\n}\n\nfunction shouldAutoApplyCadillacLogo() {\n  if (!custom_team) return false;\n  return getCustomTeamName().toLowerCase().includes(\"cadillac\");\n}\n\nlet cadillacLogoDataUrlPromise = null;\n\nfunction getCadillacLogoDataUrl() {\n  if (cadillacLogoDataUrlPromise) return cadillacLogoDataUrlPromise;\n\n  cadillacLogoDataUrlPromise = fetch(\"../assets/images/logos/cadillac.png\")\n    .then((res) => (res.ok ? res.blob() : Promise.reject(new Error(\"Cadillac logo not found\"))))\n    .then((blob) => new Promise((resolve, reject) => {\n      const reader = new FileReader();\n      reader.onload = () => resolve(reader.result);\n      reader.onerror = () => reject(reader.error || new Error(\"Failed to read Cadillac logo\"));\n      reader.readAsDataURL(blob);\n    }))\n    .catch(() => null);\n\n  return cadillacLogoDataUrlPromise;\n}\n\nfunction tryApplyCadillacCustomLogo() {\n  if (!shouldAutoApplyCadillacLogo()) return;\n\n  getCadillacLogoDataUrl().then((dataUrl) => {\n    if (!dataUrl) return;\n    replace_custom_team_logo(String(dataUrl));\n  });\n}\n\nfunction prefersReducedMotion() {\n  return window.matchMedia && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\nfunction animatePointsValue(element, targetValue, durationMs = 1000) {\n  if (!element) return;\n\n  const startValueRaw = Number.parseInt(String(element.textContent).replace(/[^\\d-]/g, \"\"), 10);\n  const startValue = startValueRaw\n  const endValue = Number(targetValue);\n\n  if (prefersReducedMotion() || durationMs <= 0) {\n    element.textContent = String(endValue);\n    return;\n  }\n\n  const token = String((Number(element.dataset.animToken || \"0\") || 0) + 1);\n  element.dataset.animToken = token;\n\n  const startTs = performance.now();\n  const easeOutCubic = (t) => 1 - Math.pow(1 - t, 3);\n\n  const tick = (now) => {\n    if (element.dataset.animToken !== token) return;\n\n    const t = Math.min(1, (now - startTs) / durationMs);\n    const eased = easeOutCubic(t);\n    const current = Math.round(startValue + (endValue - startValue) * eased);\n    element.textContent = String(current);\n\n    if (t < 1) requestAnimationFrame(tick);\n  };\n\n  requestAnimationFrame(tick);\n}\n\nfunction setModsSeason(seasonYear) {\n  const mods2025Pill = document.getElementById(\"mods2025Pill\");\n  const mods2026Pill = document.getElementById(\"mods2026Pill\");\n  const mods2025View = document.getElementById(\"mods2025View\");\n  const mods2026View = document.getElementById(\"mods2026View\");\n\n  if (!mods2025Pill || !mods2026Pill || !mods2025View || !mods2026View) return;\n\n  const is2026 = String(seasonYear) === \"2026\";\n  mods2025Pill.classList.toggle(\"active\", !is2026);\n  mods2026Pill.classList.toggle(\"active\", is2026);\n\n  mods2025View.classList.toggle(\"d-none\", is2026);\n  mods2026View.classList.toggle(\"d-none\", !is2026);\n\n  if (!is2026) clearMods2026Illumination();\n}\n\nfunction initModsSeasonPills() {\n  const mods2025Pill = document.getElementById(\"mods2025Pill\");\n  const mods2026Pill = document.getElementById(\"mods2026Pill\");\n\n  if (!mods2025Pill || !mods2026Pill) return;\n  if (mods2025Pill.dataset.modsInit === \"1\") return;\n  mods2025Pill.dataset.modsInit = \"1\";\n\n  mods2025Pill.addEventListener(\"click\", function (e) {\n    e.preventDefault();\n    setModsSeason(2025);\n  });\n\n  mods2026Pill.addEventListener(\"click\", function (e) {\n    e.preventDefault();\n    setModsSeason(2026);\n    scheduleMods2026Illumination();\n  });\n\n  setModsSeason(2026);\n}\n\nfunction initMods2026Actions(){\n  const mods2026View = document.getElementById(\"mods2026View\");\n  if (!mods2026View) return;\n  if (mods2026View.dataset.modsActionsInit === \"1\") return;\n  mods2026View.dataset.modsActionsInit = \"1\";\n\n  const timeTravelButton = mods2026View.querySelector(\".time-travel-2026\");\n  if (timeTravelButton) {\n    timeTravelButton.addEventListener(\"click\", function () {\n      const command = new Command(\"timeTravel\", { dayNumber: 46019, mod: \"2026\" });\n      command.execute();\n      this.classList.add(\"completed\");\n      this.querySelector(\"span\").textContent = \"Applied\";\n      syncMods2026ApplyAllButtonState();\n    });\n  }\n\n  const changeCalendarButton = mods2026View.querySelector(\".change-calendar-2026\");\n  if (changeCalendarButton) {\n    changeCalendarButton.addEventListener(\"click\", function () {\n      if (!calendarEditMode2026) return;\n      const command = new Command(\"changeCalendar\", { type: calendarEditMode2026, mod: \"2026\" });\n      command.execute();\n      this.classList.add(\"completed\");\n      this.querySelector(\"span\").textContent = \"Applied\";\n      syncMods2026ApplyAllButtonState();\n    });\n  }\n\n  const add2025Results = mods2026View.querySelector(\".add-results-2026\");\n  const add2025ResultsPoints = Array.from(mods2026View.querySelectorAll(\".add-results-points[data-target]\"));\n\n  const setAdd2025ResultsPoints = (animate = false) => {\n    add2025ResultsPoints.forEach((el) => {\n      el.classList.add(\"activated\")\n      const target = Number(el.dataset.target);\n      if (animate) animatePointsValue(el, target, 1000);\n      else el.textContent = String(target);\n    });\n  };\n\n  if (add2025Results) {\n    if (add2025Results.classList.contains(\"completed\")) {\n      setAdd2025ResultsPoints(false);\n    }\n\n    const mo = new MutationObserver(() => {\n      if (add2025Results.classList.contains(\"completed\")) {\n        setAdd2025ResultsPoints(false);\n      }\n    });\n    mo.observe(add2025Results, { attributes: true, attributeFilter: [\"class\"] });\n\n    add2025Results.addEventListener(\"click\", function () {\n      setAdd2025ResultsPoints(true);\n      const command = new Command(\"changeCfd\", {mod: \"2026\"});\n      command.execute();\n      this.classList.add(\"completed\");\n      this.querySelector(\"span\").textContent = \"Applied\";\n      syncMods2026ApplyAllButtonState();\n    });\n  }\n\n  const changeRegulationsButton = mods2026View.querySelector(\".change-regulations-2026\");\n  if (changeRegulationsButton) {\n    changeRegulationsButton.addEventListener(\"click\", function () {\n      if (this.classList.contains(\"completed\") || this.dataset.running === \"1\") return;\n      this.dataset.running = \"1\";\n      this.classList.add(\"disabled\");\n\n      const command = new Command(\"changeRegulations\", {mod: \"2026\"});\n      try {\n        command.execute();\n\n        this.classList.add(\"completed\");\n        this.querySelector(\"span\").textContent = \"Applied\";\n        syncMods2026ApplyAllButtonState();\n      }\n      finally {\n        this.dataset.running = \"0\";\n        this.classList.remove(\"disabled\");\n\n        const command2 = new Command(\"regulationsRefresh\", {});\n        command2.execute();\n      }\n    });\n  }\n\n  const changePerformanceButton2026 = mods2026View.querySelector(\".change-performance-2026\");\n  if (changePerformanceButton2026) {\n    const syncJenzerDamsState = () => {\n      updateJenzerToDams(changePerformanceButton2026.classList.contains(\"completed\") ? \"dams\" : \"jenzer\");\n    };\n\n    // Ensure the UI-dependent state is correct when the mod was already applied\n    // (e.g. after \"Mod data fetched\" marks the button as completed).\n    syncJenzerDamsState();\n\n    const mo = new MutationObserver(() => syncJenzerDamsState());\n    mo.observe(changePerformanceButton2026, { attributes: true, attributeFilter: [\"class\"] });\n\n    changePerformanceButton2026.addEventListener(\"click\", function () {\n      tryApplyCadillacCustomLogo();\n\n      const alfaReplaceButton = document.querySelector(\"#alfaReplaceButton button\");\n      if (alfaReplaceButton && alfaReplaceButton.dataset.value === \"stake\") {\n        applyConfigFromEditorUI({ alfa: \"audi\" });\n      }\n\n      const command = new Command(\"add2026Engines\", {mod: \"2026\"});\n      command.execute();\n      setRenaultEnginePresentation(\"honda\");\n      updateJenzerToDams(\"dams\");\n      this.classList.add(\"completed\");\n      this.querySelector(\"span\").textContent = \"Applied\";\n      syncMods2026ApplyAllButtonState();\n      const command2 = new Command(\"changePerformance\", {mod: \"2026\"});\n      command2.execute();\n    });\n  }\n\n  const changeStatsButton = mods2026View.querySelector(\".change-stats-2026\");\n  if (changeStatsButton) {\n    changeStatsButton.addEventListener(\"click\", function () {\n      const command = new Command(\"changeStats\", {mod: \"2026\"});\n      command.execute();\n      this.classList.add(\"completed\");\n      this.querySelector(\"span\").textContent = \"Applied\";\n      syncMods2026ApplyAllButtonState();\n    });\n  }\n\n  const extraDriversButton = mods2026View.querySelector(\".extra-drivers-2026\");\n  if (extraDriversButton) {\n    extraDriversButton.addEventListener(\"click\", function () {\n      const command = new Command(\"extraDrivers\", {mod: \"2026\"});\n      command.execute();\n      this.classList.add(\"completed\");\n      this.querySelector(\"span\").textContent = \"Applied\";\n      syncMods2026Dependencies();\n      syncMods2026ApplyAllButtonState();\n    });\n  }\n\n  const driverLineUpsButton = mods2026View.querySelector(\".change-line-ups-2026\");\n  if (driverLineUpsButton) {\n    driverLineUpsButton.addEventListener(\"click\", function () {\n      const command = new Command(\"changeLineUps\", {mod: \"2026\"});\n      command.execute();\n      this.classList.add(\"completed\");\n      this.querySelector(\"span\").textContent = \"Applied\";\n      syncMods2026ApplyAllButtonState();\n      document.querySelector(\"#mods2026View .had-ovr\").classList.remove(\"atfont\");\n      document.querySelector(\"#mods2026View .had-ovr\").classList.add(\"rbfont\");\n      document.querySelector(\"#mods2026View .ant-ovr\").classList.add(\"mefont\");\n    });\n\n  }\n\n  const aduoToggle = mods2026View.querySelector(\".change-aduo-tps-2026\");\n  if (aduoToggle) {\n    aduoToggle.addEventListener(\"click\", function () {\n      this.classList.add(\"completed\");\n      this.querySelector(\"span\").textContent = \"Applied\";\n      updateAduoTpEnabled(this.classList.contains(\"completed\"));\n    });\n  }\n\n  const settingsToggle = document.getElementById(\"aduoTPSToggleSettings\");\n  if (settingsToggle && settingsToggle.dataset.aduoInit !== \"1\") {\n    settingsToggle.dataset.aduoInit = \"1\";\n    settingsToggle.addEventListener(\"change\", function () {\n      updateAduoTpEnabled(this.checked);\n    });\n  }\n\n  const applyAllButton = mods2026View.querySelector(\".apply-all-2026\");\n\n  if (applyAllButton) {\n    applyAllButton.addEventListener(\"click\", function () {\n      if (applyAllButton.dataset.running === \"1\") return; // anti-bucle\n      applyAllButton.dataset.running = \"1\";\n\n      const clickNext = () => {\n        syncMods2026Dependencies();\n\n        const btn = mods2026View.querySelector(\".one-change-button:not(.completed):not(.disabled)\");\n        if (!btn) {\n          if (aduoToggle && !aduoToggle.classList.contains(\"completed\")) {\n            aduoToggle.click();\n          }\n          applyAllButton.dataset.running = \"0\";\n          syncMods2026ApplyAllButtonState();\n          return;\n        }\n\n        btn.click();\n        setTimeout(clickNext, 300);\n      };\n\n      clickNext();\n    }, { once: true }); // evita listeners duplicados\n  }\n\n  syncMods2026Dependencies();\n  syncMods2026ApplyAllButtonState();\n}\n\nfunction initMods2025Actions() {\n  const mods2025View = document.getElementById(\"mods2025View\");\n  if (!mods2025View) return;\n  if (mods2025View.dataset.modsActionsInit === \"1\") return;\n  mods2025View.dataset.modsActionsInit = \"1\";\n\n  const timeTravelButton = mods2025View.querySelector(\".time-travel\");\n  if (timeTravelButton) {\n    timeTravelButton.addEventListener(\"click\", function () {\n      const command = new Command(\"timeTravel\", { dayNumber: 45657, mod: \"2025\" });\n      command.execute();\n      this.classList.add(\"completed\");\n      this.querySelector(\"span\").textContent = \"Applied\";\n    });\n  }\n\n  const changeLineUpsButton = mods2025View.querySelector(\".change-line-ups\");\n  if (changeLineUpsButton) {\n    changeLineUpsButton.addEventListener(\"click\", function () {\n      const command = new Command(\"changeLineUps\", { mod: \"2025\" });\n      command.execute();\n\n      const hamTransfer = mods2025View.querySelector(\".ham-transfer\");\n      const saiTransfer = mods2025View.querySelector(\".sai-transfer\");\n      const antTransfer = mods2025View.querySelector(\".ant-transfer\");\n      const antOvr = mods2025View.querySelector(\".ant-ovr\");\n      const borOvr = mods2025View.querySelector(\".bor-ovr\");\n\n      if (hamTransfer) hamTransfer.classList.remove(\"mefont\");\n      if (saiTransfer) saiTransfer.classList.remove(\"fefont\");\n      if (hamTransfer) hamTransfer.classList.add(\"fefont\");\n      if (saiTransfer) saiTransfer.classList.add(\"wifont\");\n      if (antTransfer) antTransfer.classList.add(\"mefont\");\n      if (antOvr) antOvr.classList.add(\"mefont\");\n      if (borOvr) borOvr.classList.remove(\"mcfont\");\n      if (borOvr) borOvr.classList.add(\"affont\");\n\n      this.classList.add(\"completed\");\n      this.querySelector(\"span\").textContent = \"Applied\";\n    });\n  }\n\n  const changeStatsButton = mods2025View.querySelector(\".change-stats\");\n  if (changeStatsButton) {\n    changeStatsButton.addEventListener(\"click\", function () {\n      const command = new Command(\"changeStats\", { mod: \"2025\" });\n      command.execute();\n      this.classList.add(\"completed\");\n      this.querySelector(\"span\").textContent = \"Applied\";\n    });\n  }\n\n  const changeCfdButton = mods2025View.querySelector(\".change-cfd\");\n  if (changeCfdButton) {\n    changeCfdButton.addEventListener(\"click\", function () {\n      const command = new Command(\"changeCfd\", {mod : \"2025\"});\n      command.execute();\n      this.classList.add(\"completed\");\n      this.querySelector(\"span\").textContent = \"Applied\";\n    });\n  }\n\n  const changeRegulationsButton = mods2025View.querySelector(\".change-regulations\");\n  if (changeRegulationsButton) {\n    changeRegulationsButton.addEventListener(\"click\", function () {\n      const command = new Command(\"changeRegulations\", { mod: \"2025\" });\n      command.execute();\n      this.classList.add(\"completed\");\n      this.querySelector(\"span\").textContent = \"Applied\";\n    });\n  }\n\n  const extraDriversButton = mods2025View.querySelector(\".extra-drivers\");\n  if (extraDriversButton) {\n    extraDriversButton.addEventListener(\"click\", function () {\n      const command = new Command(\"extraDrivers\", { mod: \"2025\" });\n      command.execute();\n      this.classList.add(\"completed\");\n      this.querySelector(\"span\").textContent = \"Applied\";\n      syncMods2025Dependencies();\n    });\n  }\n\n  const changeCalendarButton = mods2025View.querySelector(\".change-calendar\");\n  if (changeCalendarButton) {\n    changeCalendarButton.addEventListener(\"click\", function () {\n      if (!calendarEditMode) return;\n      const command = new Command(\"changeCalendar\", { type: calendarEditMode, mod: \"2025\" });\n      command.execute();\n      this.classList.add(\"completed\");\n      this.querySelector(\"span\").textContent = \"Applied\";\n    });\n  }\n\n  const changePerformanceButton = mods2025View.querySelector(\".change-performance\");\n  if (changePerformanceButton) {\n    changePerformanceButton.addEventListener(\"click\", function () {\n      const command = new Command(\"changePerformance\", { mod: \"2025\" });\n      command.execute();\n\n      const mclaren = mods2025View.querySelector(\".mclaren-performance\");\n      const redbull = mods2025View.querySelector(\".redbull-performance\");\n      const williams = mods2025View.querySelector(\".williams-performance\");\n      if (mclaren) mclaren.innerText = \"63.7%\";\n      if (redbull) redbull.innerText = \"59.4%\";\n      if (williams) williams.innerText = \"56.8%\";\n\n      this.classList.add(\"completed\");\n      this.querySelector(\"span\").textContent = \"Applied\";\n    });\n  }\n}\n\nexport function initSeasonMods() {\n  const seasonModsDiv = document.getElementById(\"season_mods\");\n  if (!seasonModsDiv) return;\n\n  initModsSeasonPills();\n  initMods2025Actions();\n  initMods2026Actions();\n\n  if (seasonModsDiv.dataset.modsIllumInit !== \"1\") {\n    seasonModsDiv.dataset.modsIllumInit = \"1\";\n    let wasVisible = seasonModsIsVisible();\n\n    const syncVisibility = () => {\n      const visible = seasonModsIsVisible();\n      if (visible === wasVisible) return;\n      wasVisible = visible;\n\n      if (!visible) {\n        clearMods2026Illumination();\n        return;\n      }\n\n      const mods2026Pill = document.getElementById(\"mods2026Pill\");\n      if (mods2026Pill && mods2026Pill.classList.contains(\"active\")) {\n        scheduleMods2026Illumination();\n      }\n    };\n\n    const mo = new MutationObserver(syncVisibility);\n    mo.observe(seasonModsDiv, { attributes: true, attributeFilter: [\"class\"] });\n\n    if (wasVisible) {\n      const mods2026Pill = document.getElementById(\"mods2026Pill\");\n      if (mods2026Pill && mods2026Pill.classList.contains(\"active\")) {\n        scheduleMods2026Illumination();\n      }\n    }\n  }\n}\n\nexport function syncAduoTpToggles(enabledRaw) {\n  const enabled = normalizeToggleEnabled(enabledRaw);\n  setAduoTpTogglesChecked(enabled);\n  syncMods2026ApplyAllButtonState();\n}\n\nexport function syncMods2026ApplyAllButtonState() {\n  const mods2026View = document.getElementById(\"mods2026View\");\n  if (!mods2026View) return;\n\n  const applyAllButton = mods2026View.querySelector(\".apply-all-2026\");\n  if (!applyAllButton) return;\n\n  const applyAllText = applyAllButton.querySelector(\"span\");\n  const aduoToggle = mods2026View.querySelector(\".change-aduo-tps-2026\");\n\n  const remaining = mods2026View.querySelectorAll(\n    \".one-change-button:not(.completed):not(.disabled)\"\n  ).length;\n\n  const allApplied = remaining === 0 && (!aduoToggle || aduoToggle.classList.contains(\"completed\"));\n\n  applyAllButton.classList.toggle(\"applied\", allApplied);\n  if (applyAllText) applyAllText.textContent = allApplied ? \"Applied\" : \"Apply all\";\n}\n\nexport function syncMods2025Dependencies() {\n  const mods2025View = document.getElementById(\"mods2025View\");\n  if (!mods2025View) return;\n\n  const extraDriversButton = mods2025View.querySelector(\".extra-drivers\");\n  const lineUpsButton = mods2025View.querySelector(\".change-line-ups\");\n  if (!lineUpsButton) return;\n\n  if (lineUpsButton.classList.contains(\"completed\")) {\n    lineUpsButton.classList.remove(\"disabled\");\n    return;\n  }\n\n  const hasExtraDrivers = !!(extraDriversButton && extraDriversButton.classList.contains(\"completed\"));\n  const lineUpsText = lineUpsButton.querySelector(\"span\");\n\n  lineUpsButton.classList.toggle(\"disabled\", !hasExtraDrivers);\n  if (lineUpsText) {\n    lineUpsText.textContent = hasExtraDrivers ? \"Apply\" : \"Requires extra drivers\";\n  }\n}\n\nexport function syncMods2026Dependencies() {\n  const mods2026View = document.getElementById(\"mods2026View\");\n  if (!mods2026View) return;\n\n  const extraDriversButton = mods2026View.querySelector(\".extra-drivers-2026\");\n  const lineUpsButton = mods2026View.querySelector(\".change-line-ups-2026\");\n  if (!lineUpsButton) return;\n\n  if (lineUpsButton.classList.contains(\"completed\")) {\n    lineUpsButton.classList.remove(\"disabled\");\n    return;\n  }\n\n  const hasExtraDrivers = !!(extraDriversButton && extraDriversButton.classList.contains(\"completed\"));\n  const lineUpsText = lineUpsButton.querySelector(\"span\");\n\n  lineUpsButton.classList.toggle(\"disabled\", !hasExtraDrivers);\n  if (lineUpsText) {\n    lineUpsText.textContent = hasExtraDrivers ? \"Apply\" : \"Requires extra drivers\";\n  }\n}\n\nexport function updateMod2026Blocking(data) {\n  const mods2026View = document.getElementById(\"mods2026View\");\n  if (!mods2026View) return;\n\n  const timeTravelButton = mods2026View.querySelector(\".time-travel-2026\");\n  const timeTravelText = timeTravelButton ? timeTravelButton.querySelector(\"span\") : null;\n  const changeCalendarButton = mods2026View.querySelector(\".change-calendar-2026\");\n  const changeCalendarText = changeCalendarButton ? changeCalendarButton.querySelector(\"span\") : null;\n\n  const modBlocking = mods2026View.querySelector(\".mod-blocking.mods-2026-blocking\");\n  const changesGrid = mods2026View.querySelector(\".grid-and-downloads\");\n  const recommendedDownloads = mods2026View.querySelector(\".recommended-downloads\");\n\n  calendarEditMode2026 = null;\n\n  const allowTimeTravel = data === \"Start2024\" || data === \"AlreadyEdited\";\n  if (timeTravelButton && !timeTravelButton.classList.contains(\"completed\")) {\n    timeTravelButton.classList.toggle(\"disabled\", !allowTimeTravel);\n    if (timeTravelText) timeTravelText.textContent = allowTimeTravel ? \"Apply\" : \"Disabled\";\n  }\n\n  const allowCalendarEdit = data === \"Start2024\" || data === \"AlreadyEdited\";\n  if (allowCalendarEdit) {\n    calendarEditMode2026 = data;\n  }\n\n  if (changeCalendarButton && !changeCalendarButton.classList.contains(\"completed\")) {\n    changeCalendarButton.classList.toggle(\"disabled\", !allowCalendarEdit);\n    if (changeCalendarText) changeCalendarText.textContent = allowCalendarEdit ? \"Apply\" : \"Disabled\";\n  }\n\n  if (!modBlocking) return;\n  if (data === \"AlreadyEdited\" || data === \"Start2024\" ) {\n    modBlocking.classList.add(\"d-none\");\n    changesGrid.classList.remove(\"d-none\");\n    recommendedDownloads.classList.remove(\"d-none\");\n  } else {\n    modBlocking.classList.remove(\"d-none\");\n    changesGrid.classList.add(\"d-none\");\n    recommendedDownloads.classList.add(\"d-none\");\n  }\n}\n\nexport function updateMod2025Blocking(data) {\n  const mods2025View = document.getElementById(\"mods2025View\");\n  if (!mods2025View) return;\n\n  const modBlocking = mods2025View.querySelector(\".mod-blocking\");\n  const changesGrid = mods2025View.querySelector(\".changes-grid\");\n  const timeTravelButton = mods2025View.querySelector(\".time-travel\");\n  const timeTravelText = timeTravelButton ? timeTravelButton.querySelector(\"span\") : null;\n\n  if (!modBlocking || !changesGrid) return;\n\n  if (data === \"AlreadyEdited\") {\n    modBlocking.classList.add(\"d-none\");\n    changesGrid.classList.remove(\"d-none\");\n  } else if (data === \"Start2024\") {\n    modBlocking.classList.add(\"d-none\");\n    changesGrid.classList.remove(\"d-none\");\n\n    if (timeTravelButton) timeTravelButton.classList.remove(\"disabled\");\n    if (timeTravelText) timeTravelText.textContent = \"Apply\";\n    calendarEditMode = data;\n  } else if (data === \"Direct2025\" || data === \"End2024\") {\n    modBlocking.classList.add(\"d-none\");\n    changesGrid.classList.remove(\"d-none\");\n\n    if (timeTravelButton) timeTravelButton.classList.add(\"disabled\");\n    if (timeTravelText) timeTravelText.textContent = \"Disabled\";\n    calendarEditMode = data;\n  } else {\n    modBlocking.classList.remove(\"d-none\");\n    changesGrid.classList.add(\"d-none\");\n  }\n}\n\n"
  },
  {
    "path": "src/js/frontend/seasonViewer.js",
    "content": "import { races_names, names_full, team_dict, codes_dict, countries_data, combined_dict, logos_disc, races_map, driversTableLogosDict, f1_teams, f2_teams, f3_teams } from \"./config\";\nimport { resetH2H, queueAutoCompareDrivers } from './head2head';\nimport { game_version, custom_team, manageSaveButton, new_update_notifications, seasonModData, updateFront } from \"./renderer\";\nimport { insert_space, manageColor, setCurrentSeason, format_name } from \"./transfers\";\nimport { news_insert_space } from \"../backend/scriptUtils/newsUtils.js\";\nimport { Command } from \"../backend/command.js\";\n\n\n\n\nlet seasonTable;\nlet teamsTable;\nlet races_ids = []\nlet seasonResults;\nlet calendarData;\nlet pointsOrPos = \"points\"\nlet currentFormula = 1\nlet alphaReplace = \"alphatauri\"\nlet alpineReplace = \"alpine\"\nlet alfaReplace = \"alfa\"\nlet redbullReplace = \"redbull\"\nlet astonReplace = \"aston\"\nlet williamsReplace = \"williams\"\nlet haasReplace = \"haas\"\nlet driverOrTeams = \"drivers\"\nlet isYearSelected = false\nlet racesLeftCount = 0, sprintsLeft = 0;\nexport let engine_allocations;\nlet driverCells;\nlet teamCells;\nlet standingsDetailsEnabled = false;\nlet qualifyingHeightListenerAttached = false;\nlet winsHeightListenerAttached = false;\nlet driversStandingsHeightListenerAttached = false;\nlet teamsStandingsHeightListenerAttached = false;\nlet comparisonsHeightListenerAttached = false;\nconst sessionResultsEventsCache = new Map();\nlet sessionResultsActiveGpAnchor = null;\nlet sessionResultsActiveGpMeta = null;\nlet sessionResultsLastFetched = null;\nlet sessionResultsEditMode = false;\nlet sessionResultsDraggedRow = null;\nlet sessionResultsDragRaf = 0;\nlet sessionResultsDragY = 0;\nlet sessionResultsPointsInfo = null;\nlet sessionResultsPointsInfoPromise = null;\nlet sessionResultsCompactMode = false;\n\nfunction ensureDropdownCheckIcons(menuEl) {\n    if (!menuEl) return;\n    menuEl.querySelectorAll(\".redesigned-dropdown-item\").forEach((item) => {\n        if (item.dataset.noCheck === \"1\") return;\n        if (item.closest(\".dropdown-submenu-menu\")) return;\n        if (item.querySelector(\"i.bi-check\")) return;\n        const icon = document.createElement(\"i\");\n        icon.classList.add(\"bi\", \"bi-check\", \"unactive\");\n        item.appendChild(icon);\n    });\n}\n\nfunction syncDropdownCheckIcons(menuEl, isSelected) {\n    if (!menuEl || typeof isSelected !== \"function\") return;\n    ensureDropdownCheckIcons(menuEl);\n    menuEl.querySelectorAll(\".redesigned-dropdown-item\").forEach((item) => {\n        const selected = Boolean(isSelected(item));\n        item.querySelector(\"i.bi-check\")?.classList.toggle(\"unactive\", !selected);\n    });\n}\n\nfunction syncTableTypeDropdownChecks() {\n    const menu = document.getElementById(\"tableTypeDropdown\");\n    syncDropdownCheckIcons(menu, (item) => item.dataset.value === String(pointsOrPos));\n}\n\nfunction syncSeriesTypeDropdownChecks() {\n    const menu = document.getElementById(\"seriesTypeDropdown\");\n    const selected = document.getElementById(\"seriesTypeButton\")?.dataset?.value ?? String(currentFormula);\n    syncDropdownCheckIcons(menu, (item) => item.dataset.value === String(selected));\n}\n\nfunction syncRecordsTypeDropdownChecks() {\n    const menu = document.getElementById(\"recordsTypeDropdown\");\n    const selected = document.getElementById(\"recordsTypeButton\")?.dataset?.value;\n    syncDropdownCheckIcons(menu, (item) => item.dataset.value === String(selected));\n}\n\nfunction syncYearDropdownChecks() {\n    const menu = document.getElementById(\"yearMenu\");\n    const selected = document.getElementById(\"yearButton\")?.dataset?.year;\n    syncDropdownCheckIcons(menu, (item) => item.dataset.year === String(selected));\n}\n\nfunction applyStandingsDetailsState() {\n    const seasonViewer = document.getElementById(\"season_viewer\");\n    const button = document.getElementById(\"standingsDetailsButton\");\n    const label = button?.querySelector(\"span\");\n    const eyeIcon = button?.querySelector(\"i.bi-eye\");\n    const eyeSlashIcon = button?.querySelector(\"i.bi-eye-slash\");\n\n    if (seasonViewer) {\n        seasonViewer.classList.toggle(\"standings-details-enabled\", standingsDetailsEnabled);\n    }\n\n    if (label) {\n        label.textContent = standingsDetailsEnabled ? \"Hide details\" : \"Show details\";\n    }\n\n    if (eyeIcon && eyeSlashIcon) {\n        eyeIcon.style.display = standingsDetailsEnabled ? \"inline\" : \"none\";\n        eyeSlashIcon.style.display = standingsDetailsEnabled ? \"none\" : \"inline\";\n    }\n}\n\nfunction setStandingsPositionChange(changeDiv, lastPositionChange) {\n    if (!changeDiv) return;\n    const numberEl = changeDiv.querySelector(\".standings-pos-change-number\");\n    const iconEl = changeDiv.querySelector(\"i\");\n    // In DB: negative = gained positions, positive = lost positions.\n    // UI: positive = gained, negative = lost.\n    const dbChange = Number(lastPositionChange) || 0;\n    const change = -dbChange;\n\n    changeDiv.classList.remove(\"up\", \"down\", \"neutral\");\n\n    if (numberEl) {\n        numberEl.textContent = `${Math.abs(change)}`;\n    }\n\n    if (iconEl) {\n        if (change > 0) {\n            iconEl.className = \"bi bi-caret-up-fill\";\n            changeDiv.classList.add(\"up\");\n        }\n        else if (change < 0) {\n            iconEl.className = \"bi bi-caret-down-fill\";\n            changeDiv.classList.add(\"down\");\n        }\n        else {\n            iconEl.className = \"bi bi-dash\";\n            changeDiv.classList.add(\"neutral\");\n        }\n    }\n}\n\nfunction setStandingsPointsGap(gapDiv, gapToLeader) {\n    if (!gapDiv) return;\n    const gap = Number(gapToLeader);\n    gapDiv.textContent = gap === 0 ? \"0\" : `+${Math.max(0, gap)}`;\n}\n\nfunction updateStandingsPointsGaps(rows, leaderPoints) {\n    rows.forEach((row) => {\n        const gap = Number(leaderPoints) - Number(row.points);\n        setStandingsPointsGap(row.pointsGapDiv, gap);\n    });\n}\n\ndocument.getElementById(\"standingsDetailsButton\").addEventListener(\"click\", function () {\n    standingsDetailsEnabled = !standingsDetailsEnabled;\n    applyStandingsDetailsState();\n});\napplyStandingsDetailsState();\n\n\nexport let engine_names = { //this one is changed as the user adds engines, so it will stayhere\n    1: \"Ferrari\",\n    4: \"Rbpt\",\n    7: \"Mercedes\",\n    10: \"Renault\"\n}\n\nexport function addEngineName(id, name) {\n    engine_names[id] = name\n}\n\nexport function deleteEngineName(id) {\n    delete engine_names[id]\n}\n\nexport function setEngineAllocations(allocations) {\n    engine_allocations = allocations\n}\n\nexport function getEngineLogoSrc(name) {\n    const normalized = String(name || \"\").toLowerCase()\n    if (normalized.includes(\"ferrari\")) return \"../assets/images/logos/ferrari.png\"\n    if (normalized.includes(\"rbpt\") || normalized.includes(\"red bull\")) return \"../assets/images/logos/redbull.png\"\n    if (normalized.includes(\"mercedes\")) return \"../assets/images/logos/mercedes.png\"\n    if (normalized.includes(\"renault\")) return \"../assets/images/logos/renault.png\"\n    if (normalized.includes(\"honda\")) return \"../assets/images/logos/honda.png\"\n    if (normalized.includes(\"audi\")) return \"../assets/images/logos/audi.png\"\n    if (normalized.includes(\"ford\")) return \"../assets/images/logos/ford.png\"\n    if (normalized.includes(\"bmw\")) return \"../assets/images/logos/bmw.png\"\n    if (normalized.includes(\"porsche\")) return \"../assets/images/logos/porsche.png\"\n    if (normalized.includes(\"toyota\")) return \"../assets/images/logos/toyota.png\"\n    //if name contains baby we should return this emoji ☺️ \n    if (normalized.includes(\"babi\")) return emojiToDataUri(\"☺️\");\n    return \"../assets/images/engine.png\"\n}\n\nfunction emojiToDataUri(emoji) {\n  const svg = `\n    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"100\" viewBox=\"-10 -10 120 120\">\n      <text x=\"50\" y=\"50\"\n            text-anchor=\"middle\"\n            dominant-baseline=\"middle\"\n            font-size=\"100\"\n            font-family=\"Apple Color Emoji, Segoe UI Emoji, Noto Color Emoji, sans-serif\">\n        ${emoji}\n      </text>\n    </svg>\n  `.trim();\n\n  return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\n\n\nexport function resetViewer() {\n    if (seasonTable) {\n        seasonTable.destroy()\n    }\n    pointsOrPos = \"points\"\n    if (teamsTable) {\n        teamsTable.destroy()\n    }\n}\n\nexport function resetYearButtons() {\n    document.getElementById(\"yearButton\").textContent = \"Year\"\n    isYearSelected = false\n    manage_show_tables()\n    document.getElementById(\"yearButtonH2H\").textContent = \"Year\"\n    document.getElementById(\"yearPredictionButton\").textContent = \"Year\"\n    document.getElementById(\"yearPredictionModalButton\").textContent = \"Year\"\n}\n\n\n\n/**\n * Pills for the drivers and teams tables\n */\ndocument.getElementById(\"driverspill\").addEventListener(\"click\", function () {\n    driverOrTeams = \"drivers\"\n    manageDriversTeamsModeChanged()\n})\n\ndocument.getElementById(\"teamspill\").addEventListener(\"click\", function () {\n    driverOrTeams = \"teams\"\n    manageDriversTeamsModeChanged()\n})\n\nfunction manageDriversTeamsModeChanged() {\n    updateAllTimeVisibilityForTeamsRecords();\n    updateTopPanelControlsVisibility();\n    const typeVal = document.querySelector(\"#recordsTypeButton\")?.dataset?.value;\n    if (typeVal === \"standings\") {\n        manage_show_tables();\n        return;\n    }\n    if (typeVal === \"seasonreview\") {\n        return;\n    }\n    manageRecordsSelected(null);\n}\n\nfunction updateAllTimeVisibilityForTeamsRecords() {\n    const allTime = document.getElementById(\"allTimeRecords\");\n    if (!allTime) return;\n\n    const typeVal = document.querySelector(\"#recordsTypeButton\")?.dataset?.value;\n    const allowAllTime = currentFormula === 1 && driverOrTeams !== \"teams\" && typeVal !== \"standings\" && typeVal !== \"seasonreview\" && typeVal !== \"sessionresults\";\n    allTime.classList.toggle(\"d-none\", !allowAllTime);\n}\n\nfunction updateTopPanelControlsVisibility() {\n    const typeVal = document.querySelector(\"#recordsTypeButton\")?.dataset?.value;\n    const showStandingsOnlyControls = typeVal === \"standings\";\n    const hideDriversTeamsPills = typeVal === \"seasonreview\" || typeVal === \"sessionresults\";\n\n    const editToggle = document.getElementById(\"sessionResultsEditToggle\");\n    if (editToggle) {\n        const meta = sessionResultsLastFetched?.meta || {};\n        const sessionKeyLower = String(sessionResultsLastFetched?.sessionKey ?? meta?.sessionKey ?? \"\").toLowerCase();\n        const showEdit = typeVal === \"sessionresults\" && (sessionKeyLower === \"race\" || sessionKeyLower === \"sprintrace\");\n        editToggle.classList.toggle(\"d-none\", !showEdit);\n    }\n    const compactToggle = document.getElementById(\"sessionResultsCompactToggle\");\n    if (compactToggle) {\n        compactToggle.classList.toggle(\"d-none\", typeVal !== \"sessionresults\");\n    }\n\n    const exportBtn = document.getElementById(\"sessionResultsExportRltoolsButton\");\n    if (exportBtn) {\n        exportBtn.classList.toggle(\"d-none\", typeVal !== \"sessionresults\");\n    }\n\n    const driversTeamsPills = document.querySelector(\"#season_viewer .drivers-teams-pills\");\n    if (driversTeamsPills) {\n        driversTeamsPills.classList.toggle(\"d-none\", hideDriversTeamsPills);\n    }\n\n    const standingsDetailsButton = document.getElementById(\"standingsDetailsButton\");\n    if (standingsDetailsButton) {\n        standingsDetailsButton.classList.toggle(\"d-none\", !showStandingsOnlyControls);\n    }\n\n    const tableTypeWrapper = document.getElementById(\"tableTypeButton\")?.closest(\".dropdown-global\");\n    if (tableTypeWrapper) {\n        tableTypeWrapper.classList.toggle(\"d-none\", !showStandingsOnlyControls);\n    }\n\n    const hideHistoric = document.querySelector(\".hide-historic-drivers\");\n    if (hideHistoric) {\n        const showHideHistoric = currentFormula === 1 && !showStandingsOnlyControls && typeVal !== \"seasonreview\" && typeVal !== \"sessionresults\" && driverOrTeams !== \"teams\";\n        hideHistoric.classList.toggle(\"d-none\", !showHideHistoric);\n    }\n\n    updateAllTimeVisibilityForTeamsRecords();\n}\n\n\nfunction manage_show_tables() {\n    const recordsList = document.querySelector(\".records-list\")\n    recordsList.innerHTML = \"\"\n    recordsList.classList.add(\"d-none\")\n    const sessionResultsTable = document.querySelector(\".session-results-table\")\n    if (sessionResultsTable) sessionResultsTable.classList.add(\"d-none\")\n    const seasonReviewBento = document.querySelector(\".season-review-bento\")\n    seasonReviewBento.classList.add(\"d-none\")\n    if (isYearSelected) {\n        if (driverOrTeams === \"drivers\") {\n            document.querySelector(\".teams-table\").classList.add(\"d-none\")\n            document.querySelector(\".drivers-table\").classList.remove(\"d-none\")\n        }\n        else {\n            document.querySelector(\".teams-table\").classList.remove(\"d-none\")\n            document.querySelector(\".drivers-table\").classList.add(\"d-none\")\n        }\n    }\n    else {\n        document.querySelector(\".teams-table\").classList.add(\"d-none\")\n        document.querySelector(\".drivers-table\").classList.add(\"d-none\")\n    }\n}\n\ndocument.querySelectorAll(\"#tableTypeDropdown a\").forEach(function (elem) {     \n    elem.addEventListener(\"click\", function () {\n        pointsOrPos = elem.dataset.value\n        //count time to execute the function\n        let start = performance.now()\n        change_points_pos_drivers()\n        let end = performance.now()\n        start = performance.now()\n        change_points_pos_teams()\n        end = performance.now()\n        document.querySelector(\"#tableTypeButton span\").textContent = elem.textContent\n        syncTableTypeDropdownChecks()\n    })\n})\n\nfunction forceStandingsCurrentSeason() {\n    const recordsButton = document.getElementById(\"recordsTypeButton\")\n    const standingsItem = document.querySelector(\"#recordsTypeDropdown a[data-value='standings']\")\n    if (recordsButton) {\n        recordsButton.dataset.value = \"standings\"\n        const label = recordsButton.querySelector(\"span.dropdown-label\")\n        if (label) {\n            label.textContent = standingsItem ? standingsItem.textContent : \"Standings\"\n        }\n    }\n    syncRecordsTypeDropdownChecks()\n    updateTopPanelControlsVisibility();\n\n    const yearMenu = document.querySelector(\"#yearMenu\")\n    const yearItems = yearMenu ? Array.from(yearMenu.querySelectorAll(\"a\")) : []\n    if (yearItems.length > 1) {\n        const currentYearEl = yearItems.find(item => item.dataset.year !== \"all\")\n        if (currentYearEl) {\n            manageRecordsSelected(currentYearEl)\n        }\n    }\n}\n\nfunction updateSeriesControls() {\n    const showRecordsControls = currentFormula === 1\n    const recordsWrapper = document.getElementById(\"recordsTypeButton\")?.closest(\".dropdown-global\")\n    const yearWrapper = document.getElementById(\"yearButton\")?.closest(\".dropdown-global\")\n    if (recordsWrapper) {\n        recordsWrapper.classList.toggle(\"d-none\", !showRecordsControls)\n    }\n    if (yearWrapper) {\n        yearWrapper.classList.toggle(\"d-none\", !showRecordsControls)\n    }\n}\n\ndocument.querySelectorAll(\"#seriesTypeDropdown a\").forEach(function (elem) {    \n    elem.addEventListener(\"click\", function () {\n        const value = parseInt(elem.dataset.value, 10)\n        currentFormula = value\n        const seriesButton = document.getElementById(\"seriesTypeButton\")        \n        seriesButton.querySelector(\"span.dropdown-label\").textContent = elem.textContent\n        seriesButton.dataset.value = elem.dataset.value\n        syncSeriesTypeDropdownChecks()\n        updateSeriesControls()\n        if (currentFormula !== 1) {\n            forceStandingsCurrentSeason()\n        }\n        else if (document.querySelector(\"#recordsTypeButton\").dataset.value === \"standings\") {\n            manageRecordsSelected(null)\n        }\n    })\n})\n\n\n\n\nfunction change_points_pos_drivers() {\n    driverCells.forEach(function (cell) {\n        if (cell.dataset[pointsOrPos] !== undefined) {\n            cell.innerText = cell.dataset[pointsOrPos]\n        }\n        else {\n            cell.innerText = \"-\"\n        }\n    })\n}\n\nfunction renderTeamCellList(cell, values) {\n    cell.innerHTML = \"\"\n    if (!Array.isArray(values) || values.length === 0) {\n        cell.innerText = \"-\"\n        return\n    }\n    const container = document.createElement(\"div\")\n    container.className = \"teams-table-multi\"\n    values.forEach((value) => {\n        const item = document.createElement(\"div\")\n        item.className = \"teams-table-multi-item\"\n        item.textContent = value\n        container.appendChild(item)\n    })\n    cell.appendChild(container)\n}\n\nfunction change_points_pos_teams() {\n    teamCells.forEach(function (cell) {\n        if (currentFormula === 3 && (pointsOrPos === \"pos\" || pointsOrPos === \"quali\")) {\n            const listKey = pointsOrPos === \"pos\" ? \"poslist\" : \"qualilist\"\n            if (cell.dataset[listKey]) {\n                try {\n                    const values = JSON.parse(cell.dataset[listKey])\n                    renderTeamCellList(cell, values)\n                    return\n                } catch (err) {\n                    // fall back to text if data is malformed\n                }\n            }\n        }\n        if (cell.dataset[pointsOrPos] !== undefined) {\n            cell.innerText = cell.dataset[pointsOrPos]\n        }\n        else {\n            cell.innerText = \"-\"\n        }\n    })\n\n}\n\nfunction getTeamAbbr(teamId) {\n    const abbr = team_dict[teamId]\n    return abbr ? abbr.toUpperCase() : \"\"\n}\n\nfunction buildTeamAbbrElement(teamId, sizeClass) {\n    const abbr = getTeamAbbr(teamId)\n    const abbrDiv = document.createElement(\"div\")\n    abbrDiv.classList = \"team-logo-abbr\"\n    if (sizeClass) {\n        abbrDiv.classList.add(sizeClass)\n    }\n    //get team logo from logos_disc if exists\n    let logo_src = logos_disc[teamId]\n    if (logo_src) {\n        let logo = document.createElement(\"img\")\n        logo.classList = sizeClass\n        logo.dataset.teamid = teamId\n        logo.setAttribute(\"src\", logo_src)\n        abbrDiv.appendChild(logo)\n    }\n    else{\n        abbrDiv.textContent = abbr\n    }\n    return abbrDiv\n}\n\nfunction createHeaderCell(trackId, labelSuffix = \"\", baseClass = \"drivers-table-normal\") {\n    let headerPos = document.createElement(\"div\")\n    headerPos.className = `${baseClass} bold-font flag-header`\n    let headerPosFlag = document.createElement(\"img\")\n    let race = races_map[trackId]\n    let flag_src = codes_dict[race]\n    headerPosFlag.src = flag_src\n    let headerPosDiv = document.createElement(\"div\")\n    headerPosDiv.classList.add(\"text-in-front\")\n    headerPosDiv.classList.add(\"bold-font\")\n    headerPosDiv.innerText = labelSuffix ? `${labelSuffix}` : races_names[trackId]\n    if (labelSuffix === \"SPR\") {\n        headerPosDiv.classList.add(\"sprint-label\")\n        headerPosDiv.classList.add(\"sprint-result-cell\")\n    }\n    headerPos.appendChild(headerPosFlag)\n    headerPos.appendChild(headerPosDiv)\n    return headerPos\n}\n\nfunction formatDriverCellValue(value, type) {\n    if (value === null || value === undefined) {\n        return \"-\"\n    }\n    return manage_dataset_info_driver(value, undefined, type)\n}\n\nfunction syncFormulaFromCalendar(formula) {\n    const seriesButton = document.getElementById(\"seriesTypeButton\")        \n    if (seriesButton) {\n        const label = formula === 2 ? \"F2\" : (formula === 3 ? \"F3\" : \"F1\")\n        seriesButton.querySelector(\"span.dropdown-label\").textContent = label\n        seriesButton.dataset.value = String(formula)\n    }\n\n    syncSeriesTypeDropdownChecks()\n    \n    updateSeriesControls()\n}\n\nexport function new_drivers_table(data) {\n    calendarData = data\n    syncFormulaFromCalendar(currentFormula)\n    races_ids = []\n    let header = document.querySelector(\".drivers-table-header\")\n    header.innerHTML = \"\"\n    let driverDiv = document.createElement(\"div\")\n    driverDiv.classList = \"drivers-table-driver bold-font\"\n    driverDiv.innerText = \"DRIVER\"\n    let PositionDiv = document.createElement(\"div\")\n    PositionDiv.classList = \"drivers-table-position bold-font\"\n    PositionDiv.innerText = \"#\"\n    header.appendChild(PositionDiv)\n    let posChangeHeader = document.createElement(\"div\")\n    posChangeHeader.classList = \"standings-pos-change bold-font\"\n    posChangeHeader.innerText = \"\"\n    header.appendChild(posChangeHeader)\n    header.appendChild(driverDiv)\n    const isF1 = currentFormula === 1\n    const driversData = document.querySelector(\".drivers-table-data\")\n    driversData.className = \"drivers-table-data\"\n    if (currentFormula === 2) {\n        driversData.classList.add(\"f2-table-data\")\n    }\n    else if (currentFormula === 3) {\n        driversData.classList.add(\"f3-table-data\")\n    }\n    data.forEach(function (elem) {\n        const raceId = elem[0]\n        const trackId = elem[1]\n        races_ids.push(raceId)\n        if (isF1) {\n            header.appendChild(createHeaderCell(trackId))\n        }\n        else {\n            header.appendChild(createHeaderCell(trackId, \"SPR\"))\n            header.appendChild(createHeaderCell(trackId))\n        }\n    })\n    let GapDiv = document.createElement(\"div\")\n    GapDiv.classList = \"standings-points-gap bold-font\"\n    GapDiv.innerText = \"\"\n    header.appendChild(GapDiv)\n    let PointsDiv = document.createElement(\"div\")\n    PointsDiv.classList = \"drivers-table-points bold-font\"\n    PointsDiv.innerText = \"PTS\"\n    header.appendChild(PointsDiv)\n\n}\n\nexport function new_teams_table(data) {\n    calendarData = data\n    races_ids = []\n    let header = document.querySelector(\".teams-table-header\")\n    header.innerHTML = \"\"\n    let driverDiv = document.createElement(\"div\")\n    driverDiv.classList = \"teams-table-team bold-font\"\n    driverDiv.innerText = \"TEAM\"\n    let PositionDiv = document.createElement(\"div\")\n    PositionDiv.classList = \"teams-table-position bold-font\"\n    PositionDiv.innerText = \"#\"\n    header.appendChild(PositionDiv)\n    let posChangeHeader = document.createElement(\"div\")\n    posChangeHeader.classList = \"standings-pos-change bold-font\"\n    posChangeHeader.innerText = \"\"\n    header.appendChild(posChangeHeader)\n    header.appendChild(driverDiv)\n    const isF1 = currentFormula === 1\n    const teamsData = document.querySelector(\".teams-table-data\")\n    teamsData.className = \"teams-table-data\"\n    if (currentFormula === 2) {\n        teamsData.classList.add(\"f2-table-data\")\n    }\n    else if (currentFormula === 3) {\n        teamsData.classList.add(\"f3-table-data\")\n    }\n    data.forEach(function (elem) {\n        const raceId = elem[0]\n        const trackId = elem[1]\n        races_ids.push(raceId)\n        if (isF1) {\n            header.appendChild(createHeaderCell(trackId, \"\", \"teams-table-normal\"))\n        }\n        else {\n            header.appendChild(createHeaderCell(trackId, \"SPR\", \"teams-table-normal\"))\n            header.appendChild(createHeaderCell(trackId, \"\", \"teams-table-normal\"))\n        }\n    })\n    let GapDiv = document.createElement(\"div\")\n    GapDiv.classList = \"standings-points-gap bold-font\"\n    GapDiv.innerText = \"\"\n    header.appendChild(GapDiv)\n    let PointsDiv = document.createElement(\"div\")\n    PointsDiv.classList = \"teams-table-points bold-font\"\n    PointsDiv.innerText = \"PTS\"\n    header.appendChild(PointsDiv)\n}\n\nfunction checkscroll() {\n    let datazone = document.querySelector(\".drivers-table-data\")\n    let pointscol = document.querySelector(\".drivers-table-header\").querySelector(\".drivers-table-points\")\n    if (datazone.scrollHeight > datazone.clientHeight) {\n        pointscol.style.width = \"84px\"\n    }\n    else {\n        pointscol.style.width = \"80px\"\n    }\n}\n\nfunction new_color_drivers_table() {\n    let datazone = document.querySelector(\".drivers-table-data\");\n    let rows = datazone.querySelectorAll(\".drivers-table-row\");\n\n    rows.forEach(function (row) {\n        let cells = row.querySelectorAll(\".drivers-table-normal\");\n\n        cells.forEach(function (cell) {\n            let pos = cell.dataset.pos;\n\n            if (pos) {\n                let match = pos.match(/^(\\d)(?:\\s*\\(.*\\))?$/);\n                if (match) {\n                    let number = match[1];\n                    if (number === \"1\") {\n                        cell.classList.add(\"first\");\n                    } else if (number === \"2\") {\n                        cell.classList.add(\"second\");\n                    } else if (number === \"3\") {\n                        cell.classList.add(\"third\");\n                    }\n                }\n            }\n\n            if (cell.dataset.fastlap === \"1\") {\n                cell.classList.add(\"fastest\");\n            }\n            if (cell.dataset.dotd === \"true\") {\n                cell.classList.add(\"dotd\");\n            }\n            if (cell.dataset.quali === \"1\") {\n                cell.style.fontFamily = \"Formula1Bold\";\n            }\n        });\n    });\n}\n\n\nfunction manage_teams_table_logos() {\n    let logos = document.querySelectorAll(\".teams-table-logo-inner\")\n    logos.forEach(function (logo) {\n        if (logo.dataset.teamid === \"1\") {\n            logo.className = \"teams-table-logo-inner ferrari-team-table-logo\"\n        }\n        else if (logo.dataset.teamid === \"2\") {\n            if (logo.tagName === \"IMG\") {\n                const newElem = document.createElement(\"div\");\n                newElem.className = \"teams-table-logo-inner mclaren-team-table-logo\";\n                newElem.dataset.teamid = logo.dataset.teamid;\n                logo.replaceWith(newElem);\n                logo = newElem;\n            }\n            else {\n                logo.className = \"teams-table-logo-inner mclaren-team-table-logo\";\n            }\n        }\n        else if (logo.dataset.teamid === \"3\") {\n            if (redbullReplace === \"redbull\") {\n                logo.className = \"teams-table-logo-inner redbull-team-table-logo\"\n            }\n            else if (redbullReplace === \"ford\") {\n                logo.className = \"teams-table-logo-inner ford-team-table-logo\"\n            }\n            logo.src = logos_disc[3]\n        }\n        else if (logo.dataset.teamid === \"4\") {\n            logo.className = \"teams-table-logo-inner merc-team-table-logo\"\n        }\n        else if (logo.dataset.teamid === \"5\") {\n            if (alpineReplace === \"alpine\") {\n                logo.className = \"teams-table-logo-inner alpine-team-table-logo\"\n            }\n            else if (alpineReplace === \"andretti\") {\n                logo.className = \"teams-table-logo-inner ferrari-team-table-logo\"\n                logo.src = \"../assets/images/logos/andretti2.png\"\n            }\n            else if (alpineReplace === \"renault\") {\n                logo.className = \"teams-table-logo-inner ferrari-team-table-logo\"\n                logo.src = \"../assets/images/logos/renault2.png\"\n            }\n            else if (alpineReplace === \"cadillac\") {\n                logo.className = \"teams-table-logo-inner cadillac-team-table-logo\"\n                logo.src = logos_disc[5]\n            }\n            else if (alpineReplace === \"lotus\") {\n                logo.src = \"../assets/images/logos/lotus2.png\"\n            }\n        }\n        else if (logo.dataset.teamid === \"6\") {\n            if (williamsReplace === \"williams\") {\n            logo.className = \"teams-table-logo-inner williams-team-table-logo\" \n            }\n            else if (williamsReplace === \"bmw\") {\n                logo.className = \"teams-table-logo-inner bmw-team-table-logo\"\n            } \n            logo.src = logos_disc[6]\n        }\n        else if (logo.dataset.teamid === \"7\") {\n            if (haasReplace === \"toyota\") {\n                if (logo.tagName === \"IMG\") {\n                    const newElem = document.createElement(\"div\");\n                    newElem.className = \"teams-table-logo-inner toyota-team-table-logo\";\n                    newElem.dataset.teamid = logo.dataset.teamid;\n                    logo.replaceWith(newElem);\n                    logo = newElem;\n                }\n                else {\n                    logo.className = \"teams-table-logo-inner toyota-team-table-logo\";\n                }\n            }\n            else {\n                if (logo.tagName !== \"IMG\") {\n                    const newElem = document.createElement(\"img\");\n                    newElem.className = \"teams-table-logo-inner haas-team-table-logo\";\n                    newElem.dataset.teamid = logo.dataset.teamid;\n                    newElem.src = logos_disc[7];\n                    logo.replaceWith(newElem);\n                    logo = newElem;\n                }\n                else {\n                    logo.className = \"teams-table-logo-inner haas-team-table-logo\";\n                    logo.src = logos_disc[7];\n                }\n            }\n        }\n        else if (logo.dataset.teamid === \"8\") {\n            if (alphaReplace === \"alphatauri\") {\n                logo.className = \"teams-table-logo-inner alphatauri-team-table-logo\"\n            }\n            else if (alphaReplace === \"visarb\") {\n                logo.className = \"teams-table-logo-inner merc-team-table-logo\"\n            }\n            else if (alphaReplace === \"hugo\") {\n                logo.className = \"teams-table-logo-inner hugo-team-table-logo\"\n            }\n            else if (alphaReplace === \"toyota\") {\n                if (logo.tagName === \"IMG\") {\n                    const newElem = document.createElement(\"div\");\n                    newElem.className = \"teams-table-logo-inner toyota-team-table-logo\";\n                    newElem.dataset.teamid = logo.dataset.teamid;\n                    logo.replaceWith(newElem);\n                    logo = newElem;\n                }\n                else {\n                    logo.className = \"teams-table-logo-inner toyota-team-table-logo\";\n                }\n            }\n            else if (alphaReplace === \"porsche\") {\n                logo.className = \"teams-table-logo-inner porsche-team-table-logo\"\n            }\n            else if (alphaReplace === \"brawn\") {\n                logo.className = \"teams-table-logo-inner brawn-team-table-logo\"\n                logo.src = \"../assets/images/logos/brawn2.png\"\n            }\n\n            if (alphaReplace !== \"toyota\" && logo.tagName !== \"IMG\") {\n                const newElem = document.createElement(\"img\");\n                newElem.className = logo.className;\n                newElem.dataset.teamid = logo.dataset.teamid;\n                newElem.src = logos_disc[8];\n                logo.replaceWith(newElem);\n                logo = newElem;\n            }\n\n            if (alphaReplace !== \"brawn\" && logo.tagName === \"IMG\") {\n                logo.src = logos_disc[8];\n            }\n        }\n        else if (logo.dataset.teamid === \"9\") {\n            if (alfaReplace === \"alfa\") {\n                logo.className = \"teams-table-logo-inner merc-team-table-logo\"\n            }\n            else if (alfaReplace === \"audi\") {\n                logo.className = \"teams-table-logo-inner audi-team-table-logo\"\n            }\n            else if (alfaReplace === \"stake\") {\n                logo.className = \"teams-table-logo-inner stake-team-table-logo\"\n            }\n            else if (alfaReplace === \"sauber\") {\n                logo.className = \"teams-table-logo-inner ferrari-team-table-logo\"\n            }\n        }\n        else if (logo.dataset.teamid === \"10\") {\n            if (astonReplace === \"aston\") {\n                logo.className = \"teams-table-logo-inner aston-team-table-logo\"\n            }\n            else if (astonReplace === \"racingpoint\") {\n                logo.className = \"teams-table-logo-inner racingpoint-team-table-logo\"\n            }\n            else if (astonReplace === \"jordan\") {\n                logo.className = \"teams-table-logo-inner jordan-team-table-logo\"\n            }\n            logo.src = logos_disc[10]\n        }\n        else if (logo.dataset.teamid === \"32\") {\n            logo.className = \"teams-table-logo-inner custom-team-table-logo custom-replace\"\n        }\n    })\n}\n\nfunction manage_teams_table_names() {\n    let names = document.querySelectorAll(\".teams-table-team\")\n    names.forEach(function (name) {\n        if (name.dataset.teamid === \"5\") {\n            if (alpineReplace === \"alpine\") {\n                name.firstChild.innerText = \"ALPINE\"\n            }\n            else if (alpineReplace === \"andretti\") {\n                name.firstChild.innerText = \"ANDRETTI\"\n            }\n            else if (alpineReplace === \"renault\") {\n                name.firstChild.innerText = \"RENAULT\"\n            }\n            else if (alpineReplace === \"cadillac\") {\n                name.firstChild.innerText = \"CADILLAC\"\n            }\n            else if (alpineReplace === \"lotus\") {\n                name.firstChild.innerText = \"LOTUS\"\n            }\n        }\n        else if (name.dataset.teamid === \"8\") {\n            if (alphaReplace === \"alphatauri\") {\n                name.firstChild.innerText = \"ALPHA TAURI\"\n            }\n            else if (alphaReplace === \"visarb\") {\n                name.firstChild.innerText = \"VISA CASHAPP RB\"\n            }\n            else if (alphaReplace === \"hugo\") {\n                name.firstChild.innerText = \"HUGO\"\n            }\n            else if (alphaReplace === \"toyota\") {\n                name.firstChild.innerText = \"TOYOTA\"\n            }\n            else if (alphaReplace === \"porsche\") {\n                name.firstChild.innerText = \"PORSCHE\"\n            }\n            else if (alphaReplace === \"brawn\") {\n                name.firstChild.innerText = \"BRAWN GP\"\n            }\n        }\n        else if (name.dataset.teamid === \"9\") {\n            if (alfaReplace === \"alfa\") {\n                name.firstChild.innerText = \"ALFA ROMEO\"\n            }\n            else if (alfaReplace === \"audi\") {\n                name.firstChild.innerText = \"AUDI\"\n            }\n            else if (alfaReplace === \"stake\") {\n                name.firstChild.innerText = \"STAKE SAUBER\"\n            }\n            else if (alfaReplace === \"sauber\") {\n                name.firstChild.innerText = \"SAUBER\"\n            }\n        }\n        else if (name.dataset.teamid === \"3\") {\n            if (redbullReplace === \"redbull\") {\n                name.firstChild.innerText = \"RED BULL\"\n            }\n            else if (redbullReplace === \"ford\") {\n                name.firstChild.innerText = \"FORD\"\n            }\n        }\n        else if (name.dataset.teamid === \"10\") {\n            if (astonReplace === \"aston\") {\n                name.firstChild.innerText = \"ASTON MARTIN\"\n            }\n            else if (astonReplace === \"racingpoint\") {\n                name.firstChild.innerText = \"RACING POINT\"\n            }\n            else if (astonReplace === \"jordan\") {\n                name.firstChild.innerText = \"JORDAN\"\n            }\n        }\n    })\n}\n\nfunction new_color_teams_table() {\n    let datazone = document.querySelector(\".teams-table-data\")\n    calendarData.forEach(function (race) {\n        let id = race[0]\n        let colCells = datazone.querySelectorAll(\".teams-table-normal[data-raceid='\" + id + \"']\");\n        if (colCells.length > 0) {\n            let values = [];\n            colCells.forEach(function (cell, index) {\n                let value = cell.dataset.points;\n                values.push([value, index]);\n                if (cell.dataset.quali1 === \"1\" || cell.dataset.quali2 === \"1\") {\n                    cell.style.fontFamily = \"Formula1Bold\"\n                }\n                if (cell.dataset.fastlap1 === \"1\" || cell.dataset.fastlap2 === \"1\") {\n                    cell.classList.add(\"fastest\")\n                }\n            });\n            const hasResults = values.some(([value], idx) => {\n                const text = colCells[idx].textContent?.trim();\n                return value !== undefined && value !== null && String(value) !== \"\" && text !== \"-\";\n            });\n            if (!hasResults) {\n                return;\n            }\n            values.sort((a, b) => {\n                function parseValue(val) {\n                    if (val === null || val === undefined || val === \"\") return 0;\n                    if (typeof val === \"number\") return val;\n\n                    const match = String(val).match(/^(\\d+)(?:\\((\\d+)\\))?$/);\n                    if (match) {\n                        const base = parseInt(match[1], 10);\n                        const extra = match[2] ? parseInt(match[2], 10) : 0;\n                        return base + extra;\n                    }\n                    return 0;\n                }\n\n                const totalA = parseValue(a[0]);\n                const totalB = parseValue(b[0]);\n\n                return totalB - totalA;\n            });\n            let topThree = values.slice(0, 3);\n            colCells[topThree[0][1]].classList.add(\"first\");\n            colCells[topThree[1][1]].classList.add(\"second\");\n            colCells[topThree[2][1]].classList.add(\"third\");\n\n\n        }\n    })\n}\n\nfunction order_teams_table() {\n    let datazone = document.querySelector(\".teams-table-data\")\n    let rows = datazone.querySelectorAll(\".teams-table-row\")\n    let ordered = Array.from(rows).sort((a, b) => parseInt(a.querySelector(\".teams-table-position\").innerText) - parseInt(b.querySelector(\".teams-table-position\").innerText))\n    datazone.innerHTML = \"\"\n    ordered.forEach(function (row, index) {\n        let odd = index % 2 === 0\n        if (odd) {\n            row.classList.add(\"odd\")\n        }\n        datazone.appendChild(row)\n    })\n\n}\n\nexport function new_load_drivers_table(data) {\n    seasonResults = data\n    let datazone = document.querySelector(\".drivers-table-data\")\n    let pointsInfo = data[2]\n    datazone.innerHTML = \"\"\n    data = data[0]\n    data = new_order_drivers(data)\n    let driver1Poitns = 0, driver2Points = 0;\n    const driverRows = [];\n    data.forEach(function (driver, index) {\n        let odd = index % 2 === 0\n        let races_done = driver[\"races\"].map(x => x.raceId)\n        let result = new_addDriver(driver, races_done, odd)\n        driverRows.push(result)\n        const points = result.points\n        if (index === 0) {\n            driver1Poitns = points\n        }\n        else if (index === 1) {\n            driver2Points = points\n        }\n    })\n\n    const leaderPoints = driverRows[0]?.points ?? 0;\n    updateStandingsPointsGaps(driverRows, leaderPoints);\n\n    if (currentFormula === 1) {\n        checkIfDriverIsChampion(data[0], driver1Poitns, driver2Points, pointsInfo, driverRows)\n    }\n    else {\n        const firstDriverPos = document.querySelector(\".drivers-table-data .drivers-table-position\")\n        const firstDriverPoints = document.querySelector(\".drivers-table-data .drivers-table-points\")\n        if (firstDriverPos) firstDriverPos.classList.remove(\"champion\")\n        if (firstDriverPoints) firstDriverPoints.classList.remove(\"champion\")\n    }\n    checkscroll()\n    new_color_drivers_table()\n    driverCells = document.querySelectorAll(\".drivers-table-data .drivers-table-normal\")\n}\n\nfunction checkIfDriverIsChampion(driver1, driver1Points, driver2Points, pointsInfo, driverRows = []) {\n    if (driver1 !== undefined) {\n        const lastRaceDone = driver1[\"races\"][driver1[\"races\"].length - 1][\"raceId\"];\n        const lastRaceIndex = calendarData.findIndex(x => x[0] === lastRaceDone);\n        racesLeftCount = calendarData.length - (lastRaceIndex + 1);\n        sprintsLeft = calendarData.filter(x => x[2] === 1 && x[0] >= lastRaceDone).length\n\n        const maxRacePoints = Number(pointsInfo?.twoBiggestPoints?.[0]?.[0] ?? pointsInfo?.twoBiggestPoints?.[0] ?? 0);\n        const isDoublePoints = Number(pointsInfo?.isLastRaceDouble) === 1;\n        const fastestLapBonus = Number(pointsInfo?.fastestLapBonusPoint) === 1;\n        const poleBonus = Number(pointsInfo?.poleBonusPoint) === 1;\n\n        const pointsDif = driver1Points - driver2Points\n        let pointsRemaining = racesLeftCount * maxRacePoints + sprintsLeft * 8 +\n            (isDoublePoints ? maxRacePoints : 0) +\n            (fastestLapBonus ? racesLeftCount : 0) +\n            (poleBonus ? racesLeftCount : 0)\n\n        const firstDriverPos = document.querySelector(\".drivers-table-data .drivers-table-position\")\n        const firstDriverPoints = document.querySelector(\".drivers-table-data .drivers-table-points\")\n        const championClinched = pointsDif > pointsRemaining;\n        if (championClinched) {\n            firstDriverPos.classList.add(\"champion\")\n            firstDriverPoints.classList.add(\"champion\")\n        }\n        else {\n            firstDriverPos.classList.remove(\"champion\")\n            firstDriverPoints.classList.remove(\"champion\")\n        }\n\n        driverRows.forEach((row) => {\n            row?.row?.classList.remove(\"last-title-contender\");\n        });\n\n        driverRows.forEach((row, index) => {\n            if (!row?.pointsDiv) return;\n            if (index === 0) {\n                row.pointsDiv.classList.remove(\"eliminated\");\n                return;\n            }\n            const eliminated = (Number(row.points) + Number(pointsRemaining)) < Number(driver1Points);\n            row.pointsDiv.classList.toggle(\"eliminated\", eliminated);\n        });\n\n        if (!championClinched) {\n            for (let i = driverRows.length - 1; i >= 0; i--) {\n                const row = driverRows[i];\n                if (!row?.row) continue;\n                const hasChance = (Number(row.points) + Number(pointsRemaining)) >= Number(driver1Points);\n                if (hasChance) {\n                    row.row.classList.add(\"last-title-contender\");\n                    break;\n                }\n            }\n        }\n    }\n}\n\nfunction new_order_drivers(array) {\n    return array.sort((a, b) => a[\"championshipPosition\"] - b[\"championshipPosition\"]);\n}\n\nexport function update_logo(team, logo, newTeam) {\n    if (team === \"alpine\") {\n        alpineReplace = newTeam\n        logos_disc[5] = logo\n    }\n    else if (team === \"williams\") {\n        williamsReplace = newTeam\n        logos_disc[6] = logo\n    }\n    else if (team === \"haas\") {\n        haasReplace = newTeam || \"haas\"\n        logos_disc[7] = logo\n    }\n    else if (team === \"alphatauri\") {\n        alphaReplace = newTeam\n        logos_disc[8] = logo\n    }\n    else if (team === \"alfa\") {\n        alfaReplace = newTeam\n        logos_disc[9] = logo\n    }\n    else if (team === \"redbull\") {\n        redbullReplace = newTeam\n        logos_disc[3] = logo\n    }\n    else if (team === \"aston\") {\n        astonReplace = newTeam\n        logos_disc[10] = logo\n    }\n}\n\nexport function reloadTables() {\n    let datazone = document.querySelector(\".drivers-table-data\")\n    //if not empty\n    if (datazone.innerHTML !== \"\") {\n        new_drivers_table(calendarData)\n        new_load_drivers_table(seasonResults)\n        new_teams_table(calendarData)\n        new_load_teams_table(seasonResults)\n    }\n}\n\nexport function new_load_teams_table(data) {\n    // Mantenemos el mismo \"shape\" de entrada:\n    // data = [driversArray, pairTeamPos, pointsInfo]\n    const pairTeamPos = data[data.length - 2];\n    const pointsInfo = data[data.length - 1];\n\n    // Mapa posEquipo -> posición (1..10)\n    const pairTeamPosDict = {};\n    pairTeamPos.forEach(function (pair) {\n        pairTeamPosDict[pair[0]] = {\n            pos: Number(pair[1]),\n            lastPositionChange: Number(pair[2] ?? 0)\n        };\n    });\n\n    // Ahora data[0] es el array de pilotos con formato-objeto\n    const drivers = data[0];\n\n    const datazone = document.querySelector(\".teams-table-data\");\n    datazone.innerHTML = \"\";\n\n    // Estructura: teamData[teamId] = Map<raceId, RaceObj[] de ese equipo en esa carrera>\n    let teamIds = currentFormula === 1 ? f1_teams : (currentFormula === 2 ? f2_teams : f3_teams)\n    const teamData = {};\n    teamIds.forEach((id) => {\n        teamData[id] = new Map();\n    });\n\n    if (currentFormula === 1 && game_version === 2024 && custom_team) {\n        teamData[32] = new Map();\n    }\n    else{\n        delete teamData[32];\n        //remove 32 from teamIds\n        teamIds = teamIds.filter(id => id !== 32);\n    }\n\n    // Construimos el map por equipo/carrera\n    drivers.forEach(function (driver) {\n        // driver.latestTeamId sigue existiendo, pero para cada carrera usamos race.teamId\n        driver.races?.forEach(function (raceObj) {\n            const team = raceObj.teamId;\n            if (!teamData[team]) return;\n            const bucket = teamData[team];\n            const arr = bucket.get(raceObj.raceId) || [];\n            arr.push(raceObj);\n            bucket.set(raceObj.raceId, arr);\n        });\n    });\n\n    // Normalizamos: aseguramos que cada equipo tenga entradas (vacías) para todas las carreras\n    for (let team in teamData) {\n        const bucket = teamData[team];\n        races_ids.forEach(rid => {\n            if (!bucket.has(rid)) bucket.set(rid, []); // aún no llegaron los 2 pilotos o no corrieron\n        });\n    }\n\n    // Pintamos filas por equipo, usando tu orden/posiciones\n    let team1Points = 0, team2Points = 0, firstTeamId = 0;\n    const teamRows = [];\n    teamIds.forEach((teamId) => {\n        const teamInfo = pairTeamPosDict[teamId] || {};\n        const pos = teamInfo.pos;\n        const lastPositionChange = teamInfo.lastPositionChange;\n        let teamName = combined_dict[teamId] //remove the final (F2) or (F3) that may exist\n        if (teamName && (teamName.endsWith(\" (F2)\") || teamName.endsWith(\" (F3)\"))) {\n            teamName = teamName.slice(0, -5)\n        }\n        teamName = formatTeamNameForDisplay(teamName);\n        const result = new_addTeam(teamData[teamId], teamName, pos, teamId, lastPositionChange);\n        const points = result.points;\n        teamRows.push({ teamId, pos, points, row: result.row, posDiv: result.posDiv, pointsDiv: result.pointsDiv, pointsGapDiv: result.pointsGapDiv });\n        if (pos === 1) {\n            team1Points = points;\n            firstTeamId = teamId;\n        } else if (pos === 2) {\n            team2Points = points;\n        }\n    });\n\n    const needsFallbackPositions = false;\n    const sortByPoints = currentFormula !== 1 || needsFallbackPositions;\n    if (sortByPoints) {\n        const sorted = [...teamRows].sort((a, b) => b.points - a.points);\n        sorted.forEach((team, index) => {\n            const position = index + 1;\n            team.pos = position;\n            if (team.posDiv) {\n                team.posDiv.innerText = String(position);\n                team.posDiv.dataset.position = String(position);\n            }\n        });\n    }\n\n    const leaderTeamPoints = teamRows.find(team => Number(team.pos) === 1)?.points ?? 0;\n    updateStandingsPointsGaps(teamRows, leaderTeamPoints);\n\n    new_color_teams_table();\n    if (currentFormula === 1) {\n        checkIfTeamIsChamp(team1Points, team2Points, pointsInfo, teamRows);\n        manage_teams_table_logos();\n        manage_teams_table_names();\n    }\n    else {\n        const firstTeamPos = document.querySelector(\".teams-table-data .teams-table-position\")\n        const firstTeamPoints = document.querySelector(\".teams-table-data .teams-table-points\")\n        if (firstTeamPos) firstTeamPos.classList.remove(\"champion\")\n        if (firstTeamPoints) firstTeamPoints.classList.remove(\"champion\")\n    }\n    order_teams_table();\n    teamCells = document.querySelectorAll(\".teams-table-data .teams-table-normal\");\n}\n\nfunction checkIfTeamIsChamp(team1Points, team2Points, pointsInfo, teamRows = []) {\n    const sortedTeams = [...teamRows]\n        .filter(team => team)\n        .sort((a, b) => Number(a.pos) - Number(b.pos));\n\n    const leaderTeam = sortedTeams.find(team => Number(team.pos) === 1) || sortedTeams[0];\n    const runnerUpTeam = sortedTeams.find(team => Number(team.pos) === 2) || sortedTeams[1];\n\n    const leaderPoints = Number(leaderTeam?.points ?? team1Points) || 0;\n    const runnerUpPoints = Number(runnerUpTeam?.points ?? team2Points) || 0;\n\n    const pointsDif = leaderPoints - runnerUpPoints\n\n    const maxFirstPoints = Number(pointsInfo?.twoBiggestPoints?.[0]?.[0] ?? pointsInfo?.twoBiggestPoints?.[0] ?? 0);\n    const maxSecondPoints = Number(pointsInfo?.twoBiggestPoints?.[1]?.[0] ?? pointsInfo?.twoBiggestPoints?.[1] ?? 0);\n    const maxTeamRacePoints = maxFirstPoints + maxSecondPoints;\n    const isDoublePoints = Number(pointsInfo?.isLastRaceDouble) === 1;\n    const fastestLapBonus = Number(pointsInfo?.fastestLapBonusPoint) === 1;\n    const poleBonus = Number(pointsInfo?.poleBonusPoint) === 1;\n\n    let pointsRemaining = racesLeftCount * maxTeamRacePoints + sprintsLeft * 15 +\n        (isDoublePoints ? maxTeamRacePoints : 0) +\n        (fastestLapBonus ? racesLeftCount : 0) +\n        (poleBonus ? racesLeftCount : 0)\n\n\n    const firstTeamRow = document.querySelector(\n    \".teams-table-position[data-position='1']\"\n    )?.closest(\".teams-table-row\");\n    const firstTeamPos = firstTeamRow?.querySelector(\".teams-table-position\");\n    const firstTeamPoints = firstTeamRow?.querySelector(\".teams-table-points\");\n\n    const championClinched = pointsDif > pointsRemaining;\n    if (championClinched) {\n        firstTeamPos.classList.add(\"champion\")\n        firstTeamPoints.classList.add(\"champion\")\n    }\n    else {\n        firstTeamPos.classList.remove(\"champion\")\n        firstTeamPoints.classList.remove(\"champion\")\n    }\n\n    teamRows.forEach((team) => {\n        team?.row?.classList.remove(\"last-title-contender\");\n    });\n\n    teamRows.forEach((team) => {\n        if (!team?.pointsDiv) return;\n        if (Number(team.pos) === 1) {\n            team.pointsDiv.classList.remove(\"eliminated\");\n            return;\n        }\n        const eliminated = (Number(team.points) + Number(pointsRemaining)) < Number(leaderPoints);\n        team.pointsDiv.classList.toggle(\"eliminated\", eliminated);\n    });\n\n    if (!championClinched) {\n        for (let i = sortedTeams.length - 1; i >= 0; i--) {\n            const team = sortedTeams[i];\n            if (!team?.row) continue;\n            const hasChance = (Number(team.points) + Number(pointsRemaining)) >= Number(leaderPoints);\n            if (hasChance) {\n                team.row.classList.add(\"last-title-contender\");\n                break;\n            }\n        }\n    }\n}\n\nfunction new_addTeam(teamRaceMap, name, pos, id, lastPositionChange = 0) {\n    // teamRaceMap: Map<raceId, RaceObj[]>\n    let data = document.querySelector(\".teams-table-data\");\n    let row = document.createElement(\"div\");\n    row.classList = \"teams-table-row\";\n\n    let nameDiv = document.createElement(\"div\");\n    let teamName = document.createElement(\"span\");\n    nameDiv.dataset.teamid = id;\n    nameDiv.classList = \"teams-table-team bold-font\";\n    teamName.innerText = name.toUpperCase();\n    nameDiv.appendChild(teamName);\n    if (currentFormula === 1) {\n        const engineId = engine_allocations?.[id]\n        const engineNameText = engineId != null ? engine_names?.[engineId] : \"\"\n\n        const engineDiv = document.createElement(\"div\")\n        engineDiv.className = \"teams-table-engine\"\n\n        const engineLogo = document.createElement(\"img\")\n        engineLogo.className = \"teams-table-engine-logo\"\n        engineLogo.src = getEngineLogoSrc(engineNameText)\n        engineLogo.alt = \"\"\n        engineLogo.setAttribute(\"aria-hidden\", \"true\")\n\n        const engineName = document.createElement(\"span\")\n        engineName.classList = \"teams-table-engine-name bold-font\"\n        engineName.textContent = engineNameText\n\n        // engineDiv.appendChild(engineLogo) disabled for now\n        engineDiv.appendChild(engineName)\n        nameDiv.appendChild(engineDiv)\n    }\n    row.appendChild(nameDiv);\n\n    let posDiv = document.createElement(\"div\");\n    posDiv.classList = \"teams-table-position bold-font\";\n    posDiv.dataset.position = pos;\n    posDiv.innerText = pos;\n    row.appendChild(posDiv);\n\n    const posChangeDiv = document.createElement(\"div\");\n    posChangeDiv.className = \"standings-pos-change\";\n    const posChangeNumber = document.createElement(\"span\");\n    posChangeNumber.className = \"standings-pos-change-number\";\n    const posChangeIcon = document.createElement(\"i\");\n    posChangeDiv.appendChild(posChangeNumber);\n    posChangeDiv.appendChild(posChangeIcon);\n    setStandingsPositionChange(posChangeDiv, lastPositionChange);\n    row.appendChild(posChangeDiv);\n\n    let logoDiv = document.createElement(\"div\");\n    logoDiv.classList = \"teams-table-logo\";\n    logoDiv.classList.add(team_dict[id] + \"iconback\");\n    if (currentFormula === 1 && logos_disc[id]) {\n        let logo = document.createElement(\"img\");\n        logo.classList = \"teams-table-logo-inner\";\n        logo.dataset.teamid = id;\n        logo.setAttribute(\"src\", logos_disc[id]);\n        logoDiv.appendChild(logo);\n    }\n    else {\n        logoDiv.appendChild(buildTeamAbbrElement(id, \"junior-team-logo-team\"));\n    }\n    row.appendChild(logoDiv);\n    row.appendChild(nameDiv);\n\n    let teampoints = 0;\n\n    const safePoints = (v) => {\n        if (v === -1) return 0; // DNF → 0 puntos\n        const n = Number.parseInt(String(v), 10);\n        if (!Number.isFinite(n)) return 0;\n        return Math.max(0, n);\n    };\n\n    const pickTopEntries = (pair) => {\n        if (!pair || pair.length <= 2) {\n            return [pair[0] || null, pair[1] || null];\n        }\n\n        const scoring = pair\n            .map((entry, index) => ({\n                entry,\n                index,\n                total: safePoints(entry?.points) + safePoints(entry?.qualifyingPoints) + safePoints(entry?.sprintPoints)\n            }))\n            .sort((a, b) => b.total - a.total || a.index - b.index);\n\n        return [scoring[0]?.entry || null, scoring[1]?.entry || null];\n    };\n\n    const formatTeamPosValue = (entry, useSprint) => {\n        if (!entry) return \"-\"\n        const points = useSprint ? entry.sprintPoints : entry.points\n        const pos = useSprint ? entry.sprintPos : entry.finishingPos\n        if (points === -1 || pos === -1) return \"DNF\"\n        if (pos === null || pos === undefined) return \"-\"\n        return String(pos)\n    };\n\n    const formatTeamQualiValue = (entry, useSprint) => {\n        if (!entry) return \"-\"\n        if (useSprint) {\n            return entry.sprintQualiPos !== undefined && entry.sprintQualiPos !== null\n                ? String(entry.sprintQualiPos)\n                : \"-\"\n        }\n        const quali = entry.qualifyingPos ?? 99\n        return String(quali)\n    };\n\n    const buildTeamResultList = (entries, type, useSprint) => {\n        if (!Array.isArray(entries) || entries.length === 0) return []\n        if (type === \"pos\") {\n            return entries.map((entry) => formatTeamPosValue(entry, useSprint))\n        }\n        if (type === \"quali\") {\n            return entries.map((entry) => formatTeamQualiValue(entry, useSprint))\n        }\n        return []\n    };\n\n    // Iteramos las carreras en orden por races_ids (como antes)\n    races_ids.forEach((raceId) => {\n        const pair = (teamRaceMap && teamRaceMap.get(raceId)) || [];\n        const isF1 = currentFormula === 1;\n\n        if (isF1) {\n            const raceDiv = document.createElement(\"div\");\n            raceDiv.classList = \"teams-table-normal\";\n\n            if (pair.length > 0) {\n                // Aseguramos 2 elementos (puede faltar uno) y priorizamos los que más puntúan\n                const [d1, d2] = pickTopEntries(pair);\n\n                const d1Points = d1 ? (safePoints(d1.points) + safePoints(d1.qualifyingPoints)) : 0;\n                const d2Points = d2 ? (safePoints(d2.points) + safePoints(d2.qualifyingPoints)) : 0;\n                const d1Pos = d1 ? (d1.points === -1 || d1.finishingPos === -1 ? \"DNF\" : d1.finishingPos) : \"-\";\n                const d2Pos = d2 ? (d2.points === -1 || d2.finishingPos === -1 ? \"DNF\" : d2.finishingPos) : \"-\";\n\n                // datasets base\n                raceDiv.dataset.raceid = raceId;\n                raceDiv.dataset.pointsCount = d1Points + d2Points;\n\n                const s1pts = d1?.sprintPoints;\n                const s2pts = d2?.sprintPoints;\n                const s1pos = d1?.sprintPos;\n                const s2pos = d2?.sprintPos;\n\n                raceDiv.dataset.points = manage_dataset_info_team(\n                    [d1Points, d2Points],\n                    (typeof s1pts !== \"undefined\" || typeof s2pts !== \"undefined\") ? [s1pts ?? 0, s2pts ?? 0] : undefined,\n                    \"points\"\n                );\n\n                raceDiv.dataset.pos = manage_dataset_info_team(\n                    [d1Pos, d2Pos],\n                    (s1pos == null || s2pos == null) ? undefined : [s1pos, s2pos],\n                    \"pos\"\n                );\n\n                raceDiv.dataset.quali = manage_dataset_info_team(\n                    [d1 ? d1.qualifyingPos ?? 99 : 99, d2 ? d2.qualifyingPos ?? 99 : 99],\n                    undefined,\n                    \"quali\"\n                );\n\n                raceDiv.dataset.quali1 = d1 ? d1.qualifyingPos ?? 99 : 99;\n                raceDiv.dataset.quali2 = d2 ? d2.qualifyingPos ?? 99 : 99;\n\n                raceDiv.dataset.fastlap1 = d1 && d1.fastestLap ? 1 : 0;\n                raceDiv.dataset.fastlap2 = d2 && d2.fastestLap ? 1 : 0;\n\n                // Suma de puntos de carrera\n                teampoints += parseInt(raceDiv.dataset.pointsCount);\n\n                // Sprint\n                let d1SprintPoints = 0, d2SprintPoints = 0;\n                let d1SprintPos = \"-\", d2SprintPos = \"-\";\n\n                if (typeof s1pts !== \"undefined\") {\n                    if (s1pts === -1) { d1SprintPoints = 0; d1SprintPos = \"DNF\"; }\n                    else { d1SprintPoints = parseInt(s1pts) || 0; d1SprintPos = (typeof s1pos === \"number\" ? s1pos : (s1pos ?? \"-\")); }\n                }\n                if (typeof s2pts !== \"undefined\") {\n                    if (s2pts === -1) { d2SprintPoints = 0; d2SprintPos = \"DNF\"; }\n                    else { d2SprintPoints = parseInt(s2pts) || 0; d2SprintPos = (typeof s2pos === \"number\" ? s2pos : (s2pos ?? \"-\")); }\n                }\n\n                raceDiv.dataset.sprintpoints = d1SprintPoints + d2SprintPoints;\n                raceDiv.dataset.sprintpos1 = d1SprintPos;\n                raceDiv.dataset.sprintpos2 = d2SprintPos;\n\n                teampoints += parseInt(raceDiv.dataset.sprintpoints);\n\n                raceDiv.textContent = raceDiv.dataset[pointsOrPos];\n            } else {\n                raceDiv.innerText = \"-\";\n            }\n\n            row.appendChild(raceDiv);\n        }\n        else {\n            const sprintDiv = document.createElement(\"div\");\n            const featureDiv = document.createElement(\"div\");\n            sprintDiv.classList = \"teams-table-normal\";\n            featureDiv.classList = \"teams-table-normal\";\n            sprintDiv.classList.add(\"sprint-result-cell\");\n            featureDiv.classList.add(\"feature-result-cell\");\n            sprintDiv.dataset.raceid = raceId;\n            featureDiv.dataset.raceid = raceId;\n\n            if (pair.length > 0) {\n                const [d1, d2] = pickTopEntries(pair);\n                const allEntries = pair;\n                const wantsList = currentFormula === 3 && (pointsOrPos === \"pos\" || pointsOrPos === \"quali\");\n\n                const sprintPoints = [d1?.sprintPoints ?? null, d2?.sprintPoints ?? null];\n                const sprintPos = [d1?.sprintPos ?? null, d2?.sprintPos ?? null];\n                const hasSprint = sprintPos.some(v => v !== null && v !== undefined);\n\n                const sprintQuali = [d1?.sprintQualiPos ?? \"-\", d2?.sprintQualiPos ?? \"-\"];\n                sprintDiv.dataset.quali = manage_dataset_info_team(\n                    sprintQuali,\n                    undefined,\n                    \"quali\"\n                );\n                if (currentFormula === 3) {\n                    const sprintPosList = hasSprint ? buildTeamResultList(allEntries, \"pos\", true) : [];\n                    const sprintQualiList = buildTeamResultList(allEntries, \"quali\", true);\n                    sprintDiv.dataset.poslist = JSON.stringify(sprintPosList);\n                    sprintDiv.dataset.qualilist = JSON.stringify(sprintQualiList);\n                    if (pointsOrPos === \"pos\") {\n                        renderTeamCellList(sprintDiv, sprintPosList);\n                    }\n                    else if (pointsOrPos === \"quali\") {\n                        renderTeamCellList(sprintDiv, sprintQualiList);\n                    }\n                }\n                if (hasSprint) {\n                    if (currentFormula === 3) {\n                        const sprintPointsTotal = allEntries.reduce(\n                            (sum, entry) => sum + safePoints(entry?.sprintPoints),\n                            0\n                        );\n                        sprintDiv.dataset.points = sprintPointsTotal === 0 ? \"\" : String(sprintPointsTotal);\n                    }\n                    else {\n                        sprintDiv.dataset.points = manage_dataset_info_team(\n                            [safePoints(sprintPoints[0]), safePoints(sprintPoints[1])],\n                            undefined,\n                            \"points\"\n                        );\n                    }\n                    sprintDiv.dataset.pos = manage_dataset_info_team(\n                        [sprintPos[0] ?? \"-\", sprintPos[1] ?? \"-\"],\n                        undefined,\n                        \"pos\"\n                    );\n                    if (!wantsList) {\n                        sprintDiv.textContent = sprintDiv.dataset[pointsOrPos];\n                    }\n                } else {\n                    sprintDiv.textContent = \"-\";\n                }\n\n                const d1Points = d1 ? safePoints(d1.points) : 0;\n                const d2Points = d2 ? safePoints(d2.points) : 0;\n                const d1Pos = d1 ? (d1.points === -1 || d1.finishingPos === -1 ? \"DNF\" : d1.finishingPos) : \"-\";\n                const d2Pos = d2 ? (d2.points === -1 || d2.finishingPos === -1 ? \"DNF\" : d2.finishingPos) : \"-\";\n\n                const d1PointsTotal = safePoints(d1?.points) + safePoints(d1?.qualifyingPoints);\n                const d2PointsTotal = safePoints(d2?.points) + safePoints(d2?.qualifyingPoints);\n                if (currentFormula === 3) {\n                    const featurePointsTotal = allEntries.reduce(\n                        (sum, entry) =>\n                            sum + safePoints(entry?.points) + safePoints(entry?.qualifyingPoints),\n                        0\n                    );\n                    featureDiv.dataset.points = featurePointsTotal === 0 ? \"\" : String(featurePointsTotal);\n                }\n                else {\n                    featureDiv.dataset.points = manage_dataset_info_team(\n                        [d1PointsTotal, d2PointsTotal],\n                        undefined,\n                        \"points\"\n                    );\n                }\n                featureDiv.dataset.pos = manage_dataset_info_team(\n                    [d1Pos, d2Pos],\n                    undefined,\n                    \"pos\"\n                );\n                featureDiv.dataset.quali = manage_dataset_info_team(\n                    [d1 ? d1.qualifyingPos ?? 99 : \"-\", d2 ? d2.qualifyingPos ?? 99 : \"-\"],\n                    undefined,\n                    \"quali\"\n                );\n                if (currentFormula === 3) {\n                    const featurePosList = buildTeamResultList(allEntries, \"pos\", false);\n                    const featureQualiList = buildTeamResultList(allEntries, \"quali\", false);\n                    featureDiv.dataset.poslist = JSON.stringify(featurePosList);\n                    featureDiv.dataset.qualilist = JSON.stringify(featureQualiList);\n                    if (pointsOrPos === \"pos\") {\n                        renderTeamCellList(featureDiv, featurePosList);\n                    }\n                    else if (pointsOrPos === \"quali\") {\n                        renderTeamCellList(featureDiv, featureQualiList);\n                    }\n                }\n                if (!wantsList) {\n                    featureDiv.textContent = featureDiv.dataset[pointsOrPos];   \n                }\n\n                const sprintTeamPoints = hasSprint\n                    ? (currentFormula === 3\n                        ? allEntries.reduce(\n                            (sum, entry) => sum + safePoints(entry?.sprintPoints),\n                            0\n                        )\n                        : (safePoints(sprintPoints[0]) + safePoints(sprintPoints[1])))\n                    : 0;\n                const featureTeamPoints = currentFormula === 3\n                    ? allEntries.reduce(\n                        (sum, entry) =>\n                            sum + safePoints(entry?.points) + safePoints(entry?.qualifyingPoints),\n                        0\n                    )\n                    : (d1Points + d2Points + safePoints(d1?.qualifyingPoints) + safePoints(d2?.qualifyingPoints));\n                teampoints += featureTeamPoints + sprintTeamPoints;\n            } else {\n                sprintDiv.textContent = \"-\";\n                featureDiv.textContent = \"-\";\n            }\n\n            row.appendChild(sprintDiv);\n            row.appendChild(featureDiv);\n        }\n    });\n\n    const pointsGapDiv = document.createElement(\"div\");\n    pointsGapDiv.className = \"standings-points-gap\";\n    row.appendChild(pointsGapDiv);\n\n    let pointsDiv = document.createElement(\"div\");\n    pointsDiv.classList = \"teams-table-points bold-font\";\n    pointsDiv.innerText = (currentFormula === 3 && teampoints === 0) ? \"\" : teampoints;\n    row.appendChild(pointsDiv);\n\n    data.appendChild(row);\n    return { points: teampoints, row, posDiv, pointsDiv, pointsGapDiv };\n}\n\n\n\nfunction buildF1DriverLogoElement(teamId) {\n    let logo = document.createElement(\"img\");\n    logo.classList = \"drivers-table-logo\";\n    logo.dataset.teamid = teamId;\n\n    if (teamId === 1) logo.classList.add(\"logo-ferrari-table\");\n    if (teamId === 2) {\n        logo = document.createElement(\"div\");\n        logo.classList = \"drivers-table-logo logo-mclaren-table logo-reduce\";\n        logo.dataset.teamid = teamId;\n    }\n    if (teamId === 3) {\n        logo.classList.add(\"logo-up-down-mid\");\n        if (redbullReplace !== \"redbull\") {\n            logo.classList.add(driversTableLogosDict[redbullReplace]);\n        }\n    }\n    if (teamId === 6) {\n        if (williamsReplace === \"williams\") {\n            logo = document.createElement(\"div\");\n            logo.classList.add(\"logo-williams-2026-table\");\n            logo.dataset.teamid = teamId;\n        }\n        else {\n            logo = document.createElement(\"img\");\n            logo.classList = \"drivers-table-logo logo-bmw-table\";\n            logo.dataset.teamid = teamId;\n            logo.src = logos_disc[6];\n        }\n    }\n    if (teamId === 7 && haasReplace === \"toyota\") {\n        logo = document.createElement(\"div\");\n        logo.classList = \"drivers-table-logo logo-toyota-table\";\n        logo.dataset.teamid = teamId;\n    }\n    if (teamId === 4) logo.classList.add(\"logo-merc-table\");\n    if (teamId === 7 && haasReplace !== \"toyota\") logo.classList.add(\"logo-merc-table\");\n    if (teamId === 5) {\n        if (alpineReplace === \"cadillac\") {\n            logo = document.createElement(\"img\");\n            logo.classList = \"drivers-table-logo\";\n            logo.dataset.teamid = teamId;\n        }\n        else {\n            logo = document.createElement(\"div\");\n            logo.dataset.teamid = teamId;\n        }\n        logo.classList.add(driversTableLogosDict[alpineReplace]);\n    }\n    if (teamId === 8) {\n        if ([\"alphatauri\", \"visarb\", \"brawn\", \"hugo\"].includes(alphaReplace)) {\n            logo = document.createElement(\"div\");\n            logo.dataset.teamid = teamId;\n        }\n        else if (alphaReplace === \"toyota\") {\n            logo = document.createElement(\"div\");\n            logo.classList = \"drivers-table-logo\";\n            logo.dataset.teamid = teamId;\n        }\n        logo.classList.add(driversTableLogosDict[alphaReplace]);\n    }\n    if (teamId === 9) {\n        if (alfaReplace === \"sauber\") {\n            logo = document.createElement(\"div\");\n            logo.classList = \"drivers-table-logo\";\n            logo.dataset.teamid = teamId;\n        }\n        logo.classList.add(driversTableLogosDict[alfaReplace]);\n    }\n    if (teamId === 10 || teamId === 32) {\n        logo.classList.add(\"logo-up-down-little\");\n        if (teamId === 10 && astonReplace !== \"aston\") {\n            logo.classList.add(driversTableLogosDict[astonReplace]);\n        }\n    }\n    if (teamId === 32) logo.classList.add(\"custom-replace\");\n\n    if (logo.tagName === \"IMG\") logo.src = logos_disc[teamId];\n    return logo;\n}\n\nfunction buildDriverLogoDiv(teamId, opts = {}) {\n    const {\n        isF1 = currentFormula === 1,\n        wrapperClass = \"drivers-table-logo-div\",\n        juniorSizeClass = \"junior-team-logo-driver\",\n    } = opts;\n\n    const logoDiv = document.createElement(\"div\");\n    logoDiv.className = wrapperClass;\n\n    if (isF1) {\n        const logo = buildF1DriverLogoElement(teamId);\n        logoDiv.appendChild(logo);\n    }\n    else {\n        logoDiv.appendChild(buildTeamAbbrElement(teamId, juniorSizeClass));\n    }\n\n    if (team_dict[teamId]) {\n        logoDiv.classList.add(team_dict[teamId] + \"hoverback\");\n    }\n\n    return logoDiv;\n}\n\nfunction new_addDriver(driver, races_done, odd) {\n    let data = document.querySelector(\".drivers-table-data\");\n    let row = document.createElement(\"div\");\n    row.classList = \"drivers-table-row\";\n    if (odd) row.classList.add(\"odd\");\n    const isF1 = currentFormula === 1;\n\n    let nameDiv = document.createElement(\"div\");\n    nameDiv.classList = \"drivers-table-driver\";\n    let name = driver[\"driverName\"].split(\" \");\n    let nameContainer = document.createElement(\"div\");\n    nameContainer.className = \"name-container\";\n    let spanName = document.createElement(\"span\");\n    let spanLastName = document.createElement(\"span\");\n    format_name(driver[\"driverName\"], name, spanName, spanLastName);\n    spanLastName.classList.add(\"bold-font\");\n    spanLastName.dataset.teamid = driver[\"latestTeamId\"];\n    row.dataset.teamid = driver[\"latestTeamId\"];\n    nameContainer.appendChild(spanName);\n    nameContainer.appendChild(spanLastName);\n    nameDiv.appendChild(nameContainer);\n\n    let posDiv = document.createElement(\"div\");\n    posDiv.classList = \"drivers-table-position bold-font\";\n    posDiv.innerText = driver[\"championshipPosition\"];\n    row.appendChild(posDiv);\n\n    const posChangeDiv = document.createElement(\"div\");\n    posChangeDiv.className = \"standings-pos-change\";\n    const posChangeNumber = document.createElement(\"span\");\n    posChangeNumber.className = \"standings-pos-change-number\";\n    const posChangeIcon = document.createElement(\"i\");\n    posChangeDiv.appendChild(posChangeNumber);\n    posChangeDiv.appendChild(posChangeIcon);\n    setStandingsPositionChange(posChangeDiv, driver[\"lastPositionChange\"]);\n    row.appendChild(posChangeDiv);\n\n    const logoDiv = buildDriverLogoDiv(driver[\"latestTeamId\"], { isF1 });\n    row.appendChild(logoDiv);\n    row.appendChild(nameDiv);\n\n    let driverpoints = 0;\n\n    races_ids.forEach(function (raceid) {\n        const race = driver.races?.find(r => r.raceId === raceid);\n\n        if (isF1) {\n            let raceDiv = document.createElement(\"div\");\n            raceDiv.classList = \"drivers-table-normal\";\n\n            if (races_done.includes(raceid) && race) {\n                const qualiPoints = parseInt(race.qualifyingPoints) || 0;\n                const racePointsRaw = parseInt(race.points);\n                const featurePoints = racePointsRaw === -1\n                    ? -1\n                    : racePointsRaw + Math.max(0, qualiPoints);\n                const hasSprintPoints = typeof race.sprintPoints !== \"undefined\" && race.sprintPoints !== null;\n                const hasSprintPos = typeof race.sprintPos !== \"undefined\" && race.sprintPos !== null;\n\n                raceDiv.dataset.pos = manage_dataset_info_driver(\n                    race.finishingPos,\n                    hasSprintPos ? race.sprintPos : undefined,\n                    \"pos\"\n                );\n                raceDiv.dataset.points = manage_dataset_info_driver(     \n                    featurePoints,\n                    hasSprintPoints ? race.sprintPoints : undefined,     \n                    \"points\"\n                );\n                raceDiv.dataset.fastlap = race.fastestLap ? 1 : 0; // normaliza a 0/1\n                raceDiv.dataset.quali = manage_dataset_info_driver(\n                    race.qualifyingPos === 99 ? race.startingPos : race.qualifyingPos,\n                    undefined,\n                    \"quali\"\n                );\n                raceDiv.dataset.gapToWinner = race.gapToWinner;\n                raceDiv.dataset.gapToPole = race.gapToPole;\n                raceDiv.dataset.dotd = race.driverOfTheDay //if its true or false\n\n                // Sprint\n                if (hasSprintPos) raceDiv.dataset.sprintpos = race.sprintPos;\n                if (hasSprintPoints) {\n                    raceDiv.dataset.sprintpoints = race.sprintPoints;\n                    if (race.sprintPoints !== -1) {\n                        driverpoints += Math.max(0, parseInt(race.sprintPoints) || 0);\n                    }\n                }\n\n                // Puntos carrera (ignora -1)\n                driverpoints += Math.max(0, parseInt(race.points) || 0);\n                driverpoints += Math.max(0, parseInt(race.qualifyingPoints) || 0);\n\n                raceDiv.textContent = raceDiv.dataset[pointsOrPos];      \n            } else {\n                raceDiv.innerText = \"-\";\n            }\n            row.appendChild(raceDiv);\n        }\n        else {\n            const sprintDiv = document.createElement(\"div\");\n            const featureDiv = document.createElement(\"div\");\n            sprintDiv.classList = \"drivers-table-normal\";\n            featureDiv.classList = \"drivers-table-normal\";\n            sprintDiv.classList.add(\"sprint-result-cell\");\n            featureDiv.classList.add(\"feature-result-cell\");\n\n            if (races_done.includes(raceid) && race) {\n                const hasSprintPos = typeof race.sprintPos !== \"undefined\" && race.sprintPos !== null;\n                const hasSprintPoints = typeof race.sprintPoints !== \"undefined\" && race.sprintPoints !== null;\n\n                sprintDiv.dataset.quali = formatDriverCellValue(race.sprintQualiPos, \"quali\");\n                if (hasSprintPos) {\n                    sprintDiv.dataset.points = formatDriverCellValue(race.sprintPoints, \"points\");\n                    sprintDiv.dataset.pos = formatDriverCellValue(race.sprintPos, \"pos\");\n                    sprintDiv.dataset.gapToWinner = \"-\";\n                    sprintDiv.dataset.gapToPole = \"-\";\n                    sprintDiv.textContent = sprintDiv.dataset[pointsOrPos];\n                }\n                else {\n                    sprintDiv.textContent = \"-\";\n                }\n\n                featureDiv.dataset.pos = formatDriverCellValue(race.finishingPos, \"pos\");\n                const qualiPoints = parseInt(race.qualifyingPoints) || 0;\n                const featurePoints = (parseInt(race.points) || 0) + Math.max(0, qualiPoints);\n                featureDiv.dataset.points = formatDriverCellValue(featurePoints, \"points\");\n                featureDiv.dataset.fastlap = race.fastestLap ? 1 : 0;\n                featureDiv.dataset.quali = formatDriverCellValue(\n                    race.qualifyingPos === 99 ? race.startingPos : race.qualifyingPos,\n                    \"quali\"\n                );\n                featureDiv.dataset.gapToWinner = race.gapToWinner ?? \"-\";\n                featureDiv.dataset.gapToPole = race.gapToPole ?? \"-\";\n                featureDiv.dataset.dotd = race.driverOfTheDay;\n                featureDiv.textContent = featureDiv.dataset[pointsOrPos];       \n\n                driverpoints += Math.max(0, parseInt(race.points) || 0);        \n                driverpoints += Math.max(0, parseInt(race.qualifyingPoints) || 0);\n                if (hasSprintPos && hasSprintPoints) {\n                    driverpoints += Math.max(0, parseInt(race.sprintPoints) || 0);\n                }\n            } else {\n                sprintDiv.textContent = \"-\";\n                featureDiv.textContent = \"-\";\n            }\n\n            row.appendChild(sprintDiv);\n            row.appendChild(featureDiv);\n        }\n    });\n\n    const pointsGapDiv = document.createElement(\"div\");\n    pointsGapDiv.className = \"standings-points-gap\";\n    row.appendChild(pointsGapDiv);\n\n    let pointsDiv = document.createElement(\"div\");\n    pointsDiv.classList = \"drivers-table-points bold-font\";\n    pointsDiv.innerText = driverpoints;\n    row.appendChild(pointsDiv);\n\n    data.appendChild(row);\n    return { points: driverpoints, row, pointsDiv, pointsGapDiv };\n}\n\n\nfunction manage_dataset_info_driver(info, sprintInfo, type) {\n    let race, sprint;\n    if (type === \"points\") {\n        if (parseInt(info) === 0) {\n            race = \"\"\n        }\n        else if (parseInt(info) === -1) {\n            race = \"DNF\"\n        }\n        else {\n            race = info\n        }\n\n        if (sprintInfo === undefined) {\n            sprint = \"\"\n        }\n        else if (parseInt(sprintInfo) === 0 || parseInt(sprintInfo) === -1) {\n            sprint = \"\"\n        }\n        else {\n            sprint = sprintInfo\n        }\n        let res = `${race}${(sprint !== \"\") ? \"(\" + sprint + \")\" : \"\"}`\n        return res\n\n    }\n    else if (type === \"pos\") {\n        if (parseInt(info) === -1) {\n            race = \"DNF\"\n        }\n        else {\n            race = info;\n        }\n\n        if (sprintInfo === undefined || parseInt(sprintInfo) > 8 || parseInt(sprintInfo) === -1) {\n            sprint = \"\"\n        }\n        else {\n            sprint = sprintInfo\n        }\n\n        let res = `${race}${(sprint !== \"\") ? \"(\" + sprint + \")\" : \"\"}`\n        return res\n\n    }\n    else if (type === \"quali\") {\n        race = info;\n        return race;\n    }\n}\n\nfunction manage_dataset_info_team(info, sprintInfo, type) {\n    let race, sprint;\n    if (type === \"points\") {\n        let d1Points = (info[0] !== -1 ? info[0] : 0)\n        let d2Points = (info[1] !== -1 ? info[1] : 0)\n        let combinedRace = parseInt(d1Points) + parseInt(d2Points)\n        let combinedSprint;\n        if (sprintInfo !== undefined) {\n            combinedSprint = parseInt(sprintInfo[0]) + parseInt(sprintInfo[1])\n        }\n        if (combinedRace === 0) {\n            race = \"\"\n        }\n        else {\n            race = combinedRace\n        }\n        if (sprintInfo === undefined || combinedSprint === 0) {\n            sprint = \"\"\n        }\n        else if (combinedSprint !== 0) {\n            sprint = combinedSprint\n        }\n\n        let res = `${race}${(sprint !== \"\") ? \"(\" + sprint + \")\" : \"\"}`\n        return res;\n    }\n    else if (type === \"pos\") {\n        if (parseInt(info[0]) === -1) {\n            info[0] = \"DNF\"\n        }\n        if (parseInt(info[1]) === -1) {\n            info[1] = \"DNF\"\n        }\n\n        if (sprintInfo !== undefined) {\n            if (parseInt(sprintInfo[0]) === -1 || parseInt(sprintInfo[0]) > 8) {\n                sprintInfo[0] = \"\"\n            }\n            if (parseInt(sprintInfo[1]) === -1 || parseInt(sprintInfo[1]) > 8) {\n                sprintInfo[1] = \"\"\n            }\n        }\n\n        let res = `${info[0]}${(sprintInfo !== undefined && sprintInfo[0] !== \"\") ? \"(\" + sprintInfo[0] + \")\" : \"\"}\\n${info[1]}${(sprintInfo !== undefined && sprintInfo[1] !== \"\") ? \"(\" + sprintInfo[1] + \")\" : \"\"}`\n        return res;\n    }\n    else if (type === \"quali\") {\n        let res = `${info[0]}\\n${info[1]}`\n        return res;\n    }\n}\n\n\nfunction manageText(raceDiv) {\n    if (raceDiv.innerText === \"-\") {\n        return raceDiv\n    }\n    if (pointsOrPos === \"points\" || pointsOrPos === \"pos\") {\n        let racePart = \"\"\n        let sprintPart = \"\"\n        if (raceDiv.dataset.points !== \"-1\") {\n            if (pointsOrPos === \"points\") {\n                racePart = raceDiv.dataset.points\n            }\n            else {\n                racePart = raceDiv.dataset.pos\n            }\n        }\n        else {\n            racePart = \"DNF\"\n        }\n        if (raceDiv.dataset.points === \"0\" && pointsOrPos === \"points\") {\n            racePart = \"\"\n        }\n        if (raceDiv.dataset.sprintpoints !== undefined) {\n            if (raceDiv.dataset.sprintpoints !== \"-1\") {\n                if (pointsOrPos === \"points\") {\n                    sprintPart = raceDiv.dataset.sprintpoints\n                }\n                else {\n                    sprintPart = raceDiv.dataset.sprintpos\n                }\n            }\n            else {\n                sprintPart = \"DNF\"\n            }\n        }\n        if (raceDiv.dataset.sprintpoints === undefined || raceDiv.dataset.sprintpoints === \"0\") {\n            raceDiv.innerText = racePart\n        }\n        else {\n            raceDiv.innerText = racePart + \"(\" + sprintPart + \")\"\n        }\n    }\n    else if (pointsOrPos === \"quali\") {\n        raceDiv.innerText = raceDiv.dataset.quali\n    }\n    else if (pointsOrPos === \"gapWinner\") {\n        if (raceDiv.dataset.pos === \"-1\") {\n            raceDiv.innerText = \"DNF\"\n        }\n        else {\n            raceDiv.innerText = raceDiv.dataset.gapToWinner\n        }\n    }\n    else if (pointsOrPos === \"gapPole\") {\n        raceDiv.innerText = raceDiv.dataset.gapToPole\n    }\n\n\n    return raceDiv\n\n}\n\nfunction manageTeamsText(raceDiv) {\n    if (raceDiv.innerText === \"-\") {\n        return raceDiv\n    }\n    if (pointsOrPos === \"points\") {\n        if (raceDiv.dataset.sprintpoints !== undefined) {\n            let racePart = raceDiv.dataset.points\n            let sprintPart = \"(\" + raceDiv.dataset.sprintpoints + \")\"\n            if (racePart === \"0\") {\n                racePart = \"\"\n            }\n            if (sprintPart === \"0\") {\n                sprintPart = \"\"\n            }\n            raceDiv.innerText = racePart + sprintPart\n        }\n        else {\n            let racePart = raceDiv.dataset.points\n            if (racePart === \"0\") {\n                racePart = \"\"\n            }\n            raceDiv.innerText = racePart\n        }\n    }\n    else if (pointsOrPos === \"pos\") {\n        let d1Pos = \"DNF\"\n        let d2Pos = \"DNF\"\n        let d1SprPos = \"\"\n        let d2SprPos = \"\"\n        if (raceDiv.dataset.pos1 !== \"DNF\") {\n            d1Pos = raceDiv.dataset.pos1\n        }\n        if (raceDiv.dataset.pos2 !== \"DNF\") {\n            d2Pos = raceDiv.dataset.pos2\n        }\n        if (raceDiv.dataset.sprintpos1 !== undefined) {\n            d1SprPos = raceDiv.dataset.sprintpos1\n        }\n        if (raceDiv.dataset.sprintpos2 !== undefined) {\n            d2SprPos = raceDiv.dataset.sprintpos2\n        }\n\n        let text = d1Pos + \"<br>\" + d2Pos\n        if (d1SprPos !== \"\" && d2SprPos !== \"\") {\n            text = d1Pos + \"(\" + d1SprPos + \")\" + \"<br>\" + d2Pos + \"(\" + d2SprPos + \")\"\n        }\n        raceDiv.innerHTML = text\n    }\n    else if (pointsOrPos === \"quali\") {\n        raceDiv.innerHTML = raceDiv.dataset.quali1 + \"<br>\" + raceDiv.dataset.quali2\n    }\n    else if (pointsOrPos === \"gapWinner\") {\n        let d1, d2;\n        if (raceDiv.dataset.pos1 === \"DNF\") {\n            d1 = \"DNF\"\n        }\n        else {\n            d1 = raceDiv.dataset.gapToWinner1\n        }\n        if (raceDiv.dataset.pos2 === \"DNF\") {\n            d2 = \"DNF\"\n        }\n        else {\n            d2 = raceDiv.dataset.gapToWinner2\n        }\n\n        raceDiv.innerHTML = d1 + \"<br>\" + d2\n    }\n    else if (pointsOrPos === \"gapPole\") {\n        raceDiv.innerHTML = raceDiv.dataset.gapToPole1 + \"<br>\" + raceDiv.dataset.gapToPole2\n    }\n    return raceDiv\n}\n\n\n\n\n\n\n/**\n * Creates the year selector menu\n * @param {String} actualYear current year of the save\n */\nexport function generateYearsMenu(actualYear) {\n    document.querySelector(\"#yearInput\").min = actualYear;\n    setCurrentSeason(actualYear);\n\n    const yearMenu = document.querySelector(\"#yearMenu\");\n    const yearH2H = document.querySelector(\"#yearMenuH2H\");\n    yearMenu.innerHTML = \"\";\n    yearH2H.innerHTML = \"\";\n\n    const timeTravel2026Enabled = seasonModData?.[\"time-travel-2026\"] === \"1\" || seasonModData?.[\"time-travel-2026\"] === 1;\n    const minYear = timeTravel2026Enabled ? 2026 : game_version;\n\n    // años (con data-year)\n    for (let year = actualYear; year >= minYear; year--) {\n        const a = document.createElement(\"a\");\n        a.textContent = String(year);\n        a.className = \"redesigned-dropdown-item\";\n        a.style.cursor = \"pointer\";\n        a.dataset.year = String(year);                 // <- aquí\n        yearMenu.appendChild(a);\n        a.addEventListener(\"click\", () => manageRecordsSelected(a));\n\n        const a2 = document.createElement(\"a\");\n        a2.textContent = String(year);\n        a2.className = \"redesigned-dropdown-item\";\n        a2.style.cursor = \"pointer\";\n        a2.dataset.year = String(year);\n        yearH2H.appendChild(a2);\n        a2.addEventListener(\"click\", () => {\n            resetH2H();\n            document.querySelectorAll(\".modal-team\").forEach(el => el.classList.remove(\"d-none\"));\n            const yearBtnH2H = document.getElementById(\"yearButtonH2H\");\n            yearBtnH2H.querySelector(\"span.dropdown-label\").textContent = a2.textContent;\n            yearBtnH2H.dataset.year = a2.dataset.year;  // <- también lo guardo\n            new Command(\"yearSelectedH2H\", { year: a2.dataset.year }).execute();\n        });\n    }\n\n    // All Time al principio (con data-year=\"all\")\n    const allTime = document.createElement(\"a\");\n    allTime.textContent = \"All Time\";\n    allTime.className = \"redesigned-dropdown-item\";\n    allTime.id = \"allTimeRecords\";\n    allTime.dataset.year = \"all\";                   // <- clave\n    yearMenu.insertBefore(allTime, yearMenu.firstChild);\n    allTime.addEventListener(\"click\", () => manageRecordsSelected(allTime));\n\n    syncTableTypeDropdownChecks();\n    syncSeriesTypeDropdownChecks();\n    syncRecordsTypeDropdownChecks();\n    syncYearDropdownChecks();\n}\n\n\n\nfunction manageRecordsSelected(forcedYearEl = null) {\n    const yearMenu = document.querySelector(\"#yearMenu\");\n    const yearItems = Array.from(yearMenu.querySelectorAll(\"a\"));\n    const yearBtn = document.getElementById(\"yearButton\");\n    const typeVal = document.querySelector(\"#recordsTypeButton\").dataset.value; \n    updateTopPanelControlsVisibility();\n\n    // resolve seleccionado actual\n    let selectedEl = forcedYearEl\n        || yearItems.find(i => i.dataset.year === yearBtn.dataset.year)\n        || yearItems[0];\n\n    const isAllTime = el => el.dataset.year === \"all\";\n\n    // si es standings y estaba en All Time, forzar primer año real\n    if ((typeVal === \"standings\" || typeVal === \"seasonreview\" || typeVal === \"sessionresults\") && isAllTime(selectedEl)) {\n        const firstReal = yearItems.find(i => !isAllTime(i));\n        if (firstReal) selectedEl = firstReal;\n    }\n\n    if (driverOrTeams === \"teams\" && isAllTime(selectedEl)) {\n        const firstReal = yearItems.find(i => !isAllTime(i));\n        if (firstReal) selectedEl = firstReal;\n    }\n\n    // reflejar en el botón\n    setYearButton(selectedEl);\n\n    const selectedYear = selectedEl.dataset.year;\n    const isCurrentYear = selectedYear === yearItems[1].dataset.year;\n\n    console.log(\"Selected year:\", selectedYear, \"Type:\", typeVal);\n\n    if (typeVal === \"standings\") {\n        isYearSelected = true\n        manage_show_tables();\n        new Command(\"yearSelected\", { year: selectedYear, isCurrentYear, formula: currentFormula }).execute();\n    }\n    else if (typeVal === \"seasonreview\") {\n        manageSeasonReview();\n    }\n    else if (typeVal === \"sessionresults\") {\n        return;\n    }\n    else {\n        if (driverOrTeams === \"teams\" && [\"wins\", \"poles\", \"podiums\", \"dotd\"].includes(typeVal) && selectedYear !== \"all\") {\n            new Command(\"teamRecordRequest\", { type: typeVal, year: selectedYear, formula: currentFormula }).execute();\n        }\n        else {\n            new Command(\"recordSelected\", { type: typeVal, year: selectedYear }).execute();\n        }\n        manageShowRecords();\n    }\n}\n\nfunction manageSeasonReview(){\n    const driversTable = document.querySelector(\".drivers-table\")\n    const teamsTable = document.querySelector(\".teams-table\")\n    driversTable.classList.add(\"d-none\")\n    teamsTable.classList.add(\"d-none\")\n    const sessionResultsTable = document.querySelector(\".session-results-table\")\n    if (sessionResultsTable) sessionResultsTable.classList.add(\"d-none\")\n    const recordsList = document.querySelector(\".records-list\")\n    recordsList.classList.add(\"d-none\")\n\n    const seasonReviewBento = document.querySelector(\".season-review-bento\")    \n    seasonReviewBento.classList.remove(\"d-none\")\n    updateTopPanelControlsVisibility();\n    const driversTeamsPills = document.querySelector(\"#season_viewer .drivers-teams-pills\");\n    if (driversTeamsPills) driversTeamsPills.classList.add(\"d-none\");\n    const hideHistoric = document.querySelector(\"#season_viewer .hide-historic-drivers\");\n    if (hideHistoric) hideHistoric.classList.add(\"d-none\");\n\n    const selectedYear = document.getElementById(\"yearButton\")?.dataset?.year;\n    if (selectedYear) {\n        const yearMenu = document.querySelector(\"#yearMenu\");\n        const yearItems = yearMenu ? Array.from(yearMenu.querySelectorAll(\"a\")) : [];\n        const currentYear = yearItems[1]?.dataset?.year;\n        const isCurrentYear = currentYear ? (selectedYear === currentYear) : true;\n        new Command(\"seasonReviewSelected\", { year: selectedYear, isCurrentYear, formula: currentFormula }).execute();\n    }\n}\n\nexport function populateSeasonReview(data) {\n    populateDriversStandingsSeasonReview(data.driversStandings, {\n        events: data.events,\n        pointsInfo: data.pointsInfo,\n        lastRaceDoneId: data.lastRaceDoneId\n    })\n    populateTeamsStandingsSeasonReview(data.teamsStandings, {\n        events: data.events,\n        pointsInfo: data.pointsInfo,\n        lastRaceDoneId: data.lastRaceDoneId\n    })\n    updateRoundsCounterSeasonReview(data.events)\n    populateComparisonsSeasonReview(data.teamMateHeadToHead, data.teamsStandings)\n    populateQualifyingAnalysisSeasonReview(data.qualifyingStageCounts)\n    populateWinsDriversSeasonReview(data.winsRecords)\n    populateTeamsAggregateSeasonReview((data.teamWinsTotals?.length ? data.teamWinsTotals : data.winsRecords), \".wins-teams-list\", 4)\n    populateTeamsAggregateSeasonReview((data.teamPolesTotals?.length ? data.teamPolesTotals : data.polesRecords), \".poles-teams-list\", 4)\n    populateDriverOfTheDaySeasonReview(data.driverOfTheDayCounts)\n    populatePodiumsTeamsSeasonReview((data.teamPodiumsTotals?.length ? data.teamPodiumsTotals : data.podiumsRecords))\n    populatePodiumsDriversSeasonReview(data.podiumsRecords)\n}\n\nfunction updateRoundsCounterSeasonReview(events) {\n    const totalEvents = Array.isArray(events) ? events.length : 0;\n    // eventos que tienen event[3] == 2\n    const eventsDone = Array.isArray(events) ? events.filter(e => e[3] === 2).length : 0;\n    document.querySelectorAll(\".bento-title .first-number\").forEach(el => {\n        el.textContent = eventsDone;\n    });\n    document.querySelectorAll(\".bento-title .second-number\").forEach(el => {\n        el.textContent = totalEvents;\n    });\n}\n\nfunction populateComparisonsSeasonReview(comparisons, teamsStandings) {\n    const raceComparisons = document.querySelector(\".race-comparison\");\n    const qualiComparisons = document.querySelector(\".quali-comparison\");\n    if (!raceComparisons || !qualiComparisons) return;\n\n    raceComparisons.innerHTML = \"\";\n    qualiComparisons.innerHTML = \"\";\n    updateComparisonsMaxHeight();\n    ensureComparisonsHeightListener();\n    if (!Array.isArray(comparisons) || comparisons.length === 0) return;\n\n    const startH2HFromSeasonReview = (driver1Id, driver2Id) => {\n        const h2hPill = document.getElementById(\"h2hpill\");\n        if (h2hPill) h2hPill.click();\n\n        const driversModePill = document.getElementById(\"driverspillmodal\");\n        if (driversModePill) driversModePill.click();\n\n        const selectedYear = document.getElementById(\"yearButton\")?.dataset?.year;\n        const yearMenuH2H = document.getElementById(\"yearMenuH2H\");\n        queueAutoCompareDrivers(driver1Id, driver2Id);\n\n        if (selectedYear && yearMenuH2H) {\n            const yearLink = Array.from(yearMenuH2H.querySelectorAll(\"a\"))\n                .find(a => (a.dataset.year || a.textContent)?.trim() === String(selectedYear));\n            if (yearLink) yearLink.click();\n        }\n    };\n\n    const parseHeadToHead = (value) => {\n        if (typeof value === \"string\") {\n            const parts = value.split(\"-\").map(x => parseInt(x, 10));\n            if (parts.length === 2) {\n                return parts;\n            }\n        }\n        return [0, 0];\n    };\n\n    const getSurname = (name) => {\n        const words = (name || \"\").trim().split(/\\s+/).filter(Boolean);\n        return words.length ? words[words.length - 1] : \"\";\n    };\n\n    const teamPositionById = new Map();\n    if (Array.isArray(teamsStandings)) {\n        teamsStandings.forEach((row) => {\n            const teamId = Number(Array.isArray(row) ? row[0] : (row?.TeamID ?? row?.teamId));\n            const pos = Number(Array.isArray(row) ? row[1] : (row?.Position ?? row?.position));\n            teamPositionById.set(teamId, pos);\n        });\n    }\n\n    const ordered = [...comparisons].sort((a, b) => {\n        const teamA = Number(a?.teamId ?? a?.TeamID ?? a?.teamID ?? -1);\n        const teamB = Number(b?.teamId ?? b?.TeamID ?? b?.teamID ?? -1);\n        const posA = teamPositionById.get(teamA) ?? 999;\n        const posB = teamPositionById.get(teamB) ?? 999;\n        return Number(posA) - Number(posB);\n    });\n\n    const buildRow = (item, score1, score2) => {\n        const teamId = Number(item?.teamId ?? item?.TeamID ?? item?.teamID ?? -1);\n        const driver1Name = news_insert_space(item?.driver1Name ?? item?.Driver1Name ?? \"\");\n        const driver2Name = news_insert_space(item?.driver2Name ?? item?.Driver2Name ?? \"\");\n        const driver1Surname = getSurname(driver1Name);\n        const driver2Surname = getSurname(driver2Name);\n\n        const row = document.createElement(\"div\");\n        row.className = \"season-review-comparison-row\";\n\n        const teamKey = team_dict[teamId];\n        if (teamKey) row.classList.add(teamKey);\n\n        const name1Div = document.createElement(\"div\");\n        name1Div.className = \"season-review-comparison-name left\";\n        const surname1Span = document.createElement(\"span\");\n        surname1Span.className = \"bold-font\";\n        surname1Span.textContent = driver1Surname;\n        name1Div.appendChild(surname1Span);\n        row.appendChild(name1Div);\n\n        const score1Div = document.createElement(\"div\");\n        score1Div.className = \"season-review-comparison-score\";\n        score1Div.textContent = String(score1);\n        row.appendChild(score1Div);\n\n        if (teamId !== -1) {\n            const logoDiv = buildDriverLogoDiv(teamId, {\n                isF1: true,\n                wrapperClass: \"drivers-table-logo-div season-review-team-logo-div\"\n            });\n            row.appendChild(logoDiv);\n        }\n\n        const score2Div = document.createElement(\"div\");\n        score2Div.className = \"season-review-comparison-score\";\n        score2Div.textContent = String(score2);\n        row.appendChild(score2Div);\n\n        const name2Div = document.createElement(\"div\");\n        name2Div.className = \"season-review-comparison-name right\";\n        const surname2Span = document.createElement(\"span\");\n        surname2Span.className = \"bold-font\";\n        surname2Span.textContent = driver2Surname;\n        name2Div.appendChild(surname2Span);\n        row.appendChild(name2Div);\n\n        const driver1Id = Number(item?.driver1Id ?? item?.Driver1ID ?? item?.Driver1Id);\n        const driver2Id = Number(item?.driver2Id ?? item?.Driver2ID ?? item?.Driver2Id);\n        if (driver1Id > 0 && driver2Id > 0) {\n            row.addEventListener(\"click\", () => startH2HFromSeasonReview(driver1Id, driver2Id));\n        }\n\n        return row;\n    };\n\n    ordered.forEach((item) => {\n        let race1 = Number(item?.raceAhead1);\n        let race2 = Number(item?.raceAhead2);\n        if (!race1 && !race2) {\n            [race1, race2] = parseHeadToHead(item?.raceHeadToHead);\n        }\n\n        let quali1 = Number(item?.qualiAhead1);\n        let quali2 = Number(item?.qualiAhead2);\n        if (!quali1 && !quali2) {\n            [quali1, quali2] = parseHeadToHead(item?.qualiHeadToHead);\n        }\n\n        raceComparisons.appendChild(buildRow(item, race1, race2));\n        qualiComparisons.appendChild(buildRow(item, quali1, quali2));\n    });\n\n    updateComparisonsMaxHeight();\n}\n\nfunction populateDriversStandingsSeasonReview(data, meta = {}) {\n    const isF1 = currentFormula === 1;\n    const standings = document.querySelector(\".bento-driver-standings\");\n    if (!standings) return;\n    standings.innerHTML = \"\";\n    let leaderPts = data.length > 0 ? Number(data[0].Points) : 0;\n    const secondPts = data.length > 1 ? Number(data[1].Points) : 0;\n\n    let championClinched = false;\n    if (isF1 && data.length > 1 && meta && Array.isArray(meta.events) && meta.events.length > 0 && meta.pointsInfo) {\n        const lastRaceDoneId = Number(meta.lastRaceDoneId);\n        const lastRaceIndex = meta.events.findIndex(x => Number(x?.[0]) === lastRaceDoneId);\n\n        if (lastRaceIndex >= 0) {\n            const racesLeft = meta.events.length - (lastRaceIndex + 1);\n            const sprintsLeftLocal = meta.events.filter(x => Number(x?.[2]) === 1 && Number(x?.[0]) >= lastRaceDoneId).length;\n\n            const maxRacePoints = Number(meta.pointsInfo?.twoBiggestPoints?.[0]?.[0] ?? meta.pointsInfo?.twoBiggestPoints?.[0] ?? 0);\n            const isDoublePoints = Number(meta.pointsInfo?.isLastRaceDouble ?? meta.pointsInfo?.isLastraceDouble) === 1;\n            const fastestLapBonus = Number(meta.pointsInfo?.fastestLapBonusPoint) === 1;\n            const poleBonus = Number(meta.pointsInfo?.poleBonusPoint) === 1;\n\n            const pointsRemaining = racesLeft * maxRacePoints + sprintsLeftLocal * 8 +\n                (isDoublePoints ? maxRacePoints : 0) +\n                (fastestLapBonus ? racesLeft : 0) +\n                (poleBonus ? racesLeft : 0);\n\n            championClinched = (leaderPts - secondPts) > pointsRemaining;\n        }\n    }\n\n    data.forEach((driver, index) => {\n        const driverDiv = document.createElement(\"div\");\n        driverDiv.className = \"season-review-driver\";\n\n        const posDiv = document.createElement(\"div\");\n        posDiv.className = \"season-review-driver-position\";\n        posDiv.textContent = driver.Position;\n        driverDiv.appendChild(posDiv);\n\n        const teamId = Number(driver.TeamID ?? driver.teamId ?? driver.teamID ?? driver.TeamId ?? -1);\n        if (teamId !== -1) {\n            const logoDiv = buildDriverLogoDiv(teamId, {\n                isF1,\n                wrapperClass: \"drivers-table-logo-div season-review-driver-logo-div\"\n            });\n            driverDiv.appendChild(logoDiv);\n        }\n\n        const nameDiv = document.createElement(\"div\");\n        nameDiv.className = \"season-review-driver-name\";\n        const nameSpan = document.createElement(\"span\");\n        const surnameSpan = document.createElement(\"span\");\n        surnameSpan.className = \"bold-font\";\n        const fullName = news_insert_space(String(driver.DriverName ?? \"\"));\n        const nameParts = fullName.split(\" \");\n        format_name(fullName, nameParts, nameSpan, surnameSpan, true);\n        nameDiv.appendChild(nameSpan);\n        nameDiv.appendChild(surnameSpan);\n        driverDiv.appendChild(nameDiv);\n\n        const pointsDiv = document.createElement(\"div\");\n        pointsDiv.className = \"season-review-driver-points\";\n        pointsDiv.textContent = driver.Points;\n\n        const pointsDiff = Number(driver.Points) - leaderPts;\n        const diffDiv = document.createElement(\"div\");\n        diffDiv.className = \"season-review-driver-points diff\";\n        diffDiv.textContent = index === 0 ? \"\" : `+${pointsDiff.toString().replace(\"-\", \"\")}`;\n        driverDiv.appendChild(diffDiv);\n\n        driverDiv.appendChild(pointsDiv);\n\n        if (index === 0 && championClinched) {\n            posDiv.classList.add(\"champion\");\n            pointsDiv.classList.add(\"champion\");\n        }\n\n        standings.appendChild(driverDiv);\n    });\n\n    //calculate heiight and console log it\n    let height = standings.getBoundingClientRect().height;\n    console.log(\"Drivers Standings Height:\", height);\n\n    updateDriversStandingsMaxHeight();\n    ensureDriversStandingsHeightListener();\n}\n\nfunction updateDriversStandingsMaxHeight() {\n    const item = document.querySelector(\".bento-item.item-1\");\n    const standings = document.querySelector(\".bento-driver-standings\");\n    if (!item || !standings) return;\n\n    const height = item.getBoundingClientRect().height;\n    //if height is less than 60, maxHeight will be 570px\n    const maxHeight = height <= 60 ? 570 : Math.max(0, Math.floor(height - 60));\n\n    standings.style.maxHeight = `${maxHeight}px`;\n    standings.style.overflowX = \"hidden\";\n    standings.style.overflowY = \"hidden\";\n    standings.classList.remove(\"with-scrollbar\");\n    const needsScroll = standings.scrollHeight > (standings.clientHeight + 4);\n    if (needsScroll) {\n        standings.style.overflowY = \"auto\";\n        standings.classList.add(\"with-scrollbar\");\n    }\n}\n\nfunction ensureDriversStandingsHeightListener() {\n    if (driversStandingsHeightListenerAttached) return;\n    driversStandingsHeightListenerAttached = true;\n\n    let rafId = null;\n    window.addEventListener(\"resize\", () => {\n        if (rafId) cancelAnimationFrame(rafId);\n        rafId = requestAnimationFrame(() => {\n            rafId = null;\n            updateDriversStandingsMaxHeight();\n        });\n    });\n}\n\nfunction updateTeamsStandingsMaxHeight() {\n    const item = document.querySelector(\".bento-item.item-2\");\n    const standings = document.querySelector(\".bento-team-standings, .bento-teams-standings\");\n    if (!item || !standings) return;\n\n    const height = item.getBoundingClientRect().height;\n    // if height is less than 60, maxHeight will be 570px\n    const maxHeight = height <= 60 ? 570 : Math.max(0, Math.floor(height - 60));\n\n    standings.style.maxHeight = `${maxHeight}px`;\n    standings.style.overflowX = \"hidden\";\n    standings.style.overflowY = \"hidden\";\n    standings.classList.remove(\"with-scrollbar\");\n    const needsScroll = standings.scrollHeight > (standings.clientHeight + 4);\n    if (needsScroll) {\n        standings.style.overflowY = \"auto\";\n        standings.classList.add(\"with-scrollbar\");\n    }\n}\n\nfunction ensureTeamsStandingsHeightListener() {\n    if (teamsStandingsHeightListenerAttached) return;\n    teamsStandingsHeightListenerAttached = true;\n\n    let rafId = null;\n    window.addEventListener(\"resize\", () => {\n        if (rafId) cancelAnimationFrame(rafId);\n        rafId = requestAnimationFrame(() => {\n            rafId = null;\n            updateTeamsStandingsMaxHeight();\n        });\n    });\n}\n\nfunction updateComparisonsMaxHeight() {\n    const item = document.querySelector(\".bento-item.item-4\");\n    if (!item) return;\n\n    const height = item.getBoundingClientRect().height;\n    // if height is less than 60, maxHeight will be 570px\n    const maxHeight = height <= 60 ? 570 : Math.max(0, Math.floor(height - 60));\n\n    document.querySelectorAll(\".race-comparison, .quali-comparison\").forEach((el) => {\n        el.style.maxHeight = `${maxHeight}px`;\n        el.style.height = `${maxHeight}px`; \n        el.style.overflowX = \"hidden\";\n        el.style.overflowY = \"hidden\";\n        el.classList.remove(\"with-scrollbar\");\n        const needsScroll = el.scrollHeight > (el.clientHeight + 4);\n        if (needsScroll) {\n            el.style.overflowY = \"auto\";\n            el.classList.add(\"with-scrollbar\");\n        }\n    });\n}\n\nfunction ensureComparisonsHeightListener() {\n    if (comparisonsHeightListenerAttached) return;\n    comparisonsHeightListenerAttached = true;\n\n    let rafId = null;\n    window.addEventListener(\"resize\", () => {\n        if (rafId) cancelAnimationFrame(rafId);\n        rafId = requestAnimationFrame(() => {\n            rafId = null;\n            updateComparisonsMaxHeight();\n        });\n    });\n}\n\nfunction populateTeamsStandingsSeasonReview(data, meta = {}) {\n    if (!Array.isArray(data)) return;\n\n    const container = document.querySelector(\".bento-team-standings\");\n    if (!container) return;\n\n    container.innerHTML = \"\";\n    const leaderPts = data[0][2];\n    const secondPts = data.length > 1 ? Number((Array.isArray(data[1]) ? data[1][2] : (data[1]?.Points ?? data[1]?.points ?? 0))) : 0;\n\n    let championClinched = false;\n    if (currentFormula === 1 && data.length > 1 && meta && Array.isArray(meta.events) && meta.events.length > 0 && meta.pointsInfo) {\n        const lastRaceDoneId = Number(meta.lastRaceDoneId);\n        const lastRaceIndex = meta.events.findIndex(x => Number(x?.[0]) === lastRaceDoneId);\n\n        if (lastRaceIndex >= 0) {\n            const racesLeft = meta.events.length - (lastRaceIndex + 1);\n            const sprintsLeftLocal = meta.events.filter(x => Number(x?.[2]) === 1 && Number(x?.[0]) >= lastRaceDoneId).length;\n\n            const maxFirstPoints = Number(meta.pointsInfo?.twoBiggestPoints?.[0]?.[0] ?? meta.pointsInfo?.twoBiggestPoints?.[0] ?? 0);\n            const maxSecondPoints = Number(meta.pointsInfo?.twoBiggestPoints?.[1]?.[0] ?? meta.pointsInfo?.twoBiggestPoints?.[1] ?? 0);\n            const maxTeamRacePoints = maxFirstPoints + maxSecondPoints;\n\n            const isDoublePoints = Number(meta.pointsInfo?.isLastRaceDouble ?? meta.pointsInfo?.isLastraceDouble) === 1;\n            const fastestLapBonus = Number(meta.pointsInfo?.fastestLapBonusPoint) === 1;\n            const poleBonus = Number(meta.pointsInfo?.poleBonusPoint) === 1;\n\n            const pointsRemaining = racesLeft * maxTeamRacePoints + sprintsLeftLocal * 15 +\n                (isDoublePoints ? maxTeamRacePoints : 0) +\n                (fastestLapBonus ? racesLeft : 0) +\n                (poleBonus ? racesLeft : 0);\n\n            championClinched = (Number(leaderPts) - Number(secondPts)) > pointsRemaining;\n        }\n    }\n\n    data.forEach((team, index) => {\n        const teamObj = Array.isArray(team) ? {\n            TeamID: team[0],\n            Position: team[1],\n            Points: team[2]\n        } : team;\n\n        const teamDiv = document.createElement(\"div\");\n        teamDiv.className = \"season-review-team\";\n\n        const posDiv = document.createElement(\"div\");\n        posDiv.className = \"season-review-team-position\";\n        posDiv.textContent = teamObj.Position ?? teamObj.position ?? \"\";\n        teamDiv.appendChild(posDiv);\n\n        const teamId = Number(teamObj.TeamID ?? teamObj.teamId ?? teamObj.teamID ?? teamObj.TeamId ?? -1);\n        if (teamId !== -1) {\n            const logoDiv = buildDriverLogoDiv(teamId, {\n                isF1: true,\n                wrapperClass: \"drivers-table-logo-div season-review-team-logo-div\"\n            });\n            teamDiv.appendChild(logoDiv);\n        }\n\n        const nameDiv = document.createElement(\"div\");\n        nameDiv.className = \"season-review-team-name bold-font\";\n        nameDiv.textContent = formatTeamNameForDisplay(combined_dict[teamId] || \"\");\n        teamDiv.appendChild(nameDiv);\n\n        const pointsDiv = document.createElement(\"div\");\n        pointsDiv.className = \"season-review-team-points\";\n        pointsDiv.textContent = teamObj.Points ?? teamObj.points ?? \"\";\n        \n        const pointsDiff = Number(teamObj.Points) - leaderPts;\n        const diffDiv = document.createElement(\"div\");\n        diffDiv.className = \"season-review-team-points diff\";\n        diffDiv.textContent = index === 0 ? \"\" : `+${pointsDiff.toString().replace(\"-\", \"\")}`;\n        teamDiv.appendChild(diffDiv);\n        \n        teamDiv.appendChild(pointsDiv);\n\n        const position = Number(posDiv.textContent);\n        if (position === 1 && championClinched) {\n            posDiv.classList.add(\"champion\");\n            pointsDiv.classList.add(\"champion\");\n        }\n\n        container.appendChild(teamDiv);\n    });\n\n    updateTeamsStandingsMaxHeight();\n    ensureTeamsStandingsHeightListener();\n}\n\nfunction populateQualifyingAnalysisSeasonReview(data) {\n    const polesContainer = document.querySelector(\".poles-comparison\");\n    const q3Container = document.querySelector(\".q3-comparison\");\n    const q2Container = document.querySelector(\".q2-comparison\");\n    if (!polesContainer || !q3Container || !q2Container) return;\n\n    polesContainer.innerHTML = \"\";\n    q3Container.innerHTML = \"\";\n    q2Container.innerHTML = \"\";\n    if (!Array.isArray(data) || data.length === 0) return;\n\n    const getSurname = (name) => {\n        const words = (name || \"\").trim().split(/\\s+/).filter(Boolean);\n        return words.length ? words[words.length - 1] : \"\";\n    };\n\n    const buildRow = (entry, position, count) => {\n        const teamId = Number(entry?.teamId ?? entry?.TeamID ?? entry?.teamID ?? -1);\n        const fullName = news_insert_space(entry?.name ?? entry?.DriverName ?? \"\");\n        const surname = getSurname(fullName);\n\n        const row = document.createElement(\"div\");\n        row.className = \"season-review-qualifying-row\";\n\n        const posDiv = document.createElement(\"div\");\n        posDiv.className = \"season-review-qualifying-position\";\n        posDiv.textContent = String(position);\n        row.appendChild(posDiv);\n\n        if (teamId !== -1) {\n            const logoDiv = buildDriverLogoDiv(teamId, {\n                isF1: true,\n                wrapperClass: \"drivers-table-logo-div season-review-driver-logo-div\"\n            });\n            row.appendChild(logoDiv);\n        }\n\n        const nameDiv = document.createElement(\"div\");\n        nameDiv.className = \"season-review-qualifying-name\";\n        const surnameSpan = document.createElement(\"span\");\n        surnameSpan.className = \"bold-font\";\n        surnameSpan.textContent = surname;\n        nameDiv.appendChild(surnameSpan);\n        row.appendChild(nameDiv);\n\n        const countDiv = document.createElement(\"div\");\n        countDiv.className = \"season-review-qualifying-count\";\n        countDiv.textContent = String(count);\n        row.appendChild(countDiv);\n\n        return row;\n    };\n\n    const byKey = (key) => {\n        return [...data].filter((d) => (Number(d?.[key]) || 0) > 0).sort((a, b) => {\n            const av = Number(a?.[key]) || 0;\n            const bv = Number(b?.[key]) || 0;\n            if (bv !== av) return bv - av;\n            return String(a?.name ?? \"\").localeCompare(String(b?.name ?? \"\"));\n        });\n    };\n\n    const poles = byKey(\"poleCount\");\n    const q3s = byKey(\"q3Count\");\n    const q2s = byKey(\"q2Count\");\n\n    poles.forEach((d, idx) => polesContainer.appendChild(buildRow(d, idx + 1, Number(d?.poleCount) || 0)));\n    q3s.forEach((d, idx) => q3Container.appendChild(buildRow(d, idx + 1, Number(d?.q3Count) || 0)));\n    q2s.forEach((d, idx) => q2Container.appendChild(buildRow(d, idx + 1, Number(d?.q2Count) || 0)));\n\n    updateQualifyingListsMaxHeight();\n    ensureQualifyingListsHeightListener();\n}\n\nfunction updateQualifyingListsMaxHeight() {\n    const item = document.querySelector(\".bento-item.item-3\");\n    if (!item) return;\n\n    const height = item.getBoundingClientRect().height;\n    //if height is less than 60, maxHeight will be 250px\n    const maxHeight = height < 60 ? 250 : Math.max(0, Math.floor(height - 60));\n\n    document.querySelectorAll(\".poles-comparison, .q3-comparison, .q2-comparison\").forEach((el) => {\n        el.style.maxHeight = `${maxHeight}px`;\n        el.style.overflowX = \"hidden\";\n        el.style.overflowY = \"hidden\";\n        el.classList.remove(\"with-scrollbar\");\n        const needsScroll = el.scrollHeight > (el.clientHeight + 4);\n        if (needsScroll) {\n            el.style.overflowY = \"auto\";\n            el.classList.add(\"with-scrollbar\");\n        }\n    });\n}\n\nfunction ensureQualifyingListsHeightListener() {\n    if (qualifyingHeightListenerAttached) return;\n    qualifyingHeightListenerAttached = true;\n\n    let rafId = null;\n    window.addEventListener(\"resize\", () => {\n        if (rafId) cancelAnimationFrame(rafId);\n        rafId = requestAnimationFrame(() => {\n            rafId = null;\n            updateQualifyingListsMaxHeight();\n        });\n    });\n}\n\nfunction populateWinsDriversSeasonReview(data) {\n    const container = document.querySelector(\".wins-drivers-list\");\n    if (!container) return;\n\n    container.innerHTML = \"\";\n    if (!Array.isArray(data) || data.length === 0) return;\n\n    const ordered = [...data]\n        .filter(r => Number(r?.value) > 0)\n        .sort((a, b) => (Number(b?.value) || 0) - (Number(a?.value) || 0));\n\n    ordered.forEach((record, idx) => {\n        const row = document.createElement(\"div\");\n        row.className = \"season-review-wins-row\";\n\n        const posDiv = document.createElement(\"div\");\n        posDiv.className = \"season-review-wins-position\";\n        posDiv.textContent = String(idx + 1);\n        row.appendChild(posDiv);\n\n        const teamId = Number(record?.teamId ?? -1);\n        if (teamId !== -1) {\n            const logoDiv = buildDriverLogoDiv(teamId, {\n                isF1: true,\n                wrapperClass: \"drivers-table-logo-div season-review-driver-logo-div\"\n            });\n            row.appendChild(logoDiv);\n        }\n\n        const nameDiv = document.createElement(\"div\");\n        nameDiv.className = \"season-review-wins-name\";\n        const fullName = news_insert_space(record?.name ?? \"\");\n        const surname = fullName.split(\" \").pop();\n        const nameSpan = document.createElement(\"span\");\n        nameSpan.textContent = fullName.replace(surname, \"\");\n        const surnameSpan = document.createElement(\"span\");\n        surnameSpan.textContent = surname;\n        surnameSpan.className = \"bold-font\";\n        nameDiv.appendChild(nameSpan);\n        nameDiv.appendChild(surnameSpan);\n        row.appendChild(nameDiv);\n\n        const countDiv = document.createElement(\"div\");\n        countDiv.className = \"season-review-wins-count\";\n        countDiv.textContent = String(record?.value ?? 0);\n        row.appendChild(countDiv);\n\n        container.appendChild(row);\n    });\n\n    updateWinsDriversListMaxHeight();\n    ensureWinsDriversListHeightListener();\n}\n\nfunction updateWinsDriversListMaxHeight() {\n    const item = document.querySelector(\".bento-item.item-5\");\n    const list = document.querySelector(\".wins-drivers-list\");\n    if (!item || !list) return;\n\n    const height = item.getBoundingClientRect().height;\n    //if height is less than 60, maxHeight will be 300px\n    const maxHeight = height < 60 ? 300 : Math.max(0, Math.floor(height - 60));\n\n    list.style.maxHeight = `${maxHeight}px`;\n    list.style.overflowX = \"hidden\";\n    list.style.overflowY = \"hidden\";\n    const needsScroll = list.scrollHeight > (list.clientHeight + 4);\n    if (needsScroll) {\n        list.style.overflowY = \"auto\";\n    }\n}\n\nfunction ensureWinsDriversListHeightListener() {\n    if (winsHeightListenerAttached) return;\n    winsHeightListenerAttached = true;\n\n    let rafId = null;\n    window.addEventListener(\"resize\", () => {\n        if (rafId) cancelAnimationFrame(rafId);\n        rafId = requestAnimationFrame(() => {\n            rafId = null;\n            updateWinsDriversListMaxHeight();\n        });\n    });\n}\n\nfunction formatTeamNameForDisplay(teamName, { upper = false } = {}) {\n    const raw = String(teamName ?? \"\").trim();\n    const rawUpper = raw.toUpperCase();\n    const shortened = rawUpper === \"VISA CASHAPP RB\" ? \"VCARB\" : raw;\n    return upper ? shortened.toUpperCase() : shortened;\n}\n\nfunction addSeasonReviewPhantomRows(container, targetCount = 4) {\n    if (!container) return;\n    const currentCount = container.children.length;\n    for (let i = currentCount; i < targetCount; i++) {\n        const phantom = document.createElement(\"div\");\n        phantom.className = \"season-review-wins-row phantom-row\";\n        container.appendChild(phantom);\n    }\n}\n\nfunction populateTeamsAggregateSeasonReview(driverRecords, containerSelector, limit = 4) {\n    const container = document.querySelector(containerSelector);\n    if (!container) return;\n\n    container.innerHTML = \"\";\n    if (!Array.isArray(driverRecords) || driverRecords.length === 0) {\n        addSeasonReviewPhantomRows(container, 4);\n        return;\n    }\n\n    const totalsByTeamId = new Map();\n\n    driverRecords.forEach((rec) => {\n        const teamId = Number(rec?.teamId ?? -1);\n        const value = Number(rec?.value ?? 0);\n        if (teamId === -1) return;\n        if (value <= 0) return;\n        totalsByTeamId.set(teamId, (totalsByTeamId.get(teamId) || 0) + value);\n    });\n\n    const ordered = [...totalsByTeamId.entries()]\n        .map(([teamId, value]) => ({ teamId: Number(teamId), value: Number(value) }))\n        .sort((a, b) => (b.value - a.value) || String(combined_dict[a.teamId] || \"\").localeCompare(String(combined_dict[b.teamId] || \"\")))\n        .slice(0, limit);\n\n    ordered.forEach((team, idx) => {\n        const row = document.createElement(\"div\");\n        row.className = \"season-review-wins-row\";\n\n        const posDiv = document.createElement(\"div\");\n        posDiv.className = \"season-review-wins-position\";\n        posDiv.textContent = String(idx + 1);\n        row.appendChild(posDiv);\n\n        const logoDiv = buildDriverLogoDiv(team.teamId, {\n            isF1: true,\n            wrapperClass: \"drivers-table-logo-div season-review-team-logo-div\"\n        });\n        row.appendChild(logoDiv);\n\n        const nameDiv = document.createElement(\"div\");\n        nameDiv.className = \"season-review-wins-name bold-font\";\n        const teamName = combined_dict[team.teamId] || \"\";\n        nameDiv.textContent = formatTeamNameForDisplay(teamName, { upper: true });\n        row.appendChild(nameDiv);\n\n        const countDiv = document.createElement(\"div\");\n        countDiv.className = \"season-review-wins-count\";\n        countDiv.textContent = String(team.value);\n        row.appendChild(countDiv);\n\n        container.appendChild(row);\n    });\n\n    addSeasonReviewPhantomRows(container, 4);\n}\n\nfunction populateDriverOfTheDaySeasonReview(data) {\n    const left = document.querySelector(\".dotd-drivers-half-1\");\n    const right = document.querySelector(\".dotd-drivers-half-2\");\n    if (!left || !right) return;\n\n    left.innerHTML = \"\";\n    right.innerHTML = \"\";\n    if (!Array.isArray(data) || data.length === 0) {\n        addSeasonReviewPhantomRows(left, 4);\n        addSeasonReviewPhantomRows(right, 4);\n        return;\n    }\n\n    const ordered = [...data]\n        .filter(d => Number(d?.count) > 0)\n        .sort((a, b) => (Number(b?.count) || 0) - (Number(a?.count) || 0));\n\n    const top = ordered.slice(0, 8);\n    top.forEach((d, idx) => {\n        const half = idx < 4 ? left : right;\n        const row = document.createElement(\"div\");\n        row.className = \"season-review-wins-row\";\n\n        const posDiv = document.createElement(\"div\");\n        posDiv.className = \"season-review-wins-position\";\n        posDiv.textContent = String(idx + 1);\n        row.appendChild(posDiv);\n\n        const teamId = Number(d?.teamId ?? -1);\n        if (teamId !== -1) {\n            const logoDiv = buildDriverLogoDiv(teamId, {\n                isF1: true,\n                wrapperClass: \"drivers-table-logo-div season-review-driver-logo-div\"\n            });\n            row.appendChild(logoDiv);\n        }\n\n        const nameDiv = document.createElement(\"div\");\n        nameDiv.className = \"season-review-wins-name\";\n        const fullName = news_insert_space(d?.name ?? \"\");\n        const surname = fullName.split(\" \").pop();\n        const surnameSpan = document.createElement(\"span\");\n        surnameSpan.className = \"bold-font\";\n        surnameSpan.textContent = surname;\n        nameDiv.appendChild(surnameSpan);\n        row.appendChild(nameDiv);\n\n        const countDiv = document.createElement(\"div\");\n        countDiv.className = \"season-review-wins-count\";\n        countDiv.textContent = String(d?.count ?? 0);\n        row.appendChild(countDiv);\n\n        half.appendChild(row);\n    });\n\n    addSeasonReviewPhantomRows(left, 4);\n    addSeasonReviewPhantomRows(right, 4);\n}\n\nfunction computeTeamTotalsFromDriverRecords(driverRecords) {\n    const totalsByTeamId = new Map();\n\n    (driverRecords || []).forEach((rec) => {\n        const teamId = Number(rec?.teamId ?? -1);\n        const value = Number(rec?.value ?? 0);\n        if (teamId === -1) return;\n        if (value <= 0) return;\n        totalsByTeamId.set(teamId, (totalsByTeamId.get(teamId) || 0) + value);\n    });\n\n    return [...totalsByTeamId.entries()]\n        .map(([teamId, value]) => ({ teamId: Number(teamId), value: Number(value) }))\n        .sort((a, b) => (b.value - a.value) || String(combined_dict[a.teamId] || \"\").localeCompare(String(combined_dict[b.teamId] || \"\")));\n}\n\nfunction populateWinsTeamsSeasonReview(winsRecords) {\n    const left = document.querySelector(\".wins-teams-half-1\");\n    const right = document.querySelector(\".wins-teams-half-2\");\n    if (!left || !right) return;\n\n    left.innerHTML = \"\";\n    right.innerHTML = \"\";\n\n    const ordered = computeTeamTotalsFromDriverRecords(winsRecords).slice(0, 8);\n\n    ordered.forEach((team, idx) => {\n        const half = idx < 4 ? left : right;\n        const row = document.createElement(\"div\");\n        row.className = \"season-review-wins-row\";\n\n        const posDiv = document.createElement(\"div\");\n        posDiv.className = \"season-review-wins-position\";\n        posDiv.textContent = String(idx + 1);\n        row.appendChild(posDiv);\n\n        const logoDiv = buildDriverLogoDiv(team.teamId, {\n            isF1: true,\n            wrapperClass: \"drivers-table-logo-div season-review-team-logo-div\"\n        });\n        row.appendChild(logoDiv);\n\n        const nameDiv = document.createElement(\"div\");\n        nameDiv.className = \"season-review-wins-name bold-font\";\n        nameDiv.textContent = formatTeamNameForDisplay(combined_dict[team.teamId] || \"\", { upper: true });\n        row.appendChild(nameDiv);\n\n        const countDiv = document.createElement(\"div\");\n        countDiv.className = \"season-review-wins-count\";\n        countDiv.textContent = String(team.value);\n        row.appendChild(countDiv);\n\n        half.appendChild(row);\n    });\n}\n\nfunction populatePodiumsTeamsSeasonReview(podiumsRecords) {\n    const left = document.querySelector(\".podiums-teams-half-1\");\n    const right = document.querySelector(\".podiums-teams-half-2\");\n    if (!left || !right) return;\n\n    left.innerHTML = \"\";\n    right.innerHTML = \"\";\n\n    const ordered = computeTeamTotalsFromDriverRecords(podiumsRecords).slice(0, 8);\n\n    ordered.forEach((team, idx) => {\n        const half = idx < 4 ? left : right;\n        const row = document.createElement(\"div\");\n        row.className = \"season-review-wins-row\";\n\n        const posDiv = document.createElement(\"div\");\n        posDiv.className = \"season-review-wins-position\";\n        posDiv.textContent = String(idx + 1);\n        row.appendChild(posDiv);\n\n        const logoDiv = buildDriverLogoDiv(team.teamId, {\n            isF1: true,\n            wrapperClass: \"drivers-table-logo-div season-review-team-logo-div\"\n        });\n        row.appendChild(logoDiv);\n\n        const nameDiv = document.createElement(\"div\");\n        nameDiv.className = \"season-review-wins-name bold-font\";\n        nameDiv.textContent = formatTeamNameForDisplay(combined_dict[team.teamId] || \"\", { upper: true });\n        row.appendChild(nameDiv);\n\n        const countDiv = document.createElement(\"div\");\n        countDiv.className = \"season-review-wins-count\";\n        countDiv.textContent = String(team.value);\n        row.appendChild(countDiv);\n\n        half.appendChild(row);\n    });\n\n    addSeasonReviewPhantomRows(left, 4);\n    addSeasonReviewPhantomRows(right, 4);\n}\n\nfunction populatePodiumsDriversSeasonReview(podiumsRecords) {\n    const left = document.querySelector(\".podiums-drivers-half-1\");\n    const right = document.querySelector(\".podiums-drivers-half-2\");\n    if (!left || !right) return;\n\n    left.innerHTML = \"\";\n    right.innerHTML = \"\";\n    if (!Array.isArray(podiumsRecords) || podiumsRecords.length === 0) {\n        addSeasonReviewPhantomRows(left, 4);\n        addSeasonReviewPhantomRows(right, 4);\n        return;\n    }\n\n    const ordered = [...podiumsRecords]\n        .filter(r => Number(r?.value) > 0)\n        .sort((a, b) => (Number(b?.value) || 0) - (Number(a?.value) || 0))\n        .slice(0, 8);\n\n    ordered.forEach((record, idx) => {\n        const half = idx < 4 ? left : right;\n        const row = document.createElement(\"div\");\n        row.className = \"season-review-wins-row\";\n\n        const posDiv = document.createElement(\"div\");\n        posDiv.className = \"season-review-wins-position\";\n        posDiv.textContent = String(idx + 1);\n        row.appendChild(posDiv);\n\n        const teamId = Number(record?.teamId ?? -1);\n        if (teamId !== -1) {\n            const logoDiv = buildDriverLogoDiv(teamId, {\n                isF1: true,\n                wrapperClass: \"drivers-table-logo-div season-review-driver-logo-div\"\n            });\n            row.appendChild(logoDiv);\n        }\n\n        const nameDiv = document.createElement(\"div\");\n        nameDiv.className = \"season-review-wins-name\";\n        const fullName = news_insert_space(record?.name ?? \"\");\n        const surname = fullName.split(\" \").pop();\n        const surnameSpan = document.createElement(\"span\");\n        surnameSpan.className = \"bold-font\";\n        surnameSpan.textContent = surname;\n        nameDiv.appendChild(surnameSpan);\n        row.appendChild(nameDiv);\n\n        const countDiv = document.createElement(\"div\");\n        countDiv.className = \"season-review-wins-count\";\n        countDiv.textContent = String(record?.value ?? 0);\n        row.appendChild(countDiv);\n\n        half.appendChild(row);\n    });\n\n    addSeasonReviewPhantomRows(left, 4);\n    addSeasonReviewPhantomRows(right, 4);\n}\n\ndocument.querySelector(\".bento-grid .item-1\").addEventListener(\"click\", () => {\n    const driversTablePill = document.querySelector(\"#driverspill\");\n    if (driversTablePill) driversTablePill.click();\n    const standingsPill = document.querySelector(\"#standingspill\");\n    if (standingsPill) standingsPill.click();\n});\n\ndocument.querySelector(\".bento-grid .item-2\").addEventListener(\"click\", () => {\n    const teamsTablePill = document.querySelector(\"#teamspill\");\n    if (teamsTablePill) teamsTablePill.click();\n    const standingsPill = document.querySelector(\"#standingspill\");\n    if (standingsPill) standingsPill.click();\n});\n\ndocument.querySelector(\".bento-grid .item-10\").addEventListener(\"click\", () => {\n    const teamsTablePill = document.querySelector(\"#teamspill\");\n    if (teamsTablePill) teamsTablePill.click();\n    const polesPill = document.querySelector(\"#polespill\");\n    if (polesPill) polesPill.click();\n});\n\ndocument.querySelector(\".bento-grid .item-3\").addEventListener(\"click\", () => {\n    const driversTablePill = document.querySelector(\"#driverspill\");\n    if (driversTablePill) driversTablePill.click();\n    const polesPill = document.querySelector(\"#polespill\");\n    if (polesPill) polesPill.click();\n});\n\ndocument.querySelector(\".bento-grid .item-6\").addEventListener(\"click\", () => {\n    const teamsTablePill = document.querySelector(\"#teamspill\");\n    if (teamsTablePill) teamsTablePill.click();\n    const winsPill = document.querySelector(\"#winspill\");\n    if (winsPill) winsPill.click();\n});\n\ndocument.querySelector(\".bento-grid .item-5\").addEventListener(\"click\", () => {\n    const driversTablePill = document.querySelector(\"#driverspill\");\n    if (driversTablePill) driversTablePill.click();\n    const winsPill = document.querySelector(\"#winspill\");\n    if (winsPill) winsPill.click();\n});\n\ndocument.querySelector(\".bento-grid .item-8\").addEventListener(\"click\", () => {\n    const teamsTablePill = document.querySelector(\"#teamspill\");\n    if (teamsTablePill) teamsTablePill.click();\n    const podiumPill = document.querySelector(\"#podiumspill\");\n    if (podiumPill) podiumPill.click();\n});\n\ndocument.querySelector(\".bento-grid .item-7\").addEventListener(\"click\", () => {\n    const driversTablePill = document.querySelector(\"#driverspill\");\n    if (driversTablePill) driversTablePill.click();\n    const dotdPill = document.querySelector(\"#dotdpill\");\n    if (dotdPill) dotdPill.click();\n});\n\n\ndocument.querySelector(\".bento-grid .item-9\").addEventListener(\"click\", () => {\n    const driversTablePill = document.querySelector(\"#driverspill\");\n    if (driversTablePill) driversTablePill.click();\n    const podiumPill = document.querySelector(\"#podiumspill\");\n    if (podiumPill) podiumPill.click();\n});\n\nfunction manageShowRecords() {\n    const driversTable = document.querySelector(\".drivers-table\")\n    const teamsTable = document.querySelector(\".teams-table\")\n    driversTable.classList.add(\"d-none\")\n    teamsTable.classList.add(\"d-none\")\n    const seasonReviewBento = document.querySelector(\".season-review-bento\")\n    seasonReviewBento.classList.add(\"d-none\")\n    const sessionResultsTable = document.querySelector(\".session-results-table\")\n    if (sessionResultsTable) sessionResultsTable.classList.add(\"d-none\")\n\n    const recordsList = document.querySelector(\".records-list\")\n    recordsList.classList.remove(\"d-none\")\n    recordsList.innerHTML = \"\"\n    updateTopPanelControlsVisibility();\n}\n\nfunction showSessionResultsTable() {\n    const driversTable = document.querySelector(\".drivers-table\")\n    const teamsTable = document.querySelector(\".teams-table\")\n    const seasonReviewBento = document.querySelector(\".season-review-bento\")\n    const recordsList = document.querySelector(\".records-list\")\n    const sessionResultsTable = document.querySelector(\".session-results-table\")\n\n    if (driversTable) driversTable.classList.add(\"d-none\")\n    if (teamsTable) teamsTable.classList.add(\"d-none\")\n    if (seasonReviewBento) seasonReviewBento.classList.add(\"d-none\")\n    if (recordsList) recordsList.classList.add(\"d-none\")\n    if (sessionResultsTable) sessionResultsTable.classList.remove(\"d-none\")\n\n    updateTopPanelControlsVisibility();\n}\n\nfunction getSessionResultsQualiGridPosition(row) {\n    const explicitGridPosition = Number(row?.gridPosition);\n    if (explicitGridPosition > 0) return explicitGridPosition;\n\n    const qualifyingPos = Number(row?.pos);\n    const gridPenalty = Number(row?.gridPenalty);\n    const computedGridPosition = gridPenalty > 0 ? 0 : qualifyingPos;\n    return computedGridPosition > 0 ? computedGridPosition : 0;\n}\n\nexport function onSessionResultsFetched(data) {\n    sessionResultsLastFetched = data;\n    const meta = data?.meta || {};\n    const headerMain = document.querySelector(\".session-results-title-main\");\n    const headerSession = document.querySelector(\".session-results-title-session\");\n    const headerRound = document.querySelector(\".session-results-title-round\");\n    const titleEl = document.querySelector(\".session-results-title\");\n    const editToggle = document.getElementById(\"sessionResultsEditToggle\");\n    \n    if (headerMain && headerSession) {\n        const year = String(data?.year ?? \"\").trim();\n        const trackId = meta?.trackId;\n        const gpNameRaw = getGpDisplayName(trackId);\n        const gpNameRawStr = String(gpNameRaw || \"\").trim();\n        let gpName = gpNameRawStr;\n        if (/\\bgrand prix\\b/i.test(gpNameRawStr)) {\n            gpName = gpNameRawStr;\n        }\n        else if (/\\bgp\\b/i.test(gpNameRawStr)) {\n            gpName = gpNameRawStr.replace(/\\bgp\\b/ig, \"Grand Prix\");\n        }\n        else {\n            gpName = `${gpNameRawStr} Grand Prix`;\n        }\n        gpName = gpName.trim();\n\n        const weekendType = meta?.weekendType;\n        const sessionKey = String(data?.sessionKey ?? meta?.sessionKey ?? \"\").trim();\n        const sessionLabel = getSessionOptionsForWeekend(weekendType).find(o => o.key === sessionKey)?.label\n            || sessionKey\n            || \"\";\n\n        headerMain.textContent = `${year} ${gpName}`.trim();\n        headerSession.textContent = String(sessionLabel);\n    }\n    if (headerRound) {\n        const yearKey = String(data?.year ?? \"\").trim();\n        const events = sessionResultsEventsCache.get(yearKey);\n        const raceId = Number(data?.raceId ?? meta?.raceId);\n        const total = Array.isArray(events) ? events.length : 0;\n        const idx = Array.isArray(events) ? events.findIndex(e => Number(e?.[0]) === raceId) : -1;\n        headerRound.textContent = (total > 0 && idx >= 0) ? `ROUND ${idx + 1}/${total}` : \"\";\n    }\n\n    if (titleEl) {\n        const trackId = Number(meta?.trackId);\n        const trackCode = races_names?.[trackId];\n        const flagKey = trackCode ? `${String(trackCode).toLowerCase()}0` : null;\n        const flagPath = flagKey ? codes_dict?.[flagKey] : null;\n        const useTallFlagHeader = [\"HUN\", \"NED\", \"UAE\"].includes(String(trackCode || \"\").toUpperCase());\n        titleEl.style.setProperty(\n            \"--session-results-flag-bg\",\n            flagPath ? `url(\"${String(flagPath)}\")` : \"none\"\n        );\n        titleEl.classList.toggle(\"session-results-title-tall-flag\", useTallFlagHeader);\n    }\n\n    document.querySelectorAll(\".session-results-table .session-results-rows .session-results-row\").forEach((el) => el.remove());\n\n    const rawResults = data?.results ?? data;\n    const results = Array.isArray(rawResults) ? rawResults : [];\n    const sessionKeyLower = String(data?.sessionKey ?? meta?.sessionKey ?? \"\").toLowerCase();\n    const isMainRaceSession = sessionKeyLower === \"race\";\n    const isRaceSession = sessionKeyLower === \"race\" || sessionKeyLower === \"sprintrace\";\n    const isQualiSession = sessionKeyLower === \"quali\" || sessionKeyLower === \"sprintquali\";\n    const isPracticeSession = sessionKeyLower === \"fp\" || sessionKeyLower === \"fp1\" || sessionKeyLower === \"fp2\" || sessionKeyLower === \"fp3\";\n    const isEditableResultsSession = isMainRaceSession || sessionKeyLower === \"sprintrace\";\n    const isEditRace = sessionResultsEditMode && isEditableResultsSession;\n    const dotdDriverId = Number(meta?.dotdDriverId);\n    const showPointsColumn = !isPracticeSession && (!isQualiSession || Number(meta?.hasPolePositionPoints) === 1);\n    const hasQualiGrid = isQualiSession && results.some((r) => getSessionResultsQualiGridPosition(r) > 0);\n\n    if (!isEditableResultsSession && sessionResultsEditMode) {\n        sessionResultsEditMode = false;\n        manageSaveButton(false);\n    }\n    if (editToggle) editToggle.classList.toggle(\"d-none\", !isEditableResultsSession);\n    if (editToggle) {\n        const label = editToggle.querySelector(\"span\");\n        if (label) label.textContent = sessionResultsEditMode && isMainRaceSession ? \"Cancel\" : \"Edit\";\n    }\n\n    const sessionResultsTable = document.querySelector(\".session-results-table\");\n    const hasGrid = results.some((r) => {\n        const grid = Number(r?.grid);\n        return grid > 0;\n    });\n    const hasTime = results.some((r) => {\n        const time = Number(r?.time);\n        return time > 0;\n    });\n\n    if (sessionResultsTable) {\n        sessionResultsTable.classList.toggle(\"no-grid\", !hasGrid);\n        sessionResultsTable.classList.toggle(\"no-time\", !hasTime);\n        sessionResultsTable.classList.toggle(\"is-quali\", isQualiSession);\n        sessionResultsTable.classList.toggle(\"is-practice\", isPracticeSession);\n        sessionResultsTable.classList.toggle(\"is-edit\", isEditRace);\n        sessionResultsTable.classList.toggle(\"is-compact\", sessionResultsCompactMode);\n        sessionResultsTable.classList.toggle(\"no-points\", !showPointsColumn);\n        sessionResultsTable.classList.toggle(\"has-quali-grid\", hasQualiGrid);\n    }\n\n    const leaderRow = results.find(r => Number(r?.pos) === 1) || results[0] || null;\n    const leaderTime = leaderRow ? Number(leaderRow?.time) : null;\n    const leaderLaps = leaderRow ? Number(leaderRow?.laps) : null;\n\n    const fastestLapBest = results\n        .map(r => Number(r?.fastestLap))\n        .filter(v => v > 0)\n        .reduce((min, v) => (min == null || v < min ? v : min), null);\n\n    const q1Best = results\n        .map(r => Number(r?.q1FastestLap))\n        .filter(v => v > 0)\n        .reduce((min, v) => (min == null || v < min ? v : min), null);\n    const q2Best = results\n        .map(r => Number(r?.q2FastestLap))\n        .filter(v => v > 0)\n        .reduce((min, v) => (min == null || v < min ? v : min), null);\n    const q3Best = results\n        .map(r => Number(r?.q3FastestLap))\n        .filter(v => v > 0)\n        .reduce((min, v) => (min == null || v < min ? v : min), null);\n\n    results.forEach((row, idx) => {\n        const sessionResultRow = document.createElement(\"div\");\n        sessionResultRow.className = \"session-results-row\";\n        if (idx % 2 === 1) sessionResultRow.classList.add(\"odd\");\n        if (row?.driverId != null) sessionResultRow.dataset.driverid = String(row.driverId);\n        sessionResultRow.dataset.dnf = Number(row?.dnf) === 1 ? \"1\" : \"0\";\n\n        const dragDiv = document.createElement(\"div\");\n        dragDiv.className = \"session-results-drag session-results-cell\";\n        const dragIcon = document.createElement(\"div\");\n        dragIcon.className = \"session-results-drag-icon\";\n        dragDiv.appendChild(dragIcon);\n        if (!isEditRace) {\n            dragDiv.classList.add(\"hidden\");\n        } else {\n            dragDiv.classList.add(\"session-results-drag-handle\");\n            dragDiv.draggable = true;\n            dragDiv.addEventListener(\"dragstart\", (e) => {\n                sessionResultsDraggedRow = sessionResultRow;\n                sessionResultRow.classList.add(\"dragging\");\n                e.dataTransfer.effectAllowed = \"move\";\n                e.dataTransfer.setData(\"text/plain\", \"\");\n            });\n            dragDiv.addEventListener(\"dragend\", () => {\n                sessionResultRow.classList.remove(\"dragging\");\n                sessionResultsDraggedRow = null;\n                if (sessionResultsDragRaf) {\n                    cancelAnimationFrame(sessionResultsDragRaf);\n                    sessionResultsDragRaf = 0;\n                }\n                const container = document.querySelector(\".session-results-table .session-results-rows\");\n                if (container) {\n                    reindexRaceEditPositions(container);\n                    updateRaceEditPoints();\n                }\n            });\n        }\n        sessionResultRow.appendChild(dragDiv);\n\n        const posDiv = document.createElement(\"div\");\n        posDiv.className = \"session-results-position\";\n        posDiv.classList.add(\"session-results-cell\");\n        const pos = Number(row?.pos);\n        posDiv.textContent = String(pos);\n        if (pos === 1) sessionResultRow.classList.add(\"leader\");\n        if (pos === 1) posDiv.classList.add(\"champion\");\n        else if (pos === 2) posDiv.classList.add(\"second\");\n        else if (pos === 3) posDiv.classList.add(\"third\");\n        if (isQualiSession) {\n            const q2CutPos = custom_team ? 16 : 15;\n            if (pos === q2CutPos) sessionResultRow.classList.add(\"quali-cut-q2\");\n            if (pos === 10) sessionResultRow.classList.add(\"quali-cut-q3\");\n        }\n        sessionResultRow.appendChild(posDiv);\n\n        const gainedLostDiv = document.createElement(\"div\");\n        gainedLostDiv.className = \"session-results-gained-lost\";\n        gainedLostDiv.classList.add(\"session-results-cell\");\n        const gainedLostNumber = document.createElement(\"span\");\n        gainedLostNumber.className = \"session-results-gained-lost-number\";\n        const gainedLostIcon = document.createElement(\"i\");\n        gainedLostDiv.appendChild(gainedLostNumber);\n        gainedLostDiv.appendChild(gainedLostIcon);\n\n        const grid = Number(row?.grid);\n        const gained = grid - pos;\n        if (gained > 0) {\n            gainedLostNumber.textContent = `${gained}`;\n            gainedLostIcon.className = \"bi bi-caret-up-fill\";\n            gainedLostDiv.classList.add(\"up\");\n        }\n        else if (gained < 0) {\n            gainedLostNumber.textContent = `${-gained}`;\n            gainedLostIcon.className = \"bi bi-caret-down-fill\";\n            gainedLostDiv.classList.add(\"down\");\n        }\n        else {\n            gainedLostNumber.textContent = \"\";\n            gainedLostIcon.className = \"bi bi-dash\";\n            gainedLostDiv.classList.add(\"neutral\");\n        }\n        if (!hasGrid) gainedLostDiv.classList.add(\"hidden\");\n        sessionResultRow.appendChild(gainedLostDiv);\n\n        const driverDiv = document.createElement(\"div\");\n        driverDiv.className = \"session-results-driver-name\";\n        driverDiv.classList.add(\"session-results-cell\");\n        const nat = String(row?.nationality ?? \"\").trim();\n        if (nat) {\n            const img = document.createElement(\"img\");\n            img.className = \"session-results-nationality-flag\";\n            img.alt = nat;\n            img.loading = \"lazy\";\n            img.decoding = \"async\";\n            img.src = `https://flagsapi.com/${nat}/flat/64.png`;\n            driverDiv.appendChild(img);\n        }\n        const driverName = String(row?.name ?? \"\");\n        const nameParts = driverName.split(\" \");\n        const nameSpan = document.createElement(\"span\");\n        nameSpan.className = \"session-results-first-name\";\n        const surnameSpan = document.createElement(\"span\");\n        surnameSpan.className = \"bold-font session-results-surname\";\n        format_name(driverName, nameParts, nameSpan, surnameSpan);\n        surnameSpan.textContent = String(surnameSpan.textContent || \"\").toUpperCase();\n        driverDiv.appendChild(nameSpan);\n        driverDiv.appendChild(surnameSpan);\n        if (isMainRaceSession && dotdDriverId > 0 && Number(row?.driverId) === dotdDriverId) {\n            const dotdSpan = document.createElement(\"span\");\n            dotdSpan.className = \"session-results-dotd\";\n            dotdSpan.textContent = \"DotD\";\n            driverDiv.appendChild(dotdSpan);\n        }\n\n        sessionResultRow.appendChild(driverDiv);\n\n        const teamId = Number(row?.teamId ?? -1);\n        const teamDiv = document.createElement(\"div\");\n        teamDiv.className = \"session-results-team\";\n        teamDiv.classList.add(\"session-results-cell\");\n\n        const logoDiv = teamId !== -1\n            ? buildDriverLogoDiv(teamId, {\n                isF1: true,\n                wrapperClass: \"drivers-table-logo-div session-results-driver-logo-div\"\n            })\n            : (() => {\n                const empty = document.createElement(\"div\");\n                empty.className = \"drivers-table-logo-div session-results-driver-logo-div\";\n                return empty;\n            })();\n        teamDiv.appendChild(logoDiv);\n\n        const teamNameSpan = document.createElement(\"span\");\n        teamNameSpan.className = \"session-results-team-name\";\n        teamNameSpan.textContent = (teamId !== -1) ? formatTeamNameForDisplay((combined_dict?.[teamId] ?? \"\"), { upper: true }) : \"\";\n        teamDiv.appendChild(teamNameSpan);\n\n        const engineNameSpan = document.createElement(\"span\");\n        engineNameSpan.className = \"session-results-engine-name\";\n        if (currentFormula === 1 && teamId !== -1) {\n            const engineId = engine_allocations?.[teamId];\n            const engineName = engineId != null ? engine_names?.[engineId] : \"\";\n            engineNameSpan.textContent = String(engineName || \"\").toUpperCase();\n        }\n        teamDiv.appendChild(engineNameSpan);\n\n        sessionResultRow.appendChild(teamDiv);\n\n        const spacerDiv = document.createElement(\"div\");\n        spacerDiv.className = \"session-results-spacer\";\n        sessionResultRow.appendChild(spacerDiv);\n\n        const q1Div = document.createElement(\"div\");\n        q1Div.className = \"session-results-quali-lap session-results-q1\";\n        q1Div.classList.add(\"session-results-cell\");\n        const q1 = Number(row?.q1FastestLap);\n        q1Div.innerText = q1 > 0 ? formatLapTime(q1) : \"-\";\n        if (q1Best != null && q1 > 0 && Math.abs(q1 - q1Best) < 1e-6) q1Div.classList.add(\"fastest\");\n        if (!isQualiSession) q1Div.classList.add(\"hidden\");\n        sessionResultRow.appendChild(q1Div);\n\n        const q2Div = document.createElement(\"div\");\n        q2Div.className = \"session-results-quali-lap session-results-q2\";\n        q2Div.classList.add(\"session-results-cell\");\n        const q2 = Number(row?.q2FastestLap);\n        q2Div.innerText = q2 > 0 ? formatLapTime(q2) : \"-\";\n        if (q2Best != null && q2 > 0 && Math.abs(q2 - q2Best) < 1e-6) q2Div.classList.add(\"fastest\");\n        if (!isQualiSession) q2Div.classList.add(\"hidden\");\n        sessionResultRow.appendChild(q2Div);\n\n\n        //for q3, display difference (without any 0 in front, so if 0:01.223 should be 1.223) to q3best instead of lap time, if q3best is available and the lap time is valid\n        const q3Div = document.createElement(\"div\");\n        q3Div.className = \"session-results-quali-lap session-results-q3\";\n        q3Div.classList.add(\"session-results-cell\");\n        const q3 = Number(row?.q3FastestLap);\n        if (q3Best != null && q3 > 0 && Math.abs(q3 - q3Best) < 1e-6) q3Div.classList.add(\"fastest\");\n        if (q3Best != null && q3 > 0) {\n            const q3Gap = q3 - q3Best;\n            q3Div.innerText = q3Gap > 0 ? `+${q3Gap.toFixed(3)}` : formatLapTime(q3);\n        }        else {\n            q3Div.innerText = q3 > 0 ? formatLapTime(q3) : \"-\";\n        }\n        if (!isQualiSession) q3Div.classList.add(\"hidden\");\n        sessionResultRow.appendChild(q3Div);\n\n        const lapsDiv = document.createElement(\"div\");\n        lapsDiv.className = \"session-results-laps\";\n        lapsDiv.classList.add(\"session-results-cell\");\n        const laps = Number(row?.laps);\n        lapsDiv.innerText = laps >= 0 ? String(laps) : \"-\";\n        if (!isPracticeSession) lapsDiv.classList.add(\"hidden\");\n        sessionResultRow.appendChild(lapsDiv);\n\n        const fastestLapDiv = document.createElement(\"div\");\n        fastestLapDiv.className = \"session-results-fastest-lap\";\n        fastestLapDiv.classList.add(\"session-results-cell\");\n        if (isPracticeSession) fastestLapDiv.classList.add(\"session-results-fastest-lap-practice\");\n        const fl = Number(row?.fastestLap);\n        if (fl > 0) {\n            if (isPracticeSession && fastestLapBest != null) {\n                const flGap = fl - fastestLapBest;\n                fastestLapDiv.innerText = flGap > 0 ? `+${flGap.toFixed(3)}` : formatLapTime(fl);\n            } else {\n                fastestLapDiv.innerText = formatLapTime(fl);\n            }\n            if (fastestLapBest != null && Math.abs(fl - fastestLapBest) < 1e-6) {\n                fastestLapDiv.classList.add(\"fastest\");\n            }\n        }\n        if (isQualiSession) fastestLapDiv.classList.add(\"hidden\");\n        sessionResultRow.appendChild(fastestLapDiv);\n\n        const timeDiv = document.createElement(\"div\");\n        timeDiv.className = \"session-results-time\";\n        timeDiv.classList.add(\"session-results-cell\");\n        if (isEditRace) {\n            const dnf = Number(row?.dnf) === 1;\n            const rowTime = Number(row?.time);\n            const input = document.createElement(\"input\");\n            input.className = \"session-results-time-input\";\n            input.type = \"text\";\n            input.value = dnf ? \"DNF\" : ((rowTime > 0) ? formatLapTime(rowTime) : \"\");\n            input.placeholder = \"DNF or 0:00.000\";\n            input.addEventListener(\"input\", () => {\n                const v = String(input.value || \"\").trim();\n                const isDnf = /^dnf$/i.test(v);\n                sessionResultRow.dataset.dnf = isDnf ? \"1\" : \"0\";\n                updateRaceEditPoints();\n            });\n            timeDiv.appendChild(input);\n        }\n        else if (isRaceSession) {\n            const dnf = Number(row?.dnf) === 1;\n            const rowPos = Number(row?.pos);\n            const rowTime = Number(row?.time);\n            const rowLaps = Number(row?.laps);\n\n            if (dnf) {\n                timeDiv.innerText = \"-\";\n            }\n            else if (rowLaps < leaderLaps) {\n                timeDiv.innerText = `+${leaderLaps - rowLaps}L`;\n            }\n            else if (rowPos === 1 && rowTime > 0) {\n                timeDiv.innerText = formatLapTime(rowTime);\n            }\n            else if (leaderTime > 0 && rowTime > 0) {\n                const gap = rowTime - leaderTime;\n                timeDiv.innerText = gap > 0 ? `+${gap.toFixed(3)}` : \"-\";\n            }\n            else {\n                timeDiv.innerText = \"-\";\n            }\n        }\n        else {\n            const rowTime = Number(row?.time);\n            timeDiv.innerText = rowTime > 0 ? formatLapTime(rowTime) : \"-\";\n        }\n        if (!hasTime) timeDiv.classList.add(\"hidden\");\n        if (isQualiSession) timeDiv.classList.add(\"hidden\");\n        sessionResultRow.appendChild(timeDiv);\n\n        const qualiGridDiv = document.createElement(\"div\");\n        qualiGridDiv.className = \"session-results-grid-position\";\n        qualiGridDiv.classList.add(\"session-results-cell\");\n        const qualiGridPosition = getSessionResultsQualiGridPosition(row);\n        const gridPenalty = Number(row?.gridPenalty);\n        qualiGridDiv.textContent = qualiGridPosition > 0 ? `P${qualiGridPosition}` : \"-\";\n        if (gridPenalty > 0) qualiGridDiv.classList.add(\"penalty\");\n        if (!isQualiSession || !hasQualiGrid) qualiGridDiv.classList.add(\"hidden\");\n        sessionResultRow.appendChild(qualiGridDiv);\n\n        const pointsDiv = document.createElement(\"div\");\n        pointsDiv.className = \"session-results-points\";\n        pointsDiv.classList.add(\"session-results-cell\");\n        const pts = Number(row?.points);\n        if (pts > 0) {\n            pointsDiv.textContent = `+${pts}`;\n            pointsDiv.classList.add(\"positive\");\n        }\n        else {\n            pointsDiv.textContent = String(pts);\n        }\n        sessionResultRow.appendChild(pointsDiv);\n        if (!showPointsColumn) pointsDiv.classList.add(\"hidden\");\n        if (isEditRace) pointsDiv.dataset.static = \"0\";\n\n        const container = document.querySelector(\".session-results-table .session-results-rows\");\n        if (container) container.appendChild(sessionResultRow);\n    });\n    \n    const rowsContainer = document.querySelector(\".session-results-table .session-results-rows\");\n    if (rowsContainer && !rowsContainer.dataset.sessionResultsDnDInit) {\n        rowsContainer.dataset.sessionResultsDnDInit = \"1\";\n        rowsContainer.addEventListener(\"dragover\", (e) => {\n            if (!sessionResultsEditMode) return;\n            if (!sessionResultsDraggedRow) return;\n            e.preventDefault();\n            sessionResultsDragY = e.clientY;\n            if (sessionResultsDragRaf) return;\n            sessionResultsDragRaf = requestAnimationFrame(() => {\n                sessionResultsDragRaf = 0;\n                if (!sessionResultsDraggedRow) return;\n                const afterEl = getDragAfterSessionResultsRow(rowsContainer, sessionResultsDragY);\n                if (afterEl == null) {\n                    if (sessionResultsDraggedRow.nextSibling) rowsContainer.appendChild(sessionResultsDraggedRow);\n                }\n                else if (afterEl !== sessionResultsDraggedRow) {\n                    if (afterEl.previousSibling !== sessionResultsDraggedRow) {\n                        rowsContainer.insertBefore(sessionResultsDraggedRow, afterEl);\n                    }\n                }\n            });\n        });\n    }\n    if (isEditRace && rowsContainer) {\n        reindexRaceEditPositions(rowsContainer);\n        const meta = sessionResultsLastFetched?.meta || {};\n        const sessionKeyLower = String(sessionResultsLastFetched?.sessionKey ?? meta?.sessionKey ?? \"\").toLowerCase();\n        if (sessionKeyLower === \"race\") {\n            ensureSessionResultsPointsInfo().finally(() => updateRaceEditPoints());\n        }\n        updateRaceEditPoints();\n        manageSaveButton(true, \"custom\", saveSessionResultsRaceEdits);\n    }\n\n    const footer = document.querySelector(\".session-results-footer\");\n    if (!footer) return;\n    footer.innerHTML = \"\";\n    footer.classList.add(\"d-none\");\n\n    const trackId = Number(meta?.trackId);\n    const trackCode = races_names?.[trackId];\n    const trackName = trackCode ? countries_data?.[String(trackCode)]?.track : \"\";\n\n    let fastestTime = null;\n    let fastestRow = null;\n\n    if (isQualiSession) {\n        results.forEach((r) => {\n            const times = [Number(r?.q1FastestLap), Number(r?.q2FastestLap), Number(r?.q3FastestLap)]\n                .filter((v) => v > 0);\n            const best = times.length ? Math.min(...times) : null;\n            if (best != null && (fastestTime == null || best < fastestTime)) {\n                fastestTime = best;\n                fastestRow = r;\n            }\n        });\n    }\n    else if (fastestLapBest != null) {\n        fastestTime = fastestLapBest;\n        fastestRow = results.find((r) => {\n            const fl = Number(r?.fastestLap);\n            return fl > 0 && Math.abs(fl - fastestLapBest) < 1e-6;\n        }) || null;\n    }\n\n    if (!fastestRow || fastestTime == null) return;\n\n    const labelDiv = document.createElement(\"div\");\n    labelDiv.className = \"session-results-footer-label\";\n    labelDiv.textContent = \"Fastest Lap\";\n    footer.appendChild(labelDiv);\n\n    const footerDriverDiv = document.createElement(\"div\");\n    footerDriverDiv.className = \"session-results-driver-name\";\n    const footerDriverName = String(fastestRow?.name ?? \"\");\n    const footerNameParts = footerDriverName.split(\" \");\n    const footerNameSpan = document.createElement(\"span\");\n    footerNameSpan.className = \"session-results-first-name\";\n    const footerSurnameSpan = document.createElement(\"span\");\n    footerSurnameSpan.className = \"bold-font session-results-surname\";\n    format_name(footerDriverName, footerNameParts, footerNameSpan, footerSurnameSpan);\n    footerSurnameSpan.textContent = String(footerSurnameSpan.textContent || \"\").toUpperCase();\n    footerDriverDiv.appendChild(footerNameSpan);\n    footerDriverDiv.appendChild(footerSurnameSpan);\n    footer.appendChild(footerDriverDiv);\n\n    const footerTeamDiv = document.createElement(\"div\");\n    footerTeamDiv.className = \"session-results-team\";\n    const footerTeamId = Number(fastestRow?.teamId ?? -1);\n    const footerLogoDiv = footerTeamId !== -1\n        ? buildDriverLogoDiv(footerTeamId, {\n            isF1: true,\n            wrapperClass: \"drivers-table-logo-div session-results-driver-logo-div\"\n        })\n        : (() => {\n            const empty = document.createElement(\"div\");\n            empty.className = \"drivers-table-logo-div session-results-driver-logo-div\";\n            return empty;\n        })();\n    footerTeamDiv.appendChild(footerLogoDiv);\n\n    const footerTeamNameSpan = document.createElement(\"span\");\n    footerTeamNameSpan.className = \"session-results-team-name\";\n    footerTeamNameSpan.textContent = (footerTeamId !== -1) ? formatTeamNameForDisplay((combined_dict?.[footerTeamId] ?? \"\"), { upper: true }) : \"\";\n    footerTeamDiv.appendChild(footerTeamNameSpan);\n\n    const footerEngineNameSpan = document.createElement(\"span\");\n    footerEngineNameSpan.className = \"session-results-engine-name\";\n    if (currentFormula === 1 && footerTeamId !== -1) {\n        const engineId = engine_allocations?.[footerTeamId];\n        const engineName = engineId != null ? engine_names?.[engineId] : \"\";\n        footerEngineNameSpan.textContent = String(engineName || \"\").toUpperCase();\n    }\n    footerTeamDiv.appendChild(footerEngineNameSpan);\n    footer.appendChild(footerTeamDiv);\n\n    const rightDiv = document.createElement(\"div\");\n    rightDiv.className = \"session-results-footer-right\";\n\n    const timeDiv = document.createElement(\"div\");\n    timeDiv.className = \"session-results-footer-time\";\n    timeDiv.textContent = formatLapTime(fastestTime);\n    footer.appendChild(timeDiv);\n\n    const trackDiv = document.createElement(\"div\");\n    trackDiv.className = \"session-results-footer-track\";\n    trackDiv.textContent = String(trackName || \"\");\n    trackDiv.classList.toggle(\"d-none\", !trackName);\n    rightDiv.appendChild(trackDiv);\n\n    footer.appendChild(rightDiv);\n\n    footer.classList.remove(\"d-none\");\n}\n\nfunction getDragAfterSessionResultsRow(container, y) {\n    const rows = [...container.querySelectorAll(\".session-results-row:not(.dragging)\")];\n    return rows.reduce((closest, child) => {\n        const box = child.getBoundingClientRect();\n        const offset = y - box.top - box.height / 2;\n        if (offset < 0 && offset > closest.offset) {\n            return { offset, element: child };\n        }\n        return closest;\n    }, { offset: Number.NEGATIVE_INFINITY, element: null }).element;\n}\n\nfunction reindexRaceEditPositions(container) {\n    const rows = Array.from(container.querySelectorAll(\".session-results-row\"));\n    rows.forEach((rowEl, i) => {\n        const posDiv = rowEl.querySelector(\".session-results-position\");\n        if (!posDiv) return;\n        const pos = i + 1;\n        posDiv.textContent = String(pos);\n        posDiv.classList.toggle(\"champion\", pos === 1);\n        posDiv.classList.toggle(\"second\", pos === 2);\n        posDiv.classList.toggle(\"third\", pos === 3);\n        rowEl.classList.toggle(\"leader\", pos === 1);\n    });\n}\n\nfunction parseSessionResultsTimeToSeconds(txt) {\n    const s = String(txt || \"\").trim();\n    if (!s || s === \"-\") return null;\n    if (/^dnf$/i.test(s)) return null;\n    const parts = s.split(\":\").map(p => p.trim());\n    if (parts.length === 3) {\n        const h = Number(parts[0]);\n        const m = Number(parts[1]);\n        const sec = Number(parts[2]);\n        return h * 3600 + m * 60 + sec;\n    }\n    if (parts.length === 2) {\n        const m = Number(parts[0]);\n        const sec = Number(parts[1]);\n        return m * 60 + sec;\n    }\n    const sec = Number(parts[0]);\n    return sec;\n}\n\nasync function saveSessionResultsRaceEdits() {\n    if (!sessionResultsEditMode || !sessionResultsLastFetched) return;\n    const meta = sessionResultsLastFetched?.meta || {};\n    const sessionKeyLower = String(sessionResultsLastFetched?.sessionKey ?? meta?.sessionKey ?? \"\").toLowerCase();\n    const raceId = Number(sessionResultsLastFetched?.raceId ?? meta?.raceId);\n    const year = String(sessionResultsLastFetched?.year ?? \"\").trim();\n\n    const original = Array.isArray(sessionResultsLastFetched?.results) ? sessionResultsLastFetched.results : [];\n    const timeByDriver = new Map(original.map(r => [String(r?.driverId), Number(r?.time)]));\n    const dnfByDriver = new Map(original.map(r => [String(r?.driverId), Number(r?.dnf) === 1 ? 1 : 0]));\n\n    const container = document.querySelector(\".session-results-table .session-results-rows\");\n    if (!container) return;\n    const rows = Array.from(container.querySelectorAll(\".session-results-row\"));\n    const edits = [];\n\n    for (let i = 0; i < rows.length; i++) {\n        const rowEl = rows[i];\n        const driverId = Number(rowEl.dataset.driverid);\n\n        const input = rowEl.querySelector(\".session-results-time-input\");\n        const txt = input ? input.value : \"\";\n        const isDnf = /^dnf$/i.test(String(txt || \"\").trim());\n        let dnf = isDnf ? 1 : 0;\n\n        let time = isDnf ? 0 : parseSessionResultsTimeToSeconds(txt);\n        if (time == null && !isDnf) {\n            const orig = timeByDriver.get(String(driverId));\n            time = orig;\n            dnf = dnfByDriver.get(String(driverId)) ?? 0;\n        }\n\n        edits.push({ driverId, finishingPos: i + 1, time, dnf });\n    }\n\n    try {\n        const isSprint = sessionKeyLower === \"sprintrace\";\n        const resp = await new Command(\"editRaceResults\", { raceId, edits, isSprint, sessionKey: sessionKeyLower }).promiseExecute();\n        await updateFront(resp);\n        sessionResultsEditMode = false;\n        manageSaveButton(false);\n        new Command(\"sessionResultsRequest\", { year, gameYear: game_version, raceId, sessionKey: sessionKeyLower }).execute();\n    } catch (e) {\n        new_update_notifications(\"Failed to save race results\", \"error\");\n        console.error(e);\n    }\n}\n\nasync function ensureSessionResultsPointsInfo() {\n    if (sessionResultsPointsInfo) return sessionResultsPointsInfo;\n    if (sessionResultsPointsInfoPromise) return sessionResultsPointsInfoPromise;\n    sessionResultsPointsInfoPromise = new Command(\"pointsRegulationsRequest\", {}).promiseExecute()\n        .then((resp) => {\n            sessionResultsPointsInfo = resp?.content ?? null;\n            return sessionResultsPointsInfo;\n        })\n        .catch((e) => {\n            console.error(e);\n            return null;\n        })\n        .finally(() => {\n            sessionResultsPointsInfoPromise = null;\n        });\n    return sessionResultsPointsInfoPromise;\n}\n\nfunction updateRaceEditPoints() {\n    if (!sessionResultsEditMode || !sessionResultsLastFetched) return;\n    const meta = sessionResultsLastFetched?.meta || {};\n    const sessionKeyLower = String(sessionResultsLastFetched?.sessionKey ?? meta?.sessionKey ?? \"\").toLowerCase();\n    if (sessionKeyLower !== \"race\" && sessionKeyLower !== \"sprintrace\") return;\n\n    const container = document.querySelector(\".session-results-table .session-results-rows\");\n    if (!container) return;\n\n    let posToPts = new Map();\n    let doublePoints = false;\n    let flBonusEnabled = false;\n\n    const original = Array.isArray(sessionResultsLastFetched?.results) ? sessionResultsLastFetched.results : [];\n    const flByDriver = new Map(original.map(r => [Number(r?.driverId), Number(r?.fastestLap)]));\n\n    if (sessionKeyLower === \"race\") {\n        const pointsInfo = sessionResultsPointsInfo;\n        if (!pointsInfo || !Array.isArray(pointsInfo.positionAndPoints)) return;\n\n        const raceId = Number(sessionResultsLastFetched?.raceId ?? meta?.raceId);\n        const yearKey = String(sessionResultsLastFetched?.year ?? \"\").trim();\n        const events = sessionResultsEventsCache.get(yearKey);\n        const lastRaceId = Array.isArray(events) && events.length\n            ? Math.max(...events.map(e => Number(e?.[0])))\n            : null;\n\n        doublePoints = Number(pointsInfo?.isLastraceDouble) === 1 && lastRaceId != null && Number(raceId) === Number(lastRaceId);\n        flBonusEnabled = Number(pointsInfo?.fastestLapBonusPoint) === 1;\n\n        posToPts = new Map(pointsInfo.positionAndPoints\n            .map(r => [Number(r?.[0]), Number(r?.[1])])\n        );\n    } else {\n        // Sprint: keep the same points distribution as the original sprint results (pos -> points)\n        original.forEach((r) => {\n            const pos = Number(r?.pos);\n            const pts = Number(r?.points);\n            const dnf = Number(r?.dnf) === 1;\n            if (!dnf && pos > 0 && pos !== 99) posToPts.set(pos, Math.max(0, pts));\n        });\n    }\n\n    let fastestDriverId = null;\n    let fastestLap = null;\n    for (const [driverId, fl] of flByDriver.entries()) {\n        if (fl > 0 && (fastestLap == null || fl < fastestLap)) {\n            fastestLap = fl;\n            fastestDriverId = driverId;\n        }\n    }\n\n    const rows = Array.from(container.querySelectorAll(\".session-results-row\"));\n    rows.forEach((rowEl, idx) => {\n        const pos = idx + 1;\n        const driverId = Number(rowEl.dataset.driverid);\n        const dnf = Number(rowEl.dataset.dnf) === 1;\n        let pts = 0;\n        if (!dnf) {\n            pts = Number(posToPts.get(pos) ?? 0);\n            if (sessionKeyLower === \"race\" && flBonusEnabled && fastestDriverId != null && driverId === fastestDriverId && pos <= 10 && pts > 0) {\n                pts += 1;\n            }\n            if (doublePoints) pts *= 2;\n        }\n\n        const pointsDiv = rowEl.querySelector(\".session-results-points\");\n        if (!pointsDiv) return;\n        pointsDiv.classList.remove(\"positive\");\n        pointsDiv.textContent = String(pts);\n        if (pts > 0) {\n            pointsDiv.textContent = `+${pts}`;\n            pointsDiv.classList.add(\"positive\");\n        }\n    });\n}\n\nfunction setupSessionResultsEditToggle() {\n    const btn = document.getElementById(\"sessionResultsEditToggle\");\n    if (!btn || btn.dataset.init) return;\n    btn.dataset.init = \"1\";\n    btn.addEventListener(\"click\", () => {\n        if (!sessionResultsLastFetched) return;\n        const meta = sessionResultsLastFetched?.meta || {};\n        const sessionKeyLower = String(sessionResultsLastFetched?.sessionKey ?? meta?.sessionKey ?? \"\").toLowerCase();\n        if (sessionKeyLower !== \"race\" && sessionKeyLower !== \"sprintrace\") return;\n        sessionResultsEditMode = !sessionResultsEditMode;\n        if (!sessionResultsEditMode) {\n            manageSaveButton(false);\n        }\n        onSessionResultsFetched(sessionResultsLastFetched);\n    });\n}\n\nfunction setupSessionResultsCompactToggle() {\n    const btn = document.getElementById(\"sessionResultsCompactToggle\");\n    if (!btn || btn.dataset.init) return;\n    btn.dataset.init = \"1\";\n    btn.addEventListener(\"click\", () => {\n        sessionResultsCompactMode = !sessionResultsCompactMode;\n        btn.querySelector(\"span\").textContent = sessionResultsCompactMode ? \"Expand\" : \"Compact\";\n        btn.querySelector(\"i\").className = sessionResultsCompactMode ? \"bi bi-arrows-expand-vertical\" : \"bi bi-arrows-collapse-vertical\";\n        const table = document.querySelector(\".session-results-table\");\n        if (table) table.classList.toggle(\"is-compact\", sessionResultsCompactMode);\n    });\n}\n\nfunction safeJsonDownload(filename, jsonObj) {\n    try {\n        const content = JSON.stringify(jsonObj, null, 2);\n        const blob = new Blob([content], { type: \"application/json;charset=utf-8\" });\n        const url = URL.createObjectURL(blob);\n        const a = document.createElement(\"a\");\n        a.href = url;\n        a.download = filename;\n        document.body.appendChild(a);\n        a.click();\n        a.remove();\n        URL.revokeObjectURL(url);\n    } catch (e) {\n        console.error(e);\n        if (typeof new_update_notifications === \"function\") {\n            new_update_notifications(\"Failed to export JSON\", \"error\");\n        }\n    }\n}\n\nfunction slugifyForFilename(txt) {\n    const s = String(txt || \"\").trim().toLowerCase();\n    return s\n        .replace(/grand prix/gi, \"gp\")\n        .replace(/[^a-z0-9]+/g, \"_\")\n        .replace(/^_+|_+$/g, \"\")\n        .slice(0, 80) || \"unknown\";\n}\n\nfunction slugifyForUniqueName(txt) {\n    const s = String(txt || \"\").trim().toLowerCase();\n    return s.replace(/[^a-z0-9]+/g, \"\").slice(0, 40) || \"unknown\";\n}\n\nfunction normalizeRltoolsDriverName(name) {\n    return String(name || \"\").replace(/\\bAndreaKimi\\b/g, \"Kimi\").trim();\n}\n\nfunction getRltoolsTrackUniqueName(trackId, year) {\n    const trackCode = races_names?.[Number(trackId)];\n    const rlToolsName = trackCode ? String(countries_data?.[String(trackCode)]?.rlToolsName || \"\").trim() : \"\";\n    if (rlToolsName) return rlToolsName;\n    const trackName = getGpDisplayName(trackId);\n    return `${slugifyForUniqueName(trackName)}.${year || \"0\"}`;\n}\n\nfunction getQualifyingStageNumber(qualifyingStage) {\n    return Number(qualifyingStage?.fileSuffix) || 0;\n}\n\nfunction getSessionPositionForExport(sessionKeyLower, weekendType, qualifyingStage = null) {\n    const isSprintWeekend = Number(weekendType) === 1;\n    const qualiStageNumber = getQualifyingStageNumber(qualifyingStage);\n\n    if (sessionKeyLower === \"fp\" || sessionKeyLower === \"fp1\" || sessionKeyLower === \"fp2\" || sessionKeyLower === \"fp3\") {\n        return 0;\n    }\n\n    if (sessionKeyLower === \"sprintquali\") {\n        return qualiStageNumber || 0;\n    }\n\n    if (sessionKeyLower === \"sprintrace\") {\n        return 4;\n    }\n\n    if (sessionKeyLower === \"quali\") {\n        if (isSprintWeekend) {\n            return qualiStageNumber > 0 ? qualiStageNumber + 3 : 4;\n        }\n        return qualiStageNumber || 0;\n    }\n\n    if (sessionKeyLower === \"race\") {\n        return isSprintWeekend ? 7 : 4;\n    }\n\n    return 0;\n}\n\nfunction getRltoolsSessionType(sessionKeyLower) {\n    if (sessionKeyLower === \"race\" || sessionKeyLower === \"sprintrace\") return \"Race\";\n    if (sessionKeyLower === \"quali\" || sessionKeyLower === \"sprintquali\") return \"Qualification\";\n    if (sessionKeyLower === \"fp\" || sessionKeyLower === \"fp1\" || sessionKeyLower === \"fp2\" || sessionKeyLower === \"fp3\") return \"Practice\";\n    return \"Unknown\";\n}\n\nfunction getRltoolsSessionFilenamePart(sessionKeyLower) {\n    if (sessionKeyLower === \"quali\") return \"qualification\";\n    if (sessionKeyLower === \"sprintquali\") return \"sprint_qualification\";\n    if (sessionKeyLower === \"fp\" || sessionKeyLower === \"fp1\") return \"practice_1\";\n    if (sessionKeyLower === \"fp2\") return \"practice_2\";\n    if (sessionKeyLower === \"fp3\") return \"practice_3\";\n    if (sessionKeyLower === \"sprintrace\") return \"sprint_race\";\n    if (sessionKeyLower === \"race\") return \"race\";\n    return slugifyForFilename(sessionKeyLower);\n}\n\nfunction getRltoolsQualifyingStageConfigs() {\n    return [\n        { lapKey: \"q1FastestLap\", qualType: \"Q1\", fileSuffix: \"1\" },\n        { lapKey: \"q2FastestLap\", qualType: \"Q2\", fileSuffix: \"2\" },\n        { lapKey: \"q3FastestLap\", qualType: \"Q3\", fileSuffix: \"3\" }\n    ];\n}\n\nfunction secondsToIntMs(v) {\n    const n = Number(v);\n    if (!Number.isFinite(n) || n <= 0) return 0;\n    return Math.round(n * 1000);\n}\n\nfunction getShownSessionResultsRowsForExport() {\n    if (!sessionResultsLastFetched) return [];\n    const meta = sessionResultsLastFetched?.meta || {};\n    const sessionKeyLower = String(sessionResultsLastFetched?.sessionKey ?? meta?.sessionKey ?? \"\").toLowerCase();\n    const original = Array.isArray(sessionResultsLastFetched?.results) ? sessionResultsLastFetched.results : [];\n\n    if (!sessionResultsEditMode || (sessionKeyLower !== \"race\" && sessionKeyLower !== \"sprintrace\")) {\n        return original.map(r => ({ ...r }));\n    }\n\n    const container = document.querySelector(\".session-results-table .session-results-rows\");\n    if (!container) return original.map(r => ({ ...r }));\n\n    const byDriverId = new Map(original.map(r => [Number(r?.driverId), r]));\n    const timeByDriver = new Map(original.map(r => [String(r?.driverId), Number(r?.time)]));\n    const dnfByDriver = new Map(original.map(r => [String(r?.driverId), Number(r?.dnf) === 1 ? 1 : 0]));\n\n    const rows = Array.from(container.querySelectorAll(\".session-results-row\"));\n    const merged = [];\n\n    for (let i = 0; i < rows.length; i++) {\n        const rowEl = rows[i];\n        const driverId = Number(rowEl.dataset.driverid);\n        const base = byDriverId.get(driverId) || { driverId };\n\n        const input = rowEl.querySelector(\".session-results-time-input\");\n        const txt = input ? input.value : \"\";\n        const isDnf = /^dnf$/i.test(String(txt || \"\").trim());\n        let dnf = isDnf ? 1 : 0;\n        let time = isDnf ? 0 : parseSessionResultsTimeToSeconds(txt);\n        if (time == null && !isDnf) {\n            const orig = timeByDriver.get(String(driverId));\n            time = orig;\n            dnf = dnfByDriver.get(String(driverId)) ?? 0;\n        }\n\n        merged.push({\n            ...base,\n            pos: i + 1,\n            time,\n            dnf\n        });\n    }\n\n    return merged;\n}\n\nfunction buildRltoolsExportObject(options = {}) {\n    if (!sessionResultsLastFetched) return null;\n    const meta = sessionResultsLastFetched?.meta || {};\n    const year = String(sessionResultsLastFetched?.year ?? \"\").trim();\n    const trackId = Number(meta?.trackId);\n    const weekendType = Number(meta?.weekendType);\n    const trackName = getGpDisplayName(trackId);\n\n    const sessionKeyLower = String(sessionResultsLastFetched?.sessionKey ?? meta?.sessionKey ?? \"\").toLowerCase();\n    const sessionType = getRltoolsSessionType(sessionKeyLower);\n    const qualifyingStage = sessionType === \"Qualification\" ? options.qualifyingStage || null : null;\n    const sessionPosition = getSessionPositionForExport(sessionKeyLower, weekendType, qualifyingStage);\n    const stageLapKey = qualifyingStage?.lapKey || \"\";\n\n    const raceType = \"Regular\";\n    const qualType = qualifyingStage?.qualType || \"Regular\";\n\n    const rows = getShownSessionResultsRowsForExport();\n    const allResults = Array.isArray(rows) ? rows : [];\n    const results = qualifyingStage\n        ? allResults\n            .filter((r) => Number(r?.[stageLapKey]) > 0)\n            .sort((a, b) => {\n                const aLap = Number(a?.[stageLapKey]) || 0;\n                const bLap = Number(b?.[stageLapKey]) || 0;\n                if (aLap !== bLap) return aLap - bLap;\n                return (Number(a?.pos) || 0) - (Number(b?.pos) || 0);\n            })\n        : allResults;\n\n    if (!results.length) return null;\n\n    const stagePositions = new Map();\n    if (qualifyingStage) {\n        results\n            .forEach((r, idx) => {\n                stagePositions.set(Number(r?.driverId), idx + 1);\n            });\n    }\n\n    const bestLapByRow = (r) => {\n        if (sessionType === \"Race\") return Number(r?.fastestLap) || 0;\n        if (qualifyingStage) return Number(r?.[stageLapKey]) || 0;\n        if (sessionType === \"Qualification\") {\n            const times = [Number(r?.q1FastestLap), Number(r?.q2FastestLap), Number(r?.q3FastestLap)].filter(v => v > 0);\n            return times.length ? Math.min(...times) : 0;\n        }\n        return Number(r?.fastestLap) || Number(r?.time) || 0;\n    };\n\n    const leaderRow = results[0] || null;\n    const leaderTimeSec = (() => {\n        if (!leaderRow) return 0;\n        if (sessionType === \"Race\") return Number(leaderRow?.time) || 0;\n        if (sessionType === \"Qualification\") return bestLapByRow(leaderRow);\n        return Number(leaderRow?.time) || Number(leaderRow?.fastestLap) || 0;\n    })();\n    const leaderTimeInt = secondsToIntMs(leaderTimeSec);\n\n    let fastestLapTimeSec = 0;\n    let fastestLapDriverName = \"\";\n    for (const r of results) {\n        const t = bestLapByRow(r);\n        if (t > 0 && (fastestLapTimeSec <= 0 || t < fastestLapTimeSec)) {\n            fastestLapTimeSec = t;\n            fastestLapDriverName = normalizeRltoolsDriverName(r?.name);\n        }\n    }\n\n    const dotdDriverId = Number(meta?.dotdDriverId);\n    const dotdName = (sessionKeyLower === \"race\" && dotdDriverId > 0)\n        ? normalizeRltoolsDriverName(results.find(r => Number(r?.driverId) === dotdDriverId)?.name)\n        : \"\";\n\n    const drivers = results.map((r) => {\n        const driverName = normalizeRltoolsDriverName(r?.name);\n        const teamId = Number(r?.teamId ?? -1);\n        const teamName = (teamId !== -1) ? String(combined_dict?.[teamId] ?? \"\") : \"\";\n        const teamUnique = teamName ? `${slugifyForUniqueName(teamName)}.${year || \"0\"}` : \"\";\n        const lapsCount = Number(r?.laps) || 0;\n        const bestLapTimeInt = secondsToIntMs(bestLapByRow(r));\n\n        let timeSec = 0;\n        if (sessionType === \"Race\") timeSec = Number(r?.time) || 0;\n        else if (sessionType === \"Qualification\") timeSec = 0;\n        else timeSec = Number(r?.time) || Number(r?.fastestLap) || 0;\n\n        const timeInt = secondsToIntMs(timeSec);\n        const gapInt = sessionType === \"Race\" && leaderTimeInt > 0 && timeInt > 0 && Number(r?.pos) !== 1\n            ? Math.max(0, timeInt - leaderTimeInt)\n            : 0;\n        const status = sessionType === \"Race\"\n            ? ((timeInt > 0 && Number(r?.dnf) !== 1) ? \"Ok\" : \"Dnf\")\n            : ((bestLapTimeInt > 0 || lapsCount > 0) ? \"Ok\" : \"Dns\");\n\n        const base = {\n            Driver: { Name: driverName },\n            RaceNumber: Number(r?.raceNumber) || 0,\n            Position: qualifyingStage ? (stagePositions.get(Number(r?.driverId)) || 0) : (Number(r?.pos) || 0),\n            Team: { Name: teamName, UniqueName: teamUnique },\n            SeatType: \"Primary\",\n            Status: status,\n            TimeInt: timeInt,\n            GapInt: gapInt\n        };\n\n        if (sessionType === \"Race\") {\n            base.FastestLapTimeInt = secondsToIntMs(Number(r?.fastestLap) || 0);\n            base.LapsCount = lapsCount;\n            base.GridPosition = Number(r?.grid) || 0;\n        } else {\n            base.TimeInt = 0;\n            base.GapInt = 0;\n            base.FastestLapTimeInt = bestLapTimeInt;\n            base.LapsCount = lapsCount;\n        }\n\n        return base;\n    });\n\n    const out = {\n        SessionType: sessionType,\n        RaceType: raceType,\n        QualType: qualType,\n        SessionPosition: sessionPosition,\n        Date: null,\n        TrackName: trackName,\n        TrackUniqueName: getRltoolsTrackUniqueName(trackId, year),\n        Drivers: drivers\n    };\n\n    if (fastestLapTimeSec > 0 && fastestLapDriverName) {\n        out.FastestLapDriver = { Name: fastestLapDriverName };\n        out.FastestLapTimeInt = secondsToIntMs(fastestLapTimeSec);\n    }\n\n    if (dotdName) {\n        out.DriverDayDriver = { Name: dotdName };\n    }\n\n    return out;\n}\n\nfunction exportShownSessionResultsToRltools() {\n    if (!sessionResultsLastFetched) {\n        if (typeof new_update_notifications === \"function\") {\n            new_update_notifications(\"No session results to export\", \"error\");\n        }\n        return;\n    }\n\n    const meta = sessionResultsLastFetched?.meta || {};\n    const year = String(sessionResultsLastFetched?.year ?? \"\").trim() || \"unknown_year\";\n    const trackName = getGpDisplayName(meta?.trackId);\n    const sessionKeyLower = String(sessionResultsLastFetched?.sessionKey ?? meta?.sessionKey ?? \"\").toLowerCase() || \"unknown_session\";\n    const sessionSlug = getRltoolsSessionFilenamePart(sessionKeyLower);\n    const exports = [];\n\n    if (sessionKeyLower === \"quali\" || sessionKeyLower === \"sprintquali\") {\n        getRltoolsQualifyingStageConfigs().forEach((stage) => {\n            const payload = buildRltoolsExportObject({ qualifyingStage: stage });\n            if (!payload) return;\n            exports.push({\n                filename: `results_${slugifyForFilename(trackName)}_${slugifyForFilename(year)}_${slugifyForFilename(sessionSlug)}${stage.fileSuffix}.json`,\n                payload\n            });\n        });\n    } else {\n        const payload = buildRltoolsExportObject();\n        if (!payload) return;\n        exports.push({\n            filename: `results_${slugifyForFilename(trackName)}_${slugifyForFilename(year)}_${slugifyForFilename(sessionSlug)}.json`,\n            payload\n        });\n    }\n\n    if (!exports.length) return;\n\n    exports.forEach(({ filename, payload }) => {\n        safeJsonDownload(filename, payload);\n    });\n\n    if (typeof new_update_notifications === \"function\") {\n        if (exports.length === 1) {\n            new_update_notifications(`Exported ${exports[0].filename}`, \"success\");\n        } else {\n            new_update_notifications(`Exported ${exports.length} files`, \"success\");\n        }\n    }\n}\n\nfunction setupSessionResultsExportRltoolsButton() {\n    const compactToggle = document.getElementById(\"sessionResultsCompactToggle\");\n    if (!compactToggle) return;\n\n    const existing = document.getElementById(\"sessionResultsExportRltoolsButton\");\n    if (existing) return;\n\n    const btn = document.createElement(\"div\");\n    btn.className = \"button-with-icon d-none\";\n    btn.id = \"sessionResultsExportRltoolsButton\";\n    \n    const icon = document.createElement(\"i\");\n    icon.className = \"bi bi-box-arrow-up\";\n    btn.appendChild(icon);\n\n    const span = document.createElement(\"span\");\n    span.textContent = \"RLtools\";\n    btn.appendChild(span);\n\n    btn.addEventListener(\"click\", exportShownSessionResultsToRltools);\n\n    compactToggle.parentNode.insertBefore(btn, compactToggle);\n}\n\nsetupSessionResultsEditToggle();\nsetupSessionResultsCompactToggle();\nsetupSessionResultsExportRltoolsButton();\n\n//time comes in seconds.miliseconds, and I want it in hh:mm:ss.sss format (if no hh, then mm:ss.sss)\nfunction formatLapTime(lapTimeMs) {\n    const totalMs = Math.floor(lapTimeMs * 1000);\n    const hours = Math.floor(totalMs / 3600000);\n    const minutes = Math.floor((totalMs % 3600000) / 60000);\n    const seconds = Math.floor((totalMs % 60000) / 1000);\n    const milliseconds = totalMs % 1000;\n    //if it starts by a 0, remove it\n    if (hours > 0) {\n        return `${hours}:${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}.${String(milliseconds).padStart(3, \"0\")}`;\n    }\n    else {\n        return `${minutes}:${String(seconds).padStart(2, \"0\")}.${String(milliseconds).padStart(3, \"0\")}`;\n    }\n    \n}\n\nfunction formatGapTime(lapTimeMs) {\n    const totalMs = Math.floor(lapTimeMs * 1000);\n    const hours = Math.floor(totalMs / 3600000);\n    const minutes = Math.floor((totalMs % 3600000) / 60000);\n    const seconds = Math.floor((totalMs % 60000) / 1000);\n    const milliseconds = totalMs % 1000;\n\n    if (hours > 0) {\n        return `${hours}:${String(minutes).padStart(2, \"0\")}:${String(seconds).padStart(2, \"0\")}.${String(milliseconds).padStart(3, \"0\")}`;\n    }\n\n    if (minutes > 0) {\n        return `${minutes}:${String(seconds).padStart(2, \"0\")}.${String(milliseconds).padStart(3, \"0\")}`;\n    }\n\n    return `${seconds}.${String(milliseconds).padStart(3, \"0\")}`;\n}\n\nfunction getGpDisplayName(trackId) {\n    const key = races_names?.[Number(trackId)];\n    return names_full?.[key] || key || `Track ${trackId}`;\n}\n\nfunction getSessionOptionsForWeekend(weekendType) {\n    const isSprint = Number(weekendType) === 1;\n    if (isSprint) {\n        return [\n            { key: \"fp\", label: \"Free Practice\" },\n            { key: \"sprintquali\", label: \"Sprint Quali\" },\n            { key: \"sprintrace\", label: \"Sprint Race\" },\n            { key: \"quali\", label: \"Quali\" },\n            { key: \"race\", label: \"Race\" }\n        ];\n    }\n    return [\n        { key: \"fp1\", label: \"Free Practice 1\" },\n        { key: \"fp2\", label: \"Free Practice 2\" },\n        { key: \"fp3\", label: \"Free Practice 3\" },\n        { key: \"quali\", label: \"Qualifying\" },\n        { key: \"race\", label: \"Race\" }\n    ];\n}\n\nfunction getLatestYearFromMenu() {\n    const yearMenu = document.getElementById(\"yearMenu\");\n    const years = yearMenu\n        ? Array.from(yearMenu.querySelectorAll(\"a\"))\n            .map(a => a.dataset.year)\n            .filter(year => /^\\d+$/.test(year))\n            .map(Number)\n        : [];\n    return years.length ? Math.max(...years) : null;\n}\n\nfunction openSessionResultsForRace(year, raceId, sessionKey) {\n    const recordsButton = document.getElementById(\"recordsTypeButton\");\n    if (recordsButton) {\n        recordsButton.querySelector(\"span.dropdown-label\").textContent = \"Session Results\";\n        recordsButton.dataset.value = \"sessionresults\";\n    }\n    syncRecordsTypeDropdownChecks();\n    updateTopPanelControlsVisibility();\n    showSessionResultsTable();\n    new Command(\"sessionResultsRequest\", { year, gameYear: game_version, raceId, sessionKey }).execute();\n}\n\nasync function ensureSessionResultsMenuPopulated() {\n    const gpMenu = document.getElementById(\"sessionResultsGpMenu\");\n    if (!gpMenu) return;\n\n    const gpList = document.getElementById(\"sessionResultsGpList\");\n    const sessionMenu = document.getElementById(\"sessionResultsSessionMenu\");\n    if (!gpList || !sessionMenu) return;\n\n    const yearBtn = document.getElementById(\"yearButton\");\n    const selectedYear = yearBtn?.dataset?.year;\n    if (!selectedYear || selectedYear === \"all\") {\n        gpList.innerHTML = \"\";\n        sessionMenu.classList.remove(\"is-open\");\n        sessionMenu.innerHTML = \"\";\n        sessionResultsActiveGpAnchor = null;\n        sessionResultsActiveGpMeta = null;\n\n        const item = document.createElement(\"a\");\n        item.className = \"redesigned-dropdown-item\";\n        item.textContent = \"Select a Year\";\n        gpList.appendChild(item);\n        return;\n    }\n\n    gpList.innerHTML = \"\";\n    sessionMenu.classList.remove(\"is-open\");\n    sessionMenu.innerHTML = \"\";\n    sessionResultsActiveGpAnchor = null;\n    sessionResultsActiveGpMeta = null;\n\n    const loading = document.createElement(\"a\");\n    loading.className = \"redesigned-dropdown-item\";\n    loading.textContent = \"Loading...\";\n    gpList.appendChild(loading);\n\n    try {\n        let events = sessionResultsEventsCache.get(selectedYear);\n        if (!Array.isArray(events)) {\n            const resp = await new Command(\"eventsFromRequest\", { year: selectedYear, formula: 1 }).promiseExecute();\n            events = resp?.content?.events || [];\n            sessionResultsEventsCache.set(selectedYear, events);\n        }\n\n        gpList.innerHTML = \"\";\n        const doneEvents = (Array.isArray(events) ? events : []).filter((e) => {\n            const state = Number(e?.[3]);\n            return state === 1 || state === 2;\n        });\n\n        doneEvents.forEach((evt) => {\n            const raceId = evt?.[0];\n            const trackId = evt?.[1];\n            const weekendType = evt?.[2];\n\n            const trigger = document.createElement(\"a\");\n            trigger.className = \"redesigned-dropdown-item\";\n            trigger.style.cursor = \"pointer\";\n\n            const label = document.createElement(\"span\");\n            label.textContent = getGpDisplayName(trackId);\n            const chevron = document.createElement(\"i\");\n            chevron.className = \"bi bi-chevron-right\";\n            trigger.appendChild(label);\n            trigger.appendChild(chevron);\n\n            trigger.addEventListener(\"mouseenter\", () => {\n                sessionResultsActiveGpAnchor = trigger;\n                sessionResultsActiveGpMeta = { year: selectedYear, raceId, weekendType, trackId };\n                populateAndShowSessionResultsSessionMenu();\n            });\n\n            trigger.addEventListener(\"click\", () => {\n                sessionResultsActiveGpAnchor = trigger;\n                sessionResultsActiveGpMeta = { year: selectedYear, raceId, weekendType, trackId };\n                openSessionResultsForRace(selectedYear, raceId, \"race\");\n            });\n\n            gpList.appendChild(trigger);\n        });\n\n        if (doneEvents.length === 0) {\n            const item = document.createElement(\"a\");\n            item.className = \"redesigned-dropdown-item\";\n            item.textContent = \"No completed races\";\n            gpList.appendChild(item);\n        }\n\n        if (!gpMenu.dataset.sessionResultsSessionMenuInit) {\n            gpMenu.dataset.sessionResultsSessionMenuInit = \"1\";\n\n            const reposition = () => populateAndShowSessionResultsSessionMenu({ repositionOnly: true });\n            document.getElementById(\"sessionResultsGpList\")?.addEventListener(\"scroll\", reposition);\n\n            gpMenu.addEventListener(\"mouseleave\", () => {\n                sessionMenu.classList.remove(\"is-open\");\n                sessionResultsActiveGpAnchor = null;\n                sessionResultsActiveGpMeta = null;\n            });\n        }\n    } catch (e) {\n        gpList.innerHTML = \"\";\n        const item = document.createElement(\"a\");\n        item.className = \"redesigned-dropdown-item\";\n        item.textContent = \"Failed to load events\";\n        gpList.appendChild(item);\n        console.error(e);\n    }\n}\n\nfunction populateAndShowSessionResultsSessionMenu(opts = {}) {\n    const sessionMenu = document.getElementById(\"sessionResultsSessionMenu\");\n    const gpMenu = document.getElementById(\"sessionResultsGpMenu\");\n    const gpList = document.getElementById(\"sessionResultsGpList\");\n    if (!sessionMenu || !gpMenu || !gpList) return;\n\n    if (!sessionResultsActiveGpAnchor || !sessionResultsActiveGpMeta) {\n        sessionMenu.classList.remove(\"is-open\");\n        return;\n    }\n\n    const { year, raceId, weekendType } = sessionResultsActiveGpMeta;\n\n    if (!opts.repositionOnly) {\n        sessionMenu.innerHTML = \"\";\n        const optionsAll = getSessionOptionsForWeekend(weekendType);\n        const latestYear = getLatestYearFromMenu();\n        const isLatestYear = latestYear == null ? true : Number(year) === Number(latestYear);\n        const options = isLatestYear\n            ? optionsAll\n            : optionsAll.filter((o) => o.key === \"race\" || (o.key === \"sprintrace\" && Number(weekendType) === 1));\n\n        options.forEach((opt) => {\n            const a = document.createElement(\"a\");\n            a.className = \"redesigned-dropdown-item\";\n            a.style.cursor = \"pointer\";\n            a.textContent = opt.label;\n            a.addEventListener(\"click\", () => {\n                openSessionResultsForRace(year, raceId, opt.key);\n            });\n            sessionMenu.appendChild(a);\n        });\n    }\n\n    // Position the session menu aligned with the hovered GP row (inside the scroll container)\n    const top = sessionResultsActiveGpAnchor.offsetTop - gpList.scrollTop;\n    sessionMenu.style.top = `${Math.max(0, top)}px`;\n    sessionMenu.classList.add(\"is-open\");\n}\n\nfunction setYearButton(el) {\n    const yearBtn = document.getElementById(\"yearButton\");\n    yearBtn.querySelector(\"span.dropdown-label\").textContent = el.textContent.trim();\n    yearBtn.dataset.year = el.dataset.year;           // <- guardamos el valor\n    syncYearDropdownChecks()\n}\n\nexport function loadRecordsList(data) {\n    const recordsList = document.querySelector(\".records-list\")\n    recordsList.innerHTML = \"\"\n    let visibleIndex = 0;\n    const hideHistoric = document.querySelector(\".hide-historic-drivers\").classList.contains(\"active\");\n\n    data.forEach(function (record, index) {\n        if (record.value <= 0) return;\n        let recordDiv = document.createElement(\"div\")\n        recordDiv.classList = \"record-item\"\n\n        if (record.teamId !== -1) {\n            recordDiv.classList.add(`${team_dict[record.teamId]}-record`)\n        }\n        else {\n            recordDiv.classList.add(\"generic-record\")\n        }\n\n        const isHistoric = record.id === -1;\n        if (isHistoric) recordDiv.classList.add(\"historic-driver\");\n\n        const shouldHide = isHistoric && hideHistoric;\n        if (shouldHide) recordDiv.classList.add(\"d-none\");\n\n        const number = document.createElement(\"div\");\n        number.className = \"record-number\";\n        if (!shouldHide) {\n            number.textContent = `${++visibleIndex}.`;\n        } else {\n            number.textContent = \"\";\n        }\n\n        let recordName = document.createElement(\"div\")\n        recordName.classList = \"record-name\"\n        let fullName = news_insert_space(record.name)\n        let surname = fullName.split(\" \").pop()\n        let nameSpan = document.createElement(\"span\")\n        nameSpan.textContent = fullName.replace(surname, \"\")\n        let surnameSpan = document.createElement(\"span\")\n        surnameSpan.textContent = surname\n        surnameSpan.classList = \"bold-font record-surname\"\n\n        recordName.appendChild(nameSpan)\n        recordName.appendChild(surnameSpan)\n\n        let numberAndName = document.createElement(\"div\")\n        numberAndName.classList = \"number-and-name\"\n\n        let nameAndTeam = document.createElement(\"div\")\n        nameAndTeam.classList = \"name-and-team\"\n\n        let teamDiv = document.createElement(\"div\")\n        teamDiv.classList = \"record-team\"\n        teamDiv.textContent = record.teamId !== -1 ? formatTeamNameForDisplay(combined_dict[record.teamId]) : record.retired === 1 ? \"Retired\" : \"N/A\";\n\n        nameAndTeam.appendChild(recordName)\n        nameAndTeam.appendChild(teamDiv)\n\n        numberAndName.appendChild(number)\n\n        const recordTeamId = Number(record.teamId ?? -1);\n        if (recordTeamId !== -1) {\n            const logoDiv = buildDriverLogoDiv(recordTeamId, {\n                isF1: currentFormula === 1,\n                wrapperClass: \"drivers-table-logo-div record-logo-div\"\n            });\n            numberAndName.appendChild(logoDiv);\n        }\n\n        numberAndName.appendChild(nameAndTeam)\n\n        let extraStatsSection = document.createElement(\"div\")\n        extraStatsSection.classList = \"extra-stats-section\"\n\n        let totalStarts = document.createElement(\"div\")\n        totalStarts.classList = \"extra-stat\"\n        totalStarts.textContent = `Races: ${record.totalStarts}`\n\n        let percentageRate = document.createElement(\"div\")\n        percentageRate.classList = \"extra-stat perecentage-rate\"\n        if (record.record === \"wins\" || record.record === \"champs\") {\n            percentageRate.textContent = `Win Rate: ${(record.totalWins / record.totalStarts * 100).toFixed(2)}%`\n        }\n        else if (record.record === \"podiums\") {\n            percentageRate.textContent = `Podium Rate: ${(record.totalPodiums / record.totalStarts * 100).toFixed(2)}%`\n        }\n        else if (record.record === \"poles\") {\n            percentageRate.textContent = `Pole Rate: ${(record.totalPoles / record.totalStarts * 100).toFixed(2)}%`\n        }\n        else if (record.record === \"fastestlaps\") {\n            percentageRate.textContent = `Fastest Lap Rate: ${(record.totalFastestLaps / record.totalStarts * 100).toFixed(2)}%`\n        }\n        if (record.record !== \"races\" && record.record !== \"points\" && record.record !== \"dotd\") {\n            extraStatsSection.appendChild(percentageRate)\n        }\n\n        let firstRace = document.createElement(\"div\")\n        firstRace.classList = \"extra-stat\"\n        let trackName = record.firstRace.trackName ? record.firstRace.trackName : (record.firstRace.trackId ? names_full[races_names[record.firstRace.trackId]] : \"\")\n        firstRace.textContent = `First Race: ${trackName} ${record.firstRace.season}`\n\n        let firstPodium = document.createElement(\"div\")\n        firstPodium.classList = \"extra-stat\"\n        let podiumTrackName = record.firstPodium.trackName ? record.firstPodium.trackName : (record.firstPodium.trackId ? names_full[races_names[record.firstPodium.trackId]] : \"\")\n        firstPodium.textContent = `First Podium: ${podiumTrackName} ${record.firstPodium.season}`\n\n        let firstWin = document.createElement(\"div\")\n        firstWin.classList = \"extra-stat\"\n        let winTrackName = record.firstWin.trackName ? record.firstWin.trackName : (record.firstWin.trackId ? names_full[races_names[record.firstWin.trackId]] : \"\")\n        firstWin.textContent = `First Win: ${winTrackName} ${record.firstWin.season}`\n\n        let lastWin = document.createElement(\"div\")\n        lastWin.classList = \"extra-stat\"\n        let lastWinTrackName = record.lastWin.trackName ? record.lastWin.trackName : (record.lastWin.trackId ? names_full[races_names[record.lastWin.trackId]] : \"\")\n        lastWin.textContent = `Last Win: ${lastWinTrackName} ${record.lastWin.season}`\n\n        let fastestLaps = document.createElement(\"div\")\n        fastestLaps.classList = \"extra-stat\"\n        fastestLaps.textContent = `Fastest Laps: ${record.totalFastestLaps}`\n\n        let sprintWins = document.createElement(\"div\")\n        sprintWins.classList = \"extra-stat\"\n        sprintWins.textContent = `Sprint Wins: ${record.totalSprintWins}`\n\n        let poles = document.createElement(\"div\")\n        poles.classList = \"extra-stat\"\n        poles.textContent = `Poles: ${record.totalPoles}`\n\n        let podiums = document.createElement(\"div\")\n        podiums.classList = \"extra-stat\"\n        podiums.textContent = `Podiums: ${record.totalPodiums}`\n\n        let points = document.createElement(\"div\")\n        points.classList = \"extra-stat\"\n        points.textContent = `Points: ${record.totalPointsScored}`\n\n        let wins = document.createElement(\"div\")\n        wins.classList = \"extra-stat\"\n        wins.textContent = `Wins: ${record.totalWins}`\n\n        let champs = document.createElement(\"div\")\n        champs.classList = \"extra-stat\"\n        champs.textContent = `WDCs: ${record.totalChampionshipWins}`\n\n        if (document.querySelector(\"#yearButton\").dataset.year === \"all\" && record.record !== \"races\") {\n            extraStatsSection.appendChild(totalStarts)\n        }\n        if (record.record !== \"points\") {\n            extraStatsSection.appendChild(points)\n        }\n\n        if (record.firstRace.season !== 0) {\n            extraStatsSection.appendChild(firstRace)\n        }\n        if (record.firstPodium.season !== 0) {\n            extraStatsSection.appendChild(firstPodium)\n        }\n        if (record.firstWin.season !== 0) {\n            extraStatsSection.appendChild(firstWin)\n        }\n        if (record.lastWin.season !== 0) {\n            extraStatsSection.appendChild(lastWin)\n        }\n\n        if (record.record !== \"fastestlaps\" && record.totalFastestLaps > 0) {\n            extraStatsSection.appendChild(fastestLaps)\n        }\n\n        if (record.totalSprintWins > 0) {\n            extraStatsSection.appendChild(sprintWins)\n        }\n\n        if (record.record !== \"wins\" && record.totalWins > 0) {\n            extraStatsSection.appendChild(wins)\n        }\n        if (record.record !== \"podiums\" && record.totalPodiums > 0) {\n            extraStatsSection.appendChild(podiums)\n        }\n        if (record.record !== \"poles\" && record.totalPoles > 0) {\n            extraStatsSection.appendChild(poles)\n        }\n        if (record.record !== \"champs\" && record.totalChampionshipWins > 0) {\n            extraStatsSection.appendChild(champs)\n        }\n\n        let totalPoints = document.createElement(\"div\")\n        totalPoints.classList = \"extra-stat\"\n        totalPoints.textContent = `Points: ${record.totalPointsScored}`\n\n        numberAndName.appendChild(extraStatsSection)\n\n        let recordValue = document.createElement(\"div\")\n        recordValue.classList = \"record-value\"\n        recordValue.textContent = record.value\n\n\n        recordDiv.appendChild(numberAndName)\n        recordDiv.appendChild(recordValue)\n        recordsList.appendChild(recordDiv)\n    });\n}\n\nexport function loadTeamRecordsList(payload) {\n    const recordsList = document.querySelector(\".records-list\");\n    recordsList.innerHTML = \"\";\n\n    const data = Array.isArray(payload) ? payload : payload?.record;\n    if (!Array.isArray(data) || data.length === 0) return;\n\n    let visibleIndex = 0;\n\n    const formatNameNoUppercase = (fullName, spanName, spanLastName) => {\n        if (!fullName) return;\n        if (fullName.length > 17) {\n            let nameArray = fullName.split(\" \");\n            let firstName = nameArray[0];\n            if (insert_space(firstName).includes(\" \")) {\n                let splitName = insert_space(firstName).split(\" \");\n                spanName.textContent = splitName[0][0] + \". \" + splitName[1] + \" \";\n            } else {\n                spanName.textContent = firstName[0] + \". \";\n            }\n\n            spanLastName.textContent = nameArray.slice(1).join(\" \");\n        } else {\n            const nameSplitted = fullName.split(\" \");\n            spanName.textContent = insert_space(nameSplitted[0]) + \" \";\n            spanLastName.textContent = nameSplitted.slice(1).join(\" \");\n        }\n    };\n\n    const buildTeamDriverInline = (driver) => {\n        const wrap = document.createElement(\"span\");\n        wrap.className = \"record-team-driver\";\n\n        const num = driver?.number;\n        if (num != null) {\n            const numSpan = document.createElement(\"span\");\n            numSpan.className = \"record-driver-number\";\n            numSpan.textContent = `#${num}`;\n            wrap.appendChild(numSpan);\n        }\n\n        const name = String(driver?.name ?? \"\").trim();\n        if (name) {\n            const parts = name.split(\" \");\n            const nameSpan = document.createElement(\"span\");\n            const lastSpan = document.createElement(\"span\");\n            formatNameNoUppercase(name, nameSpan, lastSpan);\n            wrap.appendChild(nameSpan);\n            wrap.appendChild(lastSpan);\n        }\n\n        return wrap;\n    };\n\n    data.forEach((item) => {\n        const teamId = Number(item?.teamId ?? item?.TeamID ?? -1);\n        const value = Number(item?.value ?? 0);\n        if (teamId === -1) return;\n        if (value <= 0) return;\n\n        const recordDiv = document.createElement(\"div\");\n        recordDiv.classList = \"record-item\";\n\n        if (team_dict[teamId]) {\n            recordDiv.classList.add(`${team_dict[teamId]}-record`);\n        }\n        else {\n            recordDiv.classList.add(\"generic-record\");\n        }\n\n        const numberAndName = document.createElement(\"div\");\n        numberAndName.classList = \"number-and-name\";\n\n        const number = document.createElement(\"div\");\n        number.className = \"record-number\";\n        number.textContent = `${++visibleIndex}.`;\n\n        const logoDiv = buildDriverLogoDiv(teamId, {\n            isF1: true,\n            wrapperClass: \"drivers-table-logo-div record-logo-div\"\n        });\n\n        const nameAndTeam = document.createElement(\"div\");\n        nameAndTeam.classList = \"name-and-team\";\n\n        const recordName = document.createElement(\"div\");\n        recordName.classList = \"record-name bold-font\";\n        recordName.textContent = formatTeamNameForDisplay(combined_dict[teamId] || \"\", { upper: true });\n\n        nameAndTeam.appendChild(recordName);\n\n        const driversObj = item?.drivers;\n        const driver1 = driversObj?.driver1 ?? null;\n        const driver2 = driversObj?.driver2 ?? null;\n        if (driver1 || driver2) {\n            const driversDiv = document.createElement(\"div\");\n            driversDiv.classList = \"record-team record-team-drivers\";\n\n            const drivers = [driver1, driver2].filter(Boolean);\n            drivers.forEach((driver, idx) => {\n                if (idx > 0) {\n                    const sep = document.createElement(\"span\");\n                    sep.className = \"record-drivers-separator\";\n                    sep.textContent = \"|\";\n                    driversDiv.appendChild(sep);\n                }\n                driversDiv.appendChild(buildTeamDriverInline(driver));\n            });\n\n            nameAndTeam.appendChild(driversDiv);\n        }\n\n        numberAndName.appendChild(number);\n        numberAndName.appendChild(logoDiv);\n        numberAndName.appendChild(nameAndTeam);\n\n        const breakdown = Array.isArray(item?.breakdown) ? item.breakdown : [];\n        if (breakdown.length > 0) {\n            const extraStatsSection = document.createElement(\"div\");\n            extraStatsSection.classList = \"extra-stats-section\";\n\n            breakdown.forEach((d) => {\n                if (!d || Number(d.count) <= 0) return;\n                const statDiv = document.createElement(\"div\");\n                statDiv.classList = \"extra-stat\";\n\n                const driverName = String(d.name ?? \"\").trim();\n                if (driverName) {\n                    const parts = driverName.split(\" \");\n                    const nameSpan = document.createElement(\"span\");\n                    const lastSpan = document.createElement(\"span\");\n                    formatNameNoUppercase(driverName, nameSpan, lastSpan);\n                    statDiv.appendChild(nameSpan);\n                    statDiv.appendChild(lastSpan);\n                }\n\n                const countSpan = document.createElement(\"span\");\n                countSpan.textContent = `: ${d.count}`;\n                statDiv.appendChild(countSpan);\n\n                extraStatsSection.appendChild(statDiv);\n            });\n\n            numberAndName.appendChild(extraStatsSection);\n        }\n\n        const recordValue = document.createElement(\"div\");\n        recordValue.classList = \"record-value\";\n        recordValue.textContent = String(value);\n\n        recordDiv.appendChild(numberAndName);\n        recordDiv.appendChild(recordValue);\n        recordsList.appendChild(recordDiv);\n    });\n}\n\ndocument.querySelectorAll(\"#recordsTypeDropdown > a\").forEach(function (elem) {   \n    elem.addEventListener(\"click\", function () {\n        document.querySelector(\"#recordsTypeButton span\").textContent = elem.textContent\n        document.querySelector(\"#recordsTypeButton\").dataset.value = elem.dataset.value\n        syncRecordsTypeDropdownChecks()\n        updateTopPanelControlsVisibility();\n        manageRecordsSelected(null)\n    })\n})\n\ndocument.querySelector(\"#recordsTypeDropdown .session-results-root\")?.addEventListener(\"mouseenter\", () => {\n    ensureSessionResultsMenuPopulated();\n});\n\ndocument.querySelector(\"#recordsTypeDropdown .session-results-root\")?.addEventListener(\"click\", () => {\n    const recordsButton = document.getElementById(\"recordsTypeButton\");\n    if (recordsButton) {\n        recordsButton.querySelector(\"span.dropdown-label\").textContent = \"Session Results\";\n        recordsButton.dataset.value = \"sessionresults\";\n    }\n    syncRecordsTypeDropdownChecks();\n    updateTopPanelControlsVisibility();\n    manageRecordsSelected(null);\n});\n\ndocument.querySelector(\".hide-historic-drivers\").addEventListener(\"click\", function () {\n    this.classList.toggle(\"active\");\n    this.querySelector(\"span\").textContent = this.classList.contains(\"active\") ? \"Show Historic Drivers\" : \"Hide Historic Drivers\"\n\n    const recordsList = document.querySelectorAll(\".record-item\");\n\n    // Ocultar/mostrar históricos\n    recordsList.forEach(function (record) {\n        if (record.classList.contains(\"historic-driver\")) {\n            record.classList.toggle(\"d-none\");\n        }\n    });\n\n    // Renumerar solo los visibles\n    let visibleIndex = 1;\n    recordsList.forEach(function (record) {\n        if (!record.classList.contains(\"d-none\")) {\n            const numberEl = record.querySelector(\".record-number\");\n            if (numberEl) {\n                numberEl.textContent = `${visibleIndex}.`;\n            }\n            visibleIndex++;\n        }\n    });\n});\n"
  },
  {
    "path": "src/js/frontend/stats.js",
    "content": "import { inverted_countries_abreviations } from \"../backend/scriptUtils/countries\";\nimport { team_dict, mentalityModifiers, teamOrder, mentality_dict, combined_dict, logos_disc } from \"./config\";\nimport { colors_dict } from \"./head2head\";\nimport { attachHold } from \"./renderer\";\nimport { insert_space, manageColor, format_name } from \"./transfers\";\nimport Chart from 'chart.js/auto';\n\n\nlet driverStatTitle = document.getElementById(\"driverStatsTitle\")\nexport let statPanelShown = 0;\nexport let typeOverall = \"driver\";\nexport let typeEdit;\nlet oldNum;\nlet editStatsItems = [];\nlet timer;\nlet statsRadarChart = null;\nconst clearIcon2 = document.querySelector(\"#filterContainer .bi-x\");\n\nlet isComparisonModeActive = false;\nlet firstDriverStats = null;\nlet secondDriverStats = null;\nlet numbersAvailable = [];\n\nconst compareButton = document.getElementById('compareButton');\nconst addStaffButton = document.getElementById(\"addStaffButton\");\nconst addStaffTypeDropdown = document.getElementById(\"addStaffTypeDropdown\");\nconst draftStaffTypeControl = document.getElementById(\"draftStaffTypeControl\");\nconst genderSwapButton = document.getElementById(\"genderSwapButton\");\nconst nationalityButton = document.getElementById(\"nationalityButton\");\nconst nationalityMenu = document.getElementById(\"nationalityMenu\");\nconst plusBtn = document.querySelector('.age-holder .bi-plus');\nconst minusBtn = document.querySelector('.age-holder .bi-dash');\nconst ageSpan = document.querySelector('.age-holder .actual-age');\nconst plusR = document.querySelector('.retirement-age .bi-plus');\nconst minusR = document.querySelector('.retirement-age .bi-dash');\nconst inputR = document.querySelector('.retirement-age .actual-retirement');\nlet plusNumberBtn = document.querySelector('.number-buttons .bi-plus');\nlet minusNumberBtn = document.querySelector('.number-buttons .bi-dash');\nlet numberSpan = document.querySelector('.number-holder');\nlet selectedAddStaffType = \"0\";\nlet currentDraftId = null;\n\nconst staffTypeConfig = {\n    \"0\": { label: \"Drivers\", spaceStats: \"driverStats\" },\n    \"1\": { label: \"Technical Chiefs\", spaceStats: \"chiefStats\" },\n    \"2\": { label: \"Race Engineers\", spaceStats: \"engineerStats\" },\n    \"3\": { label: \"H. of Aerodynamics\", spaceStats: \"aeroStats\" },\n    \"4\": { label: \"Sporting Directors\", spaceStats: \"directorStats\" }\n};\n\nfunction setAttributesTitle(typeStaff) {\n    const config = staffTypeConfig[String(typeStaff ?? \"0\")] || staffTypeConfig[\"0\"];\n    const titleText = document.getElementById(\"attributesTitleText\");\n    if (titleText) {\n        titleText.textContent = `${config.label} Attributes`;\n    }\n}\n\nfunction initNationalityDropdown() {\n    if (!nationalityMenu) return;\n\n    nationalityMenu.innerHTML = \"\";\n\n    const entries = Object.entries(inverted_countries_abreviations || {})\n        .filter(([code, name]) => !!code && !!name)\n        .sort((a, b) => String(a[1]).localeCompare(String(b[1])));\n\n    const frag = document.createDocumentFragment();\n    entries.forEach(([code, name]) => {\n        const item = document.createElement(\"a\");\n        item.className = \"redesigned-dropdown-item nationality-item\";\n        item.dataset.code = code;\n\n        const img = document.createElement(\"img\");\n        img.src = `https://flagsapi.com/${code}/flat/64.png`;\n        img.alt = code;\n\n        const text = document.createElement(\"span\");\n        text.textContent = name;\n\n        item.appendChild(img);\n        item.appendChild(text);\n\n        item.addEventListener(\"click\", function () {\n            const draft = getCurrentDraftElement();\n            if (!draft) return;\n\n            draft.dataset.nationality = code;\n            document.querySelector(\".driver-info-driver-flag\").src = `https://flagsapi.com/${code}/flat/64.png`;\n            document.querySelector(\".flag-text\").textContent = inverted_countries_abreviations[code] || code;\n\n            document.dispatchEvent(new CustomEvent(\"draft-nationality-selected\", {\n                detail: {\n                    draftId: draft.dataset.driverid,\n                    code\n                }\n            }));\n        });\n\n        frag.appendChild(item);\n    });\n\n    nationalityMenu.appendChild(frag);\n}\n\nexport function setStatPanelShown(value) {\n    statPanelShown = value;\n}\n\nexport function setTypeOverall(value) {\n    typeOverall = value;\n}\n\nexport function setTypeEdit(value) {\n    typeEdit = value;\n}\n\n/**\n * Removes all the staff from their list\n */\nexport function removeStatsDrivers(staffOnly = false) {\n    document.querySelectorAll(\".staff-list\").forEach(function (elem) {\n        if (elem.id === \"fulldriverlist\" && staffOnly === false) {\n            elem.innerHTML = \"\"\n        }\n        else if (elem.id !== \"fulldriverlist\") {\n            elem.innerHTML = \"\"\n        }\n    })\n}\n\n/**\n * Places the drivers that the backend fetched on the driver list\n * @param {Object} driversArray Object with all the drivers that the backend fetched\n */\nexport function place_drivers_editStats(driversArray) {\n    let divPosition;\n    driversArray.forEach((driver) => {\n        divPosition = \"fulldriverlist\"\n\n        let newDiv = document.createElement(\"div\");\n        let ovrDiv = document.createElement(\"div\");\n        let ovrSpan = document.createElement(\"span\");\n\n        newDiv.className = \"col normal-driver\";\n        newDiv.dataset.driverid = driver[1];\n        let nameDiv = document.createElement(\"div\");\n        nameDiv.className = \"name-div-edit-stats\"\n        newDiv.dataset.teamid = driver[2];\n        newDiv.dataset.type = 0;\n        let name = driver[0].split(\" \")\n        let spanName = document.createElement(\"span\")\n        let spanLastName = document.createElement(\"span\")\n        format_name(driver[0], name, spanName, spanLastName)\n        newDiv.dataset.name = insert_space(name[0]) + \" \" + name.slice(1).join(\" \")\n        spanLastName.classList.add(\"bold-font\")\n        spanLastName.classList.add(\"surname\")\n        nameDiv.appendChild(spanName)\n        nameDiv.appendChild(spanLastName)\n        manageColor(newDiv, spanLastName)\n        newDiv.appendChild(nameDiv)\n        newDiv.classList.add(team_dict[driver[2]] + \"-transparent\")\n        let statsString = '';\n\n        for (let i = 5; i <= 15; i++) {\n            statsString += driver[i] + ' ';\n        }\n        newDiv.dataset.stats = statsString;\n\n        newDiv.dataset.superLicense = driver[\"superlicense\"]\n        newDiv.dataset.age = driver[\"age\"]\n        newDiv.dataset.retirement = driver[\"retirement_age\"]\n        newDiv.dataset.numWC = driver[\"wants1\"]\n        newDiv.dataset.number = driver[\"driver_number\"]\n        newDiv.dataset.raceFormula = driver[\"race_formula\"]\n        newDiv.dataset.driverCode = driver[\"driver_code\"]\n        newDiv.dataset.isRetired = driver[4]\n        if (driver[\"nationality\"] !== \"\") {\n            newDiv.dataset.nationality = driver[\"nationality\"]\n        }\n        if (driver[\"mentality0\"] >= 0) {\n            newDiv.dataset.mentality0 = driver[\"mentality0\"]\n            newDiv.dataset.mentality1 = driver[\"mentality1\"]\n            newDiv.dataset.mentality2 = driver[\"mentality2\"]\n            newDiv.dataset.globalMentality = driver[\"global_mentality\"]\n        }\n        let mentality = driver[\"global_mentality\"]\n\n        newDiv.dataset.marketability = driver[\"marketability\"]\n        let ovr = calculateOverall(statsString, \"driver\")\n        ovrSpan.textContent = ovr\n        ovrDiv.appendChild(ovrSpan)\n        ovrDiv.classList.add(\"bold-font\")\n        ovrDiv.classList.add(\"small-ovr\")\n        newDiv.appendChild(ovrDiv)\n        newDiv.addEventListener('click', () => {\n            if (!isComparisonModeActive) {\n                let elementosClicked = document.querySelectorAll('.clicked');\n                elementosClicked.forEach(item => item.classList.remove('clicked'));\n                newDiv.classList.toggle('clicked');\n                driverStatTitle.innerText = newDiv.dataset.name;\n                load_stats(newDiv);\n                if (statPanelShown == 0) {\n                    document.getElementById(\"editStatsPanel\").className = \"left-panel-stats\";\n                    statPanelShown = 1;\n                }\n                recalculateOverall();\n            } else if (isComparisonModeActive && firstDriverStats) {\n                //remove clicked class from actual comparing driver\n                let comparingDriver = document.querySelector('.comparing-driver');\n                if (comparingDriver) {\n                    comparingDriver.classList.remove('clicked', 'comparing-driver');\n\n                    let nameDivOld = comparingDriver.children[0];\n                    let comparingTagOld = nameDivOld.querySelector(\".comparing-tag\");\n                    if (comparingTagOld) {\n                        nameDivOld.removeChild(comparingTagOld);\n                    }\n                }\n                //add clicked class\n                newDiv.classList.add('clicked', 'comparing-driver');\n                let nameDiv = newDiv.children[0];\n                let comparingTag = document.createElement(\"span\");\n                let teamClass = team_dict[newDiv.dataset.teamid];\n                comparingTag.className = `comparing-tag ${teamClass}`;\n                comparingTag.textContent = \"Comparing\";\n                nameDiv.appendChild(comparingTag);\n                secondDriverStats = newDiv.dataset.stats;\n                updateComparisonUI();\n            }\n        });\n        document.getElementById(divPosition).appendChild(newDiv)\n\n\n    })\n\n    document.querySelector(\"#edit_stats\").querySelectorAll(\".custom-input-number\").forEach(function (elem) {\n        elem.addEventListener(\"change\", function () {\n            if (elem.value > 100) {\n                elem.value = 100;\n            }\n            recalculateOverall()\n        });\n    });\n\n    manage_order(0)\n\n}\n\nexport function initStatsDrivers() {\n    editStatsItems = [...document.querySelectorAll('.normal-driver:not([data-is-draft=\"1\"])')].map(el => {\n        const first = el.children[0]?.children[0]?.textContent || \"\";\n        const last = el.children[0]?.children[1]?.textContent || \"\";\n        return { el, name: (first + last).toLowerCase() };\n    });\n}\n\n\n\n/**\n * Places the staff that the backend fetched on their respective staff list\n * @param {Object} staffArray Object with all the staff that the backend fetched\n */\nexport function place_staff_editStats(staffArray) {\n    let divPosition;\n\n    staffArray.forEach((staff) => {\n        let statsString = '';\n\n        if (staff[3] == 1) {\n            divPosition = \"fullTechnicalList\"\n            for (let i = 4; i <= 9; i++) {\n                statsString += staff[i] + ' ';\n            }\n        }\n        else if (staff[3] == 2) {\n            divPosition = \"fullEngineerList\"\n            for (let i = 4; i <= 6; i++) {\n                statsString += staff[i] + ' ';\n            }\n        }\n        else if (staff[3] == 3) {\n            divPosition = \"fullAeroList\"\n            for (let i = 4; i <= 11; i++) {\n                statsString += staff[i] + ' ';\n            }\n        }\n        else if (staff[3] == 4) {\n            divPosition = \"fullDirectorList\"\n            for (let i = 4; i <= 7; i++) {\n                statsString += staff[i] + ' ';\n            }\n        }\n        statsString = statsString.slice(0, -1);\n\n\n        let newDiv = document.createElement(\"div\");\n        let ovrDiv = document.createElement(\"div\");\n        let ovrSpan = document.createElement(\"span\")\n\n\n        newDiv.className = \"col normal-driver\";\n        newDiv.dataset.driverid = staff[1];\n        newDiv.dataset.type = staff[3];\n        let nameDiv = document.createElement(\"div\");\n        nameDiv.className = \"name-div-edit-stats\"\n        newDiv.dataset.teamid = staff[2];\n        let name = staff[0].split(\" \")\n        let spanName = document.createElement(\"span\")\n        let spanLastName = document.createElement(\"span\")\n        format_name(staff[0], name, spanName, spanLastName)\n        newDiv.dataset.name = insert_space(name[0]) + \" \" + name.slice(1).join(\" \")\n        spanLastName.classList.add(\"bold-font\")\n        spanLastName.classList.add(\"surname\")\n        nameDiv.appendChild(spanName)\n        nameDiv.appendChild(spanLastName)\n        manageColor(newDiv, spanLastName)\n        newDiv.appendChild(nameDiv)\n        newDiv.classList.add(team_dict[staff[2]] + \"-transparent\")\n        newDiv.dataset.stats = statsString;\n\n        newDiv.dataset.age = staff[\"age\"]\n        newDiv.dataset.retirement = staff[\"retirement_age\"]\n        newDiv.dataset.raceFormula = staff[\"race_formula\"]\n        newDiv.dataset.isRetired = staff[\"is_retired\"] ?? 0\n        if (staff[\"nationality\"] !== \"\") {\n            newDiv.dataset.nationality = staff[\"nationality\"]\n        }\n        if (staff[\"mentality0\"] >= 0) {\n            newDiv.dataset.mentality0 = staff[\"mentality0\"]\n            newDiv.dataset.mentality1 = staff[\"mentality1\"]\n            newDiv.dataset.mentality2 = staff[\"mentality2\"]\n            newDiv.dataset.globalMentality = staff[\"global_mentality\"]\n        }\n        let mentality = staff[\"global_mentality\"]\n        let ovr = calculateOverall(statsString, \"staff\")\n        ovrSpan.textContent = ovr\n\n        ovrDiv.appendChild(ovrSpan)\n        ovrDiv.classList.add(\"bold-font\")\n        ovrDiv.classList.add(\"small-ovr\")\n        newDiv.appendChild(ovrDiv)\n        newDiv.addEventListener('click', () => {\n            if (!isComparisonModeActive) {\n                let elementosClicked = document.querySelectorAll('.clicked');\n                elementosClicked.forEach(item => item.classList.remove('clicked'));\n                newDiv.classList.toggle('clicked');\n                driverStatTitle.innerText = newDiv.dataset.name;\n                load_stats(newDiv);\n                if (statPanelShown == 0) {\n                    document.getElementById(\"editStatsPanel\").className = \"left-panel-stats\";\n                    statPanelShown = 1;\n                }\n                recalculateOverall();\n            } else if (isComparisonModeActive && firstDriverStats) {\n                //remove clicked class from actual comparing driver\n                let comparingDriver = document.querySelector('.comparing-driver');\n                if (comparingDriver) {\n                    comparingDriver.classList.remove('clicked', 'comparing-driver');\n\n                    let nameDivOld = comparingDriver.children[0];\n                    let comparingTagOld = nameDivOld.querySelector(\".comparing-tag\");\n                    if (comparingTagOld) {\n                        nameDivOld.removeChild(comparingTagOld);\n                    }\n                }\n                //add clicked class\n                newDiv.classList.add('clicked', 'comparing-driver');\n                let nameDiv = newDiv.children[0];\n                let comparingTag = document.createElement(\"span\");\n                let teamClass = team_dict[newDiv.dataset.teamid];\n                comparingTag.className = `comparing-tag ${teamClass}`;\n                comparingTag.textContent = \"Comparing\";\n                nameDiv.appendChild(comparingTag);\n                secondDriverStats = newDiv.dataset.stats;\n                updateComparisonUI();\n            }\n        });\n\n        document.getElementById(divPosition).appendChild(newDiv)\n\n    })\n\n}\n\nfunction getMentalityModifier(mentality) {\n    let keys = Object.keys(mentalityModifiers).map(Number).sort((a, b) => a - b);\n\n    let nextKey = keys.find(key => key > mentality);\n\n    return nextKey !== undefined ? mentalityModifiers[nextKey] : null;\n}\n\n/**\n * changes the overall placed in the overall square\n */\nfunction recalculateOverall() {\n    let stats = \"\"\n    document.querySelectorAll(\".elegible\").forEach(function (elem) {\n        stats += elem.value + \" \"\n    })\n    stats = stats.slice(0, -1);\n    let oldovr = document.getElementById(\"ovrholder\").innerHTML;\n    let ovr = calculateOverall(stats, typeOverall);\n    if (oldovr > ovr) {\n        document.getElementById(\"ovrholder\").innerHTML = ovr;\n        document.getElementById(\"ovrholder\").className = \"overall-holder bold-font alertNeg\";\n        setTimeout(() => {\n            document.getElementById(\"ovrholder\").className = \"overall-holder bold-font\"\n        }, 300);\n    }\n    else if (oldovr < ovr) {\n        document.getElementById(\"ovrholder\").innerHTML = ovr;\n        document.getElementById(\"ovrholder\").className = \"overall-holder bold-font alertPos\";\n        setTimeout(() => {\n            document.getElementById(\"ovrholder\").className = \"overall-holder bold-font\"\n        }, 300);\n    }\n\n}\n\n/**\n * eventListeenr for the confirm button for the stats\n */\n\n\n/**\n * Gets the named with a space between name and lastname\n * @param {*} html element with the name bad formatted\n * @returns the name formatted\n */\nexport function getName(html) {\n    let name = \"\"\n    html.querySelectorAll('span').forEach(function (elem) {\n        name += elem.innerText + \" \"\n    })\n\n    name = name.slice(0, -1)\n\n    return name;\n\n}\n\n/**\n * Mathematic calculations to get a staff's overall value\n * @param {string} stats all stats spearated by a space between them\n * @param {string} type type of staff\n * @returns the number of his overall value\n */\nexport function calculateOverall(stats, type) {\n    let statsArray = stats.split(\" \").map(Number);\n    let rating;\n    if (type === \"driver\") {\n        let cornering = statsArray[0];\n        let braking = statsArray[1];\n        let control = statsArray[2];\n        let smoothness = statsArray[3];\n        let adaptability = statsArray[4];\n        let overtaking = statsArray[5];\n        let defence = statsArray[6];\n        let reactions = statsArray[7];\n        let accuracy = statsArray[8];\n\n        rating = (cornering + braking * 0.75 + reactions * 0.5 + control * 0.75 + smoothness * 0.5 + accuracy * 0.75 + adaptability * 0.25 + overtaking * 0.25 + defence * 0.25) / 5;\n    }\n    else if (type === \"staff\") {\n        let suma = 0;\n        for (let i = 0; i < statsArray.length; i++) {\n            suma += statsArray[i];\n        }\n        rating = suma / statsArray.length;\n    }\n    return Math.round(rating)\n}\n\nfunction updateStat(input, increment) {\n    let val = parseInt(input.value) + increment;\n    if (val > 100) val = 100;\n    if (val < 0) val = 0;\n    input.value = val;\n    recalculateOverall();\n    manage_stat_bar(input, val);\n}\n\n\ndocument.querySelectorAll(\".attributes-panel .bi-plus\").forEach(button => {\n    let bar = button.parentNode.parentNode.parentNode.querySelector(\".one-stat-progress\");\n    let statInput = button.parentNode.parentNode.querySelector(\"input\");\n    attachHold(button, statInput, +1, { min: 0, max: 99, progressEl: bar, onChange: recalculateOverall });\n    recalculateOverall();\n});\n\ndocument.querySelectorAll(\".attributes-panel .bi-dash\").forEach(button => {\n    let bar = button.parentNode.parentNode.parentNode.querySelector(\".one-stat-progress\");\n    let statInput = button.parentNode.parentNode.querySelector(\"input\");\n    attachHold(button, statInput, -1, { min: 0, max: 99, progressEl: bar, onChange: recalculateOverall });\n});\n\ndocument.querySelectorAll(\"#addStaffTypeMenu a\").forEach(item => {\n    item.addEventListener(\"click\", function () {\n        setAddStaffType(item.dataset.staffType);\n        const currentDraft = getCurrentDraftElement();\n        if (currentDraft && currentDraft.dataset.type !== item.dataset.staffType) {\n            document.dispatchEvent(new CustomEvent(\"random-staff-requested\", {\n                detail: {\n                    typeStaff: item.dataset.staffType\n                }\n            }));\n        }\n    });\n});\n\nif (addStaffButton) {\n    addStaffButton.addEventListener(\"click\", function () {\n        if (isComparisonModeActive) toggleComparisonMode();\n        document.dispatchEvent(new CustomEvent(\"random-staff-requested\", {\n            detail: {\n                typeStaff: selectedAddStaffType\n            }\n        }));\n    });\n}\n\nif (genderSwapButton) {\n    genderSwapButton.addEventListener(\"click\", function () {\n        const draft = getCurrentDraftElement();\n        if (!draft) return;\n\n        const nextGender = draft.dataset.gender === \"1\" ? \"0\" : \"1\";\n        draft.dataset.gender = nextGender;\n        updateDraftControlVisibility(draft);\n\n        document.dispatchEvent(new CustomEvent(\"random-forename-requested\", {\n            detail: {\n                draftId: draft.dataset.driverid,\n                gender: nextGender,\n                staffNameLocale: draft.dataset.staffNameLocale\n            }\n        }));\n    });\n}\n\nsetAddStaffType(selectedAddStaffType);\ninitNationalityDropdown();\n\nattachHold(plusBtn, ageSpan, +1, { min: 0, max: 100 });\nattachHold(minusBtn, ageSpan, -1, { min: 0, max: 100 });\n\nattachHold(plusR, inputR, +1, { min: 30, max: 80 });\nattachHold(minusR, inputR, -1, { min: 30, max: 80 });\n\ndocument.querySelector(\"#nameFilter\").addEventListener(\"input\", function (event) {\n    const val = event.target.value;\n    clearIcon2.classList.toggle(\"d-none\", val === \"\");\n\n    clearTimeout(timer);\n    timer = setTimeout(() => {\n        const q = val.trim().toLowerCase();\n        console.log(\"Filtering with query:\", q);\n        if (!q) { for (const { el } of editStatsItems) el.classList.remove(\"d-none\"); return; }\n        for (const { el, name } of editStatsItems) el.classList.toggle(\"d-none\", !name.includes(q));\n    }, 150);\n})\n\ndocument.querySelectorAll(\".text-filter-container .bi-x\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function () {\n        let input = elem.parentNode.querySelector(\"input\")\n        input.value = \"\"\n        elem.classList.add(\"d-none\")\n        let event = new Event('input', {\n            bubbles: true,\n            cancelable: true\n        });\n        input.dispatchEvent(event);\n    })\n})\n\ndocument.querySelector(\"#filterIcon\").addEventListener(\"click\", function () {\n    document.getElementById(\"edit_stats\").querySelector(\".category-filters\").classList.toggle(\"show\")\n    document.getElementById(\"edit_stats\").querySelector(\".filter-container\").classList.toggle(\"focused\")\n    if (document.getElementById(\"edit_stats\").querySelector(\".filter-container\").classList.contains(\"focused\")) {\n        document.querySelector(\"#filterIcon\").className = \"bi bi-filter-circle-fill filter-icon\"\n    }\n    else {\n        document.querySelector(\"#filterIcon\").className = \"bi bi-filter-circle filter-icon\"\n    }\n})\n\ndocument.getElementById(\"edit_stats\").querySelectorAll(\".new-pills-filters\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function (event) {\n        let isActive = elem.classList.contains('active');\n\n        document.getElementById(\"edit_stats\").querySelectorAll('.new-pills-filters').forEach(function (el) {\n            el.classList.remove('active');\n        });\n\n        if (!isActive) {\n            elem.classList.add('active');\n        }\n    })\n})\n\ndocument.querySelector(\"#F1filter\").addEventListener(\"click\", function (event) {\n    if (!event.target.classList.contains(\"active\")) {\n        let elements = document.querySelectorAll('.normal-driver:not([data-is-draft=\"1\"])')\n        elements.forEach(function (elem) {\n            elem.classList.remove(\"d-none\")\n        })\n    }\n    else {\n        let elements = document.querySelectorAll('.normal-driver:not([data-is-draft=\"1\"])')\n        elements.forEach(function (elem) {\n            if (parseInt(elem.dataset.raceFormula) === 1) {\n                elem.classList.remove(\"d-none\")\n            }\n            else {\n                elem.classList.add(\"d-none\")\n            }\n        })\n    }\n})\n\ndocument.querySelector(\"#F2filter\").addEventListener(\"click\", function (event) {\n    if (!event.target.classList.contains(\"active\")) {\n        let elements = document.querySelectorAll('.normal-driver:not([data-is-draft=\"1\"])')\n        elements.forEach(function (elem) {\n            elem.classList.remove(\"d-none\")\n        })\n    }\n    else {\n        let elements = document.querySelectorAll('.normal-driver:not([data-is-draft=\"1\"])')\n        elements.forEach(function (elem) {\n            if (parseInt(elem.dataset.raceFormula) === 2) {\n                elem.classList.remove(\"d-none\")\n            }\n            else {\n                elem.classList.add(\"d-none\")\n            }\n        })\n    }\n})\n\ndocument.querySelector(\"#F3filter\").addEventListener(\"click\", function (event) {\n    if (!event.target.classList.contains(\"active\")) {\n        let elements = document.querySelectorAll('.normal-driver:not([data-is-draft=\"1\"])')\n        elements.forEach(function (elem) {\n            elem.classList.remove(\"d-none\")\n        })\n    }\n    else {\n        let elements = document.querySelectorAll('.normal-driver:not([data-is-draft=\"1\"])')\n        elements.forEach(function (elem) {\n            if (parseInt(elem.dataset.raceFormula) === 3) {\n                elem.classList.remove(\"d-none\")\n            }\n            else {\n                elem.classList.add(\"d-none\")\n            }\n        })\n    }\n})\n\ndocument.querySelector(\"#freefilter\").addEventListener(\"click\", function (event) {\n    if (!event.target.classList.contains(\"active\")) {\n        let elements = document.querySelectorAll('.normal-driver:not([data-is-draft=\"1\"])')\n        elements.forEach(function (elem) {\n            elem.classList.remove(\"d-none\")\n        })\n    }\n    else {\n        let elements = document.querySelectorAll('.normal-driver:not([data-is-draft=\"1\"])')\n        elements.forEach(function (elem) {\n            if (parseInt(elem.dataset.raceFormula) === 4) {\n                elem.classList.remove(\"d-none\")\n            }\n            else {\n                elem.classList.add(\"d-none\")\n            }\n        })\n    }\n})\n\ndocument.querySelector(\".order-space\").querySelectorAll(\"i\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function (event) {\n        let parent = elem.parentNode\n        let state = parent.dataset.state\n        let orderNumUp = document.querySelector(\".bi-sort-numeric-up-alt\")\n        let orderNumDown = document.querySelector(\".bi-sort-numeric-down\")\n        parent.dataset.state = (parseInt(state) + 1) % 3\n        if (parent.dataset.state == 0) {\n            orderNumUp.classList.remove(\"active\")\n            orderNumUp.classList.remove(\"hidden\")\n            orderNumDown.classList.add(\"hidden\")\n        }\n        else if (parent.dataset.state == 1) {\n            orderNumDown.classList.add(\"hidden\")\n            orderNumDown.classList.add(\"active\")\n            orderNumUp.classList.add(\"active\")\n            orderNumUp.classList.remove(\"hidden\")\n\n        }\n        else if (parent.dataset.state == 2) {\n            orderNumUp.classList.remove(\"active\")\n            orderNumUp.classList.add(\"hidden\")\n            orderNumDown.classList.add(\"active\")\n            orderNumDown.classList.remove(\"hidden\")\n        }\n        manage_order(parseInt(parent.dataset.state))\n    })\n})\n\n\n/**\n * Adds eventListeners to all the elements of the staff dropdown\n */\nexport function listenersStaffGroups() {\n    document.querySelectorAll('#staffMenu a').forEach(item => {\n        item.addEventListener(\"click\", function () {\n            if (isComparisonModeActive) toggleComparisonMode();\n            const staffButton = document.getElementById('staffDropdown');\n            let staffSelected = item.innerHTML\n            let staffCode = item.dataset.spacestats\n            if (staffCode === \"driverStats\") {\n                typeOverall = \"driver\"\n                typeEdit = \"0\"\n                document.getElementById(\"driverSpecialAttributes\").classList.remove(\"d-none\")\n                document.querySelector(\"#superLicenseSwitch\").classList.remove(\"d-none\")\n                document.querySelector(\"#driverCode\").classList.remove(\"d-none\")\n\n                document.querySelector(\"#numberDetails\").previousElementSibling.classList.remove(\"d-none\")\n                document.querySelector(\"#numberDetails\").classList.remove(\"d-none\")\n                document.querySelector(\".upper-section-stats\").classList.add(\"showing-driver\")\n            }\n            else {\n                typeOverall = \"staff\"\n                document.getElementById(\"driverSpecialAttributes\").classList.add(\"d-none\")\n                document.querySelector(\"#superLicenseSwitch\").classList.add(\"d-none\")\n                document.querySelector(\"#driverCode\").classList.add(\"d-none\")\n                if (staffCode === \"chiefStats\") {\n                    typeEdit = \"1\"\n                }\n                if (staffCode === \"engineerStats\") {\n                    typeEdit = \"2\"\n                }\n                if (staffCode === \"aeroStats\") {\n                    typeEdit = \"3\"\n                }\n                if (staffCode === \"directorStats\") {\n                    typeEdit = \"4\"\n                }\n\n                document.querySelector(\"#numberDetails\").previousElementSibling.classList.add(\"d-none\")\n                document.querySelector(\"#numberDetails\").classList.add(\"d-none\")\n                document.querySelector(\".upper-section-stats\").classList.remove(\"showing-driver\")\n\n            }\n\n            staffButton.querySelector(\".dropdown-label\").innerHTML = staffSelected;\n            setAddStaffType(typeEdit);\n            setAttributesTitle(typeEdit);\n            change_elegibles(item.dataset.spacestats)\n            document.querySelectorAll(\".staff-list\").forEach(function (elem) {\n                elem.classList.add(\"d-none\")\n                if (item.dataset.list == elem.id) {\n                    elem.classList.remove(\"d-none\")\n                }\n            })\n            document.querySelector(\".left-panel-stats\").classList.add(\"d-none\")\n            statPanelShown = 0;\n        });\n\n    });\n    document.getElementById(\"driverStatsDrop\").click()\n}\n\nfunction setAddStaffType(typeStaff) {\n    if (!addStaffTypeDropdown) return;\n\n    const nextType = String(typeStaff ?? \"0\");\n    const config = staffTypeConfig[nextType] || staffTypeConfig[\"0\"];\n    selectedAddStaffType = nextType;\n    addStaffTypeDropdown.querySelector(\".dropdown-label\").textContent = config.label;\n}\n\nfunction resetStatsFilters() {\n    const nameFilter = document.querySelector(\"#nameFilter\");\n    if (nameFilter && nameFilter.value !== \"\") {\n        nameFilter.value = \"\";\n        nameFilter.dispatchEvent(new Event(\"input\", {\n            bubbles: true,\n            cancelable: true\n        }));\n    }\n\n    document.getElementById(\"edit_stats\").querySelectorAll(\".new-pills-filters\").forEach(function (elem) {\n        elem.classList.remove(\"active\");\n    });\n\n    document.querySelectorAll('.normal-driver:not([data-is-draft=\"1\"])').forEach(function (elem) {\n        elem.classList.remove(\"d-none\");\n    });\n}\n\nfunction applyStaffTypeSelection(typeStaff) {\n    // Deprecated: draft type switching should not affect the browse dropdown.\n}\n\nfunction getDraftContainer() {\n    return document.querySelector(\".staff-list:not(.d-none)\") || document.getElementById(\"fulldriverlist\") || document.getElementById(\"placeholder\");\n}\n\nfunction getCurrentDraftElement() {\n    return document.querySelector('.normal-driver[data-is-draft=\"1\"]');\n}\n\nfunction removeCurrentDraftElement() {\n    const draft = getCurrentDraftElement();\n    if (draft) {\n        draft.remove();\n    }\n    currentDraftId = null;\n}\n\nfunction createDraftElement(profile) {\n    const newDiv = document.createElement(\"div\");\n    const ovrDiv = document.createElement(\"div\");\n    const ovrSpan = document.createElement(\"span\");\n    const nameDiv = document.createElement(\"div\");\n    const spanName = document.createElement(\"span\");\n    const spanLastName = document.createElement(\"span\");\n    const nameParts = profile.name.split(\" \");\n\n    newDiv.className = \"col normal-driver draft-profile d-none\";\n    newDiv.dataset.isDraft = \"1\";\n    newDiv.dataset.driverid = profile.draftId;\n    newDiv.dataset.teamid = profile.teamid ?? 0;\n    newDiv.dataset.type = profile.typeStaff;\n    newDiv.dataset.name = profile.name;\n    newDiv.dataset.gender = String(profile.gender ?? 0);\n    newDiv.dataset.staffNameLocale = profile.staffNameLocale ?? \"\";\n    newDiv.dataset.firstNameLocKey = profile.firstNameLocKey ?? \"\";\n    newDiv.dataset.lastNameLocKey = profile.lastNameLocKey ?? \"\";\n    newDiv.dataset.stats = profile.stats;\n    newDiv.dataset.age = profile.age;\n    newDiv.dataset.retirement = profile.retirement_age;\n    newDiv.dataset.number = profile.driver_number ?? 0;\n    newDiv.dataset.numWC = profile.wants1 ?? 0;\n    newDiv.dataset.superLicense = profile.superlicense ?? 0;\n    newDiv.dataset.driverCode = profile.driver_code ?? \"\";\n    newDiv.dataset.isRetired = profile.isRetired ?? 0;\n    newDiv.dataset.raceFormula = profile.race_formula ?? 4;\n    newDiv.dataset.marketability = profile.marketability ?? \"\";\n    newDiv.dataset.nationality = profile.nationality ?? \"\";\n    newDiv.dataset.mentality0 = profile.mentality0 ?? \"\";\n    newDiv.dataset.mentality1 = profile.mentality1 ?? \"\";\n    newDiv.dataset.mentality2 = profile.mentality2 ?? \"\";\n    newDiv.dataset.globalMentality = profile.global_mentality ?? \"\";\n\n    nameDiv.className = \"name-div-edit-stats\";\n    format_name(profile.name, nameParts, spanName, spanLastName);\n    spanLastName.classList.add(\"bold-font\", \"surname\");\n    nameDiv.appendChild(spanName);\n    nameDiv.appendChild(spanLastName);\n    manageColor(newDiv, spanLastName);\n    newDiv.appendChild(nameDiv);\n\n    ovrSpan.textContent = calculateOverall(profile.stats, profile.typeStaff === \"0\" ? \"driver\" : \"staff\");\n    ovrDiv.appendChild(ovrSpan);\n    ovrDiv.classList.add(\"bold-font\", \"small-ovr\");\n    newDiv.appendChild(ovrDiv);\n\n    return newDiv;\n}\n\nfunction updateDraftControlVisibility(div) {\n    const isDraft = div?.dataset?.isDraft === \"1\";\n\n    draftStaffTypeControl?.classList.toggle(\"d-none\", !isDraft);\n    genderSwapButton?.classList.toggle(\"d-none\", !isDraft);\n    if (nationalityButton) nationalityButton.disabled = !isDraft;\n\n    if (!isDraft || !genderSwapButton) return;\n\n    const isFemale = div.dataset.gender === \"1\";\n    const icon = genderSwapButton.querySelector(\"i\");\n    const label = genderSwapButton.querySelector(\".button-text\");\n    icon.className = isFemale ? \"bi bi-gender-female\" : \"bi bi-gender-male\";\n    label.textContent = isFemale ? \"Female\" : \"Male\";\n}\n\nfunction enterNameEditMode() {\n    const button = document.querySelector(\"#editNameButton\");\n    if (button && !button.classList.contains(\"editing\")) {\n        button.click();\n    }\n}\n\nexport function isDraftProfileSelected() {\n    return document.querySelector(\".clicked\")?.dataset?.isDraft === \"1\";\n}\n\nfunction setEditorStaffType(typeStaff) {\n    const typeStr = String(typeStaff ?? \"0\");\n    const config = staffTypeConfig[typeStr] || staffTypeConfig[\"0\"];\n    const isDriver = typeStr === \"0\";\n\n    typeEdit = typeStr;\n    typeOverall = isDriver ? \"driver\" : \"staff\";\n\n    setAttributesTitle(typeStr);\n\n    if (isDriver) {\n        document.getElementById(\"driverSpecialAttributes\").classList.remove(\"d-none\");\n        document.querySelector(\"#superLicenseSwitch\").classList.remove(\"d-none\");\n        document.querySelector(\"#driverCode\").classList.remove(\"d-none\");\n\n        document.querySelector(\"#numberDetails\").previousElementSibling.classList.remove(\"d-none\");\n        document.querySelector(\"#numberDetails\").classList.remove(\"d-none\");\n        document.querySelector(\".upper-section-stats\").classList.add(\"showing-driver\");\n    } else {\n        document.getElementById(\"driverSpecialAttributes\").classList.add(\"d-none\");\n        document.querySelector(\"#superLicenseSwitch\").classList.add(\"d-none\");\n        document.querySelector(\"#driverCode\").classList.add(\"d-none\");\n\n        document.querySelector(\"#numberDetails\").previousElementSibling.classList.add(\"d-none\");\n        document.querySelector(\"#numberDetails\").classList.add(\"d-none\");\n        document.querySelector(\".upper-section-stats\").classList.remove(\"showing-driver\");\n    }\n\n    change_elegibles(config.spaceStats);\n}\n\nexport function loadRandomStaffDraft(profile) {\n    if (isComparisonModeActive) toggleComparisonMode();\n\n    resetStatsFilters();\n    removeCurrentDraftElement();\n    const editNameButton = document.querySelector(\"#editNameButton\");\n    if (editNameButton?.classList.contains(\"editing\")) {\n        editNameButton.click();\n    }\n    setAddStaffType(profile.typeStaff);\n    setEditorStaffType(profile.typeStaff);\n\n    document.querySelectorAll('.clicked').forEach(item => item.classList.remove('clicked'));\n\n    const draftDiv = createDraftElement(profile);\n    draftDiv.classList.add(\"clicked\");\n    getDraftContainer()?.appendChild(draftDiv);\n    currentDraftId = profile.draftId;\n\n    driverStatTitle.innerText = draftDiv.dataset.name;\n    load_stats(draftDiv);\n    if (statPanelShown == 0) {\n        document.getElementById(\"editStatsPanel\").className = \"left-panel-stats\";\n        statPanelShown = 1;\n    }\n    recalculateOverall();\n    enterNameEditMode();\n}\n\nexport function applyDraftForenameUpdate(payload) {\n    const draft = getCurrentDraftElement();\n    if (!draft) return;\n    if (String(draft.dataset.driverid) !== String(payload.draftId)) return;\n\n    const firstName = payload.firstName || \"\";\n    draft.dataset.firstNameLocKey = payload.firstNameLocKey || \"\";\n    if (payload.lastNameLocKey) draft.dataset.lastNameLocKey = payload.lastNameLocKey || \"\";\n\n    const currentLastName = (draft.dataset.name || \"\").split(\" \").slice(1).join(\" \").trim();\n    const lastName = payload.lastName || currentLastName;\n    const newName = `${firstName} ${lastName}`.trim();\n    draft.dataset.name = newName;\n\n    const nameDiv = draft.querySelector(\".name-div-edit-stats\");\n    if (nameDiv) {\n        nameDiv.innerHTML = \"\";\n        const spanName = document.createElement(\"span\");\n        const spanLastName = document.createElement(\"span\");\n        const parts = newName.split(\" \");\n        format_name(newName, parts, spanName, spanLastName);\n        spanLastName.classList.add(\"bold-font\", \"surname\");\n        nameDiv.appendChild(spanName);\n        nameDiv.appendChild(spanLastName);\n        manageColor(draft, spanLastName);\n    }\n\n    const nameTextarea = document.querySelector(\"#driverStatsTitle textarea\");\n    if (nameTextarea) {\n        nameTextarea.value = newName;\n    } else {\n        driverStatTitle.textContent = newName;\n    }\n}\n\nexport function applyDraftCountryLocale(payload) {\n    const draft = getCurrentDraftElement();\n    if (!draft) return;\n    if (String(draft.dataset.driverid) !== String(payload.draftId)) return;\n\n    draft.dataset.staffNameLocale = payload.staffNameLocale ?? \"\";\n    draft.dataset.countryId = payload.countryId ?? \"\";\n    draft.dataset.countryName = payload.countryName ?? \"\";\n}\n\nfunction manage_order(state) {\n    let elements = document.querySelectorAll('.normal-driver:not([data-is-draft=\"1\"])');\n    let array = Array.from(elements);\n\n    // Crear un objeto para almacenar los padres originales\n    let parents = {};\n    array.forEach(elem => {\n        parents[elem.dataset.driverid] = elem.parentNode; // Asumiendo que cada .normal-driver tiene un data-id único\n    });\n\n    let sortedArray = array.sort(function (a, b) {\n        let ovrA = parseInt(a.children[1].innerText);\n        let ovrB = parseInt(b.children[1].innerText);\n        let teamA = parseInt(a.dataset.teamid);\n        let teamB = parseInt(b.dataset.teamid);\n\n        if (state == 0) {\n            if (teamA === 0) return 1;\n            if (teamB === 0) return -1;\n\n            let indexA = teamOrder.indexOf(teamA);\n            let indexB = teamOrder.indexOf(teamB);\n\n            if (indexA !== indexB) {\n                return indexA - indexB;\n            }\n\n            return ovrB - ovrA;\n        } else if (state == 1) {\n            return ovrB - ovrA;\n        } else {\n            return ovrA - ovrB;\n        }\n    });\n\n    // Limpiar los contenedores\n    document.querySelectorAll(\".staff-list\").forEach(function (elem) {\n        if (elem.id === \"placeholder\") return;\n        elem.innerHTML = \"\";\n    });\n\n    // Volver a colocar los elementos ordenados en sus padres originales\n    sortedArray.forEach(function (elem) {\n        let parent = parents[elem.dataset.driverid];\n        parent.appendChild(elem);\n    });\n}\n\n\n\nexport function manage_stat_bar(element, value) {\n    let container = element.parentNode.parentNode.parentNode\n    let bar = container.querySelector(\".one-stat-progress\")\n    let percentage = value + \"%\"\n    bar.style.width = percentage\n}\n\n\n/**\n * Loads the stats into the input numbers\n * @param {div} div div of the staff that is about to be edited\n */\nfunction load_stats(div) {\n    const editNameButton = document.querySelector(\"#editNameButton\");\n    if (editNameButton?.classList.contains(\"editing\") && div.dataset.isDraft !== \"1\") {\n        editNameButton.click();\n    }\n\n    let statsArray = div.dataset.stats.split(\" \").map(Number);\n\n    let inputArray = document.querySelectorAll(\".elegible\")\n    inputArray.forEach(function (input, index) {\n        let value = statsArray[index]\n        let label = input.parentNode.parentNode.querySelector(\"span.bold-font\")\n        input.value = value\n        manage_stat_bar(input, value)\n    });\n\n    const graphInputArray = document.querySelectorAll(\".elegible\");\n    const pairs = Array.from(graphInputArray).map((input, index) => {\n        const labelEl = input.parentNode?.parentNode?.querySelector(\"span.bold-font\");\n        const labelFull = (labelEl?.textContent || '').trim();\n        const value = statsArray[index];\n        return { labelFull, value };\n    });\n\n    // Excluir Growth y Aggression (incluida variante \"Aggresion\")\n    const excluded = new Set(['growth', 'aggression', 'aggresion', 'marketability']);\n    const filtered = pairs.filter(p => !excluded.has(p.labelFull.toLowerCase()));\n\n    // Labels = 3 primeras letras en MAYÚSCULAS\n    const labelsArray = filtered.map(p => p.labelFull.slice(0, 3).toUpperCase());\n    const valuesArray = filtered.map(p => p.value);\n\n    // (Re)crear si cambian etiquetas; si no, solo actualizar datos\n    if (!statsRadarChart ||\n        statsRadarChart.data.labels.length !== labelsArray.length ||\n        statsRadarChart.data.labels.some((l, i) => l !== labelsArray[i])) {\n        createStatsRadarChart(labelsArray);\n        statsRadarChart.config._fullLabels = filtered.map(p => p.labelFull);\n\n    }\n    updateStatsRadarData(valuesArray, 0, cssVar(\"--new-primary\"), div.dataset.name.split(\" \").pop());\n\n    let actualAge = document.querySelector(\".actual-age\")\n    let retirementAge = document.querySelector(\".actual-retirement\")\n    let numberHolder = document.querySelector(\".number-holder\")\n    let numberWC = document.querySelector(\"#driverNumber1\")\n    let codeInput = document.querySelector(\"#driverCode\")\n    codeInput.innerText = div.dataset.driverCode\n    oldNum = div.dataset.number\n    actualAge.innerText = div.dataset.age\n    retirementAge.innerText = div.dataset.retirement\n    numberHolder.innerText = div.dataset.number\n    if (div.dataset.numWC === \"0\") {\n        numberWC.checked = false\n    }\n    else {\n        numberWC.checked = true\n    }\n    if (div.dataset.superLicense === \"1\") {\n        document.querySelector(\"#superLicense\").checked = true\n    }\n    else {\n        document.querySelector(\"#superLicense\").checked = false\n    }\n    if (div.dataset.isRetired === \"1\") {\n        document.querySelector(\"#retiredInput\").checked = true\n    }\n    else {\n        document.querySelector(\"#retiredInput\").checked = false\n    }\n    if (div.dataset.mentality0) {\n        for (let i = 0; i < 3; i++) {\n            let mentality = div.dataset[\"mentality\" + i]\n            let indicator = document.getElementById(\"mentality\" + i)\n            indicator.parentNode.parentNode.classList.remove(\"d-none\")\n            indicator.dataset.value = mentality\n            let inverted_value = 5 - mentality\n            let levels = indicator.querySelectorAll('.mentality-level');\n            let mentality_class = mentality_dict[mentality]\n            for (let j = 0; j < 5; j++) {\n                levels[j].className = \"mentality-level\"\n                if (j <= inverted_value - 1) {\n                    levels[j].classList.add(mentality_class)\n                }\n            }\n            let nameEmoji = indicator.parentNode.parentNode.querySelector(\".mentality-and-emoji\")\n            nameEmoji.innerText = capitalizeFirstLetter(mentality_class)\n            nameEmoji.className = \"mentality-and-emoji\"\n            nameEmoji.classList.add(mentality_class)\n        }\n    }\n    else {\n        for (let i = 0; i < 3; i++) {\n            let indicator = document.getElementById(\"mentality\" + i)\n            indicator.parentNode.parentNode.classList.add(\"d-none\")\n        }\n    }\n    if (div.dataset.marketability) {\n        document.querySelector(\"#marketability\").classList.remove(\"d-none\")\n        document.getElementById(\"marketabilityInput\").value = div.dataset.marketability\n        document.getElementById(\"marketabilityBar\").style.width = div.dataset.marketability + \"%\"\n    }\n    else {\n        document.querySelector(\"#marketability\").classList.add(\"d-none\")\n    }\n    if (div.dataset.nationality) {\n        document.querySelector(\".driver-info-driver-flag\").src = `https://flagsapi.com/${div.dataset.nationality}/flat/64.png`\n        document.querySelector(\".flag-text\").textContent = inverted_countries_abreviations[div.dataset.nationality] || div.dataset.nationality\n    }\n    const teamId = Number(div.dataset.teamid);\n    const logoImg = document.querySelector(\".driver-info-team-logo-img\");\n    const logoMasked = document.querySelector(\".driver-info-team-logo-masked\");\n    const logo = logos_disc[teamId];\n\n    if (!logoImg || !logoMasked || !teamId || !logo) {\n        logoImg?.classList.add(\"d-none\");\n        logoMasked?.classList.add(\"d-none\");\n    }\n    else if (teamId === 2) {\n        logoImg.classList.add(\"d-none\");\n        logoMasked.classList.remove(\"d-none\");\n    }\n    else {\n        logoMasked.classList.add(\"d-none\");\n        logoImg.classList.remove(\"d-none\");\n        logoImg.src = logo;\n    }\n    let teamName = combined_dict[div.dataset.teamid] || \"Free Agent\";\n    document.querySelector(\".team-text\").textContent = teamName !== \"Visa Cashapp RB\" ? teamName : \"VCARB\";\n    updateDraftControlVisibility(div);\n    setAttributesTitle(div.dataset.type);\n}\n\ndocument.querySelectorAll(\".bar-container .bi-chevron-right\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function () {\n        let indicator = elem.parentNode.querySelector(\".mentality-level-indicator\")\n        let value = parseInt(indicator.getAttribute('data-value')) - 1;\n        if (value < 0) {\n            value = 0\n        }\n        let inverted_value = 5 - value\n\n        indicator.setAttribute('data-value', value);\n        let levels = indicator.querySelectorAll('.mentality-level');\n        let mentality_class = mentality_dict[value]\n        for (let j = 0; j < 5; j++) {\n            levels[j].className = \"mentality-level\"\n            if (j <= inverted_value - 1) {\n                levels[j].classList.add(mentality_class)\n            }\n        }\n        let nameEmoji = elem.parentNode.parentNode.querySelector(\".mentality-and-emoji\")\n        nameEmoji.innerText = capitalizeFirstLetter(mentality_class)\n        nameEmoji.className = \"mentality-and-emoji\"\n        nameEmoji.classList.add(mentality_class)\n    })\n})\n\ndocument.querySelectorAll(\".bar-container .bi-chevron-left\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function () {\n        let indicator = elem.parentNode.querySelector(\".mentality-level-indicator\")\n        let value = parseInt(indicator.getAttribute('data-value')) + 1;\n        if (value > 4) {\n            value = 4\n        }\n        let inverted_value = 5 - value\n        indicator.setAttribute('data-value', value);\n        let levels = indicator.querySelectorAll('.mentality-level');\n        let mentality_class = mentality_dict[value]\n        for (let j = 0; j < 5; j++) {\n            levels[j].className = \"mentality-level\"\n            if (j <= inverted_value - 1) {\n                levels[j].classList.add(mentality_class)\n            }\n        }\n        let nameEmoji = elem.parentNode.parentNode.querySelector(\".mentality-and-emoji\")\n        nameEmoji.innerText = capitalizeFirstLetter(mentality_class)\n        nameEmoji.className = \"mentality-and-emoji\"\n        nameEmoji.classList.add(mentality_class)\n    })\n})\n\n/**\n * Loads all the numbers into the number menu\n * @param {Object} nums all numbers array\n */\nexport function loadNumbers(nums) {\n    numbersAvailable = nums;\n}\n\nattachHold(plusNumberBtn, numberSpan, +1, { min: 0, max: 99, });\nattachHold(minusNumberBtn, numberSpan, -1, { min: 0, max: 99 });\n\n\ndocument.querySelector(\"#editNameButton\").addEventListener(\"click\", function (e) {\n    const btn = e.target;\n    const nameSpan = document.getElementById(\"driverStatsTitle\");\n    const codeSpan = document.getElementById(\"driverCode\");\n\n    if (!btn.classList.contains(\"editing\")) {\n        // --- ENTRAMOS EN MODO EDICIÓN ---\n        btn.className = \"bi bi-check editing\";\n\n        // Guardar tamaños originales como dataset\n        const nameRect = nameSpan.getBoundingClientRect();\n        const codeRect = codeSpan.getBoundingClientRect();\n        nameSpan.dataset.originalWidth = nameRect.width;\n        nameSpan.dataset.originalHeight = nameRect.height;\n        codeSpan.dataset.originalWidth = codeRect.width;\n        codeSpan.dataset.originalHeight = codeRect.height;\n\n        // Crear textareas\n        const nameInput = document.createElement(\"textarea\");\n        const codeInput = document.createElement(\"textarea\");\n\n        // Asignar valores\n        nameInput.value = nameSpan.innerText.trim();\n        codeInput.value = codeSpan.innerText.trim();\n\n        const newNameWidth = nameRect.width;\n        const newCodeWidth = codeRect.width;\n\n        // Asignar tamaño\n        nameInput.style.width = newNameWidth + \"px\";\n        nameInput.style.height = nameRect.height + \"px\";\n        nameSpan.style.width = newNameWidth + \"px\";\n        nameSpan.style.height = nameRect.height + \"px\";\n\n        codeInput.style.width = newCodeWidth + \"px\";\n        codeInput.style.height = codeRect.height + \"px\";\n        codeSpan.style.width = newCodeWidth + \"px\";\n        codeSpan.style.height = codeRect.height + \"px\";\n\n        // Reemplazar contenido\n        nameSpan.innerHTML = \"\";\n        nameSpan.appendChild(nameInput);\n\n        codeSpan.innerHTML = \"\";\n        codeSpan.appendChild(codeInput);\n    } \n    else {\n        // --- GUARDAMOS CAMBIOS ---\n        btn.className = \"bi bi-pencil-fill\";\n        btn.classList.remove(\"editing\");\n\n        const nameInput = nameSpan.querySelector(\"textarea\");\n        const codeInput = codeSpan.querySelector(\"textarea\");\n\n        // Restaurar tamaño original\n        nameSpan.style.width = \"auto\"\n        nameSpan.style.height = \"auto\";\n        codeSpan.style.width = \"auto\";\n        codeSpan.style.height = \"auto\";\n\n        // Restaurar texto\n        nameSpan.innerText = nameInput.value.trim();\n        codeSpan.innerText = codeInput.value.trim();\n\n        // Limpiar los datasets\n        delete nameSpan.dataset.originalWidth;\n        delete nameSpan.dataset.originalHeight;\n        delete codeSpan.dataset.originalWidth;\n        delete codeSpan.dataset.originalHeight;\n    }\n});\n\n\n\n\n\nfunction capitalizeFirstLetter(str) {\n    if (!str) return str; // Manejo de cadena vacía\n    return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n}\n\n\n/**\n * Generates the name title on the main panel of the edit stats\n * @param {div} html div from the staff selected\n * @returns the html necessary to put in the name with correct color\n */\nfunction manage_stats_title(html) {\n    let colorClass = \"\"\n    if (html.dataset.teamid != 0) {\n        colorClass = team_dict[html.dataset.teamid] + \"font\"\n    }\n    let spanName = document.createElement(\"span\")\n    let spanLastName = document.createElement(\"span\")\n    let name = \"<span>\" + html.children[0].children[0].innerText + \" </span>\" + \"<span class='\" + colorClass + \"'>\" + html.children[0].children[1].innerText + \"</span>\"\n\n    //let name = html.substring(0,html.length - 2).trim();\n\n    return name;\n\n}\n\n/**\n * Changes the input number that are taken into account to change stats \n * @param {div} divID div that contains the correct input numbers  \n */\nexport function change_elegibles(divID) {\n    document.querySelectorAll(\".elegible\").forEach(function (elem) {\n        elem.classList.remove(\"elegible\")\n\n    })\n    let divStats = document.getElementById(divID)\n    divStats.querySelectorAll(\".custom-input-number\").forEach(function (elem) {\n        elem.classList.add(\"elegible\")\n    })\n    if (divID === \"driverStats\") {\n        document.getElementById(\"growthInput\").classList.add(\"elegible\")\n        document.getElementById(\"agressionInput\").classList.add(\"elegible\")\n\n    }\n    document.querySelectorAll(\".main-panel-stats\").forEach(function (elem) {\n        elem.className = \"main-panel-stats d-none\"\n    })\n    divStats.classList.remove(\"d-none\")\n\n}\n\nfunction cssVar(name, fallback) {\n    const v = getComputedStyle(document.documentElement).getPropertyValue(name).trim();\n    return v || fallback;\n}\n\n\nfunction ensureStatsGraphCanvas() {\n    const wrap = document.querySelector('.stats-graph');\n    let canvas = wrap.querySelector('canvas');\n    if (!canvas) {\n        canvas = document.createElement('canvas');\n        canvas.id = 'statsRadar';\n        wrap.innerHTML = '';         // por si acaso\n        wrap.appendChild(canvas);\n    }\n    return canvas.getContext('2d');\n}\n\nfunction getThemeColor(fallback = '#4DA3FF') {\n    // intenta leer de CSS variables; ajusta nombres si ya las tienes\n    const root = getComputedStyle(document.documentElement);\n    const c = root.getPropertyValue('--accent')?.trim()\n        || root.getPropertyValue('--primary')?.trim()\n        || fallback;\n    return c;\n}\n\nfunction rgbaFromHex(hex, alpha) {\n    // admite #RGB o #RRGGBB\n    let h = hex.replace('#', '');\n    if (h.length === 3) h = h.split('').map(x => x + x).join('');\n    const r = parseInt(h.slice(0, 2), 16);\n    const g = parseInt(h.slice(2, 4), 16);\n    const b = parseInt(h.slice(4, 6), 16);\n    return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\nfunction createStatsRadarChart(labels) {\n    const ctx = ensureStatsGraphCanvas();\n\n    if (statsRadarChart) {\n        statsRadarChart.destroy();\n        statsRadarChart = null;\n    }\n\n    const labelColor = cssVar('--text-general', '#e8eaed');\n    const primaryColor = cssVar('--new-primary', '#c89efc');\n    const secondaryColor = cssVar('--new-secondary', '#9efcc8');\n\n\n    statsRadarChart = new Chart(ctx, {\n        type: 'radar',\n        data: {\n            labels,\n            datasets: [{\n                label: 'Stats',\n                data: [],\n                borderColor: primaryColor,\n                backgroundColor: `${primaryColor}40`,\n                borderWidth: 2,\n                pointRadius: 2,\n                pointHoverRadius: 4,\n                pointBackgroundColor: primaryColor\n            }]\n        },\n        options: {\n            responsive: true,\n            maintainAspectRatio: false,\n            interaction: {\n                mode: 'index',\n            },\n            plugins: {\n                legend: { display: false },\n                datalabels: { display: false },\n                tooltip: {\n                    enabled: true,\n                    backgroundColor: 'rgba(0, 0, 0, 0.8)',\n                    titleFont: {\n                        family: 'Formula1Bold',\n                        size: 13\n                    },\n                    bodyFont: {\n                        family: 'Formula1',\n                        size: 12\n                    },\n                    callbacks: {\n                        // Mostrar el nombre completo de la stat\n                        title: function (tooltipItems) {\n                            const index = tooltipItems[0].dataIndex;\n                            // Recupera el nombre completo desde tu array original\n                            // (debes tenerlo guardado globalmente o en chart.config._fullLabels)\n                            const fullLabel = statsRadarChart?.config?._fullLabels?.[index];\n                            return fullLabel || tooltipItems[0].label;\n                        },\n                        // Línea del dataset\n                        label: function (context) {\n                            const datasetLabel = context.dataset.label || '';\n                            const value = context.formattedValue;\n                            return `${datasetLabel}: ${value}`;\n                        }\n                    }\n                }\n            },\n            scales: {\n                r: {\n                    min: 0,\n                    max: 100,\n                    ticks: { display: false, showLabelBackdrop: false, stepSize: 50 },\n                    grid: { color: 'rgba(128,128,128,0.25)' },\n                    angleLines: { color: 'rgba(128,128,128,0.25)' },\n                    pointLabels: {\n                        color: labelColor,\n                        font: { family: 'Formula1Bold' }\n                    }\n                }\n            },\n            layout: {\n                padding: { top: 8, bottom: 16, left: -20, right: -20 }\n            },\n            elements: {\n                point: {\n                    radius: 2,\n                    hoverRadius: 4,\n                    hitRadius: 12\n                },\n                line: { tension: 0 }\n            }\n        }\n    });\n}\n\nfunction removeDatasetFromStatsRadarData(index) {\n    if (!statsRadarChart) return;\n    if (index < 0 || index >= statsRadarChart.data.datasets.length) return;\n    statsRadarChart.data.datasets.splice(index, 1);\n    recalculateRadarScale();\n    statsRadarChart.update();\n}\n\nfunction updateStatsRadarData(values, index = 0, color, name) {\n    if (!statsRadarChart) return;\n    statsRadarChart.data.datasets[index].data = values;\n    if (color) {\n        statsRadarChart.data.datasets[index].borderColor = color;\n        statsRadarChart.data.datasets[index].backgroundColor = rgbaFromHex(color, 0.25);\n    }\n    if (name) {\n        statsRadarChart.data.datasets[index].label = name;\n    }\n    recalculateRadarScale();\n    statsRadarChart.update();\n}\n\nfunction addDatasetToStatsRadarData(values, color, name) {\n    if (!statsRadarChart) return;\n    statsRadarChart.data.datasets.push({\n        label: name || `Stats ${statsRadarChart.data.datasets.length + 1}`,\n        data: values,\n        borderColor: color,\n        backgroundColor: rgbaFromHex(color, 0.25),\n        borderWidth: 2,\n        pointRadius: 2,\n        pointHoverRadius: 4,\n        pointBackgroundColor: color\n    });\n    recalculateRadarScale();\n    statsRadarChart.update();\n}\n\nfunction recalculateRadarScale() {\n    if (!statsRadarChart) return;\n\n    // 1️⃣ Obtenemos todos los valores de todos los datasets\n    const allValues = statsRadarChart.data.datasets.flatMap(ds => ds.data);\n\n    // 2️⃣ Calculamos el mínimo y máximo reales\n    const minVal = Math.min(...allValues);\n    const maxVal = Math.max(...allValues);\n\n    // 3️⃣ Creamos un margen dinámico (por ejemplo, 20 por debajo y 5 por encima)\n    const lowerMargin = 15;\n    const upperMargin = 5;\n\n    // 4️⃣ Ajustamos la escala del radar chart\n    statsRadarChart.options.scales.r.min = Math.max(0, minVal - lowerMargin);\n    statsRadarChart.options.scales.r.max = Math.min(100, maxVal + upperMargin);\n}\n\nfunction toggleComparisonMode() {\n    isComparisonModeActive = !isComparisonModeActive;\n    const editStatsPanel = document.getElementById('editStatsPanel');\n    const header = document.querySelector('.upper-section-stats');\n\n    if (isComparisonModeActive) {\n        compareButton.querySelector(\"span\").textContent = 'Cancel';\n        compareButton.classList.add('active');\n        editStatsPanel.classList.add('comparison-active');\n        header.classList.add('comparison-active');\n        document.querySelectorAll(\".mentality-and-emoji\").forEach(indicator => {\n            indicator.classList.add(\"d-none\");\n        });\n\n        const clickedDriver = document.querySelector('.normal-driver.clicked');\n        if (clickedDriver) {\n            firstDriverStats = clickedDriver.dataset.stats;\n            let nameDiv = clickedDriver.children[0];\n            let comparingTag = document.createElement(\"span\");\n            let teamClass = team_dict[clickedDriver.dataset.teamid];\n            comparingTag.className = `comparing-tag ${teamClass}`;\n            comparingTag.textContent = \"Comparing\";\n            nameDiv.appendChild(comparingTag);\n        } else {\n            // Handle case where no driver is selected, maybe disable the button?\n            console.warn(\"No driver selected for comparison.\");\n            // possibly exit comparison mode if no driver is selected to start with\n            isComparisonModeActive = false;\n            compareButton.querySelector(\"span\").textContent = 'Compare';\n            editStatsPanel.classList.remove('comparison-active');\n            header.classList.remove('comparison-active');\n        }\n\n\n    } else {\n        //remove all comparison tags\n        document.querySelectorAll('.normal-driver .comparing-tag').forEach(tag => tag.remove());\n        //remove comparing-driver class\n        let comparingDriver = document.querySelector('.comparing-driver');\n        if (comparingDriver) {\n            comparingDriver.classList.remove('comparing-driver', 'clicked');\n        }\n        compareButton.classList.remove('active');\n        compareButton.querySelector(\"span\").textContent = 'Compare';\n        editStatsPanel.classList.remove('comparison-active');\n        header.classList.remove('comparison-active');\n        firstDriverStats = null;\n        secondDriverStats = null;\n        resetComparisonUI();\n        removeDatasetFromStatsRadarData(1);\n\n        document.querySelectorAll(\".mentality-and-emoji\").forEach(indicator => {\n            indicator.classList.remove(\"d-none\");\n        });\n\n        document.querySelectorAll(\".shorten-ret\").forEach(elem => {\n            elem.innerText = \"Retirement\"\n        });\n\n        // Remove cloned elements\n        const clonedInfo = document.querySelector('.name-and-info.cloned');\n        if (clonedInfo) clonedInfo.remove();\n        const clonedOvr = document.querySelector('.special-overall.cloned');\n        if (clonedOvr) clonedOvr.remove();\n        document.querySelectorAll('.cloned-separator').forEach(separator => separator.remove());\n        const clonedAgeDetails = document.querySelector('#ageDetails.cloned');\n        if (clonedAgeDetails) clonedAgeDetails.remove();\n\n        document.querySelectorAll(\".hidable-separator\").forEach(separator => {\n            separator.classList.remove(\"d-none\");\n        });\n    }\n}\n\nif (compareButton) {\n    compareButton.addEventListener('click', toggleComparisonMode);\n}\n\nfunction resetComparisonUI() {\n    // Restore UI to single-driver view\n    const statPanels = document.querySelectorAll('.one-stat-panel:has(.elegible)');\n    statPanels.forEach(panel => {\n        const barContainer = panel.querySelector('.bar-container');\n        if (barContainer) barContainer.classList.remove('comparing');\n\n        //reset bar colors\n        const actualBar = panel.querySelector('.one-stat-progress');\n        if (actualBar) actualBar.style.backgroundColor = '';\n\n        const input = panel.querySelector('input.custom-input-number');\n        if (input) {\n            input.removeAttribute('readonly');\n            input.classList.remove('comparing-tag');\n            // Also remove any team color classes that might have been added\n            for (const key in team_dict) {\n                if (team_dict.hasOwnProperty(key)) {\n                    input.classList.remove(team_dict[key]);\n                }\n            }\n        }\n\n        const comparisonBar = panel.querySelector('.comparison-bar');\n        if (comparisonBar) comparisonBar.remove();\n\n        const comparisonValue = panel.querySelector('.comparison-stat-value');\n        if (comparisonValue) comparisonValue.remove();\n\n        const plusButton = panel.querySelector('.bi-plus');\n        const minusButton = panel.querySelector('.bi-dash');\n        if (plusButton) plusButton.style.display = '';\n        if (minusButton) minusButton.style.display = '';\n\n        const header = document.querySelector('.upper-section-stats');\n        // header.querySelector(\"#ageDetails\").classList.remove(\"d-none\");\n        header.querySelector(\"#numberDetails\").classList.remove(\"d-none\");\n        header.querySelector(\"#availabilityDetails\").classList.remove(\"d-none\");\n    });\n\n    // Reset Marketability\n    const marketabilityPanel = document.getElementById('marketability');\n    if (marketabilityPanel) {\n        const barContainer = marketabilityPanel.querySelector('.bar-container');\n        if (barContainer) barContainer.classList.remove('comparing');\n\n        const actualBar = marketabilityPanel.querySelector('.one-stat-progress');\n        if (actualBar) actualBar.style.backgroundColor = '';\n\n        const comparisonBar = marketabilityPanel.querySelector('.comparison-bar');\n        if (comparisonBar) comparisonBar.remove();\n\n        const comparisonValue = marketabilityPanel.querySelector('.comparison-stat-value');\n        if (comparisonValue) comparisonValue.remove();\n\n        const plusButton = marketabilityPanel.querySelector('.bi-plus');\n        const minusButton = marketabilityPanel.querySelector('.bi-dash');\n        if (plusButton) plusButton.style.display = '';\n        if (minusButton) minusButton.style.display = '';\n\n        const comparisonValueInput = marketabilityPanel.querySelector('.custom-input-number');\n        if (comparisonValueInput){\n            comparisonValueInput.removeAttribute('readonly');\n            comparisonValueInput.className = \"custom-input-number elegible\";\n        } \n    }\n\n    // Reset Mentality\n    for (let i = 0; i < 3; i++) {\n        const mentalityPanel = document.getElementById(`mentality${i}`).parentNode.parentNode;\n        if (mentalityPanel) {\n            const comparisonBar = mentalityPanel.querySelector('.comparison-bar');\n            if (comparisonBar) comparisonBar.remove();\n\n            const buttons = mentalityPanel.querySelectorAll('.bi-chevron-left, .bi-chevron-right');\n            buttons.forEach(btn => btn.style.display = '');\n        }\n    }\n}\n\nfunction updateComparisonUI() {\n    if (!firstDriverStats || !secondDriverStats) return;\n\n    //get team ids from both drivers\n    const teamId1 = document.querySelector('.normal-driver.clicked:not(.comparing-driver)').dataset.teamid;\n    const teamId2 = document.querySelector('.normal-driver.clicked.comparing-driver').dataset.teamid;\n    let secondColorSuffix = teamId1 === teamId2 ? '1' : '0';\n    let color2 = cssVar(`--new-secondary`)\n\n    const stats1 = firstDriverStats.split(' ').map(Number);\n    const stats2 = secondDriverStats.split(' ').map(Number);\n\n    const statPanels = document.querySelectorAll('.one-stat-panel:has(.elegible)');\n\n    statPanels.forEach((panel, index) => {\n        if (index < stats1.length) {\n            // Remove previous comparison elements if they exist\n            const existingComparisonBar = panel.querySelector('.comparison-stat-progress');\n            if (existingComparisonBar) existingComparisonBar.parentElement.remove();\n\n            const existingComparisonValue = panel.querySelector('.comparison-stat-value');\n            if (existingComparisonValue) existingComparisonValue.remove();\n\n            // Create and append the second stat bar\n            const barContainer = panel.querySelector('.bar-container');\n            barContainer.classList.add('comparing');\n            let actualBar = barContainer.querySelector('.one-stat-progress');\n            const comparisonStatBarContainer = document.createElement('div');\n            comparisonStatBarContainer.className = 'one-stat-bar comparison-bar';\n            const comparisonProgressBar = document.createElement('div');\n            comparisonProgressBar.className = 'one-stat-progress comparison-stat-progress';\n            comparisonProgressBar.style.width = `${stats2[index]}%`;\n            comparisonProgressBar.style.backgroundColor = color2;\n            comparisonStatBarContainer.append(comparisonProgressBar);\n            barContainer.appendChild(comparisonStatBarContainer);\n\n            // Create and append the second stat value\n            const statNumberDiv = panel.querySelector('.stat-number');\n            const comparisonValueInput = document.createElement('input');\n            //make the input non-editable\n            comparisonValueInput.setAttribute('readonly', 'readonly');\n            comparisonValueInput.className = 'custom-input-number comparison-stat-value';\n            comparisonValueInput.value = stats2[index];\n\n\n            const existingValueInput = statNumberDiv.querySelector('input.custom-input-number:not(.comparison-stat-value)');\n            existingValueInput.setAttribute('readonly', 'readonly');\n            if (stats2[index] > stats1[index]) {\n                comparisonValueInput.classList.add(`comparing-tag`, `secondary`);\n                existingValueInput.classList.remove(\"comparing-tag\", \"primary\");\n            } else if (stats2[index] < stats1[index]) {\n                if (existingValueInput) existingValueInput.classList.add(`comparing-tag`, `primary`);\n                comparisonValueInput.classList.remove(\"comparing-tag\", \"secondary\");\n            }\n            statNumberDiv.appendChild(comparisonValueInput);\n\n\n            // Hide plus/minus buttons\n            const plusButton = statNumberDiv.querySelector('.bi-plus');\n            const minusButton = statNumberDiv.querySelector('.bi-dash');\n            if (plusButton) plusButton.style.display = 'none';\n            if (minusButton) minusButton.style.display = 'none';\n        }\n    });\n\n    // Update Marketability\n    const marketabilityPanel = document.getElementById('marketability');\n    if (marketabilityPanel) {\n        const driver1 = document.querySelector('.normal-driver.clicked:not(.comparing-driver)');\n        const driver2 = document.querySelector('.normal-driver.clicked.comparing-driver');\n\n        if (driver1.dataset.marketability && driver2.dataset.marketability) {\n            const marketability1 = driver1.dataset.marketability;\n            const marketability2 = driver2.dataset.marketability;\n\n            //remove previous comparison elements if they exist\n            const existingComparisonBar = marketabilityPanel.querySelector('.comparison-stat-progress');\n            if (existingComparisonBar) existingComparisonBar.parentElement.remove();\n\n            const existingComparisonValue = marketabilityPanel.querySelector('.comparison-stat-value');\n            if (existingComparisonValue) existingComparisonValue.remove();\n\n            const barContainer = marketabilityPanel.querySelector('.bar-container');\n            barContainer.classList.add('comparing');\n\n            let actualBar = barContainer.querySelector('.one-stat-progress');\n\n            //remove plus/minus buttons\n            const plusButton = marketabilityPanel.querySelector('.bi-plus');\n            const minusButton = marketabilityPanel.querySelector('.bi-dash');\n            if (plusButton) plusButton.style.display = 'none';\n            if (minusButton) minusButton.style.display = 'none';\n\n            const comparisonStatBarContainer = document.createElement('div');\n            comparisonStatBarContainer.className = 'one-stat-bar comparison-bar';\n            const comparisonProgressBar = document.createElement('div');\n            comparisonProgressBar.className = 'one-stat-progress comparison-stat-progress';\n            comparisonProgressBar.style.width = `${marketability2}%`;\n            comparisonProgressBar.style.backgroundColor = color2;\n            comparisonStatBarContainer.append(comparisonProgressBar);\n            barContainer.appendChild(comparisonStatBarContainer);\n\n            const statNumberDiv = marketabilityPanel.querySelector('.stat-number');\n            const comparisonValueInput = document.createElement('input');\n            comparisonValueInput.setAttribute('readonly', 'readonly');\n            comparisonValueInput.className = 'custom-input-number comparison-stat-value';\n            comparisonValueInput.value = marketability2;\n\n            const existingValueInput = statNumberDiv.querySelector('input.custom-input-number:not(.comparison-stat-value)');\n            existingValueInput.setAttribute('readonly', 'readonly');\n            if (parseInt(marketability2) > parseInt(marketability1)) {\n                comparisonValueInput.classList.add(`comparing-tag`, `secondary`);\n                existingValueInput.classList.remove(\"comparing-tag\", \"primary\");\n            } else if (parseInt(marketability2) < parseInt(marketability1)) {\n                comparisonValueInput.classList.remove(\"comparing-tag\", \"secondary\");\n                existingValueInput.classList.add(\"comparing-tag\", \"primary\");\n            }\n\n            statNumberDiv.appendChild(comparisonValueInput);\n        }\n    }\n\n    // Update Radar Chart\n    const values1 = stats1.slice(0, 9);\n    const values2 = stats2.slice(0, 9);\n\n    //update the first dataset with the first driver color\n    if (statsRadarChart) {\n        updateStatsRadarData(values1, 0, cssVar(`--new-primary`));\n    }\n\n    // Update Mentality\n    const driver1 = document.querySelector('.normal-driver.clicked:not(.comparing-driver)');\n    const driver2 = document.querySelector('.normal-driver.clicked.comparing-driver');\n\n    //add the second dataset with the second driver color\n    if (statsRadarChart) {\n        let secondaryColor = color2;\n        if (statsRadarChart.data.datasets.length < 2) {\n            addDatasetToStatsRadarData(values2, secondaryColor, driver2.dataset.name.split(' ').pop());\n        } else {\n            updateStatsRadarData(values2, 1, secondaryColor, driver2.dataset.name.split(' ').pop());\n        }\n    }\n\n\n\n\n    for (let i = 0; i < 3; i++) {\n        if (driver1.dataset[`mentality${i}`] && driver2.dataset[`mentality${i}`]) {\n            const mentality1 = driver1.dataset[`mentality${i}`];\n            const mentality2 = driver2.dataset[`mentality${i}`];\n\n            //remove previous comparison bar if exists\n            const existingComparisonBar = document.getElementById(`mentality${i}`).parentNode.parentNode.querySelector('.comparison-bar');\n            if (existingComparisonBar) existingComparisonBar.remove();\n\n            const mentalityPanel = document.getElementById(`mentality${i}`).parentNode.parentNode;\n            const barContainer = mentalityPanel.querySelector('.bar-container');\n\n            // Hide buttons\n            const buttons = mentalityPanel.querySelectorAll('.bi-chevron-left, .bi-chevron-right');\n            buttons.forEach(btn => btn.style.display = 'none');\n\n            // Create and prepend the second mentality bar\n            const comparisonBar = document.createElement('div');\n            comparisonBar.className = 'mentality-level-indicator comparison-bar';\n            for (let j = 0; j < 5; j++) {\n                const level = document.createElement('div');\n                level.className = 'mentality-level';\n                if (j <= 4 - mentality2) {\n                    level.classList.add(mentality_dict[mentality2]);\n                }\n                comparisonBar.appendChild(level);\n            }\n            barContainer.prepend(comparisonBar);\n        }\n    }\n\n    // Redesign Header\n    const header = document.querySelector('.upper-section-stats');\n    const originalInfo = header.querySelector('.name-and-info');\n    const originalOvr = header.querySelector('.special-overall');\n    const originalAgeDetails = header.querySelector('#ageDetails');\n\n    // Clone and populate driver 2 info\n    let clonedInfo = header.querySelector('.name-and-info.cloned');\n    if (!clonedInfo) {\n        clonedInfo = originalInfo.cloneNode(true);\n        clonedInfo.classList.add('cloned');\n        // header.querySelector(\"#ageDetails\").classList.add(\"d-none\");\n        header.querySelector(\"#numberDetails\").classList.add(\"d-none\");\n        header.querySelector(\"#availabilityDetails\").classList.add(\"d-none\");\n        header.appendChild(clonedInfo);\n    }\n    document.querySelectorAll(\".hidable-separator\").forEach(separator => {\n        separator.classList.add(\"d-none\");\n    });\n    //put second driver name\n    clonedInfo.querySelector(\"#driverStatsTitle\").innerText = `${driver2.dataset.name}`;\n    clonedInfo.querySelector(\"#driverCode\").innerText = `${driver2.dataset.driverCode}`;\n    clonedInfo.querySelector('.driver-info-driver-flag').src = `https://flagsapi.com/${driver2.dataset.nationality}/flat/64.png`;\n    clonedInfo.querySelector('.flag-text').textContent = inverted_countries_abreviations[driver2.dataset.nationality] || driver2.dataset.nationality;\n    const driver2TeamId = Number(driver2.dataset.teamid);\n    const clonedLogoImg = clonedInfo.querySelector('.driver-info-team-logo-img');\n    const clonedLogoMasked = clonedInfo.querySelector('.driver-info-team-logo-masked');\n    const logo2 = logos_disc[driver2TeamId] || logos_disc[0];\n\n    if (!clonedLogoImg || !clonedLogoMasked || !driver2TeamId || !logo2) {\n        clonedLogoImg?.classList.add(\"d-none\");\n        clonedLogoMasked?.classList.add(\"d-none\");\n    }\n    else if (driver2TeamId === 2) {\n        clonedLogoImg.classList.add(\"d-none\");\n        clonedLogoMasked.classList.remove(\"d-none\");\n    }\n    else {\n        clonedLogoMasked.classList.add(\"d-none\");\n        clonedLogoImg.classList.remove(\"d-none\");\n        clonedLogoImg.src = logo2;\n    }\n    let teamName = combined_dict[driver2.dataset.teamid] || \"Free Agent\";\n    clonedInfo.querySelector('.team-text').textContent = teamName !== \"Visa Cashapp RB\" ? teamName : \"VCARB\";\n\n    // Clone and populate driver 2 overall\n    let clonedOvr = header.querySelector('.special-overall.cloned');\n    if (!clonedOvr) {\n        clonedOvr = originalOvr.cloneNode(true);\n        clonedOvr.classList.add('cloned');\n        header.insertBefore(clonedOvr, clonedInfo);\n        const separator = document.createElement('div');\n        separator.className = 'stats-header-separator cloned-separator';\n        header.insertBefore(separator, clonedInfo);\n    }\n    if (clonedOvr) clonedOvr.querySelector(\".overall-holder\").innerText = calculateOverall(driver2.dataset.stats, \"driver\");\n\n\n    let clonedAgeDetails = header.querySelector('#ageDetails.cloned');\n    if (originalAgeDetails && !clonedAgeDetails) {\n        clonedAgeDetails = originalAgeDetails.cloneNode(true);\n        clonedAgeDetails.classList.add('cloned');\n        header.insertBefore(clonedAgeDetails, clonedInfo);\n        const separator = document.createElement('div');\n        separator.className = 'stats-header-separator cloned-separator';\n        header.insertBefore(separator, clonedInfo);\n\n        document.querySelectorAll(\".shorten-ret\").forEach(elem => {\n            elem.innerText = \"Ret\"\n        });\n    }\n    if (clonedAgeDetails) {\n        clonedAgeDetails.querySelector('.actual-age').innerText = driver2.dataset.age;\n        clonedAgeDetails.querySelector('.actual-retirement').innerText = driver2.dataset.retirement;\n    }\n}\n"
  },
  {
    "path": "src/js/frontend/teamReplacements.js",
    "content": "import { Command } from \"../backend/command.js\";\n\nexport const names_configs = {\n    \"visarb\": \"VISA CASHAPP RB\", \"toyota\": \"TOYOTA\", \"hugo\": \"HUGO BOSS\", \"alphatauri\": \"ALPHA TAURI\", \"brawn\": \"BRAWN GP\", \"porsche\": \"PORSCHE\",\n    \"alpine\": \"ALPINE\", \"renault\": \"RENAULT\", \"andretti\": \"ANDRETTI\", \"lotus\": \"LOTUS\", \"cadillac\": \"CADILLAC\",\n    \"alfa\": \"ALFA ROMEO\", \"audi\": \"AUDI\", \"sauber\": \"SAUBER\", \"stake\": \"STAKE SAUBER\", \"williams\": \"WILLIAMS\", \"bmw\": \"BMW\", \"haas\": \"HAAS\",\n    \"redbull\": \"RED BULL\", \"ford\": \"FORD\", \"aston\": \"ASTON MARTIN\", \"racingpoint\": \"RACING POINT\", \"jordan\": \"JORDAN\"\n};\nexport const pretty_names = {\n    \"visarb\": \"Visa Cashapp RB\", \"toyota\": \"Toyota\", \"hugo\": \"Hugo Boss\", \"alphatauri\": \"Alpha Tauri\", \"brawn\": \"Brawn GP\", \"porsche\": \"Porsche\",\n    \"alpine\": \"Alpine\", \"renault\": \"Renault\", \"andretti\": \"Andretti\", \"lotus\": \"Lotus\", \"cadillac\": \"Cadillac\",\n    \"alfa\": \"Alfa Romeo\", \"audi\": \"Audi\", \"sauber\": \"Sauber\", \"stake\": \"Stake Sauber\", \"williams\": \"Williams\", \"bmw\": \"BMW\", \"haas\": \"Haas\",\n    \"redbull\": \"Red Bull\", \"ford\": \"Ford\", \"aston\": \"Aston Martin\", \"racingpoint\": \"Racing Point\", \"jordan\": \"Jordan\"\n};\nexport const abreviations_for_replacements = {\n    \"visarb\": \"VCARB\", \"toyota\": \"TOY\", \"hugo\": \"HUGO\", \"alphatauri\": \"AT\", \"brawn\": \"BGP\", \"porsche\": \"POR\",\n    \"alpine\": \"ALP\", \"renault\": \"REN\", \"andretti\": \"AND\", \"lotus\": \"LOT\", \"cadillac\": \"CAD\", \"alfa\": \"ALFA\", \"audi\": \"AUDI\", \"sauber\": \"SAU\",\n    \"stake\": \"STK\", \"williams\": \"WIL\", \"bmw\": \"BMW\", \"haas\": \"HA\", \"redbull\": \"RBR\", \"ford\": \"FOR\", \"aston\": \"AM\", \"racingpoint\": \"RP\", \"jordan\": \"JOR\"\n};\nexport const logos_configs = {\n    \"visarb\": \"../assets/images/logos/visarb.png\", \"toyota\": \"../assets/images/logos/toyota.svg\", \"hugo\": \"../assets/images/logos/hugoboss.png\", \"alphatauri\": \"../assets/images/logos/alphatauri.png\",\n    \"brawn\": \"../assets/images/logos/brawn.png\", \"porsche\": \"../assets/images/logos/porsche.png\",\n    \"alpine\": \"../assets/images/logos/alpine.png\", \"renault\": \"../assets/images/logos/renault.png\", \"andretti\": \"../assets/images/logos/andretti.png\", \"lotus\": \"../assets/images/logos/lotus.png\",\n    \"cadillac\": \"../assets/images/logos/cadillac.png\", \"alfa\": \"../assets/images/logos/alfaromeo.png\", \"audi\": \"../assets/images/logos/audi.png\", \"sauber\": \"../assets/images/logos/sauber.svg\",\n    \"stake\": \"../assets/images/logos/kick.png\", \"williams\": \"../assets/images/logos/Williams_2026_logo.svg\", \"bmw\": \"../assets/images/logos/bmw.png\", \"haas\": \"../assets/images/logos/haas.png\",\n    \"redbull\": \"../assets/images/logos/redbull.png\", \"ford\": \"../assets/images/logos/ford.png\", \"aston\": \"../assets/images/logos/astonMartin.png\", \"racingpoint\": \"../assets/images/logos/racingpoint.png\",\n    \"jordan\": \"../assets/images/logos/jordan.png\"\n};\nexport const logos_classes_configs = {\n    \"visarb\": \"visarblogo\", \"toyota\": \"toyotalogo\", \"hugo\": \"hugologo\", \"alphatauri\": \"alphataurilogo\",\n    \"porsche\": \"porschelogo\", \"brawn\": \"brawnlogo\",\n    \"alpine\": \"alpinelogo\", \"renault\": \"renaultlogo\", \"andretti\": \"andrettilogo\", \"lotus\": \"lotuslogo\", \"cadillac\": \"cadillaclogo\",\n    \"alfa\": \"alfalogo\", \"audi\": \"audilogo\", \"sauber\": \"sauberlogo\", \"stake\": \"alfalogo\",\n    \"williams\": \"williamslogo\", \"bmw\": \"bmwlogo\", \"redbull\": \"redbulllogo\", \"ford\": \"fordlogo\", \"aston\": \"astonlogo\",\n    \"racingpoint\": \"racingpointlogo\", \"jordan\": \"jordanlogo\", \"haas\": \"haaslogo\"\n};\n\nfunction updateTeamMenuClass(selector, info) {\n    document.querySelectorAll(selector).forEach(function (elem) {\n        Array.from(elem.classList).forEach(function (cl) {\n            if (cl.startsWith(\"changable-team-menu-\")) {\n                elem.classList.remove(cl);\n            }\n        });\n        elem.classList.add(\"changable-team-menu-\" + info);\n    });\n}\n\nfunction updateTeamColors({\n    baseKey,\n    info,\n    primaryId,\n    secondaryId,\n    edit_colors_dict,\n    change_css_variables\n}) {\n    if (info !== baseKey) {\n        let baseVarName = `--${baseKey}-primary`;\n        let newVarName = `--${info}-primary`;\n        change_css_variables(baseVarName, newVarName);\n        let value = getComputedStyle(document.documentElement).getPropertyValue(newVarName).trim();\n        edit_colors_dict(primaryId, value);\n        baseVarName = `--${baseKey}-secondary`;\n        newVarName = `--${info}-secondary`;\n        change_css_variables(baseVarName, newVarName);\n        value = getComputedStyle(document.documentElement).getPropertyValue(newVarName).trim();\n        edit_colors_dict(secondaryId, value);\n        baseVarName = `--${baseKey}-primary-transparent`;\n        newVarName = `--${info}-primary-transparent`;\n        change_css_variables(baseVarName, newVarName);\n        baseVarName = `--${baseKey}-secondary-transparent`;\n        newVarName = `--${info}-secondary-transparent`;\n        change_css_variables(baseVarName, newVarName);\n        return;\n    }\n\n    let baseVarName = `--${baseKey}-primary`;\n    let newVarName = `--${baseKey}-original`;\n    change_css_variables(baseVarName, newVarName);\n    let value = getComputedStyle(document.documentElement).getPropertyValue(newVarName).trim();\n    edit_colors_dict(primaryId, value);\n    baseVarName = `--${baseKey}-secondary`;\n    newVarName = `--${baseKey}-secondary-original`;\n    change_css_variables(baseVarName, newVarName);\n    value = getComputedStyle(document.documentElement).getPropertyValue(newVarName).trim();\n    edit_colors_dict(secondaryId, value);\n    baseVarName = `--${baseKey}-primary-transparent`;\n    newVarName = `--${baseKey}-primary-transparent-original`;\n    change_css_variables(baseVarName, newVarName);\n    baseVarName = `--${baseKey}-secondary-transparent`;\n    newVarName = `--${baseKey}-secondary-transparent-original`;\n    change_css_variables(baseVarName, newVarName);\n}\n\nfunction replaceTeam(config, info, deps) {\n    const { combined_dict, abreviations_dict, edit_colors_dict, change_css_variables } = deps;\n    document.querySelector(config.buttonSelector).querySelector(\"button span\").textContent = names_configs[info];\n    document.querySelector(config.buttonSelector).querySelector(\"button\").dataset.value = info;\n    combined_dict[config.teamId] = pretty_names[info];\n    abreviations_dict[config.teamId] = abreviations_for_replacements[info];\n    const command = new Command(\"updateCombinedDict\", { teamID: config.teamId, newName: pretty_names[info] });\n    command.execute();\n    document.querySelectorAll(config.teamNameSelector).forEach(function (elem) {\n        elem.dataset.teamshow = pretty_names[info];\n    });\n    config.updateNames(info);\n    config.updateLogos(info);\n    updateTeamColors({\n        baseKey: config.baseKey,\n        info,\n        primaryId: config.primaryColorId,\n        secondaryId: config.secondaryColorId,\n        edit_colors_dict,\n        change_css_variables\n    });\n    updateTeamMenuClass(config.teamMenuSelector, info);\n}\n\nexport function createTeamReplacers(deps) {\n    const alphaConfig = {\n        buttonSelector: \"#alphaTauriReplaceButton\",\n        teamId: 8,\n        teamNameSelector: \".at-teamname\",\n        teamMenuSelector: \".team-menu-alphatauri-replace\",\n        baseKey: \"alphatauri\",\n        primaryColorId: \"80\",\n        secondaryColorId: \"81\",\n        updateNames(info) {\n            document.querySelectorAll(\".at-name\").forEach(function (elem) {\n                let name = (info === \"visarb\" && !elem.classList.contains(\"complete\")) ? \"VCARB\" : names_configs[info];\n                if (elem.parentElement.classList.contains(\"car-title\")) {\n                    const match = elem.textContent.match(/^(.*?)\\s+(\\d+\\s*-\\s*#\\d+)/);\n                    if (match) {\n                        name = (info === \"visarb\" && !elem.classList.contains(\"complete\")) ? \"VCARB\" : pretty_names[info];\n                        elem.textContent = `${name} ${match[2]}`;\n                    }\n                }\n                else {\n                    elem.textContent = name;\n                }\n            });\n        },\n        updateLogos(info) {\n            if (info !== \"alphatauri\") {\n                document.querySelectorAll(\".atlogo-replace\").forEach(function (elem) {\n                    if (!elem.classList.contains(\"non-changable\")) {\n                        let newElem;\n                        if (info === \"porsche\") {\n                            newElem = document.createElement(\"img\");\n                            newElem.src = logos_configs[info];\n                        } else {\n                            newElem = document.createElement(\"div\");\n                        }\n                        newElem.className = elem.className;\n                        newElem.classList.remove(\"alphataurilogo\", \"toyotalogo\", \"hugologo\", \"porschelogo\", \"visarblogo\", \"ferrarilogo\", \"brawnlogo\");\n                        newElem.classList.add(logos_classes_configs[info]);\n                        elem.replaceWith(newElem);\n                    }\n                    if (elem.classList.contains(\"secondary\")) {\n                        if (info !== \"toyota\") {\n                            elem.src = elem.src.slice(0, -4) + \"2.png\";\n                        }\n                    }\n                });\n                return;\n            }\n            document.querySelectorAll(\".atlogo-replace\").forEach(function (elem) {\n                if (!elem.classList.contains(\"non-changable\")) {\n                    elem.src = logos_configs[info];\n                    elem.classList.remove(\"alphataurilogo\");\n                    elem.classList.remove(\"toyotalogo\");\n                    elem.classList.remove(\"hugologo\");\n                    elem.classList.remove(\"porschelogo\");\n                    elem.classList.remove(\"visarblogo\");\n                    elem.classList.remove(\"ferrarilogo\");\n                    elem.classList.remove(\"brawnlogo\");\n                    elem.classList.add(\"alphataurilogo\");\n                }\n                if (elem.classList.contains(\"secondary\")) {\n                    elem.src = elem.src.slice(0, -4) + \"2.png\";\n                }\n            });\n        }\n    };\n\n    const alpineConfig = {\n        buttonSelector: \"#alpineReplaceButton\",\n        teamId: 5,\n        teamNameSelector: \".al-teamname\",\n        teamMenuSelector: \".team-menu-alpine-replace\",\n        baseKey: \"alpine\",\n        primaryColorId: \"50\",\n        secondaryColorId: \"51\",\n        updateNames(info) {\n            document.querySelectorAll(\".alpine-name\").forEach(function (elem) { \n                let name = names_configs[info];\n                if (elem.parentElement.classList.contains(\"car-title\")) {       \n                    const match = elem.textContent.match(/^(.*?)\\s+(\\d+\\s*-\\s*#\\d+)/);\n                    if (match) {\n                        name = pretty_names[info];\n                        elem.textContent = `${name} ${match[2]}`;\n                    }\n                }\n                else {\n                    elem.textContent = name;\n                }\n            });\n        },\n        updateLogos(info) {\n            if (info === \"cadillac\") {\n                document.querySelectorAll(\".alpinelogo-replace\").forEach(function (elem) {\n                    if (!elem.classList.contains(\"non-changable\")) {\n                        if (elem.tagName.toLowerCase() !== \"img\") {\n                            const newElem = document.createElement(\"img\");\n                            newElem.className = elem.className;\n                            elem.replaceWith(newElem);\n                            elem = newElem;\n                        }\n                        elem.src = logos_configs[info];\n                        elem.classList.remove(\"alpinelogo\", \"andrettilogo\", \"renaultlogo\", \"lotuslogo\");\n                        elem.classList.add(logos_classes_configs[info]);\n                    }\n                    if (elem.classList.contains(\"secondary\")) {\n                        elem.src = elem.src.slice(0, -4) + \"2.png\";\n                    }\n                });\n                return;\n            }\n            if (info !== \"alpine\") {\n                document.querySelectorAll(\".alpinelogo-replace\").forEach(function (elem) {\n                    if (!elem.classList.contains(\"non-changable\")) {\n                        if (elem.tagName.toLowerCase() === \"img\") {\n                            const newElem = document.createElement(\"div\");\n                            newElem.className = elem.className;\n                            elem.replaceWith(newElem);\n                            elem = newElem;\n                        }\n                        elem.classList.remove(\"alpinelogo\");\n                        elem.classList.remove(\"andrettilogo\");\n                        elem.classList.remove(\"renaultlogo\");\n                        elem.classList.remove(\"lotuslogo\");\n                        elem.classList.remove(\"cadillaclogo\");\n                        elem.classList.add(logos_classes_configs[info]);        \n                    }\n                    if (elem.classList.contains(\"secondary\")) {\n                        elem.src = elem.src.slice(0, -4) + \"2.png\";\n                    }\n                });\n                return;\n            }\n            document.querySelectorAll(\".alpinelogo-replace\").forEach(function (elem) {\n                if (!elem.classList.contains(\"non-changable\")) {\n                    if (elem.tagName.toLowerCase() === \"img\") {\n                        const newElem = document.createElement(\"div\");\n                        newElem.className = elem.className;\n                        elem.replaceWith(newElem);\n                        elem = newElem;\n                    }\n                    elem.src = logos_configs[info];\n                    elem.classList.remove(\"alpinelogo\");\n                    elem.classList.remove(\"andrettilogo\");\n                    elem.classList.remove(\"renaultlogo\");\n                    elem.classList.remove(\"lotuslogo\");\n                    elem.classList.remove(\"cadillaclogo\");\n                    elem.classList.add(\"alpinelogo\");\n                }\n                if (elem.classList.contains(\"secondary\")) {\n                    elem.src = elem.src.slice(0, -4) + \"2.png\";\n                }\n            });\n        }\n    };\n\n    const williamsConfig = {\n        buttonSelector: \"#williamsReplaceButton\",\n        teamId: 6,\n        teamNameSelector: \".wi-teamname\",\n        teamMenuSelector: \".team-menu-williams-replace\",\n        baseKey: \"williams\",\n        primaryColorId: \"60\",\n        secondaryColorId: \"61\",\n        updateNames(info) {\n            document.querySelectorAll(\".williams-name\").forEach(function (elem) {\n                let name = names_configs[info];\n                if (elem.parentElement.classList.contains(\"car-title\")) {\n                    const match = elem.textContent.match(/^(.*?)\\s+(\\d+\\s*-\\s*#\\d+)/);\n                    if (match) {\n                        name = pretty_names[info];\n                        elem.textContent = `${name} ${match[2]}`;\n                    }\n                }\n                else {\n                    elem.textContent = name;\n                }\n            });\n        },\n        updateLogos(info) {\n            document.querySelectorAll(\".williamslogo-replace\").forEach(function (elem) {\n                if (!elem.classList.contains(\"non-changable\")) {\n                    elem.classList.remove(\"williamslogo\");\n                    elem.classList.remove(\"bmwlogo\");\n                    elem.classList.add(logos_classes_configs[info]);\n                    // bmw logo is a png\n                    if (info === \"bmw\") {\n                        //create an img element to replace the div\n                        let newElem = document.createElement(\"img\");\n                        newElem.src = logos_configs[info];\n                        newElem.className = elem.className;\n                        elem.replaceWith(newElem);\n                    }   else {\n                        //if not bmw, make sure it's a div\n                        if (elem.tagName.toLowerCase() === \"img\") {\n                            let newElem = document.createElement(\"div\");\n                            newElem.className = elem.className;\n                            elem.replaceWith(newElem);\n                        }\n                    }\n                }\n            });\n        }\n    };\n\n    const haasConfig = {\n        buttonSelector: \"#haasReplaceButton\",\n        teamId: 7,\n        teamNameSelector: \".ha-teamname\",\n        teamMenuSelector: \".team-menu-haas-replace\",\n        baseKey: \"haas\",\n        primaryColorId: \"70\",\n        secondaryColorId: \"71\",\n        updateNames(info) {\n            document.querySelectorAll(\".haas-name\").forEach(function (elem) {\n                let name = names_configs[info];\n                if (elem.parentElement.classList.contains(\"car-title\")) {\n                    const match = elem.textContent.match(/^(.*?)\\s+(\\d+\\s*-\\s*#\\d+)/);\n                    if (match) {\n                        name = pretty_names[info];\n                        elem.textContent = `${name} ${match[2]}`;\n                    }\n                }\n                else {\n                    elem.textContent = name;\n                }\n            });\n        },\n        updateLogos(info) {\n            document.querySelectorAll(\".haaslogo-replace\").forEach(function (elem) {\n                if (elem.classList.contains(\"non-changable\")) return;\n                const isMaskLogo = info === \"toyota\";\n                if (isMaskLogo) {\n                    const newElem = document.createElement(\"div\");\n                    newElem.className = elem.className;\n                    newElem.classList.remove(\"haaslogo\");\n                    newElem.classList.remove(\"toyotalogo\");\n                    newElem.classList.add(\"toyotalogo\");\n                    elem.replaceWith(newElem);\n                    return;\n                }\n\n                if (elem.tagName.toLowerCase() !== \"img\") {\n                    const newElem = document.createElement(\"img\");\n                    newElem.className = elem.className;\n                    elem.replaceWith(newElem);\n                    elem = newElem;\n                }\n                elem.src = logos_configs[info];\n                elem.classList.remove(\"toyotalogo\");\n                elem.classList.add(logos_classes_configs[info]);\n            });\n        }\n    };\n\n    const alfaConfig = {\n        buttonSelector: \"#alfaReplaceButton\",\n        teamId: 9,\n        teamNameSelector: \".af-teamname\",\n        teamMenuSelector: \".team-menu-alfa-replace\",\n        baseKey: \"alfa\",\n        primaryColorId: \"90\",\n        secondaryColorId: \"91\",\n        updateNames(info) {\n            document.querySelectorAll(\".alfa-name\").forEach(function (elem) {\n                let name = names_configs[info];\n                if (elem.parentElement.classList.contains(\"car-title\")) {\n                    const match = elem.textContent.match(/^(.*?)\\s+(\\d+\\s*-\\s*#\\d+)/);\n                    if (match) {\n                        name = pretty_names[info];\n                        elem.textContent = `${name} ${match[2]}`;\n                    }\n                }\n                else {\n                    elem.textContent = name;\n                }\n            });\n        },\n        updateLogos(info) {\n            if (info !== \"alfa\") {\n                document.querySelectorAll(\".alfalogo-replace\").forEach(function (elem) {\n                    if (!elem.classList.contains(\"non-changable\")) {\n                        const isMaskLogo = info === \"sauber\";\n                        if (isMaskLogo) {\n                            const newElem = document.createElement(\"div\");\n                            newElem.className = elem.className;\n                            newElem.classList.remove(\"alfaromeologo\");\n                            newElem.classList.remove(\"audilogo\");\n                            newElem.classList.remove(\"sauberlogo\");\n                            newElem.classList.add(logos_classes_configs[info]);\n                            elem.replaceWith(newElem);\n                            return;\n                        }\n\n                        if (elem.tagName.toLowerCase() !== \"img\") {\n                            const newElem = document.createElement(\"img\");\n                            newElem.className = elem.className;\n                            elem.replaceWith(newElem);\n                            elem = newElem;\n                        }\n                        elem.src = logos_configs[info];\n                        elem.classList.remove(\"alfaromeologo\");\n                        elem.classList.remove(\"audilogo\");\n                        elem.classList.remove(\"sauberlogo\");\n                        elem.classList.add(logos_classes_configs[info]);\n                    }\n                });\n                return;\n            }\n            document.querySelectorAll(\".alfalogo-replace\").forEach(function (elem) {\n                if (!elem.classList.contains(\"non-changable\")) {\n                    if (elem.tagName.toLowerCase() !== \"img\") {\n                        const newElem = document.createElement(\"img\");\n                        newElem.className = \"alfalogo-replace alfalogo\";\n                        newElem.src = logos_configs[info];\n                        elem.replaceWith(newElem);\n                        return;\n                    }\n                    elem.src = logos_configs[info];\n                    elem.className = \"alfalogo-replace alfalogo\";\n                }\n            });\n        }\n    };\n\n    const redbullConfig = {\n        buttonSelector: \"#redbullReplaceButton\",\n        teamId: 3,\n        teamNameSelector: \".rb-teamname\",\n        teamMenuSelector: \".team-menu-redbull-replace\",\n        baseKey: \"redbull\",\n        primaryColorId: \"30\",\n        secondaryColorId: \"31\",\n        updateNames(info) {\n            document.querySelectorAll(\".redbull-name\").forEach(function (elem) {\n                let name = names_configs[info];\n                if (elem.parentElement.classList.contains(\"car-title\")) {\n                    const match = elem.textContent.match(/^(.*?)\\s+(\\d+\\s*-\\s*#\\d+)/);\n                    if (match) {\n                        name = pretty_names[info];\n                        elem.textContent = `${name} ${match[2]}`;\n                    }\n                }\n                else {\n                    if (elem.classList.contains(\"complete\") && info === \"redbull\") {\n                        name = \"RED BULL\";\n                    }\n                    elem.textContent = name;\n                }\n            });\n        },\n        updateLogos(info) {\n            document.querySelectorAll(\".redbulllogo-replace\").forEach(function (elem) {\n                if (!elem.classList.contains(\"non-changable\")) {\n                    if (elem.tagName.toLowerCase() !== \"img\") {\n                        const newElem = document.createElement(\"img\");\n                        newElem.className = elem.className;\n                        elem.replaceWith(newElem);\n                        elem = newElem;\n                    }\n                    elem.src = logos_configs[info];\n                    elem.classList.remove(\"redbulllogo\", \"fordlogo\");\n                    elem.classList.add(logos_classes_configs[info]);\n                }\n            });\n        }\n    };\n\n    const astonConfig = {\n        buttonSelector: \"#astonReplaceButton\",\n        teamId: 10,\n        teamNameSelector: \".as-teamname\",\n        teamMenuSelector: \".team-menu-aston-replace\",\n        baseKey: \"aston\",\n        primaryColorId: \"100\",\n        secondaryColorId: \"101\",\n        updateNames(info) {\n            document.querySelectorAll(\".aston-name\").forEach(function (elem) {\n                let name = names_configs[info];\n                if (elem.parentElement.classList.contains(\"car-title\")) {\n                    const match = elem.textContent.match(/^(.*?)\\s+(\\d+\\s*-\\s*#\\d+)/);\n                    if (match) {\n                        name = pretty_names[info];\n                        elem.textContent = `${name} ${match[2]}`;\n                    }\n                }\n                else {\n                    elem.textContent = name;\n                }\n            });\n        },\n        updateLogos(info) {\n            document.querySelectorAll(\".astonlogo-replace\").forEach(function (elem) {\n                if (!elem.classList.contains(\"non-changable\")) {\n                    if (elem.tagName.toLowerCase() !== \"img\") {\n                        const newElem = document.createElement(\"img\");\n                        newElem.className = elem.className;\n                        elem.replaceWith(newElem);\n                        elem = newElem;\n                    }\n                    elem.src = logos_configs[info];\n                    elem.classList.remove(\"astonlogo\", \"racingpointlogo\", \"jordanlogo\");\n                    elem.classList.add(logos_classes_configs[info]);\n                }\n            });\n        }\n    };\n\n    return {\n        replaceTeam,\n        alphaTauriReplace(info) {\n            replaceTeam(alphaConfig, info, deps);\n        },\n        alpineReplace(info) {\n            replaceTeam(alpineConfig, info, deps);\n        },\n        williamsReplace(info) {\n            replaceTeam(williamsConfig, info || \"williams\", deps);        \n        },\n        haasReplace(info) {\n            replaceTeam(haasConfig, info || \"haas\", deps);\n        },\n        alfaReplace(info) {\n            replaceTeam(alfaConfig, info, deps);\n        },\n        redbullReplace(info) {\n            replaceTeam(redbullConfig, info, deps);\n        },\n        astonReplace(info) {\n            replaceTeam(astonConfig, info, deps);\n        }\n    };\n}\n"
  },
  {
    "path": "src/js/frontend/teams.js",
    "content": "import { team_dict } from \"./config\";\nimport { Command } from \"../backend/command.js\";\nimport { manage_stat_bar } from \"./stats\";\nimport { attachHold } from \"./renderer.js\";\n\nexport let teamCod;\nlet currYear;\nexport let originalCostCap;\nexport let longTermObj;\n\nconst MAX_ARC_LENGTH = 212; \n\n/**\n * Listener for the team menu buttons\n */\ndocument.querySelector(\"#teamMenu\").querySelectorAll(\"a\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function () {\n        document.querySelector(\"#teamButton span\").innerText = elem.querySelector(\".team-menu-name\").innerText;\n        teamCod = elem.dataset.teamid;\n        let data = {\n            teamID: teamCod,\n        }\n\n        document.querySelector(\"#teamButton\").classList.remove(\"open\")\n\n        const command = new Command(\"teamRequest\", data);\n        command.execute();\n\n        document.querySelector(\".team-viewer\").classList.remove(\"d-none\")\n    })\n\n})\n\n\n/**\n * Listener for the objective menu dropdown\n */\ndocument.querySelector(\"#objectiveMenu\").querySelectorAll(\"a\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function () {\n        document.querySelector(\".objective-label\").innerText = elem.textContent\n        longTermObj = elem.id[elem.id.length - 1]\n    })\n\n})\n\n/**\n * Helper function to add mousedown listener with auto increment/decrement\n */\nfunction addContinuousListener(element, selector, incrementCallback, decrementCallback) {\n    let intervalId;\n    element.querySelectorAll(selector).forEach(function (elem) {\n        elem.addEventListener('mousedown', function () {\n            let input = this.parentNode.parentNode.querySelector(\"input\");\n            if (this.classList.contains('bi-chevron-up') || this.classList.contains('bi-plus-lg')) {\n                incrementCallback(input);\n                intervalId = setInterval(() => {\n                    incrementCallback(input);\n                }, 100);\n            } else if (this.classList.contains('bi-chevron-down') || this.classList.contains('bi-dash-lg')) {\n                decrementCallback(input);\n                intervalId = setInterval(() => {\n                    decrementCallback(input);\n                }, 100);\n            }\n        });\n\n        elem.addEventListener('mouseup', function () {\n            clearInterval(intervalId);\n        });\n\n        elem.addEventListener('mouseleave', function () {\n            clearInterval(intervalId);\n        });\n    });\n}\n\nattachHold(document.querySelector(\"#objAndYear .input-and-buttons .bi-plus\"), document.querySelector(\"#longTermInput\"), +1, { min: 2023, max: 2023 + 1000 });\nattachHold(document.querySelector(\"#objAndYear .input-and-buttons .bi-dash\"), document.querySelector(\"#longTermInput\"), -1, { min: 2023, max: 2023 + 1000 });\n\n\nattachHold(document.querySelector(\"#seasonObjective .bi-plus\"), document.querySelector(\"#seasonObjectiveInput\"), -1, { min: 1, max: 10 });\nattachHold(document.querySelector(\"#seasonObjective .bi-dash\"), document.querySelector(\"#seasonObjectiveInput\"), +1, { min: 1, max: 10 });\n\n\nattachHold(document.querySelector(\"#confidence .bi-plus\"), document.querySelector(\"#confidence input\"), +5, { min: 0, max: 100 });\nattachHold(document.querySelector(\"#confidence .bi-dash\"), document.querySelector(\"#confidence input\"), -5, { min: 0, max: 100 });\n\n\nattachHold(document.querySelector(\"#costCap .bi-plus\"), document.querySelector(\"#costCap input\"), +100000,\n    {\n        min: -9999999999,\n        max: 1000000000,\n        format: (val) => val.toLocaleString(\"en-US\")\n    });\n\nattachHold(document.querySelector(\"#costCap .bi-dash\"), document.querySelector(\"#costCap input\"), -100000,\n    {\n        min: -9999999999,\n        max: 1000000000,\n        format: (val) => val.toLocaleString(\"en-US\")\n    });\n\n\nattachHold(\n    document.querySelector(\"#teamBudget .bi-plus\"),\n    document.querySelector(\"#teamBudget input\"),\n    +100000,\n    {\n        min: -9999999999,\n        max: 1000000000,\n        format: (val) => val.toLocaleString(\"en-US\")\n    }\n);\n\nattachHold(document.querySelector(\"#teamBudget .bi-dash\"),\n    document.querySelector(\"#teamBudget input\"),\n    -100000,\n    {\n        min: -9999999999,\n        max: 1000000000,\n        format: (val) => val.toLocaleString(\"en-US\")\n    }\n);\n\ndocument.querySelectorAll(\".gauge-and-buttons .bi-plus\").forEach(btn => {\n    const wrapper = btn.closest('.gauge-and-buttons');\n    const textSpan = wrapper.querySelector('.gauge-indicator');\n    const gaugeContainer = wrapper.querySelector('.gauge-container');\n\n    attachHold(btn, textSpan, +1, {\n        min: 0,\n        max: 100,\n        format: v => v + '%', // Formato con porcentaje\n        onChange: (val) => {\n            updateGaugeVisual(gaugeContainer, val);\n        }\n    });\n});\n\ndocument.querySelectorAll(\".gauge-and-buttons .bi-dash\").forEach(btn => {\n    const wrapper = btn.closest('.gauge-and-buttons');\n    const textSpan = wrapper.querySelector('.gauge-indicator');\n    const gaugeContainer = wrapper.querySelector('.gauge-container');\n\n    attachHold(btn, textSpan, -1, {\n        min: 0,\n        max: 100,\n        format: v => v + '%',\n        onChange: (val) => {\n            updateGaugeVisual(gaugeContainer, val);\n        }\n    });\n});\n\nfunction updateGaugeVisual(container, value) {\n    container.style.setProperty('--perc', value);\n    //if value is 100 set font-size to 12px\n    const textSpan = container.querySelector('.gauge-indicator');\n    if (value === 100) {\n        textSpan.style.fontSize = '10px';\n    } else {\n        textSpan.style.fontSize = '';\n    }\n}\n\n\n\n/**\n * Fills the level for each facility\n * @param {object} teamData info of the team facilities\n */\nexport function fillLevels(teamData) {\n    teamData.slice(0, 15).forEach(function (elem) {\n        let num = elem[0];\n        let level = num % 10;\n        let facilityID = Math.floor(num / 10);\n        let facility = document.querySelector(\"#facility\" + facilityID)\n        let indicator = facility.querySelector('.facility-level-indicator')\n        \n\n        let gaugeElement = facility.querySelector('.gauge-container');\n\n        if (gaugeElement) {\n            let percentage = parseInt(elem[1] * 100);\n            gaugeElement.style.setProperty('--perc', percentage);\n            let gaugeText = gaugeElement.querySelector('.gauge-indicator');\n            if (gaugeText) {\n                gaugeText.innerText = percentage + '%';\n            }\n            if (percentage === 100) {\n                gaugeText.style.fontSize = '10px';\n            } else {\n                gaugeText.style.fontSize = '';\n            }\n        }\n\n        indicator.dataset.value = level\n        let value = level\n        let levels = indicator.querySelectorAll('.level');\n\n        for (let i = 0; i < 5; i++) {\n            levels[i].className = \"level\"\n            if (i <= value - 1) {\n                levels[i].classList.add(team_dict[teamCod] + 'activated');\n            }\n        }\n    })\n    document.querySelector(\"#seasonObjectiveInput\").value = teamData[16]\n    document.querySelector(\"#longTermObj\" + teamData[17][0]).click()\n    document.querySelector(\"#longTermInput\").value = teamData[17][1]\n    document.querySelector(\"#teamBudgetInput\").value = teamData[18].toLocaleString(\"en-US\")\n    document.querySelector(\"#costCapInput\").value = Math.abs(teamData[19][0]).toLocaleString(\"en-US\")\n    manageConfidence(teamData[20])\n    document.querySelector(\"#confidenceInput\").value = teamData[20]\n    currYear = teamData[21]\n    originalCostCap = Math.abs(teamData[19][0])\n    for (let key in teamData[22]) {\n        let pitCrewStat = document.querySelector(`.pit-crew-details .one-stat-panel[data-crewStat='${key}']`);\n        let input = pitCrewStat.querySelector(\"input\");\n        let value = Math.round(teamData[22][key]);\n        if (key === \"38\") {\n            value = value / 10;\n        }\n        input.value = value + \"%\";\n        let bar = pitCrewStat.querySelector(\".one-stat-progress\");\n        bar.style.width = value + \"%\";\n    }\n    let engineManufacturer = teamData[23];\n    document.querySelector(`#engineMenu a[data-engine='${engineManufacturer}']`).click();\n    let bars = document.querySelector(\".pit-crew-details\").querySelectorAll(\".one-stat-progress\");\n    bars.forEach(function (elem) {\n        elem.classList = \"one-stat-progress \" + team_dict[teamCod] + \"bar-primary\";\n    })\n}\n\n\n\n\ndocument.querySelectorAll(\"#engineMenu a\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function () {\n        let engineiD = elem.dataset.engine;\n        let engine = elem.innerText;\n        document.querySelector(\"#engineLabel\").innerText = engine;\n        document.querySelector(\"#engineButton\").dataset.value = engineiD;\n    })\n})\n\n/**\n * Resets the view\n */\nexport function resetTeamEditing() {\n    document.querySelector(\".team-viewer\").classList.add(\"d-none\");\n    teamCod = null;\n    document.querySelector(\"#teamButton\").innerText = \"Team\";\n}\n\n\nfunction updatePitStat(input, increment) {\n    let actual = input.value.split(\"%\")[0];\n    let val = parseInt(actual) + increment;\n    if (val > 100) val = 100;\n    if (val < 0) val = 0;\n    input.value = val + \"%\";\n    manage_stat_bar(input, val);\n}\n\n\ndocument.querySelector(\".pit-crew-details\").querySelectorAll(\".bi-plus\").forEach(function (elem) {\n    // Guardamos referencia al input una sola vez para no buscarlo a cada clic\n    const input = elem.parentNode.querySelector(\"input\");\n\n    attachHold(elem, input, +1, {\n        min: 0,\n        max: 100,\n        // 1. Añadimos el símbolo % visualmente\n        format: (v) => v + '%', \n        // 2. Corregimos el onChange para que reciba el valor nuevo (val)\n        onChange: function (val) {\n            manage_stat_bar(input, val);\n        }\n    });\n});\n\n// Configuración para el botón - (DASH)\ndocument.querySelector(\".pit-crew-details\").querySelectorAll(\".bi-dash\").forEach(function (elem) {\n    const input = elem.parentNode.querySelector(\"input\");\n\n    attachHold(elem, input, -1, {\n        min: 0,\n        max: 100,\n        format: (v) => v + '%',\n        onChange: function (val) {\n            manage_stat_bar(input, val);\n        }\n    });\n});\n\n/**\n * Manages state of blocking div for confidence\n * @param {Number} data Confidence number. If -1, blocking div is activated\n */\nfunction manageConfidence(data) {\n    if (Number(data[0]) === -1) {\n        document.querySelector(\"#confidence\").classList.add(\"d-none\")\n    }\n    else {\n        document.querySelector(\"#confidence\").classList.remove(\"d-none\")\n    }\n}\n\n/**\n * Listeners for the level indicators for each facility\n */\ndocument.querySelector(\"#edit_teams\").querySelectorAll(\".bi-chevron-right\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function () {\n        let indicator = elem.parentNode.querySelector(\".facility-level-indicator\")\n        let value = parseInt(indicator.getAttribute('data-value')) + 1;\n        if (value > 5) {\n            value = 5\n        }\n\n        indicator.setAttribute('data-value', value);\n        let levels = indicator.querySelectorAll('.level');\n\n        if (value <= levels.length) {\n            levels[value - 1].classList.add(team_dict[teamCod] + 'activated');\n        }\n    })\n})\n\ndocument.querySelector(\"#edit_teams\").querySelectorAll(\".bi-chevron-left\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function () {\n        let indicator = elem.parentNode.querySelector(\".facility-level-indicator\")\n        let value = parseInt(indicator.getAttribute('data-value')) - 1;\n        if (value < 0) {\n            value = 0\n        }\n\n        indicator.setAttribute('data-value', value);\n        let levels = indicator.querySelectorAll('.level');\n\n        if (value < levels.length) {\n            levels[value].className = \"level\"\n        }\n    })\n\n})\n\n\n/**\n * Collects the data for each facility\n * @returns array with tuples for each facility\n */\nexport function gather_team_data() {\n    let facilities = document.getElementsByClassName('facility');\n    let result = [];\n\n    for (let i = 0; i < facilities.length; i++) {\n        let facility = facilities[i];\n        let id = facility.id.match(/\\d+$/)[0]; // Extrae el número al final del id\n        let levelIndicator = facility.getElementsByClassName('facility-level-indicator')[0];\n        let level = levelIndicator.getAttribute('data-value');\n        let number = id + level; // Compone el número concatenando los strings\n        let condition = facility.querySelector('.gauge-indicator').innerText.split(\"%\")[0] / 100;\n        result.push([number, condition]); // Añade la tupla a la lista\n    }\n\n    return result\n}\n\nexport function gather_pit_crew() {\n    let pitCrewStats = document.querySelectorAll(\".pit-crew-details .one-stat-panel\");\n    let result = {};\n    pitCrewStats.forEach(function (elem) {\n        let key = elem.dataset.crewstat;\n        let value = elem.querySelector(\"input\").value.split(\"%\")[0];\n        if (key === \"38\") {\n            value = value * 10;\n        }\n        result[key] = value;\n    });\n    return result;\n}"
  },
  {
    "path": "src/js/frontend/transfers.js",
    "content": "import { staff_pics, team_dict, combined_dict, staff_positions, typeStaff_dict, f1_teams, f2_teams, f3_teams, inverted_dict, getUpdatedName, logos_disc } from \"./config\";\nimport { attachHold, game_version, make_name_prettier } from \"./renderer\";\nimport bootstrap from \"bootstrap/dist/js/bootstrap.bundle.min.js\";\nimport interact from 'interactjs';\nimport { Command } from \"../backend/command.js\";\n\n\n\nconst myModal = new bootstrap.Modal(document.getElementById('contractModal'));\nconst raceBonusAmt = document.getElementById(\"raceBonusAmt\");\nconst raceBonusPos = document.getElementById(\"raceBonusPos\");\n\nconst freeDriversPill = document.getElementById(\"freepill\");\nconst f2DriversPill = document.getElementById(\"F2pill\");\nconst f3DriversPill = document.getElementById(\"F3pill\");\n\nexport const freeDriversDiv = document.getElementById(\"free-drivers\");\nconst freeStaffDiv = document.getElementById(\"free-staff\");\nconst f2DriversDiv = document.getElementById(\"f2-drivers\");\nconst f3DriversDiv = document.getElementById(\"f3-drivers\");\n\nconst clearIcon = document.querySelector(\"#filterTransfersContainer .bi-x\");\nlet freeDriverItems = []\nlet t;\n\nconst autoContractToggle = document.getElementById(\"autoContractToggle\")\nconst lineupsViewButton = document.getElementById(\"lineupsViewButton\");\nconst transfersMainLayout = document.getElementById(\"transfersMainLayout\");\nconst lineupsView = document.getElementById(\"lineupsView\");\nconst lineupsCircle = document.getElementById(\"lineupsCircle\");\nconst lineupsSeasonPillsTop = document.getElementById(\"lineupsSeasonPillsTop\");\nconst lineupsCurrentPill = document.getElementById(\"lineupsCurrentPill\");\nconst lineupsNextPill = document.getElementById(\"lineupsNextPill\");\n\nconst divsArray = [freeDriversDiv, f2DriversDiv, f3DriversDiv]\n\nlet originalParent;\nlet destinationParent;\nlet draggable;\nlet teamDestiniy;\nlet teamOrigin;\nlet posInTeam;\nlet modalType;\nlet driverEditingID;\nlet driverEditingName;\nlet driverEditingOfficialDriver = false;\nlet driver1;\nlet driver2;\nlet originalTeamId\nexport let currentSeason;\nlet lineupsData = null;\nlet lineupsSeasonType = \"current\";\n\nlet juniorTeamIdActive = -1;\nlet juniorTeamDrivers = [];\nlet juniorContractDirty = false;\n\nexport function setCurrentSeason(season) {\n    currentSeason = season\n}\n\n\n\nlet name_dict = { 'ferrari': \"Ferrari\", 'mclaren': \"McLaren\", 'redbull': \"Red Bull\", 'merc': \"Mercedes\", 'alpine': \"Alpine\", 'williams': \"Williams\", 'haas': \"Haas\", 'alphatauri': \"Alpha Tauri\", 'alfaromeo': \"Alfa Romeo\", 'astonmartin': \"Aston Martin\", \"F2\": \"F2\", \"F3\": \"F3\", \"custom\": \"Custom Team\" }\n//custom team name changes so this dict stays here\n\n/**\n * Removes all the drivers from teams and categories\n */\nexport function remove_drivers(staffOnly = false) {\n    if (!staffOnly) {\n        document.querySelectorAll('.driver-space').forEach(item => {\n            item.innerHTML = \"\"\n        });\n        document.querySelectorAll('.affiliates-space').forEach(item => {\n            item.innerHTML = \"\"\n        });\n        freeDriversDiv.innerHTML = \"\"\n    }\n    document.querySelectorAll('.staff-space').forEach(item => {\n        item.innerHTML = \"\"\n    });\n    freeStaffDiv.innerHTML = \"\"\n}\n\nexport function insert_space(str) {\n    return str.replace(/([A-Z])/g, ' $1').trim();\n}\n\nexport function format_name(fullName, nameSplitted, spanName, spanLastName, onlyLastWordLastName = false) {\n    const nameArray = String(fullName || \"\").split(\" \").filter(Boolean);\n    const firstName = nameArray[0] || \"\";\n    const lastName = nameArray[nameArray.length - 1] || \"\";\n    const middleNames = nameArray.slice(1, -1);\n\n    if (String(fullName || \"\").length > 17) {\n        if (insert_space(firstName).includes(\" \")) {\n            let splitName = insert_space(firstName).split(\" \");\n            spanName.textContent = splitName[0][0] + \". \" + splitName[1];\n        } else {\n            spanName.textContent = firstName[0] + \".\";\n        }\n\n        if (onlyLastWordLastName && middleNames.length > 0) {\n            spanName.textContent = spanName.textContent + \" \" + middleNames.map(n => insert_space(n)).join(\" \");\n        }\n        spanName.textContent = spanName.textContent + \" \";\n\n        spanLastName.textContent = (onlyLastWordLastName ? lastName : nameArray.slice(1).join(\" \")).toUpperCase();\n    } else {\n        const parts = Array.isArray(nameSplitted) ? nameSplitted.filter(Boolean) : [];\n        if (onlyLastWordLastName && parts.length > 1) {\n            spanName.textContent = parts.slice(0, -1).map(p => insert_space(p)).join(\" \").trim() + \" \";\n            spanLastName.textContent = String(parts[parts.length - 1] || \"\").toUpperCase();\n        } else {\n            spanName.textContent = insert_space(parts[0] || \"\") + \" \";\n            spanLastName.textContent = parts.slice(1).join(\" \").toUpperCase();\n        }\n    }\n}\n\n\n/**\n * Places all drivers in their respective team, category etc\n * @param {Object} driversArray List of drivers\n */\nexport function place_drivers(driversArray) {\n    console.log(\"DRIVERS ARRAY\", driversArray)\n    let divPosition;\n    driversArray.forEach((driver) => {\n        let newDiv = document.createElement(\"div\");\n        newDiv.className = \"col free-driver\";\n        newDiv.dataset.driverid = driver[1];\n        newDiv.dataset.teamid = driver[2];\n        let name = driver[0].split(\" \")\n        let nameContainer = document.createElement(\"div\")\n        nameContainer.className = \"name-container\"\n        let spanName = document.createElement(\"span\")\n        let spanLastName = document.createElement(\"span\")\n        format_name(driver[0], name, spanName, spanLastName)\n        spanLastName.classList.add(\"bold-font\")\n        nameContainer.appendChild(spanName)\n        nameContainer.appendChild(spanLastName)\n        if (driver[\"team_junior\"] && driver[\"team_junior\"].teamId !== -1) {\n            add_junior_formula_logo(newDiv, driver[\"team_junior\"])\n        }\n        newDiv.appendChild(nameContainer)\n        newDiv.classList.add(team_dict[driver[2]] + \"-transparent\")\n        if (driver[\"team_future\"].teamId !== -1) {\n            add_future_team_noti(newDiv, driver[\"team_future\"])\n        }\n        newDiv.dataset.futureteam = driver[\"team_future\"].teamId\n        manageColor(newDiv, spanLastName)\n        divPosition = \"free-drivers\"\n        let position = driver[3]\n        if (position >= 3) {\n            position = 3\n        }\n        addIcon(newDiv)\n        add_edit_container(newDiv)\n        if (driver[2] > 0 && driver[2] <= 10 || driver[2] === 32) {\n            divPosition = team_dict[driver[2]] + position;\n        }\n        document.getElementById(divPosition).appendChild(newDiv)\n\n    })\n\n\n    document.querySelectorAll(\".affiliates-and-arrows\").forEach(updateAffiliateArrows)\n}\n\nfunction add_edit_container(div) {\n    let edit_container = document.createElement(\"div\")\n    edit_container.className = \"edit-container\"\n    let numbersicon = document.createElement(\"i\")\n    numbersicon.className = \"bi bi bi-123\"\n    let pencilicon = document.createElement(\"i\")\n    pencilicon.className = \"bi bi-pencil-fill\"\n    edit_container.appendChild(pencilicon)\n    edit_container.appendChild(numbersicon)\n    div.appendChild(edit_container)\n    edit_container.addEventListener(\"click\", function () {\n        let id = div.dataset.driverid\n        document.getElementById(\"statspill\").click()\n        let edit_stats_div = document.querySelector(`.normal-driver[data-driverid=\"${id}\"]`)\n        let typeStaff = typeStaff_dict[edit_stats_div.dataset.type]\n        let menuClick = document.querySelector(`#staffMenu a[data-list=\"${typeStaff}\"]`)\n        menuClick.click()\n        edit_stats_div.click()\n\n        edit_stats_div.scrollIntoView({ behavior: \"smooth\", block: \"center\" })\n    })\n}\n\n\nexport function update_name(driverID, name) {\n    let freeDiv = document.querySelector(`.free-driver[data-driverid='${driverID}']`)\n    let normalDiv = document.querySelector(`.normal-driver[data-driverid='${driverID}']`)\n    let nameContainer = freeDiv.querySelector(\".name-container\")\n    let nameArray = name.split(\" \")\n    let new_name = nameArray[0]\n    let new_surname = nameArray.slice(1).join(\" \").toUpperCase()\n    let firstNameContainer = nameContainer.childNodes[0]\n    let lastNameContainer = nameContainer.querySelector(\".bold-font\")\n    firstNameContainer.textContent = new_name\n    lastNameContainer.textContent = new_surname\n    firstNameContainer = normalDiv.childNodes[0].childNodes[0]\n    lastNameContainer = normalDiv.childNodes[0].querySelector(\".bold-font\")\n    firstNameContainer.textContent = new_name + \" \"\n    lastNameContainer.textContent = new_surname\n    normalDiv.dataset.name = name\n}\n\n\nexport function sortList(divID) {\n    let container = document.getElementById(divID);\n\n    let divs = Array.from(container.querySelectorAll('.free-driver'));\n\n    let compareFunction = (a, b) => {\n        let futureTeamA = parseInt(a.dataset.futureteam);\n        let futureTeamB = parseInt(b.dataset.futureteam);\n\n        if (futureTeamA > futureTeamB) return -1;\n        if (futureTeamA < futureTeamB) return 1;\n\n        let textA = a.firstElementChild.textContent.toLowerCase();\n        let textB = b.firstElementChild.textContent.toLowerCase();\n\n        return textA.localeCompare(textB);\n    };\n\n    divs.sort(compareFunction);\n\n    container.innerHTML = '';\n\n    divs.forEach(div => container.appendChild(div));\n}\n\nexport function place_staff(staffArray) {\n    let divPosition;\n    staffArray.forEach((staff) => {\n        let newDiv = document.createElement(\"div\");\n        newDiv.className = \"col free-driver\";\n        newDiv.dataset.driverid = staff[1];\n        newDiv.dataset.teamid = staff[2];\n        let name = staff[0].split(\" \")\n        let spanName = document.createElement(\"span\")\n        let spanLastName = document.createElement(\"span\")\n        let marqueeContainer = document.createElement(\"div\")\n        marqueeContainer.className = \"marquee-wrapper\"\n        let nameContainer = document.createElement(\"div\")\n        nameContainer.className = \"name-container\"\n        spanName.textContent = insert_space(name[0]) + \" \"\n        spanLastName.textContent = name.slice(1).join(\" \").toUpperCase()\n        spanLastName.classList.add(\"bold-font\")\n        let staffLogo = document.createElement(\"img\")\n        let position = staff[3]\n        staffLogo.src = staff_pics[position]\n        staffLogo.className = \"staff-logo\"\n        newDiv.appendChild(staffLogo)\n        nameContainer.appendChild(spanName)\n        nameContainer.appendChild(spanLastName)\n        marqueeContainer.appendChild(nameContainer)\n        newDiv.appendChild(marqueeContainer)\n        newDiv.classList.add(team_dict[staff[2]] + \"-transparent\")\n        if (staff[\"team_future\"].teamId !== -1) {\n            add_future_team_noti(newDiv, staff[\"team_future\"])\n        }\n        newDiv.dataset.futureteam = staff[\"team_future\"].teamId\n        manageColor(newDiv, spanLastName)\n        // if (staff[4] === 1) {\n        //     addUnRetireIcon(newDiv)\n        // }\n        divPosition = \"free-staff\"\n        let staff_position = staff_positions[position]\n        newDiv.dataset.type = staff_position\n        staffLogo.classList.add(staff_position + \"-border\")\n        addIcon(newDiv)\n        add_edit_container(newDiv)\n        if (staff[2] > 0 && staff[2] <= 10 || staff[2] === 32) {\n            let teamDiv = document.querySelector(`.staff-section[data-teamid='${staff[2]}']`)\n            if (position !== 2) {\n                teamDiv.querySelector(`[data-type='${staff_position}']`).appendChild(newDiv)\n            }\n            else {\n                let engineer_1_has_child = teamDiv.querySelector(`[data-type='${staff_position}'][data-pos='1']`).childElementCount\n                if (engineer_1_has_child === 0) {\n                    teamDiv.querySelector(`[data-type='${staff_position}'][data-pos='1']`).appendChild(newDiv)\n                }\n                else {\n                    teamDiv.querySelector(`[data-type='${staff_position}'][data-pos='2']`).appendChild(newDiv)\n                }\n            }\n        }\n        else {\n            document.getElementById(divPosition).appendChild(newDiv)\n        }\n\n\n    })\n}\n\nexport function initFreeDriversElems() {\n    freeDriverItems = [\n        ...document.querySelectorAll(\"#free-drivers .free-driver\"),\n        ...document.querySelectorAll(\"#free-staff .free-driver\"),\n    ].map(el => {\n        const first = el.children[0]?.textContent || \"\";\n        const last = el.children[1]?.textContent || \"\";\n        const full = (first +  last).toLowerCase();\n        return { el, name: full };\n    });\n}\n\ndocument.querySelectorAll(\"#stafftransfersMenu a\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function () {\n        document.querySelector(\"#staffTransfersDropdown span.dropdown-label\").innerText = elem.innerText;\n        let value = elem.dataset.value;\n        document.querySelector(\"#staffTransfersDropdown\").dataset.value = value;\n        manage_staff_drivers(value)\n    })\n})\n\nfunction manage_staff_drivers(value) {\n    if (value === \"drivers\") {\n        document.getElementById(\"free-drivers\").classList.remove(\"d-none\")\n        document.getElementById(\"free-staff\").classList.add(\"d-none\")\n        document.querySelectorAll(\".drivers-section\").forEach(function (elem) {\n            elem.classList.remove(\"d-none\")\n        })\n        document.querySelectorAll(\".staff-section\").forEach(function (elem) {\n            elem.classList.add(\"d-none\")\n        })\n    }\n    else {\n        document.getElementById(\"free-drivers\").classList.add(\"d-none\")\n        document.getElementById(\"free-staff\").classList.remove(\"d-none\")\n        document.querySelectorAll(\".drivers-section\").forEach(function (elem) {\n            elem.classList.add(\"d-none\")\n        })\n        document.querySelectorAll(\".staff-section\").forEach(function (elem) {\n            elem.classList.remove(\"d-none\")\n        })\n    }\n}\n\nfunction add_future_team_noti(driverDiv, teamInfo) {\n    console.log(\"ADDING NOTI FOR FUTURE TEAM \", teamInfo)\n    let notiDiv = document.createElement(\"div\")\n    notiDiv.className = `future-contract-noti noti-${team_dict[teamInfo.teamId]}${teamInfo.posInTeam > 2 ? \"-affiliate\" : \"\"}`\n    driverDiv.appendChild(notiDiv)\n}\n\nfunction add_junior_formula_logo(driverDiv, juniorInfo) {\n    let imgContainer = document.createElement(\"div\")\n    imgContainer.className = \"junior-formula-logo\"\n    let img = document.createElement(\"img\")\n    img.src = logos_disc[juniorInfo.teamId]\n    if (f2_teams.includes(juniorInfo.teamId)) {\n        imgContainer.classList.add(\"f2-team\")\n    }\n    else if (f3_teams.includes(juniorInfo.teamId)) {\n        imgContainer.classList.add(\"f3-team\")\n    }\n    img.dataset.juniorTeamId = juniorInfo.teamId\n    imgContainer.appendChild(img)\n    driverDiv.appendChild(imgContainer)\n}\n\nconst affiliatesScrollDisabledClass = \"affiliates-scroll-disabled\"\nconst affiliatesScrollEpsilon = 2\n\nfunction getDirectAffiliateDrivers(affiliatesDiv) {\n    return Array.from(affiliatesDiv.children).filter(child => child.classList?.contains(\"free-driver\"))\n}\n\nfunction getAffiliateScrollStep(affiliatesDiv) {\n    const items = getDirectAffiliateDrivers(affiliatesDiv)\n    if (items.length >= 2) {\n        const step = items[1].offsetLeft - items[0].offsetLeft\n        return step > 0 ? step : 0\n    }\n    if (items.length === 1) {\n        const style = window.getComputedStyle(items[0])\n        const marginLeft = parseFloat(style.marginLeft) || 0\n        const marginRight = parseFloat(style.marginRight) || 0\n        return items[0].getBoundingClientRect().width + marginLeft + marginRight\n    }\n    return 0\n}\n\nfunction clamp(number, min, max) {\n    return Math.min(max, Math.max(min, number))\n}\n\nfunction updateAffiliateArrows(wrapper) {\n    const affiliatesDiv = wrapper.querySelector(\".affiliates-space\")\n    const leftArrow = wrapper.querySelector(\".bi-chevron-left\")\n    const rightArrow = wrapper.querySelector(\".bi-chevron-right\")\n\n    if (!affiliatesDiv || !leftArrow || !rightArrow) {\n        return\n    }\n\n    const items = getDirectAffiliateDrivers(affiliatesDiv)\n    const shouldShowArrows = items.length > 0\n\n    leftArrow.classList.toggle(\"d-none\", !shouldShowArrows)\n    rightArrow.classList.toggle(\"d-none\", !shouldShowArrows)\n\n    if (!shouldShowArrows) {\n        leftArrow.classList.remove(affiliatesScrollDisabledClass)\n        rightArrow.classList.remove(affiliatesScrollDisabledClass)\n        return\n    }\n\n    const maxScrollLeft = Math.max(0, affiliatesDiv.scrollWidth - affiliatesDiv.clientWidth)\n    if (affiliatesDiv.scrollLeft > maxScrollLeft) {\n        affiliatesDiv.scrollLeft = Math.max(0, maxScrollLeft)\n    }\n\n    if (affiliatesDiv.clientWidth <= 0) {\n        leftArrow.classList.remove(affiliatesScrollDisabledClass)\n        rightArrow.classList.remove(affiliatesScrollDisabledClass)\n        return\n    }\n\n    const hasOverflow = maxScrollLeft > affiliatesScrollEpsilon\n    const canScrollLeft = hasOverflow && affiliatesDiv.scrollLeft > affiliatesScrollEpsilon\n    const canScrollRight = hasOverflow && affiliatesDiv.scrollLeft < (maxScrollLeft - affiliatesScrollEpsilon)\n\n    leftArrow.classList.toggle(affiliatesScrollDisabledClass, !canScrollLeft)\n    rightArrow.classList.toggle(affiliatesScrollDisabledClass, !canScrollRight)\n}\n\nfunction setupAffiliateScroller(wrapper) {\n    const affiliatesDiv = wrapper.querySelector(\".affiliates-space\")\n    const leftArrow = wrapper.querySelector(\".bi-chevron-left\")\n    const rightArrow = wrapper.querySelector(\".bi-chevron-right\")\n\n    if (!affiliatesDiv || !leftArrow || !rightArrow) {\n        return\n    }\n\n    leftArrow.addEventListener(\"click\", function () {\n        const step = getAffiliateScrollStep(affiliatesDiv)\n        if (step <= 0) return\n\n        const maxScrollLeft = affiliatesDiv.scrollWidth - affiliatesDiv.clientWidth\n        const target = clamp(affiliatesDiv.scrollLeft - step, 0, maxScrollLeft)\n        affiliatesDiv.scrollTo({ left: target, behavior: \"smooth\" })\n    })\n\n    rightArrow.addEventListener(\"click\", function () {\n        const step = getAffiliateScrollStep(affiliatesDiv)\n        if (step <= 0) return\n\n        const maxScrollLeft = affiliatesDiv.scrollWidth - affiliatesDiv.clientWidth\n        const target = clamp(affiliatesDiv.scrollLeft + step, 0, maxScrollLeft)\n        affiliatesDiv.scrollTo({ left: target, behavior: \"smooth\" })\n    })\n\n    affiliatesDiv.addEventListener(\"scroll\", function () {\n        updateAffiliateArrows(wrapper)\n    }, { passive: true })\n\n    const observer = new MutationObserver(function () {\n        updateAffiliateArrows(wrapper)\n    })\n    observer.observe(affiliatesDiv, { childList: true })\n\n    updateAffiliateArrows(wrapper)\n}\n\nconst affiliateScrollers = Array.from(document.querySelectorAll(\".affiliates-and-arrows\"))\naffiliateScrollers.forEach(setupAffiliateScroller)\nwindow.addEventListener(\"resize\", function () {\n    affiliateScrollers.forEach(updateAffiliateArrows)\n})\n\n\n/**\n * Updates the color from the div depending on the team, both in contract and stats view\n * @param {div} div div from the driver\n */\nfunction updateColor(div) {\n    let surnameDiv = div.querySelector(\".bold-font\")\n    surnameDiv.className = \"bold-font\"\n    manageColor(div, surnameDiv)\n    let statsDiv = document.querySelector('.normal-driver[data-driverid=\"' + div.dataset.driverid + '\"]')\n    statsDiv.dataset.teamid = div.dataset.teamid\n    surnameDiv = statsDiv.querySelector(\".surname\")\n    surnameDiv.className = \"bold-font surname\"\n    manageColor(statsDiv, surnameDiv)\n    div.className = \"colr free-driver \" + team_dict[div.dataset.teamid] + \"-transparent\"\n    statsDiv.className = \"colr normal-driver \" + team_dict[div.dataset.teamid] + \"-transparent\"\n}\n\n/**\n * Manages the color depending on the team\n * @param {div} div div from the driver\n * @param {span} lastName the lastname span from the driver\n */\nexport function manageColor(div, lastName) {\n    if (div.dataset.teamid != 0) {\n        let colorClass = team_dict[div.dataset.teamid] + \"font\"\n        lastName.classList.add(colorClass)\n    }\n}\n\n\n\n/**\n * Adds the edit icon\n * @param {div} div div from the driver that is going to add the icon into\n */\nfunction addIcon(div) {\n    let iconDiv = document.createElement(\"div\");\n    iconDiv.className = \"custom-icon\"\n    let iconElement = document.createElement(\"i\");\n    iconElement.className = \"bi bi-pencil-square\";\n    iconListener(iconElement)\n    iconDiv.appendChild(iconElement)\n    div.appendChild(iconDiv)\n}\n\n\n/**\n * Adds the eventlistener for one icon\n * @param {div} icon div from the icon\n */\nfunction iconListener(icon) {\n    icon.addEventListener(\"click\", function () {\n        document.querySelector(\"#juniorContractDropdown\").classList.remove(\"d-none\")\n        document.querySelector(\"#contractPills\").classList.remove(\"d-none\")\n        modalType = \"edit\"\n        document.getElementById(\"contractModalTitle\").innerText = icon.parentNode.parentNode.innerText.replace(/\\n/g, ' ') + \"'s\";\n        fetchContracts(icon.parentNode.parentNode)\n        let space = icon.parentNode.parentNode.parentNode\n        //officialDriver = space has an id that ends with 1 or 2\n        driverEditingOfficialDriver = space.id.endsWith(\"1\") || space.id.endsWith(\"2\")\n        if (space.classList.contains(\"driver-space\") || space.classList.contains(\"affiliates-space\") || (space.id === \"free-drivers\" && (f2_teams.includes(parseInt(icon.parentNode.parentNode.dataset.teamid)) || f3_teams.includes(parseInt(icon.parentNode.parentNode.dataset.teamid))))) {\n            manage_modal_driver_staff(\"driver\")\n        }\n        else if (space.classList.contains(\"staff-space\") || (space.id === \"free-staff\" && (f2_teams.includes(parseInt(icon.parentNode.parentNode.dataset.teamid)) || f3_teams.includes(parseInt(icon.parentNode.parentNode.dataset.teamid))))) {\n            if (event.target.parentNode.parentNode.dataset.type === \"race-engineer\") {\n                manage_modal_driver_staff(\"race-engineer\")\n            }\n            else {\n                manage_modal_driver_staff(\"staff\")\n            }\n        }\n        else if (space.id === \"free-drivers\") {\n            manage_modal_driver_staff(\"free-driver\")\n        }\n        else if (space.id === \"free-staff\") {\n            if (event.target.parentNode.parentNode.dataset.type === \"race-engineer\") {\n                manage_modal_driver_staff(\"free-race-engineer\")\n            }\n            else {\n                manage_modal_driver_staff(\"free-staff\")\n            }\n        }\n        myModal.show()\n    })\n}\n\nfunction manage_modal_driver_staff(type) {\n    if (type === \"staff\" || type === \"race-engineer\") {\n        document.getElementById(\"currentContractTitle\").classList.remove(\"d-none\")\n        document.getElementById(\"currentContractOptions\").classList.remove(\"d-none\")\n        document.querySelectorAll(\".driver-only\").forEach(function (elem) {\n            let input = elem.querySelector(\"input\")\n            input.disabled = true\n            input.classList.add(\"disabled\")\n            let buttons = elem.querySelectorAll(\"i\")\n            buttons.forEach(function (button) {\n                button.classList.add(\"disabled\")\n            })\n        })\n    }\n    else if (type === \"driver\") {\n        document.getElementById(\"currentContractTitle\").classList.remove(\"d-none\")\n        document.getElementById(\"currentContractOptions\").classList.remove(\"d-none\")\n        document.querySelectorAll(\".driver-only\").forEach(function (elem) {\n            let input = elem.querySelector(\"input\")\n            input.disabled = false\n            input.classList.remove(\"disabled\")\n            let buttons = elem.querySelectorAll(\"i\")\n            buttons.forEach(function (button) {\n                button.classList.remove(\"disabled\")\n            })\n        })\n        let positionInput = document.querySelector(\"#positionInput input\")\n        positionInput.max = 999\n\n    }\n    else if (type === \"free-driver\") {\n        document.querySelectorAll(\".driver-only\").forEach(function (elem) {\n            let input = elem.querySelector(\"input\")\n            input.disabled = false\n            input.classList.remove(\"disabled\")\n            let buttons = elem.querySelectorAll(\"i\")\n            buttons.forEach(function (button) {\n                button.classList.remove(\"disabled\")\n            })\n        })\n        let positionInput = document.querySelector(\"#positionInput input\")\n        positionInput.max = 999\n        document.getElementById(\"currentContractOptions\").classList.add(\"d-none\")\n        document.getElementById(\"futureContractOptions\").classList.add(\"d-none\")\n        document.getElementById(\"futureContractTitle\").classList.add(\"d-none\")\n        document.getElementById(\"currentContractTitle\").classList.add(\"d-none\")\n        document.querySelector(\".add-contract\").classList.remove(\"d-none\")\n    }\n    else if (type === \"free-staff\") {\n        document.querySelectorAll(\".driver-only\").forEach(function (elem) {\n            let input = elem.querySelector(\"input\")\n            input.disabled = true\n            input.classList.add(\"disabled\")\n            let buttons = elem.querySelectorAll(\"i\")\n            buttons.forEach(function (button) {\n                button.classList.add(\"disabled\")\n            })\n        })\n        let positionInput = document.querySelector(\"#positionInput input\")\n        positionInput.disabled = true\n        let buttons = document.querySelectorAll(\"#positionInput i\")\n        buttons.forEach(function (button) {\n            button.classList.add(\"disabled\")\n        })\n        document.getElementById(\"currentContractOptions\").classList.add(\"d-none\")\n        document.getElementById(\"futureContractOptions\").classList.add(\"d-none\")\n        document.getElementById(\"futureContractTitle\").classList.add(\"d-none\")\n        document.getElementById(\"currentContractTitle\").classList.add(\"d-none\")\n        document.querySelector(\".add-contract\").classList.remove(\"d-none\")\n    }\n    else if (type === \"free-race-engineer\") {\n        document.querySelectorAll(\".driver-only\").forEach(function (elem) {\n            let input = elem.querySelector(\"input\")\n            input.disabled = true\n            input.classList.add(\"disabled\")\n            let buttons = elem.querySelectorAll(\"i\")\n            buttons.forEach(function (button) {\n                button.classList.add(\"disabled\")\n            })\n        })\n        let input = document.querySelector(\"#positionInput input\")\n        let buttons = document.querySelectorAll(\"#positionInput i\")\n        input.disabled = false\n        input.max = 2\n        input.classList.remove(\"disabled\")\n        buttons.forEach(function (button) {\n            button.classList.remove(\"disabled\")\n        })\n        document.getElementById(\"currentContractOptions\").classList.add(\"d-none\")\n        document.getElementById(\"futureContractOptions\").classList.add(\"d-none\")\n        document.getElementById(\"futureContractTitle\").classList.add(\"d-none\")\n        document.getElementById(\"currentContractTitle\").classList.add(\"d-none\")\n        document.querySelector(\".add-contract\").classList.remove(\"d-none\")\n    }\n    if (type === \"race-engineer\") {\n        let input = document.querySelector(\"#positionInput input\")\n        let buttons = document.querySelectorAll(\"#positionInput i\")\n        input.disabled = false\n        input.max = 2\n        input.classList.remove(\"disabled\")\n        buttons.forEach(function (button) {\n            button.classList.remove(\"disabled\")\n        })\n    }\n\n}\n\n\n\n/**\n * Places all the values for the modal that just openend\n * @param {Object} info values for the contract modal that just opened\n */\nexport function manage_modal(info) {\n    if (info[0] !== null) {\n        let teamID;\n        if (info[0][5] <= 10 || info[0][5] === 32) {\n            teamID = info[0][5]\n        }\n        else if (f2_teams.includes(info[0][5])) {\n            teamID = 33\n        }\n        else if (f3_teams.includes(info[0][5])) {\n            teamID = 34\n        }\n        document.getElementById(\"currentContract\").innerText = getUpdatedName(info[0][5]).toUpperCase()\n        document.getElementById(\"currentContract\").className = \"team-contract engine-\" + team_dict[teamID]\n        document.getElementById(\"yearInput\").dataset.maxYear = info[4]\n        document.getElementById(\"yearInput\").min = info[4]\n        document.getElementById(\"yearInputFuture\").min = info[4] + 1\n        document.querySelector(\"#currentContractOptions\").querySelectorAll(\".contract-modal-input\").forEach(function (elem, index) {\n            if (elem.id === \"salaryInput\" || elem.id === \"signBonusInput\" || elem.id === \"raceBonusAmt\") {\n                elem.value = info[0][index].toLocaleString(\"en-US\")\n            }\n            else {\n                elem.value = info[0][index]\n            }\n\n        })\n    }\n    if (info[1] === null) {\n        document.querySelector(\".add-contract\").classList.remove(\"d-none\")\n        document.querySelector(\"#futureContractTitle\").classList.add(\"d-none\")\n        document.querySelector(\"#futureContractOptions\").classList.add(\"d-none\")\n        document.querySelector(\"#teamContractButton span\").innerText = \"Team\"\n        document.querySelector(\"#teamContractButton\").dataset.teamid = \"-1\"\n    }\n    else {\n        document.querySelector(\".add-contract\").classList.add(\"d-none\")\n        document.querySelector(\"#futureContractTitle\").classList.remove(\"d-none\")\n        document.querySelector(\"#futureContractOptions\").classList.remove(\"d-none\")\n        document.getElementById(\"futureYear\").innerText = \"Contract for \" + parseInt(info[4] + 1)\n        document.getElementById(\"futureContract\").innerText = getUpdatedName(info[1][6]).toUpperCase()\n        document.querySelector(\"#teamContractButton\").dataset.teamid = info[1][6]\n        document.getElementById(\"futureContract\").className = \"team-contract engine-\" + team_dict[info[1][6]]\n        document.querySelector(\"#futureContractOptions\").querySelectorAll(\".contract-modal-input\").forEach(function (elem, index) {\n            if (elem.id === \"salaryInputFuture\" || elem.id === \"signBonusInputFuture\" || elem.id === \"raceBonusAmtFuture\") {\n                elem.value = info[1][index].toLocaleString(\"en-US\")\n            }\n            else if (elem.id === \"posInTeamFuture\") {\n                setPosInTeamFutureValue(elem, info[1][index], { dispatch: false });\n            }\n            else {\n                elem.value = info[1][index]\n            }\n        })\n    }\n\n    ensureJuniorTeamDropdownBuilt();\n\n    const juniorPill = document.querySelector(\".contract-category.junior-contract\");\n    if (info[2] !== null) {\n        document.getElementById(\"contractPills\").classList.remove(\"d-none\");\n        juniorPill?.classList.remove(\"d-none\");\n\n        const juniorTeamId = Number(info[2][6]);\n        const juniorButton = document.getElementById(\"juniorTeamContractButton\");\n        const posInput = document.getElementById(\"juniorPosInTeam\");\n        if (juniorButton) {\n            juniorTeamIdActive = juniorTeamId;\n            juniorContractDirty = false;\n            juniorButton.dataset.teamid = String(juniorTeamId);\n            const label = juniorButton.querySelector(\"span\");\n            if (label) label.innerText = (combined_dict[juniorTeamId] || \"Select junior team\").toUpperCase();\n\n            setJuniorPosInputLimits(juniorTeamId);\n            if (posInput) {\n                const pos = Number(info[2][5]);\n                posInput.value = String(pos);\n            }\n\n            const listDiv = document.querySelector(\".junior-team-drivers-list\");\n            if (listDiv) listDiv.innerHTML = \"<div class=\\\"modal-subtitle bold-font\\\">Loading drivers...</div>\";\n            const command = new Command(\"juniorTeamDriversRequest\", { teamID: juniorTeamId });\n            command.execute();\n        }\n    }\n    else {\n        juniorPill?.classList.remove(\"d-none\");\n        juniorTeamIdActive = -1;\n        juniorTeamDrivers = [];\n        juniorContractDirty = false;\n        const juniorButton = document.getElementById(\"juniorTeamContractButton\");\n        if (juniorButton) {\n            juniorButton.dataset.teamid = \"-1\";\n            const label = juniorButton.querySelector(\"span\");\n            if (label) label.innerText = \"Select junior team\";\n        }\n        const posInput = document.getElementById(\"juniorPosInTeam\");\n        if (posInput) {\n            posInput.min = \"1\";\n            posInput.max = \"3\";\n            posInput.value = \"1\";\n        }\n        const listDiv = document.querySelector(\".junior-team-drivers-list\");\n        if (listDiv) listDiv.innerHTML = \"\";\n    }\n\n    document.querySelectorAll(\".contract-category\").forEach(function (el) {\n        el.classList.remove(\"active\");\n    });\n    document.querySelector(\".contract-category.f1-contract\")?.classList.add(\"active\");\n    document.querySelector(\"#juniorContractDropdown\")?.classList.add(\"d-none\");\n    document.querySelector(\"#currentContract\")?.classList.remove(\"d-none\");\n    document.querySelector(\".junior-contract-info\")?.classList.add(\"d-none\");\n    document.querySelector(\"#currentContractOptions\")?.classList.remove(\"d-none\");\n\n    if (info[1] === null) {\n        document.querySelector(\".add-contract\")?.classList.remove(\"d-none\");\n        document.querySelector(\"#futureContractTitle\")?.classList.add(\"d-none\");\n        document.querySelector(\"#futureContractOptions\")?.classList.add(\"d-none\");\n    } else {\n        document.querySelector(\".add-contract\")?.classList.add(\"d-none\");\n        document.querySelector(\"#futureContractTitle\")?.classList.remove(\"d-none\");\n        document.querySelector(\"#futureContractOptions\")?.classList.remove(\"d-none\");\n    }\n\n    if (driverEditingOfficialDriver || !info[3]) { //if its an official driver or is a staff member, hide junior pill\n        juniorPill?.classList.add(\"d-none\");\n    }\n    else{\n        juniorPill?.classList.remove(\"d-none\");\n    }\n\n}\n\nfunction getJuniorMaxCars(teamId) {\n    if (f2_teams.includes(teamId)) return 2;\n    if (f3_teams.includes(teamId)) return 3;\n    if (teamId >= 11 && teamId <= 21) return 2;\n    if (teamId >= 22 && teamId <= 31) return 3;\n    return 2;\n}\n\nfunction setJuniorPosInputLimits(teamId) {\n    const input = document.getElementById(\"juniorPosInTeam\");\n    if (!input) return;\n\n    const maxCars = getJuniorMaxCars(teamId);\n    input.min = \"1\";\n    input.max = String(maxCars);\n\n    const current = Number(input.value || 1);\n    input.value = String(Math.min(maxCars, Math.max(1, current)));\n}\n\nfunction renderJuniorDriversList() {\n    const listDiv = document.querySelector(\".junior-team-drivers-list\");\n    if (!listDiv) return;\n\n    const maxCars = getJuniorMaxCars(juniorTeamIdActive);\n    const input = document.getElementById(\"juniorPosInTeam\");\n    const selectedPos = Math.min(maxCars, Math.max(1, Number(input?.value || 1)));\n\n    const driversByPos = new Map();\n    (juniorTeamDrivers || []).forEach((d) => {\n        const pos = Number(d?.posInTeam);\n        driversByPos.set(pos, d?.name || \"Free driver\");\n    });\n\n    listDiv.innerHTML = \"\";\n\n    for (let pos = 1; pos <= maxCars; pos++) {\n        const row = document.createElement(\"div\");\n        row.className = \"junior-driver-row\";\n\n        const left = document.createElement(\"div\");\n        left.className = \"junior-driver-left\";\n\n        const car = document.createElement(\"div\");\n        car.className = \"junior-driver-car\";\n        car.innerText = `CAR ${pos}`;\n\n        const name = document.createElement(\"div\");\n        name.className = \"junior-driver-name\";\n        name.innerText = driversByPos.get(pos) || \"Free driver\";\n\n        left.appendChild(car);\n        left.appendChild(name);\n\n        const right = document.createElement(\"div\");\n        right.className = \"junior-driver-right\";\n        if (pos === selectedPos) {\n            const tag = document.createElement(\"div\");\n            tag.className = \"junior-replacing-tag\";\n            tag.innerText = \"< Replacing\";\n            right.appendChild(tag);\n        }\n\n        row.appendChild(left);\n        row.appendChild(right);\n        listDiv.appendChild(row);\n    }\n}\n\nfunction ensureJuniorTeamDropdownBuilt() {\n    const menu = document.getElementById(\"juniorTeamContractMenu\");\n    if (!menu) return;\n\n    menu.innerHTML = \"\";\n\n    const juniorIds = Object.keys(combined_dict)\n        .map((k) => Number(k))\n        .filter((id) => id >= 11 && id <= 31)\n        .sort((a, b) => a - b);\n\n    juniorIds.forEach((teamId) => {\n        const item = document.createElement(\"a\");\n        item.className = \"redesigned-dropdown-item bold-font\";\n        item.style.cursor = \"pointer\";\n        item.dataset.teamid = String(teamId);\n\n        const logoWrap = document.createElement(\"div\");\n        logoWrap.className = \"team-menu-logo\";\n\n        const logo = document.createElement(\"img\");\n        logo.src = logos_disc[teamId] || \"\";\n        logo.alt = combined_dict[teamId] || `Team ${teamId}`;\n        logo.className = \"team-menu-junior-generic\";\n        logoWrap.appendChild(logo);\n\n        const nameWrap = document.createElement(\"div\");\n        nameWrap.className = \"team-menu-name\";\n        nameWrap.innerText = (combined_dict[teamId] || `Team ${teamId}`).toUpperCase();\n\n        item.appendChild(logoWrap);\n        item.appendChild(nameWrap);\n        menu.appendChild(item);\n    });\n\n    menu.querySelectorAll(\"a\").forEach(function (elem) {\n        elem.addEventListener(\"click\", function () {\n            const teamId = Number(elem.dataset.teamid);\n            const button = document.getElementById(\"juniorTeamContractButton\");\n            const label = button?.querySelector(\"span\");\n            if (label) label.innerText = elem.querySelector(\".team-menu-name\")?.innerText || \"Select junior team\";\n            if (button) button.dataset.teamid = String(teamId);\n\n            juniorTeamIdActive = teamId;\n            setJuniorPosInputLimits(teamId);\n            juniorTeamDrivers = [];\n            juniorContractDirty = true;\n            document.querySelector(\".junior-contract-info\")?.classList.remove(\"d-none\");\n\n            const listDiv = document.querySelector(\".junior-team-drivers-list\");\n            if (listDiv) listDiv.innerHTML = \"<div class=\\\"modal-subtitle bold-font\\\">Loading drivers...</div>\";\n\n            const command = new Command(\"juniorTeamDriversRequest\", { teamID: teamId });\n            command.execute();\n        });\n    });\n\n    const posInput = document.getElementById(\"juniorPosInTeam\");\n    if (posInput && posInput.dataset.listenerAttached !== \"1\") {\n        posInput.dataset.listenerAttached = \"1\";\n        posInput.addEventListener(\"input\", function () {\n            if (juniorTeamIdActive !== -1) setJuniorPosInputLimits(juniorTeamIdActive);\n            juniorContractDirty = true;\n            renderJuniorDriversList();\n        });\n\n        const wrapper = posInput.closest(\".input-and-buttons\");\n        const plusBtn = wrapper?.querySelector(\".bi-chevron-down\");\n        const minusBtn = wrapper?.querySelector(\".bi-chevron-up\");\n\n        const wrapStep = (delta) => {\n            const max = Number(posInput.max || 1);\n            const min = Number(posInput.min || 1);\n            const cur = Number(posInput.value || min);\n            const normalized = cur;\n\n            let next = normalized + delta;\n            if (next > max) next = min;\n            if (next < min) next = max;\n\n            posInput.value = String(next);\n            posInput.dispatchEvent(new Event(\"input\", { bubbles: true }));\n        };\n\n        plusBtn?.addEventListener(\"click\", function () {\n            wrapStep(1);\n        });\n        minusBtn?.addEventListener(\"click\", function () {\n            wrapStep(-1);\n        });\n    }\n}\n\nexport function loadJuniorTeamDrivers(payload) {\n    const listDiv = document.querySelector(\".junior-team-drivers-list\");\n    if (!listDiv) return;\n\n    const teamId = Number(payload?.teamID);\n    juniorTeamIdActive = teamId;\n    setJuniorPosInputLimits(teamId);\n\n    juniorTeamDrivers = Array.isArray(payload?.driverNames) ? payload.driverNames : [];\n    renderJuniorDriversList();\n}\n\n\ndocument.querySelectorAll(\".contract-category\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function () {\n        document.querySelectorAll(\".contract-category\").forEach(function (el) {\n            el.classList.remove(\"active\")\n        })\n        elem.classList.add(\"active\");\n        let category = elem.dataset.category;\n        if (category === \"junior\") {\n            document.querySelector(\"#currentContractOptions\").classList.add(\"d-none\")\n            // document.querySelector(\"#futureContractTitle\").classList.add(\"d-none\")\n            // document.querySelector(\"#futureContractOptions\").classList.add(\"d-none\")\n            document.querySelector(\".add-contract\").classList.add(\"d-none\")\n            document.querySelector(\"#juniorContractDropdown\").classList.remove(\"d-none\")\n            document.querySelector(\"#currentContract\").classList.add(\"d-none\")\n            const selectedTeamId = Number(document.getElementById(\"juniorTeamContractButton\")?.dataset.teamid || -1);\n            if (selectedTeamId === -1) {\n                document.querySelector(\".junior-contract-info\").classList.add(\"d-none\")\n            } else {\n                document.querySelector(\".junior-contract-info\").classList.remove(\"d-none\")\n            }\n        }\n        else{\n            document.querySelector(\"#currentContractOptions\").classList.remove(\"d-none\")\n            // document.querySelector(\"#futureContractTitle\").classList.remove(\"d-none\")\n            // document.querySelector(\"#futureContractOptions\").classList.remove(\"d-none\")\n            document.querySelector(\"#juniorContractDropdown\").classList.add(\"d-none\")\n            document.querySelector(\"#currentContract\").classList.remove(\"d-none\")\n            document.querySelector(\".add-contract\").classList.remove(\"d-none\")\n            document.querySelector(\".junior-contract-info\").classList.add(\"d-none\")\n        }\n    })\n})\n\n/**\n * Listener for the team menu buttons\n */\ndocument.querySelector(\"#teamContractMenu\").querySelectorAll(\"a\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function () {\n        document.querySelector(\"#teamContractButton span\").innerText = elem.querySelector(\".team-menu-name\").innerText;\n        document.querySelector(\"#teamContractButton\").dataset.teamid = elem.dataset.teamid;\n        document.querySelector(\".add-contract\").classList.add(\"enabled\")\n    })\n})\n\nfunction formatNumber(num) {\n    return num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n}\n\nfunction formatPosInTeamFutureLabel(pos) {\n    const n = Math.trunc(Number(pos));\n    if (n === 1) return \"Car 1\";\n    if (n === 2) return \"Car 2\";\n    return `Reserve ${n}`;\n}\n\nfunction parsePosInTeamFutureValue(raw) {\n    if (raw === null || raw === undefined) return NaN;\n    const str = String(raw).trim();\n    if (!str) return NaN;\n\n    const match = str.match(/(\\d+)/);\n    if (!match) return NaN;\n    return Number(match[1]);\n}\n\nfunction getPosInTeamFutureValue(input) {\n    if (!input) return NaN;\n\n    const parsed = parsePosInTeamFutureValue(input.value);\n    const fromDataset = Number(input.dataset.posValue);\n    return parsed || fromDataset || 1;\n}\n\nfunction setPosInTeamFutureValue(input, pos, opts = {}) {\n    if (!input) return;\n\n    const min = input.min !== \"\" ? Number(input.min) : -Infinity;\n    const max = input.max !== \"\" ? Number(input.max) : Infinity;\n\n    let next = Math.trunc(Number(pos));\n    next = Math.max(min, next);\n    next = Math.min(max, next);\n\n    input.dataset.posValue = String(next);\n    input.value = formatPosInTeamFutureLabel(next);\n\n    if (opts.dispatch !== false) {\n        input.dispatchEvent(new Event(\"input\", { bubbles: true }));\n    }\n}\n\nfunction attachHoldPosInTeamFuture(btn, input, delta) {\n    if (!btn || !input) return;\n    if (btn.dataset.holdAttached === \"1\") return;\n\n    btn.dataset.holdAttached = \"1\";\n\n    let intervalId = null;\n    let timeoutId = null;\n\n    const stepOnce = () => {\n        const current = getPosInTeamFutureValue(input);\n        setPosInTeamFutureValue(input, current + delta);\n    };\n\n    const clearTimers = () => {\n        if (timeoutId !== null) clearTimeout(timeoutId);\n        if (intervalId !== null) clearInterval(intervalId);\n        timeoutId = null;\n        intervalId = null;\n    };\n\n    btn.addEventListener(\"pointerdown\", (e) => {\n        e.preventDefault();\n        clearTimers();\n        stepOnce();\n        timeoutId = setTimeout(() => {\n            intervalId = setInterval(stepOnce, 75);\n        }, 350);\n    });\n\n    [\"pointerup\", \"pointercancel\", \"pointerleave\", \"lostpointercapture\"].forEach((evt) => {\n        btn.addEventListener(evt, clearTimers);\n    });\n}\n\nfunction setupPosInTeamFutureControls(input, plusBtn, minusBtn) {\n    if (!input || !plusBtn || !minusBtn) return;\n\n    if (input.dataset.posSetup === \"1\") return;\n    input.dataset.posSetup = \"1\";\n\n    input.type = \"text\";\n    input.placeholder = \"ex: Car 1\";\n\n    const initial = getPosInTeamFutureValue(input);\n    setPosInTeamFutureValue(input, initial, { dispatch: false });\n\n    input.addEventListener(\"change\", () => {\n        setPosInTeamFutureValue(input, getPosInTeamFutureValue(input), { dispatch: false });\n    });\n\n    attachHoldPosInTeamFuture(plusBtn, input, +1);\n    attachHoldPosInTeamFuture(minusBtn, input, -1);\n}\n\ndocument.querySelector(\".add-contract .button-with-icon\").addEventListener(\"click\", function () {\n    document.getElementById(\"yearInput\").value = document.getElementById(\"yearInput\").dataset.maxYear\n    document.querySelector(\"#futureYear\").innerText = \"Next year's contract\"\n    document.querySelector(\"#futureContract\").className = \"team-contract engine-\" + team_dict[document.querySelector(\"#teamContractButton\").dataset.teamid]\n    document.querySelector(\"#futureContract\").innerText = document.querySelector(\"#teamContractButton span\").innerText\n    document.querySelector(\".add-contract\").classList.add(\"d-none\")\n    document.querySelector(\"#futureContractTitle\").classList.remove(\"d-none\")\n    document.querySelector(\"#futureContractOptions\").classList.remove(\"d-none\")\n    if (document.querySelector(\"#salaryInput\").value !== \"\") {\n        document.querySelector(\"#salaryInputFuture\").value = formatNumber((parseFloat(document.querySelector(\"#salaryInput\").value.replace(/[$,]/g, '')) * 1.3).toFixed(0));\n        document.querySelector(\"#signBonusInputFuture\").value = formatNumber((parseFloat(document.querySelector(\"#signBonusInput\").value.replace(/[$,]/g, '')) * 1.15).toFixed(0));\n        document.querySelector(\"#raceBonusAmtFuture\").value = formatNumber((parseFloat(document.querySelector(\"#raceBonusAmt\").value.replace(/[$,]/g, '')) * 1.15).toFixed(0));\n        document.querySelector(\"#raceBonusPosFuture\").value = parseInt(document.querySelector(\"#raceBonusPos\").value)\n        document.querySelector(\"#yearInputFuture\").value = parseInt(document.querySelector(\"#yearInput\").value) + 2\n    }\n    else {\n        document.querySelector(\"#salaryInputFuture\").value = \"1,000,000\"\n        document.querySelector(\"#signBonusInputFuture\").value = \"100,000\"\n        document.querySelector(\"#raceBonusAmtFuture\").value = \"0\"\n        document.querySelector(\"#raceBonusPosFuture\").value = \"1\"\n        document.querySelector(\"#yearInputFuture\").value = parseInt(currentSeason) + 1\n    }\n\n    setPosInTeamFutureValue(document.querySelector(\"#posInTeamFuture\"), 1);\n\n})\n\n\ndocument.querySelector(\".break-contract\").addEventListener(\"click\", function () {\n    document.querySelector(\".add-contract\").classList.remove(\"d-none\")\n    document.querySelector(\"#futureContractTitle\").classList.add(\"d-none\")\n    document.querySelector(\"#futureContractOptions\").classList.add(\"d-none\")\n    document.querySelector(\"#teamContractButton span\").innerText = \"Team\"\n    document.querySelector(\"#teamContractButton\").dataset.teamid = \"-1\"\n    document.querySelector(\".add-contract\").classList.remove(\"enabled\")\n})\n\nfunction attachHoldWithAttrClamp(btn, input, step, opts = {}) {\n    if (!btn || !input) return;\n    if (btn.dataset.holdAttached === \"1\") return;\n\n    btn.dataset.holdAttached = \"1\";\n    const format = typeof opts.format === \"function\" ? opts.format : undefined;\n\n    attachHold(btn, input, step, {\n        min: -Infinity,\n        max: Infinity,\n        format,\n        onChange: (val) => {\n            if (typeof val !== \"number\") return;\n\n            const min = input.min !== \"\" ? Number(input.min) : -Infinity;\n            const max = input.max !== \"\" ? Number(input.max) : Infinity;\n            let clamped = val;\n\n            clamped = Math.max(min, clamped);\n            clamped = Math.min(max, clamped);\n\n            if (clamped === val) return;\n\n            input.value = String(format ? format(clamped) : clamped);\n            input.dispatchEvent(new Event(\"input\", { bubbles: true }));\n        },\n    });\n}\n\nfunction setupContractModalButtons() {\n    const moneyFormat = (val) => Number(val).toLocaleString(\"en-US\");\n    const moneyInputs = new Set([\n        \"salaryInput\",\n        \"signBonusInput\",\n        \"raceBonusAmt\",\n        \"salaryInputFuture\",\n        \"signBonusInputFuture\",\n        \"raceBonusAmtFuture\",\n    ]);\n\n    document.querySelectorAll(\"#contractModal .contract-options .input-and-buttons\").forEach((wrapper) => {\n        const input = wrapper.querySelector(\"input\");\n        const plusBtn = wrapper.querySelector(\".bi-plus\");\n        const minusBtn = wrapper.querySelector(\".bi-dash\");\n        if (!input || !plusBtn || !minusBtn) return;\n        if (input.id === \"juniorPosInTeam\") return;\n        if (input.id === \"posInTeamFuture\") {\n            setupPosInTeamFutureControls(input, plusBtn, minusBtn);\n            return;\n        }\n\n        const isMoney = moneyInputs.has(input.id);\n        const isSalary = input.id === \"salaryInput\" || input.id === \"salaryInputFuture\";\n        const isRacePos = input.id === \"raceBonusPos\" || input.id === \"raceBonusPosFuture\";\n\n        const baseStep = isSalary ? 100000 : isMoney ? 10000 : 1;\n        const plusStep = isRacePos ? -baseStep : +baseStep;\n        const minusStep = isRacePos ? +baseStep : -baseStep;\n\n        attachHoldWithAttrClamp(plusBtn, input, plusStep, { format: isMoney ? moneyFormat : undefined });\n        attachHoldWithAttrClamp(minusBtn, input, minusStep, { format: isMoney ? moneyFormat : undefined });\n    });\n}\n\nsetupContractModalButtons();\n\n/**\n * Sends the message that requests the details from the driver\n * @param {div} elem div from the driver its requesting its details\n */\nfunction fetchContracts(elem) {\n    driverEditingID = elem.dataset.driverid\n    driverEditingName = make_name_prettier(elem.innerText)\n\n    const command = new Command(\"driverRequest\", { driverID: driverEditingID });\n    command.execute();\n\n}\n\n\n/**\n * Manages the state of the categorias\n * @param  {...string} divs the state of each div\n */\nfunction manageDrivers(...divs) {\n    divsArray.forEach(function (div, index) {\n        if (divs[index] === \"show\") {\n            div.className = \"main-columns-drag-section\"\n        }\n        else {\n            div.className = \"main-columns-drag-section d-none\"\n        }\n    })\n}\n\n/**\n * Event listener for the confirm button from the modal\n */\ndocument.getElementById(\"confirmButton\").addEventListener('click', function () {\n    const juniorActive = document.querySelector(\".contract-category.junior-contract\")?.classList.contains(\"active\");\n    if (juniorActive) {\n        if (juniorContractDirty) {\n            juniorContractDirty = false;\n        }\n        let data = {\n            driverID: driverEditingID,\n            driver: driverEditingName,\n            team: combined_dict[juniorTeamIdActive] || \"\",\n            teamID: juniorTeamIdActive,\n            posInTeam: document.getElementById(\"juniorPosInTeam\").value\n        }\n        const command = new Command(\"juniorTransfer\", data);\n        command.execute();\n        modalType = \"\";\n        setTimeout(clearModal, 500);\n        return;\n    }\n    if (modalType === \"hire\") {\n        if (((f2_teams.includes(originalTeamId) | f3_teams.includes(originalTeamId)) && !destinationParent.classList.contains(\"affiliates-space\")) | originalParent.className === \"driver-space\" | originalParent.classList.contains(\"affiliates-space\") | originalParent.className === \"staff-space\") {\n            signDriver(\"fireandhire\")\n        }\n        signDriver(\"regular\")\n        modalType = \"\";\n    }\n    else if (modalType === \"edit\") {\n        editContract()\n        modalType = \"\";\n    }\n    setTimeout(clearModal, 500);\n    sortList(\"free-drivers\")\n    sortList(\"free-staff\")\n})\n\n/**\n * Clears the modal's inputs\n */\nfunction clearModal() {\n    document.querySelectorAll(\".contract-modal-input\").forEach(function (elem) {\n        if (elem.id === \"posInTeamFuture\") {\n            delete elem.dataset.posValue;\n        }\n        elem.value = \"\"\n    })\n}\n\n/**\n * Sends the message to the backend to edit the contract\n */\nfunction editContract() {\n    let values = []\n    document.querySelector(\"#currentContractOptions\").querySelectorAll(\".contract-modal-input\").forEach(function (elem) {\n        if (elem.id === \"salaryInput\" || elem.id === \"signBonusInput\" || elem.id === \"raceBonusAmt\") {\n            values.push(elem.value.replace(/[$,]/g, \"\"))\n        }\n        else {\n            values.push(elem.value)\n        }\n    })\n    let futureValues = []\n    document.querySelector(\"#futureContractOptions\").querySelectorAll(\".contract-modal-input\").forEach(function (elem) {\n        if (elem.id === \"salaryInputFuture\" || elem.id === \"signBonusInputFuture\" || elem.id === \"raceBonusAmtFuture\") {\n            futureValues.push(elem.value.replace(/[$,]/g, \"\"))\n        }\n        else if (elem.id === \"posInTeamFuture\") {\n            futureValues.push(String(getPosInTeamFutureValue(elem)))\n        }\n        else {\n            futureValues.push(elem.value)\n        }\n    })\n    let future_team = document.querySelector(\"#teamContractButton\").dataset.teamid\n\n    let data = {\n        driverID: driverEditingID,\n        salary: values[0],\n        year: values[1],\n        signBonus: values[2],\n        raceBonus: values[3],\n        raceBonusPos: values[4],\n        driver: driverEditingName,\n        futureTeam: future_team,\n        futureSalary: futureValues[0],\n        futureYear: futureValues[1],\n        futureSignBonus: futureValues[2],\n        futureRaceBonus: futureValues[3],\n        futureRaceBonusPos: futureValues[4],\n        futurePosition: futureValues[5]\n    }\n\n    const command = new Command(\"editContract\", data);\n    command.execute();\n\n    console.log(\"FUTURE TEAM: \", future_team)\n\n    let teamInfo = {\n        teamId: future_team,\n        posInTeam: futureValues[5]\n    }\n\n    if (future_team !== \"-1\") {\n        let driverDiv = document.querySelector('.free-driver[data-driverid=\"' + driverEditingID + '\"]')\n        add_future_team_noti(driverDiv, teamInfo)\n        driverDiv.dataset.futureteam = future_team\n    }\n    else {\n        let driverDiv = document.querySelector('.free-driver[data-driverid=\"' + driverEditingID + '\"]')\n        driverDiv.querySelector(\".future-contract-noti\").remove()\n        driverDiv.dataset.futureteam = -1\n    }\n}\n\n/**\n * Changes the positions of 2 drivers involved in a swap\n */\nfunction manage_swap() {\n    let parent1 = driver1.parentNode;\n    let parent2 = driver2.parentNode;\n    parent1.removeChild(driver1);\n    parent2.removeChild(driver2);\n    parent1.appendChild(driver2);\n    parent2.appendChild(driver1);\n\n}\n\n/**\n * Sends the necessary messages to hire a driver\n * @param {string} type type of the hiring of the driver, depending if he needs to be fired before or not\n */\nfunction signDriver(type) {\n    let driverName = make_name_prettier(draggable.innerText)\n    if (type === \"fireandhire\") {\n        let data = {\n            driverID: draggable.dataset.driverid,\n            driver: driverName,\n            team: getUpdatedName(inverted_dict[teamOrigin.dataset.team]),\n            teamID: originalTeamId\n        }\n        if (!data[\"team\"]) {\n            if (f2_teams.includes(originalTeamId)) {\n                data[\"team\"] = \"F2\"\n            }\n            else if (f3_teams.includes(originalTeamId)) {\n                data[\"team\"] = \"F3\"\n            }\n        }\n        const command = new Command(\"fireDriver\", data);\n        command.execute();\n\n    }\n    if (type === \"regular\") {\n        let salaryData = document.getElementById(\"salaryInput\").value.replace(/[$,]/g, \"\");\n        let yearData = document.getElementById(\"yearInput\").value;\n        let signBonusData = document.getElementById(\"signBonusInput\").value.replace(/[$,]/g, \"\");\n        let raceBonusData;\n        let raceBonusPosData;\n\n        if (signBonusData === \"\")\n            signBonusData = \"0\"\n\n        if (raceBonusAmt.value === \"\")\n            raceBonusData = \"0\";\n        else\n            raceBonusData = raceBonusAmt.value.replace(/[$,]/g, \"\");\n\n        if (raceBonusPos.value === \"\")\n            raceBonusPosData = \"10\";\n        else\n            raceBonusPosData = raceBonusPos.value;\n\n        let data = {\n            driverID: draggable.dataset.driverid,\n            teamID: inverted_dict[teamDestiniy],\n            position: posInTeam,\n            salary: salaryData,\n            signBonus: signBonusData,\n            raceBonus: raceBonusData,\n            raceBonusPos: raceBonusPosData,\n            year: yearData,\n            driver: driverName,\n            team: name_dict[teamDestiniy]\n        }\n        destinationParent.appendChild(draggable);\n        const command = new Command(\"hireDriver\", data);\n        command.execute();\n\n    }\n    else if (type === \"autocontract\") {\n        let dataAuto = {\n            driverID: draggable.dataset.driverid,\n            teamID: inverted_dict[teamDestiniy],\n            position: posInTeam,\n            driver: driverName,\n            team: name_dict[teamDestiniy]\n        }\n        destinationParent.appendChild(draggable);\n        const command = new Command(\"autoContract\", dataAuto);\n        command.execute();\n\n    }\n}\n\n\n/**\n * Event listener for the cancel button on the modal\n */\ndocument.getElementById(\"cancelButton\").addEventListener('click', function () {\n    document.querySelector(\".add-contract\").classList.remove(\"enabled\")\n    if (modalType === \"hire\") {\n        originalParent.appendChild(draggable);\n        draggable.dataset.teamid = inverted_dict[teamOrigin.dataset.team]\n        updateColor(draggable)\n    }\n    setTimeout(clearModal, 500);\n})\n\ndocument.querySelector(\"#nameFilterTransfer\").addEventListener(\"input\", (e) => {\n  const val = e.target.value;\n  clearIcon.classList.toggle(\"d-none\", val === \"\");\n\n  clearTimeout(t);\n  t = setTimeout(() => {\n    const q = val.trim().toLowerCase();\n    if (!q) {\n      for (const {el} of freeDriverItems) el.classList.remove(\"d-none\");\n      return;\n    }\n    for (const {el, name} of freeDriverItems) {\n      el.classList.toggle(\"d-none\", !name.includes(q));\n    }\n  }, 150);\n});\n\ndocument.querySelector(\"#filterIconTransfers\").addEventListener(\"click\", function () {\n    document.querySelector(\".category-filters\").classList.toggle(\"show\")\n    document.querySelector(\".filter-container\").classList.toggle(\"focused\")\n    if (document.querySelector(\".filter-container\").classList.contains(\"focused\")) {\n        document.querySelector(\"#filterIconTransfers\").className = \"bi bi-filter-circle-fill filter-icon\"\n    }\n    else {\n        document.querySelector(\"#filterIconTransfers\").className = \"bi bi-filter-circle filter-icon\"\n    }\n})\n\ndocument.getElementById(\"driver_transfers\").querySelectorAll(\".new-pills-filters\").forEach(function (elem) {\n    elem.addEventListener(\"click\", function (event) {\n        let isActive = elem.classList.contains('active');\n\n        document.getElementById(\"driver_transfers\").querySelectorAll('.new-pills-filters').forEach(function (el) {\n            el.classList.remove('active');\n        });\n\n        if (!isActive) {\n            elem.classList.add('active');\n        }\n    })\n})\n\ndocument.querySelector(\"#F2filterTransfers\").addEventListener(\"click\", function (event) {\n    if (!event.target.classList.contains(\"active\")) {\n        let driverElements = document.getElementById(\"free-drivers\").querySelectorAll(\".free-driver\")\n        driverElements.forEach(function (elem) {\n            elem.classList.remove(\"d-none\")\n        })\n        let staffElements = document.getElementById(\"free-staff\").querySelectorAll(\".free-driver\")\n        staffElements.forEach(function (elem) {\n            elem.classList.remove(\"d-none\")\n        })\n    }\n    else {\n        let driverElements = document.getElementById(\"free-drivers\").querySelectorAll(\".free-driver\")\n        driverElements.forEach(function (elem) {\n            if (parseInt(elem.dataset.teamid) <= 21 && parseInt(elem.dataset.teamid) > 10) {\n                elem.classList.remove(\"d-none\")\n            }\n            else {\n                elem.classList.add(\"d-none\")\n            }\n        })\n        let staffElements = document.getElementById(\"free-staff\").querySelectorAll(\".free-driver\")\n        staffElements.forEach(function (elem) {\n            if (parseInt(elem.dataset.teamid) <= 21 && parseInt(elem.dataset.teamid) > 10) {\n                elem.classList.remove(\"d-none\")\n            }\n            else {\n                elem.classList.add(\"d-none\")\n            }\n        })\n    }\n})\n\ndocument.querySelector(\"#F3filterTransfers\").addEventListener(\"click\", function (event) {\n    if (!event.target.classList.contains(\"active\")) {\n        let driverElements = document.getElementById(\"free-drivers\").querySelectorAll(\".free-driver\")\n        driverElements.forEach(function (elem) {\n            elem.classList.remove(\"d-none\")\n        })\n        let staffElements = document.getElementById(\"free-staff\").querySelectorAll(\".free-driver\")\n        staffElements.forEach(function (elem) {\n            elem.classList.remove(\"d-none\")\n        })\n    }\n    else {\n        let driverElements = document.getElementById(\"free-drivers\").querySelectorAll(\".free-driver\")\n        driverElements.forEach(function (elem) {\n            if (parseInt(elem.dataset.teamid) <= 31 && parseInt(elem.dataset.teamid) > 21) {\n                elem.classList.remove(\"d-none\")\n            }\n            else {\n                elem.classList.add(\"d-none\")\n            }\n        })\n        let staffElements = document.getElementById(\"free-staff\").querySelectorAll(\".free-driver\")\n        staffElements.forEach(function (elem) {\n            if (parseInt(elem.dataset.teamid) <= 31 && parseInt(elem.dataset.teamid) > 21) {\n                elem.classList.remove(\"d-none\")\n            }\n            else {\n                elem.classList.add(\"d-none\")\n            }\n        })\n    }\n})\n\ndocument.querySelector(\"#freefilterTransfers\").addEventListener(\"click\", function (event) {\n    if (!event.target.classList.contains(\"active\")) {\n        let driverElements = document.getElementById(\"free-drivers\").querySelectorAll(\".free-driver\")\n        driverElements.forEach(function (elem) {\n            elem.classList.remove(\"d-none\")\n        })\n        let staffElements = document.getElementById(\"free-staff\").querySelectorAll(\".free-driver\")\n        staffElements.forEach(function (elem) {\n            elem.classList.remove(\"d-none\")\n        })\n    }\n    else {\n        let driverElements = document.getElementById(\"free-drivers\").querySelectorAll(\".free-driver\")\n        driverElements.forEach(function (elem) {\n            if (parseInt(elem.dataset.teamid) == 0) {\n                elem.classList.remove(\"d-none\")\n            }\n            else {\n                elem.classList.add(\"d-none\")\n            }\n        })\n        let staffElements = document.getElementById(\"free-staff\").querySelectorAll(\".free-driver\")\n        staffElements.forEach(function (elem) {\n            if (parseInt(elem.dataset.teamid) == 0) {\n                elem.classList.remove(\"d-none\")\n            }\n            else {\n                elem.classList.add(\"d-none\")\n            }\n        })\n    }\n})\n\nfunction setLineupsButtonState(isOpen) {\n    if (!lineupsViewButton) return;\n\n    const label = lineupsViewButton.querySelector(\"span\");\n    const icon = lineupsViewButton.querySelector(\"i\");\n\n    if (label) {\n        label.textContent = isOpen ? \"Transfers\" : \"Line ups\";\n    }\n    if (icon) {\n        icon.className = isOpen ? \"bi bi-arrow-return-left\" : \"bi bi-diagram-3\";\n    }\n}\n\n\nfunction getLineupsDisplaySeason() {\n    const baseSeason = Number(lineupsData?.season) || Number(currentSeason) || 0;\n    if (lineupsSeasonType === \"next\") return baseSeason + 1;\n    return baseSeason;\n}\n\nfunction setLineupsSeasonPillActive(seasonType) {\n    lineupsSeasonType = seasonType;\n    if (lineupsCurrentPill) {\n        lineupsCurrentPill.classList.toggle(\"active\", seasonType === \"current\");\n    }\n    if (lineupsNextPill) {\n        lineupsNextPill.classList.toggle(\"active\", seasonType === \"next\");\n    }\n}\n\nfunction getLineupsTeamIds(payload) {\n    const availableIds = Array.isArray(payload?.teamIds)\n        ? payload.teamIds.map(id => Number(id))\n        : Object.keys(payload?.teams || {}).map(id => Number(id));\n    const standardOrder = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 32];\n\n    const standingsRows = Array.isArray(payload?.previousSeasonStandings)\n        ? payload.previousSeasonStandings\n        : [];\n\n    const standingsOrder = standingsRows\n        .map((row) => Number(Array.isArray(row) ? row[0] : (row?.teamId ?? row?.TeamID)))\n        .filter((teamId) => !Number.isNaN(teamId) && availableIds.includes(teamId));\n\n    const uniqueStandingsOrder = [...new Set(standingsOrder)];\n    const fallbackOrder = standardOrder.filter((id) => availableIds.includes(id) && !uniqueStandingsOrder.includes(id));\n\n    return [...uniqueStandingsOrder, ...fallbackOrder];\n}\n\nfunction buildFallbackLogo(teamId) {\n    const logo = document.createElement(\"img\");\n    logo.src = logos_disc[teamId] || \"../assets/images/logos/placeholder.png\";\n    logo.className = \"standardlogo\";\n    return logo;\n}\n\nfunction getTeamTemplateById(teamId) {\n    const staffSection = document.querySelector(`.staff-section[data-teamid=\"${teamId}\"]`);\n    return staffSection ? staffSection.closest(\".team-template\") : null;\n}\n\nfunction createTeamLogoNode(teamId) {\n    const logoContainer = document.createElement(\"div\");\n    logoContainer.classList.add(\"lineups-team-logo\");\n\n    const teamTemplate = getTeamTemplateById(teamId);\n    const sourceLogo = teamTemplate?.querySelector(\".new-logo-and-name\")?.children?.[0];\n\n    if (sourceLogo) {\n        logoContainer.appendChild(sourceLogo.cloneNode(true));\n    } else {\n        logoContainer.appendChild(buildFallbackLogo(teamId));\n    }\n\n    return logoContainer;\n}\n\nfunction getTeamNameForLineup(teamId, teamInfo) {\n    const teamTemplate = getTeamTemplateById(teamId);\n    const templateName = teamTemplate?.querySelector(\".team-name\")?.textContent?.trim();\n    if (templateName && templateName.length > 0) return templateName;\n    if (teamInfo?.name) return teamInfo.name;\n    return combined_dict[teamId] || \"Unknown Team\";\n}\n\nfunction normalizeDriverNumber(value) {\n    const parsed = Number(value);\n    return !Number.isNaN(parsed) && parsed > 0 ? Math.trunc(parsed) : null;\n}\n\nfunction getDriverSeatPriority(driver, seasonType) {\n    let priority = 0;\n    const contractType = Number(driver?.contractType);\n    if (seasonType === \"next\" && contractType === 3) priority += 100;\n    if (contractType === 0) priority += 50;\n    if (driver?.isForNextSeason) priority += 20;\n    if (normalizeDriverNumber(driver?.driverNumber) != null) priority += 1;\n    return priority;\n}\n\nfunction getLineupDriversBySeat(teamInfo, seasonType) {\n    const sourceDrivers = seasonType === \"next\"\n        ? (teamInfo?.driversNextSeason || [])\n        : (teamInfo?.driversThisSeason || []);\n\n    const slots = [null, null];\n    const priorities = [-Infinity, -Infinity];\n    const overflow = [];\n\n    sourceDrivers.forEach((driver) => {\n        const seat = Number(driver?.posInTeam);\n        if (seat === 1 || seat === 2) {\n            const idx = seat - 1;\n            const nextPriority = getDriverSeatPriority(driver, seasonType);\n            if (slots[idx] == null || nextPriority > priorities[idx]) {\n                slots[idx] = driver;\n                priorities[idx] = nextPriority;\n            }\n            return;\n        }\n        overflow.push(driver);\n    });\n\n    for (let idx = 0; idx < 2; idx++) {\n        if (!slots[idx] && overflow.length > 0) {\n            slots[idx] = overflow.shift();\n        }\n    }\n\n    return slots.map((driver, idx) => driver || { name: \"TBD\", posInTeam: idx + 1 });\n}\n\nfunction createLineupDriverRows(teamInfo, seasonType) {\n    const rows = document.createElement(\"div\");\n    rows.classList.add(\"lineups-team-drivers\");\n    const drivers = getLineupDriversBySeat(teamInfo, seasonType);\n\n    drivers.forEach((driver) => {\n        const line = document.createElement(\"div\");\n        line.classList.add(\"lineups-team-driver\");\n        if (seasonType === \"next\" && driver?.isForNextSeason) {\n            line.classList.add(\"next-contract\");\n        }\n\n        const driverNumber = normalizeDriverNumber(driver?.driverNumber);\n        if (driverNumber != null) {\n            const numberMark = document.createElement(\"span\");\n            numberMark.classList.add(\"lineups-driver-number\");\n            numberMark.textContent = String(driverNumber);\n            line.appendChild(numberMark);\n        }\n\n        const rawName = (driver?.name || \"TBD\").trim();\n        if (rawName === \"TBD\") {\n            const last = document.createElement(\"span\");\n            last.classList.add(\"lineups-driver-last\", \"bold-font\", \"to-be-decided\");\n            last.textContent = \"TBD\";\n            line.appendChild(last);\n            rows.appendChild(line);\n            return;\n        }\n\n        const parts = rawName.split(/\\s+/);\n        const surname = parts.pop() || \"\";\n        const firstNames = parts.join(\" \");\n\n        if (firstNames) {\n            const first = document.createElement(\"span\");\n            first.classList.add(\"lineups-driver-first\");\n            first.textContent = firstNames;\n            line.appendChild(first);\n        }\n\n        const last = document.createElement(\"span\");\n        last.classList.add(\"lineups-driver-last\", \"bold-font\");\n        last.textContent = surname.toUpperCase();\n        line.appendChild(last);\n\n        rows.appendChild(line);\n    });\n\n    return rows;\n}\n\nfunction buildLineupCard(teamId, teamInfo, seasonType) {\n    const card = document.createElement(\"div\");\n    card.classList.add(\"lineups-team-card\");\n    if (teamId === 32) {\n        card.classList.add(\"lineups-custom-team\");\n    }\n    const accentByTeamId = {\n        1: \"var(--ferrari-primary)\",\n        2: \"var(--mclaren-primary)\",\n        3: \"var(--redbull-primary)\",\n        4: \"var(--mercedes-primary)\",\n        5: \"var(--alpine-primary)\",\n        6: \"var(--williams-primary)\",\n        7: \"var(--haas-primary)\",\n        8: \"var(--alphatauri-primary)\",\n        9: \"var(--alfa-primary)\",\n        10: \"var(--aston-primary)\",\n        32: \"var(--custom-team-primary)\"\n    };\n    card.style.setProperty(\"--lineup-accent\", accentByTeamId[teamId] || \"var(--new-primary)\");\n\n    const header = document.createElement(\"div\");\n    header.classList.add(\"lineups-team-header\");\n\n    const teamName = document.createElement(\"div\");\n    teamName.classList.add(\"lineups-team-name\", \"bold-font\");\n    const lineupTeamName = getTeamNameForLineup(teamId, teamInfo);\n    teamName.textContent = lineupTeamName;\n\n    header.appendChild(teamName);\n    header.appendChild(createTeamLogoNode(teamId));\n\n    card.appendChild(header);\n    card.appendChild(createLineupDriverRows(teamInfo, seasonType));\n\n    return card;\n}\n\nfunction computeLineupPositions(teamIds, width, height) {\n    const positions = new Map();\n    const hasCenterBottomTeam = teamIds.length % 2 === 1;\n    const centerBottomTeamId = hasCenterBottomTeam ? teamIds[teamIds.length - 1] : null;\n    const pairedTeams = hasCenterBottomTeam ? teamIds.slice(0, -1) : teamIds.slice();\n    // Alternate by standings rank: 1st left, 2nd right, 3rd left, 4th right, ...\n    const leftTeams = pairedTeams.filter((_, idx) => idx % 2 === 0);\n    const rightTeams = pairedTeams.filter((_, idx) => idx % 2 === 1);\n    const topY = height * 0.06;\n    const bottomY = hasCenterBottomTeam ? (height * 0.80) : (height * 0.90);\n\n    const buildYPositions = (count) => {\n        if (count <= 0) return [];\n        if (count === 1) return [height * 0.5];\n        const step = (bottomY - topY) / (count - 1);\n        return Array.from({ length: count }, (_, i) => topY + (i * step));\n    };\n\n    const placeColumn = (teamsInColumn, side) => {\n        const yPositions = buildYPositions(teamsInColumn.length);\n        const baseX = side === \"left\" ? (width * 0.23) : (width * 0.77);\n        const outwardShift = width * 0.23;\n        const cardHalfWidth = width <= 900 ? 98 : (width <= 1200 ? 121 : 132);\n        const denom = Math.max(1, teamsInColumn.length - 1);\n\n        const getArcStrength = (idx) => {\n            // Hand-tuned 5-row profile: tighter top pair, strong middle opening,\n            // and configurable bottom pair spacing when there is a bottom-center team.\n            if (teamsInColumn.length === 5) {\n                if (hasCenterBottomTeam) {\n                    // Wider bottom spread to leave cleaner space for team 11 in the center.\n                    return [-0.7, -0.1, 0.3, 0.1, -0.3][idx];\n                }\n                // Standard saves: bottom pair spacing mirrors top pair spacing.\n                return [-0.6, -0.1, 0.2, -0.1, -0.6][idx];\n            }\n\n            const t = idx / denom;\n            const arcBase = 1 - (Math.abs(t - 0.5) * 2);\n            return Math.max(0, arcBase);\n        };\n\n        teamsInColumn.forEach((teamId, idx) => {\n            const arcStrength = getArcStrength(idx);\n            const x = side === \"left\"\n                ? (baseX - outwardShift * arcStrength)\n                : (baseX + outwardShift * arcStrength);\n\n            const clampedX = side === \"left\"\n                ? Math.max(cardHalfWidth + 12, x)\n                : Math.min(width - cardHalfWidth - 12, x);\n\n            positions.set(teamId, {\n                x: clampedX,\n                y: yPositions[idx]\n            });\n        });\n    };\n\n    placeColumn(leftTeams, \"left\");\n    placeColumn(rightTeams, \"right\");\n\n    if (centerBottomTeamId != null) {\n        positions.set(centerBottomTeamId, {\n            x: width * 0.5,\n            y: height * 0.91\n        });\n    }\n\n    return positions;\n}\n\nfunction updateLineupPillLabels(season) {\n    if (lineupsCurrentPill) {\n        const label = lineupsCurrentPill.querySelector(\".lineups-pill-label\");\n        if (label) label.textContent = `${season}`;\n    }\n    if (lineupsNextPill) {\n        const label = lineupsNextPill.querySelector(\".lineups-pill-label\");\n        if (label) label.textContent = `${season + 1}`;\n    }\n}\n\nfunction renderLineupsCircle() {\n    if (!lineupsCircle || !lineupsData) return;\n\n    lineupsCircle.innerHTML = \"\";\n    const teamIds = getLineupsTeamIds(lineupsData);\n\n    if (teamIds.length === 0) {\n        return;\n    }\n\n    const rect = lineupsCircle.getBoundingClientRect();\n    if (rect.width <= 0 || rect.height <= 0) return;\n\n    const positions = computeLineupPositions(teamIds, rect.width, rect.height);\n    const teams = lineupsData.teams || {};\n    const centerTitle = document.createElement(\"div\");\n    centerTitle.classList.add(\"lineups-center-title\");\n    const displaySeason = getLineupsDisplaySeason();\n    const yearText = displaySeason > 0 ? `${displaySeason}` : \"F1\";\n    centerTitle.innerHTML = `\n        <span class=\"lineups-center-year\">${yearText}</span>\n        <span class=\"lineups-center-label\">DRIVER</span>\n        <span class=\"lineups-center-label lineups\">LINE UPS</span>\n    `;\n    lineupsCircle.appendChild(centerTitle);\n\n    teamIds.forEach((teamId) => {\n        const teamInfo = teams[teamId] || teams[String(teamId)] || {};\n        const card = buildLineupCard(teamId, teamInfo, lineupsSeasonType);\n        const pos = positions.get(teamId);\n        if (!pos) return;\n        card.style.left = `${pos.x}px`;\n        card.style.top = `${pos.y}px`;\n        lineupsCircle.appendChild(card);\n    });\n\n}\n\nfunction renderLineupsAfterLayout() {\n    requestAnimationFrame(() => {\n        renderLineupsCircle();\n    });\n}\n\nfunction refreshLineupsCircleAfterTeamReplace() {\n    if (!lineupsView || lineupsView.classList.contains(\"d-none\")) return;\n    if (!lineupsCircle || !lineupsData) return;\n    renderLineupsAfterLayout();\n}\n\ndocument.addEventListener(\"teamsReplaced\", function () {\n    refreshLineupsCircleAfterTeamReplace();\n});\n\nasync function fetchLineupsData() {\n    const command = new Command(\"lineupsRequest\", {});\n    const response = await command.promiseExecute();\n    lineupsData = response.content || null;\n    return lineupsData;\n}\n\nfunction closeLineupsView() {\n    if (!lineupsView || !transfersMainLayout) return;\n    lineupsView.classList.add(\"d-none\");\n    transfersMainLayout.classList.remove(\"d-none\");\n    lineupsSeasonPillsTop?.classList.add(\"d-none\");\n    setLineupsButtonState(false);\n}\n\nasync function openLineupsView() {\n    if (!lineupsView || !transfersMainLayout) return;\n\n    setLineupsButtonState(true);\n    transfersMainLayout.classList.add(\"d-none\");\n    lineupsView.classList.remove(\"d-none\");\n    lineupsSeasonPillsTop?.classList.remove(\"d-none\");\n\n    try {\n        const payload = await fetchLineupsData();\n        const season = Number(payload?.season) || Number(currentSeason) || 0;\n        if (season > 0) {\n            updateLineupPillLabels(season);\n        }\n        setLineupsSeasonPillActive(\"current\");\n        renderLineupsAfterLayout();\n    } catch (err) {\n        console.error(\"Error fetching line ups:\", err);\n    }\n}\n\nlineupsViewButton?.addEventListener(\"click\", async function () {\n    const isClosed = lineupsView?.classList.contains(\"d-none\");\n    if (isClosed) {\n        await openLineupsView();\n    } else {\n        closeLineupsView();\n    }\n});\n\n[lineupsCurrentPill, lineupsNextPill].forEach((pill) => {\n    pill?.addEventListener(\"click\", function () {\n        const seasonType = pill.dataset.seasonType;\n        if (!seasonType) return;\n        setLineupsSeasonPillActive(seasonType);\n        renderLineupsCircle();\n    });\n});\n\nwindow.addEventListener(\"resize\", function () {\n    if (lineupsView && !lineupsView.classList.contains(\"d-none\")) {\n        renderLineupsAfterLayout();\n    }\n});\n\nfunction hire_modal_standars() {\n    document.querySelector(\".add-contract\").classList.add(\"d-none\")\n    document.querySelector(\"#futureContractTitle\").classList.add(\"d-none\")\n    document.querySelector(\"#futureContractOptions\").classList.add(\"d-none\")\n    document.querySelector(\"#juniorContractDropdown\").classList.add(\"d-none\")\n    document.querySelector(\"#contractPills\").classList.add(\"d-none\")\n    document.getElementById(\"currentContract\").innerText = getUpdatedName(inverted_dict[teamDestiniy]).toUpperCase()\n    document.getElementById(\"currentContract\").className = \"team-contract engine-\" + team_dict[inverted_dict[teamDestiniy]]\n}\n\n\n/**\n * Manages the interaction to drag drivers\n */\ninteract('.free-driver').draggable({\n    inertia: true,\n    listeners: {\n        start(event) {\n            originalParent = event.target.parentNode;\n            if (originalParent.className != \"main-columns-drag-section\") {\n                if (originalParent.classList.contains(\"affiliates-space\")) {\n                    teamOrigin = originalParent.parentNode.parentNode\n                }\n                else {\n                    teamOrigin = originalParent.parentNode\n                }\n            }\n            else {\n                teamOrigin = originalParent\n            }\n            draggable = event.target;\n            let target = event.target;\n            let position = target.getBoundingClientRect();\n            let width = target.getBoundingClientRect().width\n            target.style.width = width + \"px\";\n            target.style.position = \"fixed\";\n            target.style.top = position.top + \"px\";\n            target.style.left = position.left + \"px\"; // Añadir esta línea para manejar la posición izquierda\n        },\n        move(event) {\n            const target = event.target;\n            const x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx;\n            const y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;\n\n            target.style.transform = `translate(${x}px, ${y}px)`;\n            target.style.opacity = 1;\n            target.style.zIndex = 10;\n\n            target.setAttribute('data-x', x);\n            target.setAttribute('data-y', y);\n        },\n        end(event) {\n            let target = event.target;\n            target.style.position = \"relative\";\n            target.style.top = \"auto\";\n            target.style.left = \"auto\"; // Resetear la posición izquierda\n            target.style.width = \"auto\";\n            target.style.transform = 'none';\n            target.style.zIndex = 1;\n            target.setAttribute('data-x', 0);\n            target.setAttribute('data-y', 0);\n            //is driver\n            if (event.target.parentNode.classList.contains(\"driver-space\") | event.target.parentNode.classList.contains(\"affiliates-space\") | event.target.parentNode.id === \"free-drivers\") {\n                let freeDrivers = document.getElementById('free-drivers');\n                let freeRect = freeDrivers.getBoundingClientRect();\n\n                let driverSpaceElements = document.querySelectorAll('.driver-space');\n                driverSpaceElements.forEach(function (element) {\n                    let rect = element.getBoundingClientRect();\n                    if (event.clientX >= rect.left && event.clientX <= rect.right &&\n                        event.clientY >= rect.top && event.clientY <= rect.bottom) {\n                        if (element.classList.contains(\"affiliates-space\") && game_version === 2024) {\n                            posInTeam = 3 + element.childElementCount\n                            teamDestiniy = element.parentNode.parentNode.dataset.team\n                            destinationParent = element;\n                            element.appendChild(target)\n                            originalTeamId = parseInt(target.dataset.teamid)\n                            target.dataset.teamid = inverted_dict[teamDestiniy]\n                            updateColor(target)\n                            document.getElementById(\"contractModalTitle\").innerText = target.innerText + \"'s contract with \" + name_dict[teamDestiniy];\n                            if (autoContractToggle.checked) {\n                                if ((game_version === 2024) && (originalParent.className === \"driver-space\" | originalParent.classList.contains(\"affiliates-space\"))) {\n                                    signDriver(\"fireandhire\")\n                                }\n                                signDriver(\"autocontract\")\n                            }\n                            else {\n                                modalType = \"hire\"\n                                hire_modal_standars()\n                                manage_modal_driver_staff(\"driver\")\n                                myModal.show()\n                            }\n                            if (target.querySelector(\".custom-icon\") === null) {\n                                addIcon(target)\n                            }\n                        }\n                        else {\n                            if (element.childElementCount < 1) {\n                                posInTeam = element.id.charAt(2)\n                                teamDestiniy = element.parentNode.dataset.team\n                                destinationParent = element;\n                                element.appendChild(target);\n                                originalTeamId = parseInt(target.dataset.teamid)\n                                target.dataset.teamid = inverted_dict[teamDestiniy]\n                                updateColor(target)\n                                document.getElementById(\"contractModalTitle\").innerText = target.innerText + \"'s contract with \" + name_dict[teamDestiniy];\n                                if (autoContractToggle.checked) {\n                                    if ((game_version === 2023 && (f2_teams.includes(originalTeamId) | f3_teams.includes(originalTeamId) | originalParent.className === \"driver-space\" | originalParent.classList.contains(\"affiliates-space\"))) ||\n                                        (game_version === 2024) && (f2_teams.includes(originalTeamId) | f3_teams.includes(originalTeamId) | originalParent.className === \"driver-space\" | originalParent.classList.contains(\"affiliates-space\"))) {\n                                        signDriver(\"fireandhire\")\n                                    }\n                                    signDriver(\"autocontract\")\n                                }\n                                else {\n                                    modalType = \"hire\"\n                                    hire_modal_standars()\n                                    manage_modal_driver_staff(\"driver\")\n                                    myModal.show()\n                                }\n                                if (target.querySelector(\".custom-icon\") === null) {\n                                    addIcon(target)\n                                }\n\n                            }\n                            else if (element.childElementCount == 1) {\n                                if (originalParent.classList.contains(\"driver-space\")) {\n                                    driver1 = target;\n                                    driver2 = element.firstChild;\n                                    let team1 = driver1.parentNode.parentNode\n                                    let team2 = driver2.parentNode.parentNode\n                                    driver1.dataset.teamid = inverted_dict[team2.dataset.team]\n                                    updateColor(driver1)\n                                    driver2.dataset.teamid = inverted_dict[team1.dataset.team]\n                                    updateColor(driver2)\n                                    if (driver1 !== driver2) {\n                                        let data = {\n                                            driver1ID: target.dataset.driverid,\n                                            driver2ID: element.firstChild.dataset.driverid,\n                                            driver1: make_name_prettier(target.innerText),\n                                            driver2: make_name_prettier(element.firstChild.innerText),\n                                        }\n\n                                        const command = new Command(\"swapDrivers\", data);\n                                        command.execute();\n                                        manage_swap()\n                                    }\n\n                                }\n\n                            }\n                        }\n                    }\n                });\n\n                if (event.clientX >= freeRect.left && event.clientX <= freeRect.right &&\n                    event.clientY >= freeRect.top && event.clientY <= freeRect.bottom) {\n                    if (target.querySelector(\".custom-icon\") !== null) {\n                        draggable.removeChild(draggable.querySelector(\".custom-icon\"))\n                    }\n                    if (originalParent.id !== \"free-drivers\") {\n                        originalParent.removeChild(draggable);\n                        originalTeamId = parseInt(target.dataset.teamid)\n                        draggable.dataset.teamid = 0\n                        updateColor(draggable)\n                        freeDrivers.appendChild(target);\n                        let data = {\n                            driverID: draggable.dataset.driverid,\n                            driver: make_name_prettier(draggable.innerText),\n                            team: getUpdatedName(inverted_dict[teamOrigin.dataset.team]),\n                            teamID: originalTeamId\n                        }\n                        if (!data[\"team\"]) {\n                            if (f2_teams.includes(originalTeamId)) {\n                                data[\"team\"] = \"F2\"\n                            }\n                            else if (f3_teams.includes(originalTeamId)) {\n                                data[\"team\"] = \"F3\"\n                            }\n                        }\n                        const command = new Command(\"fireDriver\", data);\n                        command.execute();\n                    }\n                }\n            }\n            //is staff\n            else if (event.target.parentNode.classList.contains(\"staff-space\") | event.target.parentNode.id === \"free-staff\") {\n                let tfreeStaff = document.getElementById('free-staff');\n                let staffRect = tfreeStaff.getBoundingClientRect();\n                let staffSpaceElements = document.querySelectorAll('.staff-space');\n                staffSpaceElements.forEach(function (element) {\n                    let rect = element.getBoundingClientRect();\n                    if (event.clientX >= rect.left && event.clientX <= rect.right &&\n                        event.clientY >= rect.top && event.clientY <= rect.bottom) {\n                        if (element.dataset.type === event.target.dataset.type) {\n                            if (element.childElementCount < 1) {\n                                posInTeam = element.dataset.pos\n                                teamDestiniy = element.parentNode.dataset.team\n                                destinationParent = element;\n                                element.appendChild(target);\n                                originalTeamId = parseInt(target.dataset.teamid)\n                                target.dataset.teamid = inverted_dict[teamDestiniy]\n                                updateColor(target)\n                                document.getElementById(\"contractModalTitle\").innerText = target.innerText + \"'s contract with \" + name_dict[teamDestiniy];\n                                if (autoContractToggle.checked) {\n                                    if ((game_version === 2023 && (f2_teams.includes(originalTeamId) | f3_teams.includes(originalTeamId) | originalParent.className === \"staff-space\")) ||\n                                        (game_version === 2024) && (f2_teams.includes(originalTeamId) | f3_teams.includes(originalTeamId) | originalParent.className === \"staff-space\")) {\n                                        signDriver(\"fireandhire\")\n                                    }\n                                    signDriver(\"autocontract\")\n                                }\n                                else {\n                                    modalType = \"hire\"\n                                    hire_modal_standars()\n                                    if (event.target.dataset.type === \"race-engineer\") {\n                                        manage_modal_driver_staff(\"race-engineer\")\n                                    }\n                                    else {\n                                        manage_modal_driver_staff(\"staff\")\n                                    }\n                                    myModal.show()\n                                }\n                                if (target.querySelector(\".custom-icon\") === null) {\n                                    addIcon(target)\n                                }\n                            }\n                            else if (element.childElementCount == 1) {\n                                if (originalParent.classList.contains(\"staff-space\")) {\n                                    driver1 = target;\n                                    driver2 = element.firstChild;\n                                    let team1 = driver1.parentNode.parentNode\n                                    let team2 = driver2.parentNode.parentNode\n                                    driver1.dataset.teamid = inverted_dict[team2.dataset.team]\n                                    updateColor(driver1)\n                                    driver2.dataset.teamid = inverted_dict[team1.dataset.team]\n                                    updateColor(driver2)\n                                    if (driver1 !== driver2) {\n                                        let data = {\n                                            driver1ID: target.dataset.driverid,\n                                            driver2ID: element.firstChild.dataset.driverid,\n                                            driver1: target.innerText,\n                                            driver2: element.firstChild.innerText,\n                                        }\n\n                                        const command = new Command(\"swapDrivers\", data);\n                                        command.execute();\n                                        manage_swap()\n                                    }\n\n                                }\n\n                            }\n                        }\n                        else {\n                            update_notifications(\"You can't change staff from different positions\", \"lighterror\")\n                        }\n\n                    }\n                });\n\n                if (event.clientX >= staffRect.left && event.clientX <= staffRect.right &&\n                    event.clientY >= staffRect.top && event.clientY <= staffRect.bottom) {\n                    if (target.querySelector(\".custom-icon\") !== null) {\n                        draggable.removeChild(draggable.querySelector(\".custom-icon\"))\n                    }\n                    if (originalParent.id !== \"free-staff\") {\n                        originalParent.removeChild(draggable);\n                        originalTeamId = parseInt(target.dataset.teamid)\n                        draggable.dataset.teamid = 0\n                        updateColor(draggable)\n                        tfreeStaff.appendChild(target);\n                        let data = {\n                            driverID: draggable.dataset.driverid,\n                            driver: make_name_prettier(draggable.innerText),\n                            team: getUpdatedName(inverted_dict[teamOrigin.dataset.team]),\n                            teamID: originalTeamId\n                        }\n                        if (!data[\"team\"]) {\n                            if (f2_teams.includes(originalTeamId)) {\n                                data[\"team\"] = \"F2\"\n                            }\n                            else if (f3_teams.includes(originalTeamId)) {\n                                data[\"team\"] = \"F3\"\n                            }\n                        }\n                        const command = new Command(\"fireDriver\", data);\n                        command.execute();\n                    }\n                }\n            }\n\n        }\n    }\n});\n"
  },
  {
    "path": "src/styles.css",
    "content": "@font-face {\n  font-family: 'Formula1';\n  src: url(\"../assets/fonts/Formula1-Regular.ttf\") format('truetype');\n}\n\n@font-face {\n  font-family: 'Formula1Bold';\n  src: url(\"../assets/fonts/Formula1-Bold.ttf\") format('truetype');\n}\n\n@font-face {\n  font-family: 'NumbersFont';\n  src: url(\"../assets/fonts/NumbersRegular.otf\") format('opentype');\n}\n\n@font-face {\n  font-family: 'NumbersBold';\n  src: url(\"../assets/fonts/NumbersBold.otf\") format('opentype');\n}\n\n@font-face {\n  font-family: 'Formula1Dark';\n  src: url(\"../assets/fonts/Formula1-Display-Black.ttf\") format('truetype');\n}\n\n.bold-font {\n  font-family: 'Formula1Bold' !important;\n}\n\n.numbersFont {\n  font-family: 'NumbersFont' !important;\n}\n\nhtml {\n  background-color: var(--background, #111111);\n}\n\nbody {\n  background-color: var(--background) !important;\n  height: 100vh;\n  overflow-x: hidden;\n  transition: border-color 0.15s, box-shadow 0.15s, background-color 0.15s;\n}\n\n\n\n.font {\n  font-family: 'Formula1';\n}\n\n#byname {\n  text-decoration: none;\n  color: var(--separator);\n  transition: color 0.15s;\n}\n\nbody.og-theme .footer {\n  border-top: 1px solid var(--slight-contrast);\n}\n\n.footer {\n  position: fixed;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  background-color: transparent;\n  color: var(--dark-text);\n  text-align: center;\n  padding: 5px 0;\n  font-size: 16px;\n  z-index: 200;\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  max-height: 35px;\n  overflow-y: clip;\n  border-top-left-radius: 10px;\n  border-top-right-radius: 10px;\n  transition: opacity 0.15s, transform 0.15s;\n}\n\n.scroll-wrapper {\n  overflow-y: auto;\n  height: 92%;\n}\n\n.scroll-wrapper::-webkit-scrollbar {\n  width: 6px;\n}\n\n.scroll-wrapper::-webkit-scrollbar-thumb {\n  background-color: var(--white-general);\n  border-radius: 6px;\n}\n\n#free-drivers::-webkit-scrollbar,\n#free-staff::-webkit-scrollbar {\n  width: 4px !important;\n  margin-left: 4px;\n}\n\n#free-drivers::-webkit-scrollbar-thumb,\n#free-staff::-webkit-scrollbar-thumb {\n  background-color: var(--white-general);\n  border-radius: 3px !important;\n}\n\n#free-drivers::-webkit-scrollbar-thumb:hover,\n#free-staff::-webkit-scrollbar-thumb:hover {\n  background-color: var(--scrollbar-hover);\n}\n\n.socials a,\n.footer i {\n  cursor: pointer !important;\n  padding: 0 7px;\n  transition: color 0.15s;\n  color: var(--dark-text);\n  text-decoration: none;\n}\n\nbody.og-theme .socials a,\nbody.og-theme .footer i {\n  color: var(--footer-og);\n}\n\n\n.save-info {\n  display: flex;\n  justify-content: center;\n  cursor: default;\n  position: absolute;\n  left: 50%;\n  transform: translateX(-50%);\n}\n\n.socials {\n  display: flex;\n  justify-content: start;\n}\n\n.save-button {\n  position: fixed;\n  bottom: 60px;\n  right: -146px;\n  z-index: 1000;\n  padding: 13px 25px 13px 15px;\n  background-color: var(--text-general);\n  color: var(--negative-text);\n  border: none;\n  border-radius: 5px;\n  cursor: pointer;\n  transition: right 0.15s, background-color 0.15s, color 0.15s;\n  border-radius: 10px;\n  font-size: 18px;\n  box-shadow: var(--shadow-m);\n}\n\n.save-button:active {\n  transform: scale(0.95);\n  /* Ajusta esto a tu gusto */\n  box-shadow: inset 0 2px 5px rgba(0, 0, 0, 0.2);\n}\n\n@keyframes slideAndColorChange {\n  0% {\n    right: -146px;\n    background-color: var(--text-general);\n  }\n\n  10% {\n    right: -17px;\n    background-color: var(--new-primary);\n    box-shadow: 0 0 8px var(--new-primary);\n  }\n\n  45% {\n    right: -17px;\n    background-color: var(--new-primary);\n    box-shadow: 0 0 8px var(--new-primary);\n  }\n\n  55% {\n    right: -17px;\n    background-color: var(--new-secondary);\n    box-shadow: 0 0 8px var(--new-secondary);\n  }\n\n  90% {\n    right: -17px;\n    background-color: var(--new-secondary);\n    box-shadow: 0 0 8px var(--new-secondary);\n  }\n\n  100% {\n    right: -146px;\n    background-color: var(--text-general);\n  }\n}\n\n.save-button.first-show {\n  animation: slideAndColorChange 3s forwards;\n}\n\nbody.og-theme .important-text {\n  color: var(--new-secondary);\n}\n\n.important-text {\n  color: var(--new-primary-dark);\n}\n\n.patreon-changes-text {\n  display: flex;\n  flex-direction: column;\n  gap: 10px;\n}\n\n.patreon-text {\n  color: var(--support-me);\n}\n\n.patreon-paragraph {\n  display: flex;\n  flex-direction: column;\n  gap: 10px;\n}\n\n/* Developer tools (localhost only) */\n.devtools-window {\n  position: fixed;\n  left: 50%;\n  top: 50%;\n  transform: translate(-50%, -50%);\n  width: min(380px, calc(100vw - 28px));\n  min-height: 220px;\n  background:\n    linear-gradient(180deg, rgba(18, 22, 34, 0.96), rgba(7, 11, 18, 0.96)),\n    radial-gradient(circle at top right, rgba(76, 201, 240, 0.12), transparent 38%);\n  border: 1px solid rgba(125, 249, 255, 0.18);\n  border-radius: 18px;\n  padding: 14px;\n  color: #d9fdf6;\n  box-shadow:\n    0 24px 80px rgba(0, 0, 0, 0.55),\n    0 0 0 1px rgba(255, 255, 255, 0.03) inset,\n    0 0 28px rgba(0, 255, 179, 0.08);\n  z-index: 6000;\n  display: none;\n  overflow: hidden;\n  backdrop-filter: blur(18px);\n  font-family: \"Cascadia Code\", \"Fira Code\", \"JetBrains Mono\", \"Consolas\", \"Courier New\", monospace;\n}\n\n.devtools-window::before {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  background:\n    linear-gradient(90deg, rgba(0, 255, 179, 0.08), transparent 30%, transparent 70%, rgba(122, 92, 255, 0.08)),\n    repeating-linear-gradient(180deg, rgba(255, 255, 255, 0.03) 0 1px, transparent 1px 4px);\n  opacity: 0.8;\n  pointer-events: none;\n}\n\n.devtools-window::after {\n  content: \"\";\n  position: absolute;\n  inset: 1px;\n  border-radius: 17px;\n  border: 1px solid rgba(255, 255, 255, 0.05);\n  pointer-events: none;\n}\n\n.devtools-window.show {\n  display: block;\n}\n\n.devtools-header {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  cursor: move;\n  user-select: none;\n  margin-bottom: 14px;\n  padding-bottom: 12px;\n  border-bottom: 1px solid rgba(125, 249, 255, 0.12);\n  position: relative;\n  z-index: 1;\n}\n\n.devtools-window.dragging {\n  user-select: none;\n  box-shadow:\n    0 30px 90px rgba(0, 0, 0, 0.65),\n    0 0 40px rgba(0, 255, 179, 0.12);\n}\n\n.devtools-chrome {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n}\n\n.devtools-dot {\n  width: 9px;\n  height: 9px;\n  border-radius: 50%;\n  box-shadow: 0 0 12px currentColor;\n}\n\n.devtools-dot.is-red {\n  color: #ff5f57;\n  background: #ff5f57;\n}\n\n.devtools-dot.is-yellow {\n  color: #febc2e;\n  background: #febc2e;\n}\n\n.devtools-dot.is-green {\n  color: #28c840;\n  background: #28c840;\n}\n\n.devtools-title {\n  font-size: 15px;\n  font-weight: 700;\n  letter-spacing: 0.22em;\n  color: #f5fffd;\n  text-shadow: 0 0 14px rgba(0, 255, 179, 0.2);\n}\n\n.devtools-status {\n  margin-left: auto;\n  color: rgba(140, 250, 223, 0.72);\n  font-size: 11px;\n  letter-spacing: 0.12em;\n}\n\n.devtools-close {\n  border: 1px solid rgba(255, 95, 87, 0.25);\n  background: rgba(255, 95, 87, 0.12);\n  color: #ffd8d5;\n  font-size: 18px;\n  line-height: 1;\n  width: 34px;\n  height: 34px;\n  border-radius: 10px;\n  padding: 0;\n  cursor: pointer;\n  transition: transform 0.14s ease, background-color 0.14s ease, border-color 0.14s ease, box-shadow 0.14s ease;\n  position: relative;\n  z-index: 2;\n}\n\n.devtools-close:hover {\n  background: rgba(255, 95, 87, 0.2);\n  border-color: rgba(255, 95, 87, 0.45);\n  box-shadow: 0 0 18px rgba(255, 95, 87, 0.18);\n}\n\n.devtools-close:active {\n  transform: scale(0.95);\n}\n\n.devtools-close:focus-visible {\n  outline: 1px solid rgba(255, 255, 255, 0.28);\n  outline-offset: 2px;\n}\n\n.devtools-body {\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n  position: relative;\n  z-index: 1;\n}\n\n.devtools-hint {\n  padding: 10px 12px;\n  border-radius: 12px;\n  background: rgba(255, 255, 255, 0.03);\n  border: 1px solid rgba(125, 249, 255, 0.08);\n  color: rgba(184, 255, 239, 0.78);\n  font-size: 12px;\n  letter-spacing: 0.08em;\n  text-transform: uppercase;\n}\n\n.devtools-action {\n  border: 1px solid rgba(125, 249, 255, 0.12);\n  border-radius: 14px;\n  padding: 14px 16px;\n  background:\n    linear-gradient(135deg, rgba(9, 28, 26, 0.92), rgba(20, 25, 44, 0.88));\n  color: #effffc;\n  cursor: pointer;\n  transition: transform 0.12s ease, border-color 0.16s ease, box-shadow 0.16s ease, background 0.16s ease;\n  text-align: left;\n  font-size: 13px;\n  font-weight: 600;\n  letter-spacing: 0.04em;\n  box-shadow:\n    inset 0 1px 0 rgba(255, 255, 255, 0.04),\n    0 10px 24px rgba(0, 0, 0, 0.22);\n}\n\n.devtools-action:hover {\n  border-color: rgba(125, 249, 255, 0.28);\n  background:\n    linear-gradient(135deg, rgba(13, 40, 37, 0.95), rgba(26, 32, 56, 0.92));\n  box-shadow:\n    inset 0 1px 0 rgba(255, 255, 255, 0.05),\n    0 0 24px rgba(0, 255, 179, 0.08),\n    0 12px 30px rgba(0, 0, 0, 0.28);\n}\n\n.devtools-action:active {\n  transform: translateY(1px) scale(0.99);\n}\n\n.devtools-action:disabled {\n  opacity: 0.65;\n  cursor: default;\n  box-shadow: none;\n}\n\n@media (max-width: 540px) {\n  .devtools-window {\n    left: 14px;\n    right: 14px;\n    top: 14px;\n    width: auto;\n    transform: none;\n  }\n\n  .devtools-header {\n    flex-wrap: wrap;\n  }\n\n  .devtools-status {\n    order: 4;\n    width: 100%;\n    margin-left: 0;\n  }\n}\n\n.patreon-plain-text {\n  color: var(--modal-text)\n}\n\n.patreon-perks {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: flex-start;\n}\n\n\n#patreonKeyGeneral {\n  margin-top: 10px;\n}\n\n.patreon-button {\n  display: flex;\n  flex-direction: row;\n  gap: 5px;\n  align-items: center;\n  transition: background-color 0.15s, color 0.15s;\n  padding: 8px 15px;\n  border-radius: 7px;\n  cursor: pointer;\n  width: max-content;\n  text-decoration: none;\n}\n\na:has(.patreon-button) {\n  text-decoration: none;\n}\n\n.patreon-button:hover {\n  background-color: var(--text-general);\n}\n\n.patreon-button:hover .patreon-button-text,\npatreon-button:active .patreon-button-text {\n  color: var(--negative-text);\n}\n\n.patreon-button:hover .patreon-button-logo,\n.patreon-button:active .patreon-button-logo {\n  background-color: var(--negative-text);\n}\n\n.patreon-button:active {\n  transform: scale(0.98);\n}\n\n.patreon-button-logo {\n  width: 1em;\n  height: 1em;\n  -webkit-mask: url('/assets/images/patreonLogo.svg') no-repeat center;\n  mask: url('/assets/images/patreonLogo.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--text-general);\n  transition: all 0.15s;\n}\n\n.patreon-button-text {\n  color: var(--text-general);\n  font-size: 18px;\n  text-transform: uppercase;\n  transition: all 0.15s;\n  text-decoration: none;\n}\n\n.perks-list {\n  display: flex;\n  flex-direction: column;\n  gap: 5px;\n}\n\n.danger-text {\n  color: var(--negative-general);\n}\n\n.save-button .save-label {\n  transition: opacity 0.15s;\n  cursor: pointer;\n}\n\n.save-button i {\n  transition: opacity 0.15s;\n  cursor: pointer;\n}\n\n.save-button .save-label {\n  opacity: 0;\n}\n\n.save.button i {\n  opacity: 1;\n}\n\n.save-button:hover i,\n.save-button.first-show i {\n  opacity: 0;\n}\n\n.save-button:hover .save-label,\n.save-button.first-show .save-label {\n  opacity: 1;\n}\n\n.save-button:hover {\n  right: -17px;\n  background-color: var(--new-primary);\n}\n\n.save-button i {\n  position: absolute;\n  left: 10px;\n  top: 50%;\n  transform: translateY(-50%);\n}\n\n.twenty-three,\n.twenty-four {\n  color: var(--dark-text);\n  transition: color 0.15s, border-color 0.15s;\n  width: 50px;\n  position: relative;\n}\n\n.twenty-three::before {\n  content: \"\";\n  display: block;\n  width: 100%;\n  height: 100%;\n  position: absolute;\n  top: 0;\n  left: 0;\n  background: radial-gradient(circle at 100% 180%, var(--new-secondary), transparent 70%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: -1;\n}\n\n.twenty-four::before {\n  content: \"\";\n  display: block;\n  width: 100%;\n  height: 100%;\n  position: absolute;\n  top: 0;\n  left: 0;\n  background: radial-gradient(circle at 0% 180%, var(--new-primary), transparent 70%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: -1;\n}\n\n.twenty-three {\n  border-right: 1px solid var(--dark-text);\n}\n\n.twenty-four {\n  border-left: 1px solid var(--dark-text);\n}\n\n.twenty-three.activated {\n  color: var(--text-general);\n  border-color: var(--new-secondary);\n}\n\n.twenty-four.activated {\n  color: var(--text-general);\n  border-color: var(--new-primary);\n}\n\n.twenty-three.activated::before {\n  opacity: 1;\n}\n\n.twenty-four.activated .front-gradient,\n.twenty-three.activated .front-gradient {\n  text-shadow: 0 0 5px black;\n}\n\n.twenty-four.activated::before {\n  opacity: 1;\n}\n\n.socials a:hover,\n.footer i:hover {\n  color: var(--dark-text);\n}\n\n.socials a {\n  display: inline-block;\n  overflow: hidden;\n  max-width: 27px;\n  white-space: nowrap;\n  transition: max-width 0.35s ease-in-out, color 0.15s;\n}\n\n.socials a:hover {\n  max-width: 240px;\n}\n\n.update-info {\n  transition: color 0.15s, opacity 0.15s;\n  text-decoration: none;\n  color: var(--dark-text);\n  cursor: default;\n  padding-right: 10px;\n}\n\n.update-info.hide {\n  opacity: 0;\n  width: 0;\n  padding-right: 0;\n}\n\n.update-info.hide::before {\n  width: 0;\n}\n\n.version-panel {\n  transition: border 0.15s, opacity 0.15s, color 0.15s, text-shadow 0.15s;\n  cursor: pointer;\n  padding: 0 5px;\n  border-left: 2px solid transparent;\n  background-color: var(--background);\n  z-index: 3;\n  will-change: border;\n}\n\n.version-panel.nightly {\n  color: var(--new-secondary) !important;\n}\n\n.version-panel.nightly:hover {\n  color: var(--text-selected-secondary) !important;\n}\n\n.status:has(.footer-notification.show) .version-panel {\n  border-left: 2px solid var(--separator);\n}\n\n.footer-notification {\n  transition: transform 0.22s ease-out, color 0.22s ease-out;\n  padding-right: 5px;\n  z-index: 1;\n  color: var(--positive-general);\n}\n\n.footer-notification.error {\n  color: var(--negative-general);\n}\n\n.footer-notification.error a {\n  color: color-mix(in srgb, var(--negative-general) 60%, white);\n}\n\n.footer-notification.error a:hover {\n  color: color-mix(in srgb, var(--negative-general) 80%, white);\n}\n\n.footer-notification:not(.show) {\n  transform: translateX(125%);\n}\n\n\n\n\n.version-panel:hover {\n  color: var(--text-selected);\n}\n\n.dev-console {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  background-color: var(--console-transparent);\n  color: var(--text-general);\n  border: none;\n  font-family: 'Courier New', Courier, monospace;\n  z-index: 1000;\n}\n\n.dev-console:focus-visible {\n  outline: none;\n}\n\n.bi-exclamation-diamond {\n  color: var(--negative-general);\n}\n\n.bi-exclamation-lg,\n.bi-cloud-download {\n  color: #d3d393;\n  cursor: pointer;\n}\n\n.bi-exclamation-lg:hover,\n.bi-cloud-download:hover {\n  color: #FFFF99;\n}\n\na.bi-reddit:hover {\n  color: var(--reddit);\n}\n\na.bi-twitter-x:hover,\n#byname:hover {\n  color: var(--twitter);\n}\n\na.bi-cup-hot-fill:hover {\n  color: var(--support-me);\n}\n\na.bi-discord:hover {\n  color: var(--discord);\n}\n\na.bi-linkedin:hover {\n  color: var(--new-secondary);\n}\n\na.bi-github:hover {\n  color: var(--new-primary);\n}\n\ni.bi-file-text:hover {\n  color: var(--white-general);\n}\n\n\n\n.status {\n  display: flex;\n  flex-direction: row;\n  justify-content: flex-end;\n}\n\n\n\n.awaiting {\n  color: var(--awaiting-color);\n}\n\n\n.rounded-checkbox {\n  display: inline-flex;\n  align-items: center;\n  cursor: pointer;\n  border-radius: 5px;\n  margin-top: 10px;\n  border: 1px solid #adb5bd;\n  min-width: 20px;\n  min-height: 20px;\n}\n\n.title {\n  text-align: center;\n  color: var(--white-general);\n  font-size: 26px;\n  padding: 5px 0 5px 0px;\n  flex: 1;\n}\n\n.title-buttons-left {\n  position: absolute;\n  gap: 10px;\n  padding-left: 14px;\n  display: flex;\n  align-items: center;\n}\n\n.stats-add-controls {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n}\n\n#addStaffButton {\n  white-space: nowrap;\n}\n\n.title-buttons-right {\n  position: absolute;\n  right: 0;\n  gap: 10px;\n  padding-right: 14px;\n  display: flex;\n  align-items: center;\n}\n\n.title-buttons-left .custom-dropdown {\n  margin: 0 !important;\n}\n\n.standings-list {\n  width: 65px;\n  text-align: center;\n}\n\n.standings-list-engine {\n  color: var(--engine-table-name);\n}\n\n.transfer-top-panel,\n.general-top-panel {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n\n.general-top-panel .custom-dropdown {\n  margin: 0 !important;\n}\n\n.transfer-title {\n  flex: 1;\n  text-align: center;\n}\n\n\n.add-contract {\n  border: 2px dashed var(--disabled-text);\n  color: var(--disabled-text);\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  justify-content: space-between;\n  border-radius: 8px;\n  transition: color 0.15s, border 0.15s, transform 0.15s;\n  padding: 8px;\n  font-size: 16px;\n}\n\n.add-contract.enabled {\n  border: 2px dashed var(--dark-text);\n  color: var(--dark-text);\n}\n\n.add-contract:not(.enabled) .button-with-icon {\n  pointer-events: none;\n}\n\n.add-contract.enabled .button-with-icon {\n  cursor: pointer;\n}\n\n\n#teamContractButton {\n  margin-top: 0 !important;\n}\n\n#futureContractTitle {\n  border-top: 2px solid var(--separator);\n}\n\n#yearMenu{\n  min-width: 140px;\n}\n\n.year-and-break {\n  display: flex;\n  flex-direction: row;\n  align-items: baseline;\n}\n\n.contract-title {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: center;\n  font-size: 20px;\n  font-family: 'Formula1Bold';\n  color: var(--white-general);\n  margin-bottom: 10px;\n}\n\n\n.auto-contract {\n  color: var(--text-general);\n  font-size: 16px;\n  padding-right: 2rem;\n  position: absolute;\n  right: 0;\n}\n\n.transfer-right-actions {\n  right: 14px;\n  gap: 10px;\n  display: flex;\n  align-items: center;\n}\n\n.transfer-right-actions .auto-contract {\n  position: static;\n  right: auto;\n  padding-right: 0;\n}\n\n.lineups-season-pills-top {\n  display: flex;\n  align-items: center;\n  margin-right: 2px;\n}\n\n.lineups-season-pills-top .generalPills {\n  padding: 4px 10px !important;\n  min-width: 70px;\n}\n\n.lineups-view {\n  background-color: transparent;\n  min-height: 670px;\n  height: 100%;\n}\n\n.lineups-view-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: 10px;\n  flex-wrap: wrap;\n}\n\n.lineups-season-pills {\n  display: inline-flex;\n  align-items: center;\n  gap: 4px;\n  background-color: var(--elements);\n  border-radius: 999px;\n  padding: 4px;\n  box-shadow: var(--shadow-s);\n}\n\n.lineups-pill {\n  border: none;\n  border-radius: 999px;\n  background-color: transparent;\n  color: var(--text-general);\n  font-size: 14px;\n  padding: 5px 14px;\n  transition: background-color 0.15s, color 0.15s;\n}\n\n.lineups-pill:hover {\n  background-color: var(--table-hover);\n  color: var(--white-general);\n}\n\n.lineups-pill.active {\n  background-color: var(--text-general);\n  color: var(--negative-text);\n}\n\n.lineups-circle-wrap {\n  min-height: 0;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  overflow: hidden;\n  height: 100%;\n}\n\n.lineups-circle {\n  position: relative;\n  width: 90%;\n  min-width: 0;\n  min-height: 760px;\n}\n\n\n\n.lineups-team-logo {\n  width: 104px;\n  height: 46px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  overflow: hidden;\n  margin-bottom: 0;\n  position: relative;\n  z-index: 2;\n}\n\n.lineups-team-logo img {\n  width: 46px;\n  height: 46px;\n  object-fit: contain;\n}\n\n.lineups-team-logo > *:not(img) {\n  transform: scale(1.16);\n  transform-origin: center;\n}\n\n.lineups-team-drivers {\n  margin-top: 8px;\n  padding-top: 6px;\n  border-top: 1px solid color-mix(in srgb, var(--separator) 72%, transparent);\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 6px;\n  position: relative;\n  z-index: 1;\n}\n\n.lineups-team-card {\n  --lineup-accent: var(--new-primary);\n  position: absolute;\n  width: 272px;\n  transform: translate(-50%, -50%);\n  background:\n    linear-gradient(165deg,\n      color-mix(in srgb, var(--lineup-accent) 18%, var(--elements)) 0%,\n      color-mix(in srgb, var(--lineup-accent) 10%, var(--elements)) 34%,\n      color-mix(in srgb, var(--elements) 95%, black 5%) 100%);\n  border-radius: 10px;\n  box-shadow:\n    0 11px 24px rgba(0, 0, 0, 0.36),\n    inset 0 1px 0 rgba(255, 255, 255, 0.04);\n  padding: 8px 10px 9px;\n  color: var(--text-general);\n  transition: none;\n  cursor: default;\n  overflow: hidden;\n}\n\n.lineups-team-card::before {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  background:\n    radial-gradient(120% 85% at -10% -18%, color-mix(in srgb, var(--lineup-accent) 30%, transparent), transparent 55%);\n  pointer-events: none;\n}\n\n.lineups-team-card::after {\n  content: none;\n}\n\n.lineups-team-header {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  position: relative;\n  min-height: 46px;\n  padding-top: 1px;\n  z-index: 1;\n  overflow: hidden;\n}\n\n@media (max-height: 940px) {\n\n  .lineups-team-card{\n    padding: 5px 10px 9px;\n  }\n\n  .lineups-team-drivers{\n    margin-top: 4px;\n    padding-top: 3px;\n  }\n\n  .lineups-team-logo {\n    height: 42px;\n  }\n\n  .lineups-team-header {\n    min-height: 42px;\n  }\n\n  .lineups-team-logo img {\n    width: 42px;\n    height: 42px;\n    object-fit: contain;\n  }\n\n  .lineups-team-logo > *:not(img) {\n    transform: scale(1.06);\n    transform-origin: center;\n  }\n}\n\n\n\n.lineups-team-name {\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  transform: translate(-50%, -48%) scaleX(1);\n  transform-origin: center center;\n  width: 124%;\n  text-align: center;\n  text-transform: uppercase;\n  font-size: 28px;\n  line-height: 1;\n  letter-spacing: 0.9px;\n  color: color-mix(in srgb, var(--white-general) 72%, var(--lineup-accent) 28%);\n  opacity: 0.13;\n  text-shadow: none;\n  overflow: hidden;\n  white-space: nowrap;\n  pointer-events: none;\n  z-index: 1;\n}\n\n\n\n.lineups-team-driver {\n  font-size: 11px;\n  color: color-mix(in srgb, var(--text-general) 95%, white 5%);\n  text-align: center;\n  background-color: color-mix(in srgb, var(--background) 28%, transparent);\n  border-radius: 4px;\n  padding: 4px 4px;\n  position: relative;\n  isolation: isolate;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  line-height: 1.05;\n  min-height: 34px;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n}\n\n.lineups-team-driver > *:not(.lineups-driver-number) {\n  position: relative;\n  z-index: 1;\n}\n\n.lineups-driver-number {\n  position: absolute;\n  right: 4px;\n  top: 1px;\n  font-size: 20px;\n  line-height: 1;\n  color: color-mix(in srgb, var(--white-general) 70%, var(--lineup-accent) 30%);\n  opacity: 0.16;\n  pointer-events: none;\n  z-index: 0;\n  font-family: 'NumbersFont';\n}\n\n.lineups-driver-first {\n  display: block;\n  font-size: 10px;\n  opacity: 0.92;\n}\n\n.lineups-driver-last {\n  display: block;\n  font-size: 13px;\n  letter-spacing: 0.2px;\n}\n\n.to-be-decided{\n  color: var(--text-tertiary);\n}\n\n.lineups-team-driver.next-contract {\n  color: var(--new-primary);\n}\n\n.lineups-team-card.lineups-custom-team {\n  box-shadow:\n    0 12px 28px rgba(0, 0, 0, 0.34),\n    inset 0 1px 0 rgba(255, 255, 255, 0.04);\n}\n\n.lineups-center-title {\n  position: absolute;\n  top: 47%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  font-family: 'Formula1Dark';\n  color: color-mix(in srgb, var(--white-general) 95%, var(--new-primary) 5%);\n  text-transform: uppercase;\n  letter-spacing: 1.4px;\n  line-height: 0.9;\n  pointer-events: none;\n  text-shadow: 0 12px 28px rgba(0, 0, 0, 0.55);\n  z-index: 0;\n  opacity: 0.96;\n}\n\n.lineups-center-year {\n  display: block;\n  text-align: center;\n  white-space: nowrap;\n  font-size: clamp(66px, 8vw, 130px);\n  line-height: 0.78;\n}\n\n.lineups-center-label {\n  display: block;\n  text-align: center;\n  white-space: nowrap;\n  font-size: clamp(24px, 5vw, 88px);\n  line-height: 0.88;\n}\n\n.lineups-center-label.lineups{\n  display: block;\n  text-align: center;\n  white-space: nowrap;\n  font-size: clamp(18px, 3.6vw, 94px);\n  line-height: 0.88;\n}\n\n\n.freeze-mentality {\n  color: var(--text-general);\n  font-size: 20px;\n  padding-right: 2rem;\n}\n/* Base */\ninput[role=\"switch\"] {\n  cursor: pointer;\n  box-shadow: none;\n  background-color: transparent !important;\n  transition: border-color 0.15s, background-color 0.15s;\n  border: 2px solid var(--switch-border-off) !important;\n\n  /* clave: necesitamos posicionar el pseudo-thumb */\n  position: relative;\n\n  /* clave: desactivamos el “ball” de bootstrap (background-image) */\n  --bs-form-switch-bg: none !important;\n}\n\n/* Si no quieres glow de focus */\ninput[role=\"switch\"]:focus {\n  box-shadow: none;\n}\n\n/* THUMB: un solo SVG (thumb-general.svg) coloreable */\ninput[role=\"switch\"]::after {\n  content: \"\";\n  position: absolute;\n  top: 50%;\n  transform: translateY(-50%);\n\n  /* tamaño del thumb: ajusta si tu switch es más grande/pequeño */\n  width: 0.85rem;\n  height: 0.85rem;\n\n  /* posición OFF */\n  left: 0.01rem;\n\n  /* el SVG solo define la forma */\n  -webkit-mask: url('../assets/images/thumb-general.svg') no-repeat center / contain;\n  mask: url('../assets/images/thumb-general.svg') no-repeat center / contain;\n\n  /* color del thumb (OFF por defecto) */\n  background-color: var(--switch-border-off);\n\n  transition: left 0.15s, background-color 0.15s;\n}\n\n/* OFF */\ninput[role=\"switch\"]:not(:checked) {\n  border-color: var(--switch-border-off) !important;\n}\n\n/* ON */\ninput[role=\"switch\"]:checked {\n  border-color: var(--switch-border-on) !important;\n  background-color: transparent !important;\n}\n\n/* mover thumb a la derecha cuando está ON */\ninput[role=\"switch\"]:checked::after {\n  /* calc: 100% - thumbWidth - margenIzq */\n  left: calc(100% - 0.85rem - 0.01rem);\n  background-color: var(--switch-border-on);\n}\n\n/* Variables por tema */\nbody.light-theme {\n  --switch-thumb-color-off: #b0b0b0;          /* gris off */\n  --switch-thumb-color-on: var(--new-primary);/* on */\n  --switch-thumb-color-focus: var(--new-primary);\n}\n\nbody:not(.light-theme) {\n  --switch-thumb-color-off: #555;             /* gris oscuro off */\n  --switch-thumb-color-on: var(--new-primary);\n  --switch-thumb-color-focus: var(--new-primary);\n}\n\n\ninput[type=\"checkbox\"] {\n  border: none;\n}\n\ninput[type=\"checkbox\"]:focus {\n  box-shadow: none;\n}\n\n\n\n.main-team-changes {\n  display: flex;\n  flex-direction: column;\n}\n\n.team-changes-grid{\n  display: grid;\n  grid-template-columns: repeat(4, 1fr);\n  gap: 5px 10px;\n  margin-top: 5px;\n  align-items: center;\n}\n\n.team-changes-grid .logo-and-name{\n  font-size: 12px;\n  height: 30px;\n}\n\n.team-changes-grid .logo-and-name .team-name{\n  padding-left: 0px;\n}\n\n.team-changes-grid [data-resizable=\"true\"] {\n  transform: scale(0.8);\n}\n\n.team-change {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n}\n\n.team-change-button {\n  text-align: end;\n  align-items: end;\n  display: flex;\n  justify-content: flex-end;\n}\n\n.info-modal-section {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: center;\n}\n\n.texts-and-clear {\n  display: flex;\n  flex-direction: row;\n  gap: 15px;\n  align-items: flex-start;\n  justify-content: flex-start;\n}\n\n.texts-and-clear .fit-button {\n  padding: 0;\n}\n\n.H2H-text span.text-main {\n  color: var(--new-primary);\n}\n\n\n.graph-text span.text-main {\n  color: var(--new-secondary);\n}\n\n.h2h-highlight {\n  animation: h2h-animation 0.15s forwards;\n}\n\n.graph-highlight {\n  animation: graph-animation 0.15s forwards;\n}\n\n@keyframes h2h-animation {\n\n  0%,\n  100% {\n    color: var(--text-general);\n  }\n\n  50% {\n    color: var(--text-selected);\n  }\n}\n\n@keyframes graph-animation {\n\n  0%,\n  100% {\n    color: var(--text-general);\n  }\n\n  50% {\n    color: var(--text-selected-secondary);\n  }\n}\n\n.annotations {\n  color: var(--text-general);\n  font-size: 16px;\n  padding-right: 1rem;\n}\n\n.number-details {\n  display: flex;\n  flex-direction: row;\n  align-items: baseline;\n  width: 100%;\n  justify-content: flex-end;\n  gap: 15px;\n}\n\n#d1Menu,\n#d2Menu,\n#teamMenu,\n#raceProbMenu {\n  max-height: 200px;\n  overflow-y: scroll;\n}\n\n#numberMenu {\n  max-height: 200px;\n  overflow-y: scroll;\n}\n\n#numberMenu::-webkit-scrollbar,\n#d1Menu::-webkit-scrollbar,\n#d2Menu::-webkit-scrollbar,\n#teamMenu::-webkit-scrollbar,\n#teamContractMenu::-webkit-scrollbar,\n#raceMenu::-webkit-scrollbar,\n#raceProbMenu::-webkit-scrollbar,\n#nationalityMenu::-webkit-scrollbar,\n.prob-viewer-data::-webkit-scrollbar,\n#patchNotesBody::-webkit-scrollbar,\n.parts-list::-webkit-scrollbar,\n.engine-modal-body::-webkit-scrollbar,\n.news-article::-webkit-scrollbar,\n.main-second-viewer::-webkit-scrollbar,\n.news-edit-textarea::-webkit-scrollbar,\n#juniorTeamContractMenu::-webkit-scrollbar,\n.poles-comparison::-webkit-scrollbar,\n.q3-comparison::-webkit-scrollbar,\n.q2-comparison::-webkit-scrollbar,\n.wins-drivers-list::-webkit-scrollbar,\n.bento-driver-standings::-webkit-scrollbar,\n#sessionResultsGpMenu::-webkit-scrollbar,\n#engineMenu::-webkit-scrollbar,\n.bento-team-standings::-webkit-scrollbar,\n.quali-comparison::-webkit-scrollbar,\n.race-comparison::-webkit-scrollbar,\n.script-view::-webkit-scrollbar {\n  width: 4px;\n}\n\n#numberMenu::-webkit-scrollbar-thumb,\n#d1Menu::-webkit-scrollbar-thumb,\n#d2Menu::-webkit-scrollbar-thumb,\n#teamMenu::-webkit-scrollbar-thumb,\n#teamContractMenu::-webkit-scrollbar-thumb,\n#raceMenu::-webkit-scrollbar-thumb,\n#raceProbMenu::-webkit-scrollbar-thumb,\n#nationalityMenu::-webkit-scrollbar-thumb,\n.prob-viewer-data::-webkit-scrollbar-thumb,\n#patchNotesBody::-webkit-scrollbar-thumb,\n.parts-list::-webkit-scrollbar-thumb,\n.engine-modal-body::-webkit-scrollbar-thumb,\n.news-article::-webkit-scrollbar-thumb,\n.main-second-viewer::-webkit-scrollbar-thumb,\n.news-edit-textarea::-webkit-scrollbar-thumb,\n#juniorTeamContractMenu::-webkit-scrollbar-thumb,\n.poles-comparison::-webkit-scrollbar-thumb,\n.q3-comparison::-webkit-scrollbar-thumb,\n.q2-comparison::-webkit-scrollbar-thumb,\n.wins-drivers-list::-webkit-scrollbar-thumb,\n.bento-driver-standings::-webkit-scrollbar-thumb,\n.bento-team-standings::-webkit-scrollbar-thumb,\n#sessionResultsGpMenu::-webkit-scrollbar-thumb,\n#engineMenu::-webkit-scrollbar-thumb,\n.quali-comparison::-webkit-scrollbar-thumb,\n.race-comparison::-webkit-scrollbar-thumb,\n.script-view::-webkit-scrollbar-thumb {\n  background-color: var(--white-general);\n  border-radius: 3px;\n}\n\n#numberMenu::-webkit-scrollbar-thumb:hover,\n#d1Menu::-webkit-scrollbar-thumb:hover,\n#d2Menu::-webkit-scrollbar-thumb:hover,\n#teamMenu::-webkit-scrollbar-thumb:hover,\n#teamContractMenu::-webkit-scrollbar-thumb:hover,\n#raceMenu::-webkit-scrollbar-thumb:hover,\n#raceProbMenu::-webkit-scrollbar-thumb:hover,\n#nationalityMenu::-webkit-scrollbar-thumb:hover,\n.prob-viewer-data::-webkit-scrollbar-thumb:hover,\n#patchNotesBody::-webkit-scrollbar-thumb:hover,\n.parts-list::-webkit-scrollbar-thumb:hover,\n.engine-modal-body::-webkit-scrollbar-thumb:hover,\n.news-article::-webkit-scrollbar-thumb:hover,\n.main-second-viewer::-webkit-scrollbar-thumb:hover,\n.news-edit-textarea::-webkit-scrollbar-thumb:hover,\n#juniorTeamContractMenu::-webkit-scrollbar-thumb:hover,\n.poles-comparison::-webkit-scrollbar-thumb:hover,\n.q3-comparison::-webkit-scrollbar-thumb:hover,\n.q2-comparison::-webkit-scrollbar-thumb:hover,\n.wins-drivers-list::-webkit-scrollbar-thumb:hover,\n.bento-driver-standings::-webkit-scrollbar-thumb:hover,\n#sessionResultsGpMenu::-webkit-scrollbar-thumb:hover,\n#engineMenu::-webkit-scrollbar-thumb:hover,\n.bento-team-standings::-webkit-scrollbar-thumb:hover,\n.quali-comparison::-webkit-scrollbar-thumb:hover,\n.race-comparison::-webkit-scrollbar-thumb:hover,\n.script-view::-webkit-scrollbar-thumb:hover {\n  background-color: var(--scrollbar-hover);\n}\n\n#engineMenu {\n  max-height: 300px;\n  overflow-y: scroll;\n}\n\n#allDrivers {\n  overflow-y: hidden;\n}\n\n.dropdown-menu {\n  background-color: var(--dropdown-back) !important;\n  border: none !important;\n  box-shadow: 0 2px 6px 1px black;\n  margin-top: 1px !important;\n  z-index: 9999 !important;\n}\n\n\n.dropdown-menu .dropdown-item {\n  cursor: pointer;\n}\n\n.dropdown-menu a {\n  background-color: var(--dropdown-back) !important;\n  color: var(--white-general) !important;\n  border-bottom: 2px solid transparent !important;\n  transition: background-color 0.15s, color 0.15s, border-bottom 0.15s;\n}\n\n.dropdown-menu a:hover {\n  background-color: var(--dropdown-hover) !important;\n  color: var(--text-selected) !important;\n  border-bottom: 2px solid var(--new-primary) !important;\n}\n\nbody.og-theme .dropdown-menu a:hover {\n  color: var(--white-general) !important;\n  border-bottom: 2px solid #dedde6 !important;\n}\n\n.dropdown-manu a::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(ellipse 70% 150% at center bottom, var(--new-primary), transparent 70%);\n  opacity: 0;\n  transition: opacity 0.15s ease;\n  pointer-events: none;\n}\n\n.dropdown-menu a:hover::before {\n  opacity: 1;\n}\n\n.dropdown-menu a:not(:hover)::before {\n  transition-delay: 0s;\n}\n\n\n\n.modal-subtitle {\n  color: var(--text-general);\n}\n\n.upper-section-stats {\n  display: flex;\n  padding-right: 16px;\n  background: var(--elements);\n  border-top-left-radius: 10px;\n  border-top-right-radius: 10px;\n  box-shadow: var(--shadow-s);\n  align-items: center;\n  padding: 18px 25px;\n  height: 116px;\n  gap: 20px;\n  justify-content: space-between;\n  position: relative;\n}\n\n.special-overall.cloned {\n  margin-left: auto;\n}\n\n/*Gradient from left to right with new primary to transparent*/\n.upper-section-stats.comparison-active:has(.cloned-separator)::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: linear-gradient(to right, var(--new-primary) -39%, transparent 36%);\n  z-index: 1;\n  border-top-left-radius: 10px;\n}\n\n.upper-section-stats.comparison-active:has(.cloned-separator)::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  right: 0;\n  width: 100%;\n  height: 100%;\n  background: linear-gradient(to left, var(--new-secondary) -39%, transparent 36%);\n  z-index: 1;\n  border-top-right-radius: 10px;\n}\n\n.stats-radar-wrap {\n  position: relative;\n}\n\n/* capa HTML encima del canvas */\n.radar-overlay {\n  position: absolute;\n  inset: 0;\n  pointer-events: none;\n  font-family: Formula1Bold;\n  line-height: 1;\n}\n\n.radar-overlay .tick {\n  position: absolute;\n  transform: translate(-50%, -50%);\n  text-align: center;\n  white-space: nowrap;\n  /* si se corta en bordes, añade un poco de padding externo al chart: options.layout.padding */\n}\n\n.radar-overlay .values {\n  display: inline-flex;\n  gap: 6px;\n  justify-content: center;\n  font-size: 11px;\n}\n\n.radar-overlay .v1 {\n  color: var(--new-primary);\n}\n\n.radar-overlay .v2 {\n  color: var(--new-secondary);\n}\n\n.radar-overlay .lab {\n  display: block;\n  font-size: 12px;\n  color: var(--text-secondary);\n  margin-top: 2px;\n}\n\n.upper-section-stats.comparison-active:has(.cloned-separator) .name-and-info {\n  flex-grow: 0;\n  max-width: none;\n}\n\n.upper-section-stats.comparison-active:has(.cloned-separator) {\n  gap: 15px;\n}\n\n.upper-section-stats.comparison-active:has(.cloned-separator) .age-text {\n  margin-left: 0 !important;\n}\n\n.upper-section-stats.comparison-active:has(.cloned-separator) .bi-pencil-fill {\n  display: none !important;\n  pointer-events: none;\n}\n\n.upper-section-stats.comparison-active:has(.cloned-separator) .name-and-code {\n  gap: 10px;\n}\n\n.upper-section-stats.comparison-active:has(.cloned-separator) .hiddable-text,\n.upper-section-stats.comparison-active:has(.cloned-separator) .age-buttons,\n.upper-section-stats.comparison-active:has(.cloned-separator) .retirement-buttons {\n  display: none;\n  pointer-events: none;\n}\n\n.title-and-details.cloned {\n  align-items: flex-end;\n}\n\n.title-and-details.cloned .age-holder {\n  align-items: flex-end;\n}\n\n.title-and-details.cloned .age,\n.title-and-details.cloned .retirement-age {\n  flex-direction: row-reverse;\n}\n\n.retry-with-lite {\n  margin-top: 10px;\n}\n\n.button-with-icon {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 10px;\n  cursor: pointer;\n  color: var(--text-secondary);\n  transition: color 0.15s, background-color 0.15s;\n  font-size: 16px;\n  padding: 3px 7px;\n  border-radius: 5px;\n}\n\n.button-with-icon.close-modal{\n  padding: 3px 7px;\n}\n\n#compDataButton.button-with-icon {\n  color: var(--text-general);\n}\n\n#compDataButton.button-with-icon:hover {\n  color: var(--new-primary);\n}\n\n\n.button-with-icon:hover {\n  color: var(--new-primary);\n  background-color: var(--new-primary-transparent)\n}\n\n#patreonLoginButton i::before {\n  transition: background-color 0.15s;\n}\n\n#patreonLoginButton:hover i::before {\n  background-color: var(--new-primary);\n}\n\n.user-name-and-logout-tool {\n  position: relative;\n}\n\n.userToolMenu {\n  display: flex;\n  flex-direction: column;\n  position: absolute;\n  top: 40px;\n  right: 0px;\n  border-radius: 7px;\n  width: max-content;\n  gap: 2px;\n  padding: 8px 5px;\n  opacity: 1;\n  z-index: 200;\n  transform: translateY(0);\n  pointer-events: auto;\n  background-color: var(--elements);\n  box-shadow: var(--shadow-m);\n  transition: opacity 0.15s, transform 0.15s;\n}\n\n.userToolMenu.hidden {\n  opacity: 0;\n  transform: translateY(-10px);\n  pointer-events: none;\n}\n\n.button-with-icon.active {\n  color: var(--new-primary);\n  background-color: var(--new-primary-transparent);\n}\n\n.button-with-icon:active {\n  color: var(--new-primary);\n  background-color: var(--new-primary-transparent);\n  transform: scale(0.97);\n}\n\n.button-with-icon#patreonStatus:hover {\n  color: var(--text-secondary);\n  background-color: transparent;\n  cursor: default;\n}\n\n.button-with-icon#patreonStatus:active {\n  transform: none;\n}\n\n.button-with-icon#patreonStatus i.bi-custom-patreon::before {\n  background-color: var(--text-secondary);\n}\n\n.button-with-icon#patreonStatus:hover i.bi-custom-patreon::before {\n  background-color: var(--text-secondary);\n}\n\n.comparing-tag {\n  font-size: 12px;\n  padding: 2px 6px;\n  border-radius: 4px;\n  text-transform: capitalize;\n  font-weight: bold;\n  margin-left: 8px;\n}\n\n.bar-container.comparing {\n  flex-direction: column;\n  align-items: flex-start;\n  gap: 1px;\n}\n\ninput.comparing-tag {\n  font-weight: normal !important;\n  font-size: 18px !important;\n  color: var(--text-general) !important;\n  padding: 2px !important;\n  line-height: 1.5;\n  margin: 0 5px !important;\n}\n\n.comparing-tag.primary {\n  background-color: var(--new-primary-transparent);\n  color: var(--new-primary);\n}\n\n.comparing-tag.secondary {\n  background-color: var(--new-secondary-transparent);\n  color: var(--new-secondary);\n}\n\n.comparing-tag.ct {\n  background-color: color-mix(in srgb, var(--custom-team-primary) 35%, transparent);\n  color: var(--custom-team-primary);\n}\n\n\n.comparing-tag.fe {\n  background-color: color-mix(in srgb, var(--ferrari-primary) 35%, transparent);\n  color: var(--ferrari-primary);\n}\n\n.comparing-tag.me {\n  background-color: color-mix(in srgb, var(--mercedes-primary) 35%, transparent);\n  color: var(--mercedes-primary);\n}\n\n.comparing-tag.rb {\n  background-color: color-mix(in srgb, var(--redbull-primary) 35%, transparent);\n  color: var(--redbull-primary);\n}\n\n.comparing-tag.mc {\n  background-color: color-mix(in srgb, var(--mclaren-primary) 35%, transparent);\n  color: var(--mclaren-primary);\n}\n\n.comparing-tag.wi {\n  background-color: color-mix(in srgb, var(--williams-primary) 35%, transparent);\n  color: var(--williams-primary);\n}\n\n.comparing-tag.ha {\n  background-color: color-mix(in srgb, var(--haas-primary) 35%, transparent);\n  color: var(--haas-primary);\n}\n\n.comparing-tag.as {\n  background-color: color-mix(in srgb, var(--aston-primary) 35%, transparent);\n  color: var(--aston-primary);\n}\n\n.comparing-tag.al {\n  background-color: color-mix(in srgb, var(--alpine-primary) 35%, transparent);\n  color: var(--alpine-primary);\n}\n\n.comparing-tag.af {\n  background-color: color-mix(in srgb, var(--alfa-primary) 35%, transparent);\n  color: var(--alfa-primary);\n}\n\n.comparing-tag.at {\n  background-color: color-mix(in srgb, var(--alphatauri-primary) 35%, transparent);\n  color: var(--alphatauri-primary);\n}\n\n.upper-section-stats.showing-driver .name-and-info {\n  max-width: calc(42% - 20px);\n}\n\n.name-and-info {\n  display: flex;\n  flex-direction: column;\n  gap: 10px;\n  flex-grow: 1;\n  z-index: 3;\n}\n\n.name-and-info.cloned {\n  align-items: flex-end;\n}\n\n.name-and-info.cloned .name-and-code,\n.name-and-info.cloned .flag-and-team {\n  flex-direction: row-reverse;\n}\n\n.stats-header-separator {\n  width: 2px;\n  background-color: var(--separator-light);\n  height: 100%;\n  z-index: 3;\n}\n\n.name-and-code {\n  display: flex;\n  flex-direction: row;\n  height: 36px;\n  align-items: center;\n  gap: 30px;\n  z-index: 3;\n}\n\n.custom-separator {\n  width: 2px;\n  background-color: var(--separator-light);\n  height: 85%;\n  z-index: 3;\n}\n\n.flag-and-team {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 15px;\n  height: 30px;\n  z-index: 3;\n}\n\n.image-and-text {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 10px;\n  z-index: 3;\n}\n\n.nationality-dropdown {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  height: 32px;\n  padding: 0 10px;\n  border-radius: 8px;\n  background: transparent;\n  max-width: 200px;\n}\n\n.nationality-dropdown:disabled {\n  opacity: 0.75;\n  cursor: default;\n}\n\n.nationality-dropdown .flag-text {\n  flex: 1;\n  min-width: 0;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  text-align: left;\n}\n\n#nationalityMenu {\n  max-height: 320px;\n  overflow: auto;\n  max-width: 200px;\n  scrollbar-width: thin;\n  scrollbar-color: var(--white-general) transparent;\n}\n\n.redesigned-dropdown-item.nationality-item {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  justify-content: flex-start;\n  width: 100%;\n  max-width: 100%;\n}\n\n.nationality-item span {\n  flex: 1;\n  min-width: 0;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.nationality-item img {\n  width: 22px;\n  height: 14px;\n  border-radius: 3px;\n  object-fit: cover;\n}\n\n\n.driver-info-driver-flag {\n  width: 40px;\n  height: auto;\n  border-radius: 4px;\n  height: 20px;\n  object-fit: cover;\n}\n\n.driver-info-team-logo {\n  width: 34px;\n  height: auto;\n  border-radius: 5px;\n}\n\n.driver-info-team-logo-masked {\n  height: 24px;\n  -webkit-mask: url('/assets/images/logos/mclaren.svg') no-repeat center;\n  mask: url('/assets/images/logos/mclaren.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--mclaren-primary);\n}\n\n.actual-age,\n.actual-retirement {\n  width: 30px;\n  text-align: center;\n  display: inline-block;\n}\n\n.info-text {\n  color: var(--text-secondary);\n  font-size: 18px;\n  text-transform: capitalize;\n}\n\n#driverStatsTitle {\n  font-size: 26px;\n  width: max-content;\n  position: relative;\n  max-width: 350px;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  overflow: hidden;\n}\n\n#availabilityDetails:has(#superLicenseSwitch.d-none) {\n  justify-content: flex-start;\n  gap: 6px;\n}\n\n#driverCode {\n  font-size: 26px;\n  color: var(--text-secondary);\n  text-transform: uppercase;\n  position: relative;\n}\n\n#driverStatsTitle textarea,\n#driverCode textarea {\n  resize: none;\n  background: transparent;\n  color: inherit;\n  font: inherit;\n  border: none;\n  border-bottom: 2px solid var(--text-secondary);\n  outline: none;\n  box-sizing: border-box;\n  padding: 0;\n  margin: 0;\n  overflow: hidden;\n  white-space: nowrap;\n  /* evita saltos de línea */\n  overflow-x: hidden;\n  /* permite hacer scroll horizontal si se pasa del ancho */\n  overflow-y: hidden;\n}\n\n#editNameButton.bi-check {\n  font-size: 22px;\n}\n\n#editNameButton.bi-check:hover {\n  color: var(--positive-general);\n  background-color: var(--positive-transparent);\n}\n\n#editNameButton {\n  width: 24px;\n  height: 24px;\n  cursor: pointer;\n  border-radius: 5px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  transition: background-color 0.15s, color 0.15s;\n}\n\n#editNameButton:hover {\n  background-color: var(--new-primary-transparent);\n  color: var(--new-primary);\n}\n\n#editNameButton:active {\n  background-color: var(--new-primary-transparent);\n  color: var(--new-primary);\n  transform: scale(0.97);\n}\n\n.draft-staff-type-dropdown {\n  min-width: 190px;\n  height: 32px;\n  font-size: 14px;\n  padding: 0 14px;\n}\n\n#genderSwapButton.compact {\n  height: 32px;\n  min-width: 104px;\n  font-size: 14px;\n  padding: 0 12px;\n  white-space: nowrap;\n}\n\n.api-key-section .separator {\n  height: 20px;\n}\n\n.separator-3 {\n  width: 3px;\n  background-color: var(--separator);\n  height: calc(100% - 22px);\n}\n\n.title-and-details {\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n  align-items: flex-start;\n  z-index: 3;\n}\n\n.title-and-details.special-overall {\n  align-items: center;\n}\n\n.stats-title {\n  font-size: 17px;\n  color: var(--text-secondary);\n}\n\n.age-holder {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n}\n\n.age-title {\n  color: var(--text-general);\n}\n\n.age-text {\n  color: var(--text-secondary);\n  margin-left: 12px;\n}\n\n.text-filter {\n  background-color: transparent;\n  color: var(--white-general);\n  border-bottom: 2px solid var(--separator);\n  border-right: 0px;\n  border-left: 0px;\n  border-top: 0px;\n  transition: color 0.15s, border-color 0.15s;\n  height: 36px;\n  padding: 6px;\n  width: 100%;\n\n}\n\n.text-filter-container {\n  margin-top: 5px;\n  width: 100%;\n  margin-right: 10px;\n  position: relative;\n}\n\n.text-filter-container .bi-x {\n  color: var(--dark-text);\n  cursor: pointer;\n  transition: color 0.15s, transform 0.15s, opacity 0.15s;\n  position: absolute;\n  right: 0px;\n}\n\n.text-filter-container .bi-x:hover {\n  color: var(--new-primary);\n  transform: scale(1.1);\n}\n\n.filter-icon {\n  color: var(--dark-text);\n  font-size: 20px;\n  display: flex;\n  align-items: center;\n  cursor: pointer;\n  transition: color 0.15s;\n}\n\n.new-pills-filters{\n  padding: 3px 10px !important;\n  border-radius: 6px !important;\n  background-color: transparent;\n}\n\n.new-pills-filters:hover{\n  background-color: var(--new-primary-transparent);\n  color: var(--new-primary);\n}\n\n.new-pills-filters:active{\n  transform: scale(0.97);\n}\n\n.new-pills-filters.active{\n  background-color: var(--new-primary-transparent) !important;\n  color: var(--new-primary) !important;\n}\n\n.new-pills-filters.f2-filter:hover{\n  color: var(--f2-back);\n  background-color: color-mix(in srgb, var(--f2-back) 30%, transparent);\n  transform: scale(1.05);\n}\n\n.new-pills-filters.f2-filter:active{\n  transform: scale(0.97);\n}\n\n.new-pills-filters.f2-filter.active{\n  color: var(--f2-back);\n  background-color: color-mix(in srgb, var(--f2-back) 30%, transparent);\n}\n\n.new-pills-filters.f3-filter:hover{\n  color: var(--f3-back);\n  background-color: color-mix(in srgb, var(--f3-back) 30%, transparent);\n  transform: scale(1.05);\n}\n\n.new-pills-filters.f3-filter:active{\n  transform: scale(0.97);\n}\n\n.new-pills-filters.f3-filter.active{\n  color: var(--f3-back);\n  background-color: color-mix(in srgb, var(--f3-back) 30%, transparent);\n}\n\n.filter-icon:hover {\n  color: var(--new-primary);\n  transform: scale(1.05);\n}\n\n.filter-icon:active {\n  color: var(--new-primary);\n  transform: scale(0.97);\n}\n\n.filter-container {\n  background-color: transparent;\n  border-radius: 10px;\n  box-shadow: 0 0 0 0 var(--box-shadow);\n  transition: background-color 0.15s, box-shadow 0.15s;\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  font-size: 14px;\n  padding: 2px 12px;\n}\n\n.filter-container:not(.focused) .category-filters {\n  pointer-events: none;\n}\n\n.filter-container.focused .filter-icon {\n  color: var(--new-primary);\n}\n\n\n.category-filters,\n.order-filters {\n  opacity: 0;\n  transition: opacity 0.15s;\n}\n\n.category-filters:not(.show) a {\n  pointer-events: none;\n}\n\n.category-filters.show,\n.order-filters.show {\n  opacity: 1;\n}\n\n.category-filters .basic-label {\n  color: var(--dark-text);\n}\n\n#freefilter:hover .pill-line,\n#freefilterTransfers:hover .pill-line {\n  width: 100%;\n}\n\n#freefilter.active .basic-label,\n#freefilterTransfers.active .basic-label {\n  color: var(--new-primary);\n}\n\n#freefilter:hover .pill-line,\n#freefilterTransfers:hover .pill-line {\n  background-color: var(--new-primary);\n}\n\n#freefilter:hover .basic-label,\n#freefilterTransfers:hover .basic-label {\n  color: var(--new-primary);\n}\n\n\n#F1filter:hover .pill-line,\n#F1filterTransfers:hover .pill-line {\n  width: 100%;\n}\n\n#F1filter .pill-line,\n#F1filterTransfers .pill-line {\n  background-color: var(--white-general);\n}\n\n#F1filter.active .basic-label,\n#F1filterTransfers.active .basic-label {\n  color: var(--text-general);\n}\n\n#F1filter:hover .pill-line,\n#F1filterTransfers:hover .pill-line {\n  background-color: var(--text-general);\n}\n\n#F1filter:hover .basic-label,\n#F1filterTransfers:hover .basic-label {\n  color: var(--text-general);\n}\n\n\n#F2filter:hover .pill-line,\n#F2filterTransfers:hover .pill-line {\n  width: 100%;\n}\n\n#F2filter .pill-line,\n#F2filterTransfers .pill-line {\n  background-color: var(--f2-border);\n}\n\n#F2filter.active .basic-label,\n#F2filterTransfers.active .basic-label {\n  color: var(--f2-border);\n}\n\n#F2filter:hover .pill-line,\n#F2filterTransfers:hover .pill-line {\n  background-color: var(--f2-border);\n}\n\n#F2filter:hover .basic-label,\n#F2filterTransfers:hover .basic-label {\n  color: var(--f2-border);\n}\n\n\n#F3filter .pill-line,\n#F3filterTransfers .pill-line {\n  background-color: var(--f3-back);\n}\n\n#F3filter:hover .pill-line,\n#F3filterTransfers:hover .pill-line {\n  width: 100%;\n}\n\n#F3filter.active .basic-label,\n#F3filterTransfers.active .basic-label {\n  color: var(--f3-border);\n}\n\n#F3filter:hover .pill-line,\n#F3filterTransfers:hover .pill-line {\n  background-color: var(--f3-border);\n}\n\n#F3filter:hover .basic-label,\n#F3filterTransfers:hover .basic-label {\n  color: var(--f3-border);\n}\n\n#StaffLists {\n  margin-left: 14px;\n}\n\n\n.search-and-order {\n  margin-left: 10px;\n  margin-bottom: 7px;\n  display: flex;\n  align-items: flex-end;\n  justify-content: space-between;\n}\n\n.order-space {\n  margin-right: 20px;\n  width: 23px;\n  height: 35px;\n  position: relative;\n  cursor: pointer;\n}\n\n.search-and-order i {\n  font-size: 24px;\n  transition: opacity 0.15s, transform 0.15s, color 0.15s;\n  color: var(--dark-text);\n  position: absolute;\n  z-index: 1;\n}\n\n.order-space i:hover {\n  transform: scale(1.1);\n  color: var(--text-selected);\n}\n\n.search-and-order i.active {\n  color: var(--new-primary);\n}\n\n.search-and-order i.hidden {\n  opacity: 0;\n  z-index: 0;\n}\n\n\n.text-filter:hover {\n  border-bottom: 2px solid var(--text-selected);\n}\n\n.text-filter:focus {\n  color: var(--text-selected);\n  border-bottom: 2px solid var(--new-primary);\n}\n\n.text-filter:focus-visible {\n  outline: none;\n}\n\n.color-reader:focus-visible {\n  outline: none;\n}\n\n\n.retirement-age,\n.age {\n  display: flex;\n  gap: 3px;\n}\n\n.retirement-buttons,\n.age-buttons {\n  font-size: 18px;\n  display: flex;\n  flex-direction: row;\n  margin-top: 4px;\n  gap: 5px;\n  margin-left: 5px;\n}\n\n.number-selector-and-number-1 {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n}\n\n.number-selector {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 9px;\n}\n\n.number-holder {\n  font-size: 20px;\n  color: var(--text-general);\n  width: 32px;\n}\n\n.wc-number {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-end;\n}\n\n.number-buttons {\n  display: flex;\n  flex-direction: row;\n  gap: 5px;\n}\n\n.new-augment-button.transparent {\n  background-color: transparent;\n}\n\n.new-augment-button.transparent:hover {\n  background-color: var(--augment-buttons-bg);\n}\n\n.new-augment-button {\n  background-color: var(--augment-buttons-bg);\n  border-radius: 5px;\n  width: 18px;\n  height: 18px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  font-size: 22px;\n  cursor: pointer;\n  transition: background-color 0.15s, color 0.15s;\n  user-select: none;\n}\n\n.new-augment-button.small {\n  font-size: 16px;\n}\n\n.new-augment-button:hover {\n  background-color: var(--augment-buttons-hover);\n  color: var(--new-primary);\n}\n\n.new-augment-button:active {\n  transform: scale(0.95);\n  color: var(--new-primary);\n}\n\n\n.name-age-and-retired {\n  display: flex;\n  flex-direction: row;\n  gap: 15px;\n}\n\n#numberName {\n  position: relative;\n}\n\n#numberName .name-and-stat {\n  position: absolute;\n  margin-left: 20px;\n}\n\n#numberName .number-details {\n  position: absolute;\n  margin-right: 50px;\n  margin-top: 15px;\n}\n\n.ovr {\n  font-size: 21px;\n  color: var(--disabled-text)\n}\n\n.ovrcombined {\n  display: flex;\n  width: 116px;\n  align-items: baseline;\n  justify-content: space-between;\n  width: 120px;\n  position: relative;\n  gap: 5px;\n}\n\n.wc-number .custom-toggle {\n  margin-left: -20px;\n}\n\n\n.overall-holder {\n  font-size: 34px;\n}\n\n.upper-panel {\n  display: flex;\n}\n\n.number-and-retirement {\n  display: flex;\n  flex-direction: row;\n  width: 66%;\n  background-color: var(--elements);\n  padding: 10px;\n  border-radius: 10px;\n  margin-right: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n  margin-left: 10px;\n  box-shadow: 0 0 10px 1px var(--box-shadow);\n}\n\n.number-options {\n  width: 66%;\n}\n\n.retirement-options i {\n  color: var(--text-general);\n  border-radius: 7.5px !important;\n  width: 20px !important;\n  height: 20px !important;\n  font-size: 20px !important;\n  margin-left: 5px !important;\n}\n\n@keyframes colorChangeNeg {\n\n  0%,\n  100% {\n    background-color: transparent;\n    color: var(--white-general);\n  }\n\n  50% {\n    background-color: transparent;\n    color: var(--negative-general);\n  }\n}\n\n@keyframes colorChangePos {\n\n  0%,\n  100% {\n    background-color: transparent;\n    color: var(--white-general);\n  }\n\n  50% {\n    background-color: transparent;\n    color: var(--positive-general);\n  }\n}\n\n\n.alertNeg {\n  animation: colorChangeNeg 0.15s;\n  margin-bottom: 0px !important;\n}\n\n.alertPos {\n  animation: colorChangePos 0.15s;\n  margin-bottom: 0px !important;\n}\n\n.main-title-old {\n  text-align: left;\n  background-color: var(--tools-general);\n  padding-top: 1rem;\n  padding-bottom: 0.1%;\n  display: flex;\n  width: 100%;\n  justify-content: center;\n}\n\n.cet-menubar {\n  opacity: 0 !important;\n}\n\n.cet-title {\n  font-family: 'Formula1Bold' !important;\n}\n\n.patchNotesPanel {\n  position: fixed;\n  top: 70px;\n  left: 10px;\n}\n\n.patchNotesPanel i {\n  transition: color 0.15s;\n  font-style: normal;\n  color: var(--separator);\n  cursor: pointer;\n}\n\n.patchNotesPanel i:hover {\n  color: var(--white-general);\n}\n\n.notification-panel {\n  position: absolute;\n  top: 56px;\n  right: 0px;\n  color: var(--white-general);\n  width: 530px;\n  height: 116px;\n  display: flex;\n  flex-direction: column;\n  text-align: center;\n  align-items: flex-end;\n  gap: 10px;\n  pointer-events: none;\n}\n\n.notification-line {\n  width: 0%;\n  height: 2px;\n  background-color: var(--white-general);\n  position: relative;\n  bottom: 7px;\n  transition: width 3s linear;\n}\n\n.notification-line.start {\n  width: 100%;\n}\n\n.line-error {\n  width: 100%;\n  height: 2px;\n  position: relative;\n  bottom: 7px;\n  background-color: var(--negative-general) !important;\n}\n\n.custom-toast {\n  background-color: var(--toast-background) !important;\n  color: var(--white-general);\n  border-radius: 10px !important;\n  min-width: 420px !important;\n  z-index: 9999 !important;\n  flex-direction: row !important;\n  position: relative !important;\n  justify-content: space-between !important;\n}\n\n.toast-icon {\n  font-size: 26px;\n  height: 65%;\n  border-right: 2px solid transparent;\n  display: flex;\n  padding: 0 10px;\n  align-items: center;\n}\n\n.custom-toast-body {\n  font-size: 16px;\n  text-align: left;\n}\n\n.toast-icon.success {\n  border-color: var(--positive-general);\n  color: var(--positive-general)\n}\n\n.toast-icon.error {\n  border-color: var(--negative-general);\n  color: var(--negative-general);\n}\n\n.custom-toast-cross {\n  padding: 10px;\n  font-size: 30px;\n  color: var(--dark-text);\n  cursor: pointer;\n  transition: transform 0.15s, color 0.15s;\n  display: flex;\n  align-items: center;\n}\n\n.custom-toast-cross:hover {\n  color: var(--text-selected);\n  transform: scale(1.1);\n}\n\n.bar-space {\n  width: 100%;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  padding: 0 5px;\n}\n\n.driver1-number {\n  font-size: 18px;\n  margin-right: 10px;\n  transition: color 0.15s;\n  width: 12.5%;\n  text-align: right;\n}\n\n.driver2-number {\n  font-size: 18px;\n  margin-left: 10px;\n  width: 12.5%;\n  transition: color 0.15s;\n}\n\n.driver1-number.little,\n.driver2-number.little {\n  font-size: 13px;\n  height: 27px;\n  padding-top: 5px;\n}\n\n.avg-comparison {\n  display: flex;\n  height: 27px;\n  gap: 70px;\n}\n\n.driver1-avg,\n.driver2-avg {\n  font-size: 18px;\n}\n\n.avg-separator {\n  width: 2px;\n  height: 20px;\n  margin-top: 3px;\n  background-color: var(--text-general);\n}\n\n.toast-error {\n  color: var(--negative-general) !important;\n}\n\n.hide {\n  animation: fadeOut 0.15s;\n}\n\n.myShow {\n  animation: myFadeIn 0.15s;\n}\n\n@keyframes fadeOut {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n  }\n}\n\n\n@keyframes myFadeIn {\n  from {\n    opacity: 0;\n  }\n\n  to {\n    opacity: 1;\n  }\n}\n\n.tools-panel {\n  color: var(--white-general);\n  background-color: transparent;\n  display: flex;\n  flex-direction: row;\n  position: relative;\n  align-items: center;\n  border-bottom-left-radius: 10px;\n  border-bottom-right-radius: 10px;\n}\n\n.patreon-login {\n  padding-right: 15px;\n}\n\nbody:has(#blockDiv:not(.disappear)) .patreon-login .patreon-login-button,\nbody:has(#blockDiv:not(.disappear)) .patreon-login #userToolButton {\n  color: var(--text-muted);\n}\n\nbody:has(#blockDiv:not(.disappear)) .patreon-login .patreon-login-button:hover,\nbody:has(#blockDiv:not(.disappear)) .patreon-login #userToolButton:hover {\n  color: var(--new-primary);\n}\n\n\n.patreon-login .patreon-login-button:hover {\n  color: var(--new-primary);\n}\n\n.patreon-login .patreon-login-button:active {\n  transform: scale(0.97);\n  color: var(--new-primary);\n}\n\n\nbody.og-theme .tools-panel {\n  border-bottom: 1px solid var(--slight-contrast);\n}\n\n\n@keyframes move {\n  0% {\n    left: -300px;\n  }\n\n  100% {\n    left: 100%;\n  }\n}\n\n.mode-line {\n  position: relative;\n  width: 100%;\n  height: 1px;\n  background-color: var(--separator);\n}\n\n.mode-line.ai {\n  background-color: var(--mode-line-ai);\n  /* box-shadow: 0 0 6px 1px var(--mode-line-ai); */\n}\n\n.mode-line.edit {\n  background-color: var(--mode-line-edit);\n  /* box-shadow: 0 0 6px 1px #fff7b0; */\n}\n\n.mode-line.view {\n  background-color: var(--mode-line-view);\n  /* box-shadow: 0 0 6px 1px var(--mode-line-view); */\n}\n\n.moving-line {\n  position: absolute;\n  width: 300px;\n  height: 1px;\n  background: transparent;\n  animation: move 10s linear infinite;\n}\n\n\n\n.background {\n  background-color: var(--new-primary);\n  background-image: url('../assets/images/background2.svg');\n  background-size: cover;\n  background-position: center;\n  background-repeat: no-repeat;\n  height: 100%;\n  margin: 0;\n  position: absolute;\n  width: 100.2%;\n  z-index: -5;\n  left: -2px;\n  opacity: 1;\n}\n\nbody.light-theme .background {\n  background-image: url('../assets/images/background2light.svg');\n}\n\nbody.og-theme .background {\n  background-image: url('../assets/images/background2og.svg');\n  /* background-image: none;\n  background-color: var(--background); */\n}\n\nbody.vaporwave-theme .background {\n  background-image: url('../assets/images/background2vaporwave.svg');\n}\n\nbody.ferrari-theme .background {\n  background-image: url('../assets/images/background2.svg');\n  filter: hue-rotate(-28deg) saturate(1.4) brightness(0.8);\n}\n\nbody.redbull-theme .background {\n  background-image: url('../assets/images/background2.svg');\n  filter: hue-rotate(145deg) saturate(1.3) brightness(0.8);\n}\n\nbody.mercedes-theme .background {\n  background-image: url('../assets/images/background2.svg');\n  filter: hue-rotate(175deg) saturate(1.25) brightness(0.8);\n}\n\nbody.astonmartin-theme .background {\n  background-image: url('../assets/images/background2.svg');\n  filter: hue-rotate(120deg) saturate(1.25) brightness(0.78);\n}\n\nbody.mclaren-theme .background {\n  background-image: url('../assets/images/background2.svg');\n  filter: hue-rotate(20deg) saturate(1.35) brightness(0.8);\n}\n\n.main-panel {\n  display: flex;\n  position: relative;\n  height: 100%;\n  overflow-x: hidden;\n}\n\n#season_viewer.script-view{\n  height: 91vh;\n}\n\n.script-view {\n  display: flex;\n  width: 100%;\n  transition: opacity 0.15s;\n  position: absolute;\n  top: 0;\n  left: 0;\n  opacity: 1;\n  height: 90vh;\n  /* overflow-x: hidden; */\n  overflow-y: auto;\n}\n\n.script-view.hide {\n  opacity: 0;\n  pointer-events: none;\n  visibility: none;\n}\n\n.script-view.hide.unloaded {\n  display: none;\n  opacity: 0;\n  pointer-events: none;\n  visibility: none;\n}\n\n.script-view.enter-from-right {\n  animation: slide-in-from-right 0.15s ease-out forwards;\n}\n\n.script-view.enter-from-left {\n  animation: slide-in-from-left 0.15s ease-out forwards;\n}\n\n\n.scirpt-info {\n  font-size: 15px;\n}\n\n.script-selector {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  flex-grow: 1;\n  margin-right: 20px;\n  transition: transform 0.15s ease, opacity 0.15s ease;\n}\n\n.script-selector .nav-pills > li.nav-item {\n  opacity: 1;\n  transform: none;\n}\n\n.script-selector.hidden .nav-pills > li.nav-item {\n  opacity: 0;\n  transform: translateX(-12px);\n}\n\n@keyframes script-pill-reveal {\n  0% {\n    opacity: 0;\n    transform: translateX(-12px);\n  }\n\n  65% {\n    opacity: 1;\n    transform: translateX(2px);\n  }\n\n  100% {\n    opacity: 1;\n    transform: none;\n  }\n}\n\n.script-selector:not(.hidden) .nav-pills > li.nav-item {\n  animation: script-pill-reveal 0.3s cubic-bezier(0.34, 1.56, 0.64, 1) backwards;\n}\n\n.script-selector:not(.hidden) .nav-pills > li.nav-item:nth-child(1) { animation-delay: 0ms; }\n.script-selector:not(.hidden) .nav-pills > li.nav-item:nth-child(2) { animation-delay: 45ms; }\n.script-selector:not(.hidden) .nav-pills > li.nav-item:nth-child(3) { animation-delay: 90ms; }\n.script-selector:not(.hidden) .nav-pills > li.nav-item:nth-child(4) { animation-delay: 135ms; }\n.script-selector:not(.hidden) .nav-pills > li.nav-item:nth-child(5) { animation-delay: 180ms; }\n.script-selector:not(.hidden) .nav-pills > li.nav-item:nth-child(6) { animation-delay: 225ms; }\n.script-selector:not(.hidden) .nav-pills > li.nav-item:nth-child(7) { animation-delay: 270ms; }\n.script-selector:not(.hidden) .nav-pills > li.nav-item:nth-child(8) { animation-delay: 315ms; }\n.script-selector:not(.hidden) .nav-pills > li.nav-item:nth-child(9) { animation-delay: 360ms; }\n.script-selector:not(.hidden) .nav-pills > li.nav-item:nth-child(10) { animation-delay: 405ms; }\n\n@media (prefers-reduced-motion: reduce) {\n  .script-selector .nav-pills > li.nav-item {\n    animation: none;\n    transform: none;\n  }\n\n  .script-selector.hidden .nav-pills > li.nav-item {\n    transform: none;\n  }\n}\n\n.script-selector.hidden,\n.gear-container.hidden,\n.footer.hidden {\n  opacity: 0;\n  pointer-events: none;\n}\n\n\n.general-config {\n  display: flex;\n  flex-direction: row;\n  gap: 10px;\n}\n\n.gear-container {\n  font-size: 16px;\n  width: 0px;\n  height: 40px;\n  justify-content: center;\n  align-items: center;\n  position: relative;\n  transition: width 0.15s, opacity 0.15s;\n  cursor: pointer;\n  border-top: 2px solid transparent;\n  border-bottom: 2px solid transparent;\n}\n\n.gear-container::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(ellipse 70% 150% at center bottom, var(--white-gradient), transparent 70%);\n  opacity: 0;\n  transition: opacity 0.25s ease;\n  transition-delay: 0.15s;\n  pointer-events: none;\n}\n\n.gear-container:hover::before {\n  opacity: 1;\n}\n\n.gear-container:not(:hover)::before {\n  transition-delay: 0s;\n}\n\n.gear-container:not(:has(.hidden)) {\n  width: 40px;\n}\n\n.gear-container:hover .bi-gear-fill {\n  opacity: 0;\n}\n\n.gear-container:hover .standard-line,\n.gear-container:hover {\n  width: 117px;\n}\n\n.gear-container .standard-label {\n  width: 160px;\n}\n\n.gear-container:hover .standard-label {\n  opacity: 1;\n}\n\n\n.standard-label {\n  opacity: 0;\n  transition: opacity 0.10s;\n  position: absolute;\n  left: 8px;\n  cursor: pointer;\n  pointer-events: none;\n  bottom: 7px;\n}\n\n.gear-container .bi-gear-fill {\n  color: var(--text-general);\n  opacity: 1;\n  transition: color 0.15s, opacity 0.1s;\n  left: 10px;\n  font-size: 20px;\n  position: absolute;\n  bottom: 5px;\n}\n\n.gear-container .bi-gear-fill.hidden {\n  opacity: 0;\n  pointer-events: none;\n}\n\n.gear-container.bi-gear-fill:hover .standard-line {\n  width: 100%;\n  background-color: var(--text-general);\n}\n\n.save-selector {\n  display: flex;\n  flex-direction: column;\n  transition: width 0.15s;\n}\n\n.custom-dropdown {\n  max-width: 250px !important;\n  min-width: 100px !important;\n  justify-content: space-between;\n  margin-top: 0.6rem !important;\n  color: var(--white-general) !important;\n  transition: color 0.15s !important;\n  background-color: transparent !important;\n  border: 0px !important;\n  position: relative;\n  padding: 6px 10px !important;\n  display: flex !important;\n  align-items: center;\n  justify-content: space-around;\n}\n\n\n.custom-dropdown::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(ellipse 70% 150% at center bottom, var(--new-primary), transparent 70%);\n  opacity: 0;\n  transition: opacity 0.25s ease;\n  transition-delay: 0.15s;\n  pointer-events: none;\n  z-index: -1;\n}\n\n#numberButton::before {\n  z-index: 0 !important;\n}\n\n.custom-dropdown:hover::before {\n  opacity: 1;\n}\n\n.custom-dropdown:not(:hover)::before {\n  transition-delay: 0s;\n}\n\n.custom-dropdown+.dropdown-line {\n  width: 0%;\n  background-color: var(--new-primary);\n}\n\n\n.custom-dropdown:hover+.dropdown-line {\n  width: 100%;\n  background-color: var(--new-primary);\n}\n\n.custom-dropdown-no-margin {\n  max-width: 250px !important;\n  background-color: var(--separator) !important;\n  margin-bottom: 1% !important;\n  border: 2px solid transparent !important;\n  border-radius: 10px !important;\n  color: var(--white-general) !important;\n  transition: border-color 0.15s !important;\n}\n\n.dropdown-line {\n  height: 2px;\n  width: 0%;\n  background-color: var(--text-general);\n  transition: width 0.15s, color 0.15s;\n}\n\n.standard-line {\n  height: 2px;\n  width: 0%;\n  background-color: var(--text-general);\n  transition: width 0.15s, color 0.15s;\n  position: absolute;\n  bottom: 0;\n  left: -2px;\n}\n\n.new-custom-dropdown::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(ellipse 70% 150% at center bottom, var(--white-gradient), transparent 70%);\n  opacity: 0;\n  transition: opacity 0.25s ease;\n  transition-delay: 0.15s;\n  pointer-events: none;\n}\n\n.new-custom-dropdown:hover::before {\n  opacity: 1;\n}\n\n.new-custom-dropdown:not(:hover)::before {\n  transition-delay: 0s;\n  /* No delay when not hovering */\n}\n\n#saveSelector {\n  min-width: 140px;\n}\n\n#saveSelector:focus::before {\n  opacity: 1;\n}\n\n#saveSelector:focus+.dropdown-line {\n  width: 100%;\n}\n\n.new-custom-dropdown {\n  max-width: 250px !important;\n  background-color: transparent !important;\n  color: var(--white-general) !important;\n  border: 0px !important;\n  position: relative;\n  padding: 6px 10px !important;\n  display: flex;\n  align-items: center;\n  justify-content: space-around;\n}\n\n.new-custom-dropdown:hover+.dropdown-line {\n  width: 100%;\n  background-color: var(--text-general);\n}\n\n#numberButton {\n  flex-direction: row;\n  align-items: center;\n  margin-top: 0 !important;\n  font-size: 20px;\n}\n\n.number-details .form-check {\n  font-size: 18px;\n}\n\n.custom-dropdown-no-margin:hover {\n  border: 2px solid var(--white-general) !important;\n}\n\n.custom-dropdown-no-margin:active {\n  background-color: var(--active-general) !important;\n}\n\n.addTracks-button {\n  margin-top: 0.4rem;\n  max-width: 210px;\n  background-color: var(--separator) !important;\n  margin-bottom: 1%;\n  border: 2px solid transparent !important;\n  border-radius: 10px !important;\n  box-shadow: none;\n\n}\n\n.addTracks-button:hover {\n  border: 2px solid var(--white-general) !important;\n}\n\n.addTracks-button:active {\n  background-color: var(--active-general);\n}\n\n#addTrackMenu {\n  max-height: 300px;\n  overflow-y: scroll;\n}\n\n#addTrackMenu::-webkit-scrollbar {\n  width: 4px;\n}\n\n#addTrackMenu::-webkit-scrollbar-thumb {\n  background-color: var(--white-general);\n  border-radius: 3px;\n}\n\n#addTrackMenu::-webkit-scrollbar-thumb:hover {\n  background-color: var(--scrollbar-hover);\n}\n\n.nav-item {\n  cursor: pointer;\n}\n\n.menu-race {\n  max-width: 200px;\n}\n\n.name-flag {\n  margin-left: 8px;\n  width: 30px;\n  height: 24px;\n  border-radius: 20px;\n  opacity: 0.9;\n}\n\n.name-div-edit-stats {\n  display: flex;\n  align-items: center;\n  gap: 4px;\n  /* max-height: 24px; */\n}\n\n.menuFlag {\n  height: 10px;\n  width: 20px;\n  margin-left: 10px;\n}\n\n#edit_teams {\n  display: flex;\n  flex-direction: column;\n}\n\n#objAndYear {\n  display: flex;\n  flex-direction: row;\n  gap: 15px;\n  align-items: center;\n}\n\nbody.og-theme .main-columns-drag-section,\nbody.og-theme .main-editStats-section,\nbody.og-theme .main-viewer-section,\nbody.og-theme .main-calendar-section {\n  background-color: var(--background);\n  border: 1px solid var(--slight-contrast);\n  box-shadow: none;\n}\n\n.main-columns-drag-section {\n  margin-left: 14px;\n  margin-right: 14px;\n  background-color: var(--generals);\n  color: var(--white-general);\n  overflow-y: auto;\n  border-radius: 10px;\n  box-shadow: var(--shadow-s)\n}\n\n.attributes-panel {\n  display: flex;\n  flex-direction: row;\n  gap: 20px;\n}\n\n.attributes-column {\n  display: flex;\n  flex-direction: column;\n  gap: 10px;\n  width: 100%;\n}\n\n.stats-graph {\n  width: 30%;\n  padding: 0px;\n  height: 230px;\n  transform: translateY(53px);\n  border-left: 3px solid var(--separator-light);\n}\n\n.title-and-stats {\n  display: flex;\n  flex-direction: column;\n  gap: 10px;\n  width: 100%;\n  padding: 18px 0px 10px 25px;\n}\n\n.stats-and-graph {\n  display: flex;\n  flex-direction: row;\n  gap: 20px;\n  width: 100%;\n}\n\n\n\n.attributes-title {\n  font-size: 20px;\n  color: var(--text-secondary);\n}\n\n.main-panel-stats,\n.other-attributes-stats {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  gap: 10px;\n}\n\n.stats-row {\n  display: flex;\n  flex-direction: row;\n  gap: 15px;\n  align-items: center;\n}\n\n.stats-row-separator {\n  width: 2px;\n  background-color: var(--separator-light);\n  height: 63px;\n}\n\n.stats-row-separator-invisible {\n  width: 2px;\n  background-color: transparent;\n  height: 60px;\n  pointer-events: none;\n  opacity: 0;\n}\n\n.extra-atributes {\n  display: grid;\n  width: 100%;\n  grid-template-columns: repeat(3, 0.34fr);\n  gap: 10px 15px;\n}\n\n.bottom-panel {\n  display: flex;\n  flex-direction: row;\n}\n\n.left-panel-stats {\n  width: 100%;\n}\n\n.custom-hr {\n  border: none;\n  height: 2px;\n  /* border: 1px solid var(--separator); */\n  margin-left: 10px;\n  margin-right: 10px;\n  margin-top: 1rem;\n  margin-bottom: 1rem;\n  background-color: var(--separator);\n}\n\n\n.categoryPills,\n.scriptPills,\n.generalPills {\n  padding: 6px 12px !important;\n  border-radius: 10px !important;\n}\n\n.pill-types {\n  display: flex;\n  flex-direction: row;\n  color: var(--text-general);\n  font-size: 18px;\n  width: 100%;\n}\n\n.pill-types .activeType {\n  color: var(--white-general);\n}\n\n\n#editPills {\n  position: absolute;\n  z-index: 1;\n  right: 350px;\n  transition: color 0.15s;\n}\n\n#dataPills {\n  z-index: 1 !important;\n  padding-left: 144px;\n  transition: color 0.15s;\n}\n\n#iaPills {\n  z-index: 1 !important;\n  padding-left: 36px;\n  transition: color 0.15s;\n\n}\n\n\n#iaPills .pill-line {\n  background-color: var(--mode-line-ai);\n}\n\n\n#dataPills .pill-line {\n  background-color: var(--mode-line-view);\n}\n\n\n#editPills .pill-line {\n  background-color: var(--mode-line-edit);\n}\n\n#predict_results,\n#edit_stats,\n#car_performance,\n#driver_transfers,\n#regulations,\n#season_viewer,\n#head2head_viewer,\n#car_performance,\n#season_mods,\n#news {\n  flex-direction: column;\n}\n\n#regulations .main-viewer-section.points-and-cfd{\n  margin-left: 0px;\n  flex-grow: 1;\n}\n\n#regulations .custom-input-number{\n  padding: 0 3px;\n}\n\n#regulations .small-regulations .custom-input-number{\n  max-width: 25px;\n}\n\n#regulations .main-viewer-section.small-regulations{\n  width: 36%;\n}\n\n#regulations .main-viewer-section.small-regulations .viewer-element{\n  height: 56px;\n}\n\n#regulations .regulations-main {\n  flex: 1;\n  min-height: 0;\n  gap: 14px;\n  max-height: calc(100% - 110px);\n}\n\n#regulations .regulations-panels {\n  display: flex;\n  gap: 14px;\n  min-height: 0;\n}\n\n#regulations .regulations-panels .viewer-details {\n  min-height: 0;\n  flex: 1 1 0;\n  min-width: 0;\n}\n\n#regulations .viewer-details {\n  padding: 14px;\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n}\n\n#regulations .viewer-title {\n  font-family: 'Formula1Bold';\n  font-size: 18px;\n  color: var(--white-general);\n}\n\n#regulations .viewer-title-row {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  min-width: 0;\n}\n\n#regulations .viewer-element {\n  background-color: var(--elements);\n  border-radius: 10px;\n  padding: 10px 12px;\n  box-shadow: var(--shadow-s);\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 12px;\n}\n\n#regulations .viewer-element-name {\n  color: var(--text-secondary);\n  font-size: 16px;\n}\n\n#regulations .viewer-element .stat-number {\n  gap: 6px;\n  margin: 0px !important;\n}\n\n#regulations .regulations-table-wrap {\n  overflow-x: auto;\n}\n\n#regulations .regulations-grid {\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  gap: 2px;\n}\n\n.regulations-grid-resources .regulations-grid-header,\n.regulations-grid-resources .regulations-row,\n.regulations-grid-points .regulations-grid-header,\n.regulations-grid-points .regulations-row {\n  justify-content: space-between;\n}\n\n#regulations .regulations-grid-header {\n  display: flex;\n  gap: 8px;\n  padding: 0 10px 6px;\n}\n\n#regulations .regulations-grid-body {\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n}\n\n#regulations .regulations-row {\n  display: flex;\n  gap: 8px;\n  align-items: center;\n  background-color: color-mix(in srgb, var(--background) 55%, transparent);\n  border-radius: 8px;\n  padding: 8px 10px;\n}\n\n#regulations .regulations-cell {\n  color: var(--text-general);\n}\n\n#regulations .regulations-colheader {\n  font-family: 'Formula1Bold';\n  font-size: 12px;\n  text-transform: uppercase;\n  color: var(--text-secondary);\n  white-space: nowrap;\n}\n\n#regulations .regulations-keycell {\n  font-family: 'Formula1Bold';\n  color: var(--white-general);\n  white-space: nowrap;\n  text-align: center;\n  width: 45px;\n  text-align: center;\n  cursor: default;\n}\n\n#regulations #regPointSchemeBody input.custom-input-number,\n#regulations #regResourcePackageBody input.custom-input-number,\n.regulations-grid-resources .regulations-grid-header .regulations-colheader,\n.regulations-grid-points .regulations-grid-header .regulations-colheader {\n  width: 45px;\n  text-align: center;\n}\n\n.wind-tunnel-header, .points-header {\n  width: min-content !important;\n}\n\n#regulations #regSpendingCap.custom-input-number {\n  max-width: 155px;\n}\n\n#regulations .regulations-switch.form-switch {\n  padding-left: 0;\n  display: flex;\n  align-items: center;\n}\n\n.form-check{\n  margin-bottom: 0px !important;\n}\n\n#regulations .regulations-switch .form-check-input {\n  margin: 0;\n}\n\n#probText {\n  padding-top: 2px;\n  color: var(--text-general);\n}\n\n#probSelector {\n  display: flex;\n  align-items: center;\n}\n\n#raceProbButton,\n#yearPredictionModalButton {\n  margin-top: 0.45rem !important;\n}\n\n#probViewer {\n  width: 100%;\n  height: 660px;\n  max-height: 660px;\n}\n\n#mainProb {\n  width: 100%;\n}\n\n/*\nDRIVERS TABLE\n*/\n\n.first {\n  color: var(--table-first) !important;\n}\n\n.teams-table-row .teams-table-team {\n  width: 9.4%;\n  gap: 2px;\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  justify-content: center;\n}\n\n.teams-table-row .teams-table-team span {\n  line-height: 1.03;\n}\n\n.teams-table-engine-name {\n  color: var(--engine-table-name);\n  display: block;\n  text-transform: uppercase;\n  font-size: 13px;\n}\n\n.teams-table-engine {\n  display: flex;\n  align-items: flex-end;\n  gap: 3px;\n}\n\n.teams-table-engine-logo {\n  width: 12px;\n  height: 12px;\n  object-fit: contain;\n  flex: 0 0 auto;\n}\n\n.teams-table-row:hover .teams-table-engine-name {\n  color: var(--engine-table-name-hover);\n}\n\n.drivers-table-row.odd:hover .first,\n.drivers-table-row:hover .first,\n.teams-table-row.odd:hover .first,\n.teams-table-row:hover .first {\n  background-color: var(--table-first) !important;\n  color: var(--table-hover-text) !important;\n}\n\n.second {\n  color: var(--table-second) !important;\n}\n\n.drivers-table-row.odd:hover .second,\n.drivers-table-row:hover .second,\n.teams-table-row.odd:hover .second,\n.teams-table-row:hover .second {\n  background-color: var(--table-second) !important;\n  color: var(--table-hover-text) !important;\n}\n\n.third {\n  color: var(--table-third) !important;\n}\n\n.drivers-table-row.odd:hover .third,\n.drivers-table-row:hover .third,\n.teams-table-row.odd:hover .third,\n.teams-table-row:hover .third {\n  background-color: var(--table-third) !important;\n  color: var(--table-hover-text) !important;\n}\n\n.fastest {\n  text-decoration: underline;\n  text-decoration-color: #c90fd7;\n  text-decoration-thickness: 2px;\n  text-underline-offset: 2px;\n}\n\n.dotd::after {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  right: 0;\n  width: 12%;\n  height: 27%;\n  border-top: 3px solid var(--positive-general);\n  border-right: 3px solid var(--positive-general);\n}\n\n.dotd::before {\n  content: \"\";\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 12%;\n  height: 27%;\n  border-bottom: 3px solid var(--positive-general);\n  border-left: 3px solid var(--positive-general);\n}\n\n/* \n.drivers-table-row:hover .dotd::before {\n  border-bottom: 3px solid var(--table-hover-text);\n  border-left: 3px solid var(--table-hover-text);\n}\n\n.drivers-table-row:hover .dotd::after {\n  border-top: 3px solid var(--table-hover-text);\n  border-right: 3px solid var(--table-hover-text);\n} */\n\n\n\n.drivers-table-header,\n.teams-table-header {\n  display: flex;\n  flex-direction: row;\n  color: var(--text-general);\n  padding-top: 1px;\n  background-color: var(--table-header);\n  box-shadow: var(--shadow-s);\n  border-top-right-radius: 10px;\n  border-top-left-radius: 10px;\n\n}\n\n.drivers-table-row {\n  display: flex;\n  flex-direction: row;\n  height: 30px;\n}\n\n.teams-table-row {\n  display: flex;\n  flex-direction: row;\n  height: 60px;\n}\n\n.drivers-table-data,\n.teams-table-data {\n  overflow-y: auto;\n  font-size: 15px;\n  max-height: 80vh;\n}\n\n:not(.f2-table-data) .drivers-table-row:first-child .drivers-table-position,\n:not(.f2-table-data) .teams-table-row:first-child .teams-table-position {\n  background-color: var(--f1-first);\n  color: var(--text-general);\n}\n\n.f2-table-data .drivers-table-row:first-child .drivers-table-position,\n.f2-table-data .teams-table-row:first-child .teams-table-position {\n  background-color: var(--f2-back);\n  color: var(--text-general);\n}\n\n.f3-table-data .drivers-table-row:first-child .drivers-table-position,\n.f3-table-data .teams-table-row:first-child .teams-table-position {\n  background-color: var(--f3-back);\n  color: var(--text-general);\n}\n\n.drivers-table-row:has(.drivers-table-position.champion) .drivers-table-position,\n.teams-table-row:has(.teams-table-position.champion) .teams-table-position {\n  border-left: 2px solid #FEDB37;\n  background: linear-gradient(90deg, rgba(254, 219, 55, 0.35) 0%, var(--table-default-odd) 75%);\n}\n\n.drivers-table-row:has(.drivers-table-position.champion):hover .drivers-table-position,\n.teams-table-row:has(.teams-table-position.champion):hover .teams-table-position {\n  border-left: 2px solid #FEDB37;\n  background: linear-gradient(90deg, rgba(254, 219, 55, 0.35) 0%, var(--text-general) 75%);\n  color: var(--negative-text) !important;\n}\n\n.drivers-table-row:has(.drivers-table-position.champion) .drivers-table-points,\n.teams-table-row:has(.teams-table-position.champion) .teams-table-points {\n  border-right: 2px solid #FEDB37;\n  background: linear-gradient(270deg, rgba(254, 219, 55, 0.35) 0%, var(--table-default-odd) 75%);\n}\n\n.drivers-table-row:has(.drivers-table-position.champion):hover .drivers-table-points,\n.teams-table-row:has(.teams-table-position.champion):hover .teams-table-points {\n  border-right: 2px solid #FEDB37;\n  background: linear-gradient(270deg, rgba(254, 219, 55, 0.35) 0%, var(--text-general) 75%);\n  color: var(--negative-text) !important;\n}\n\n\n.drivers-table-data::-webkit-scrollbar {\n  width: 4px !important;\n  margin-left: 4px;\n}\n\n.drivers-table-data::-webkit-scrollbar-thumb {\n  background-color: var(--white-general);\n  border-radius: 3px !important;\n}\n\n.drivers-table-data::-webkit-scrollbar-thumb:hover {\n  background-color: var(--scrollbar-hover);\n}\n\n\n.drivers-table-row:hover .drivers-table-driver,\n.drivers-table-row:hover .drivers-table-normal,\n.teams-table-row:hover .teams-table-normal {\n  background-color: var(--text-general);\n  color: var(--negative-text);\n}\n\n.drivers-table-row.odd:hover .drivers-table-driver,\n.drivers-table-row.odd:hover .drivers-table-normal,\n.teams-table-row.odd:hover .teams-table-normal {\n  background-color: var(--text-general);\n  color: var(--negative-text);\n}\n\n\n.drivers-table-row:hover .drivers-table-position,\n.teams-table-row:hover .teams-table-position,\n.drivers-table-row-odd:hover .drivers-table-position,\n.teams-table-row-odd:hover .teams-table-position,\n.drivers-table-row.odd:hover .standings-pos-change,\n.teams-table-row.odd:hover .standings-pos-change,\n.drivers-table-row.odd:hover .standings-points-gap,\n.teams-table-row.odd:hover .standings-points-gap {\n  background-color: var(--text-general) !important;\n  color: var(--negative-text) !important;\n}\n\n.drivers-table-row:hover .drivers-table-points,\n.teams-table-row:hover .teams-table-points,\n.drivers-table-row:hover .standings-pos-change,\n.teams-table-row:hover .standings-pos-change,\n.drivers-table-row:hover .standings-points-gap,\n.teams-table-row:hover .standings-points-gap{\n  background-color: var(--text-general) !important;\n  color: var(--negative-text);\n}\n\n.drivers-table-row:hover .standings-pos-change.up,\n.teams-table-row:hover .standings-pos-change.up {\n  color: var(--positive-general-darker) !important;\n}\n\n\n.drivers-table-row:hover .standings-pos-change.down,\n.teams-table-row:hover .standings-pos-change.down {\n  color: var(--negative-general) !important;\n}\n\n.drivers-table-row:hover,\n.teams-table-row:hover {\n  cursor: pointer;\n}\n\n.drivers-table-row span.bold-font {\n  color: var(--white-general);\n}\n\n\n\n.drivers-table-row:hover span.bold-font {\n  color: var(--negative-text) !important;\n}\n\n.drivers-table-row .drivers-table-normal,\n.teams-table-row .teams-table-normal,\n.drivers-table-row .drivers-table-driver,\n.drivers-table-row .drivers-table-points,\n.drivers-table-row .drivers-table-position,\n.drivers-table-row .drivers-table-logo-div,\n.teams-table-row .standings-pos-change,\n.teams-table-row .standings-points-gap,\n.drivers-table-row .standings-pos-change,\n.drivers-table-row .standings-points-gap {\n  background-color: var(--table-default);\n}\n\n.drivers-table-row.odd .drivers-table-normal,\n.teams-table-row.odd .teams-table-normal,\n.drivers-table-row.odd .drivers-table-driver,\n.drivers-table-row.odd .drivers-table-points,\n.drivers-table-row.odd .drivers-table-position,\n.drivers-table-row.odd .drivers-table-logo-div,\n.drivers-table-row.odd .standings-pos-change,\n.teams-table-row.odd .standings-pos-change,\n.teams-table-row.odd .standings-points-gap,\n.drivers-table-row.odd .standings-points-gap {\n  background-color: var(--table-default-odd);\n}\n\n.teams-table-row .teams-table-team,\n.teams-table-row .teams-table-points,\n.teams-table-row .teams-table-position {\n  background-color: var(--table-default)\n}\n\n.teams-table-row .teams-table-team {\n  padding: 0 7px;\n}\n\n.teams-table-row.odd .teams-table-team,\n.teams-table-row.odd .teams-table-points,\n.teams-table-row.odd .teams-table-position {\n  background-color: var(--table-default-odd);\n}\n\n.teams-table-row:hover .teams-table-team {\n  background-color: var(--text-general);\n  color: var(--negative-text);\n  border-color: var(--text-general);\n}\n\n.drivers-table-normal[data-pos=\"DNF\"] {\n  color: var(--table-dnf);\n}\n\n\n.drivers-table-normal,\n.teams-table-normal {\n  flex: 1 0 0;\n  text-align: center;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  font-size: 14px;\n  position: relative;\n}\n\n.teams-table-multi {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: center;\n  align-items: center;\n  gap: 2px 6px;\n  width: 100%;\n  line-height: 1.1;\n}\n\n.teams-table-multi-item {\n  white-space: nowrap;\n}\n\n.f3-table-data .teams-table-multi-item {\n  font-size: 12px;\n}\n\n.drivers-table-position,\n.teams-table-position {\n  width: 40px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding-top: 3px;\n  position: relative;\n}\n\n.drivers-table-data .drivers-table-points,\n.teams-table-data .teams-table-points {\n  padding-top: 3px;\n}\n\n#season_viewer {\n  --standings-details-col-width: 0px;\n}\n\n#season_viewer.standings-details-enabled {\n  --standings-details-col-width: 44px;\n}\n\n.drivers-table-header .standings-pos-change,\n.teams-table-header .standings-pos-change,\n.drivers-table-header .standings-points-gap,\n.teams-table-header .standings-points-gap {\n  font-family: \"Formula1Bold\" !important;\n  padding-top: 0px !important;\n}\n\n.standings-pos-change,\n.standings-points-gap {\n  flex: 0 0 var(--standings-details-col-width);\n  width: var(--standings-details-col-width);\n  min-width: 0;\n  overflow: hidden;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: 1px;\n  font-size: 13px;\n  line-height: 1;\n  font-family: 'NumbersFont';\n  padding-top: 0;\n}\n\n\n#season_viewer.standings-details-enabled .standings-pos-change,\n#season_viewer.standings-details-enabled .standings-points-gap {\n  padding-top: 3px;\n}\n\n.standings-pos-change.up {\n  color: var(--positive-general);\n}\n\n.standings-pos-change.down {\n  color: var(--negative-general);\n}\n\n.standings-pos-change.neutral {\n  color: var(--text-secondary);\n}\n\n.standings-points-gap {\n  color: var(--text-secondary);\n}\n\n.drivers-table-row:has(.drivers-table-points.eliminated) .standings-points-gap,\n.teams-table-row:has(.teams-table-points.eliminated) .standings-points-gap {\n  color: var(--table-dnf) !important;\n}\n\n#season_viewer.standings-details-enabled .drivers-table-row.last-title-contender {\n  border-bottom: 1px solid var(--table-dnf);\n}\n\n#season_viewer.standings-details-enabled .teams-table-row.last-title-contender {\n  border-bottom: 1px solid var(--table-dnf);\n}\n\n.drivers-table-data .drivers-table-position,\n.teams-table-data .teams-table-position {\n  font-family: 'NumbersBold' !important;\n  font-size: 16px;\n}\n\n.drivers-table-data .drivers-table-points,\n.teams-table-data .teams-table-points {\n  font-family: 'NumbersBold' !important;\n  font-size: 16px;\n}\n\n\n.drivers-table-header .drivers-table-position,\n.teams-table-header .teams-table-position {\n  padding-top: 0;\n  padding-bottom: 1px;\n}\n\n.aston-team-table-logo {\n  padding: 6px 0 !important;\n}\n\n.racingpoint-team-table-logo,\n.jordan-team-table-logo {\n  padding: 9px 4px !important;\n}\n\n.cadillac-team-table-logo {\n  padding: 9px 5px !important;\n}\n\n.ferrari-team-table-logo {\n  padding: 8px !important;\n}\n\n.mclaren-team-table-logo {\n  margin-right: 3px !important;\n}\n\n.teams-table-logo-inner.mclaren-team-table-logo:not(img) {\n  -webkit-mask: url('/assets/images/logos/mclaren.svg') no-repeat center;\n  mask: url('/assets/images/logos/mclaren.svg') no-repeat center;\n  -webkit-mask-size: 90%;\n  mask-size: 90%;\n  background-color: #f0f0f0;\n}\n\n.redbull-team-table-logo {\n  padding: 13px 0px !important;\n}\n\n.ford-team-table-logo {\n  padding: 10px 4px !important;\n}\n\n.merc-team-table-logo {\n  padding: 9px !important;\n}\n\n.alpine-team-table-logo {\n  padding: 13px 2px !important\n}\n\n.williams-team-table-logo {\n  padding: 2px!important;\n}\n\n.haas-team-table-logo {\n  padding: 7px !important;\n}\n\n.stake-team-table-logo {\n  padding: 3px !important;\n}\n\n.alphatauri-team-table-logo {\n  padding: 15px 9px !important;\n}\n\n.hugo-team-table-logo {\n  padding: 5px 1px !important;\n}\n\n.toyota-team-table-logo {\n  padding: 13px 8px !important;\n}\n\n.teams-table-logo-inner.toyota-team-table-logo:not(img) {\n  -webkit-mask: url('/assets/images/logos/toyota.svg') no-repeat center;\n  mask: url('/assets/images/logos/toyota.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--white-general);\n  width: 48px;\n}\n\n.porsche-team-table-logo {\n  padding: 11px !important;\n}\n\n.brawn-team-table-logo {\n  padding: 24px 6px !important;\n}\n\n.audi-team-table-logo {\n  padding: 20px 5px !important;\n}\n\n.custom-team-table-logo {\n  padding: 1px !important;\n}\n\n.drivers-table-logo {\n  width: 30px;\n  height: 30px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  opacity: 1;\n  transition: opacity 0.15s;\n}\n\n.teams-table-logo {\n  width: 60px;\n  height: 60px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  transition: border-height 0.15s;\n  position: relative;\n  z-index: 1;\n}\n\n\n.teams-table-logo-inner {\n  width: 60px;\n  height: 60px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 5px;\n  position: relative;\n  z-index: 1;\n}\n\n.junior-team-logo-driver{\n  width: 30px;\n  height: 30px;\n}\n\n.junior-team-logo-team{\n  width: 60px;\n}\n\n.team-logo-abbr {\n  font-family: 'Formula1Bold';\n  font-size: 12px;\n  letter-spacing: 0.5px;\n  color: #f5f5f5;\n  text-transform: uppercase;\n  width: 30px;\n  height: 100%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n/*\nphm\n*/\n.team-logo-abbr:has(.junior-team-logo-driver[data-teamid=\"17\"]) img,  .team-logo-abbr:has(.junior-team-logo-driver[data-teamid=\"31\"]) img{ \n  padding: 7px 0;\n  width: 32px;\n}\n\n\n\n/* mp */\n.team-logo-abbr:has(.junior-team-logo-driver[data-teamid=\"16\"]) img, .team-logo-abbr:has(.junior-team-logo-driver[data-teamid=\"27\"]) img { \n  width: 38px;\n  padding: 3px 0px;\n}\n\n.junior-formula-logo img[data-junior-team-id=\"16\"], .junior-formula-logo img[data-junior-team-id=\"27\"] {\n  width: 38px;\n}\n\n\n/* carlin*/\n.team-logo-abbr:has(.junior-team-logo-driver[data-teamid=\"13\"]) img, .team-logo-abbr:has(.junior-team-logo-driver[data-teamid=\"29\"]) img { \n  padding: 0px;\n}\n\n.junior-formula-logo img[data-junior-team-id=\"13\"], .junior-formula-logo img[data-junior-team-id=\"29\"] {\n  padding: 0px\n}\n\n.team-logo-abbr:has(.junior-team-logo-team[data-teamid=\"13\"]) img, .team-logo-abbr:has(.junior-team-logo-team[data-teamid=\"29\"]) img { \n  width: 55px;\n}\n\n/*trident*/\n.team-logo-abbr:has(.junior-team-logo-driver[data-teamid=\"21\"]) img, .team-logo-abbr:has(.junior-team-logo-driver[data-teamid=\"23\"]) img {\n  width: 45px;\n}\n\n.junior-formula-logo img[data-junior-team-id=\"21\"], .junior-formula-logo img[data-junior-team-id=\"23\"] {\n  width: 40px;\n}\n\n\n/* art */\n.team-logo-abbr:has(.junior-team-logo-driver[data-teamid=\"15\"]) img, .team-logo-abbr:has(.junior-team-logo-driver[data-teamid=\"24\"]) img {\n  width: 38px;\n}\n\n.junior-formula-logo img[data-junior-team-id=\"15\"], .junior-formula-logo img[data-junior-team-id=\"24\"] {\n  width: 34px;\n}\n\n\n/*hitech*/\n.team-logo-abbr:has(.junior-team-logo-driver[data-teamid=\"14\"]) img, .team-logo-abbr:has(.junior-team-logo-driver[data-teamid=\"25\"]) img {\n  width: 38px;\n}\n\n.junior-formula-logo img[data-junior-team-id=\"14\"], .junior-formula-logo img[data-junior-team-id=\"25\"] {\n  width: 34px;\n}\n\n.team-logo-abbr:has(.junior-team-logo-team[data-teamid=\"14\"]) img, .team-logo-abbr:has(.junior-team-logo-team[data-teamid=\"25\"]) img {\n  width: 74px;\n}\n\n/* var */\n.team-logo-abbr:has(.junior-team-logo-driver[data-teamid=\"20\"]) img, .team-logo-abbr:has(.junior-team-logo-driver[data-teamid=\"26\"]) img {\n  width: 38px;\n}\n\n.junior-formula-logo img[data-junior-team-id=\"20\"], .junior-formula-logo img[data-junior-team-id=\"26\"] {\n  width: 32px;\n}\n\n\n/* prema */\n.team-logo-abbr:has(.junior-team-logo-driver[data-teamid=\"11\"]) img, .team-logo-abbr:has(.junior-team-logo-driver[data-teamid=\"22\"]) img {\n  padding: 6px 2px;\n}\n\n.junior-formula-logo img[data-junior-team-id=\"11\"], .junior-formula-logo img[data-junior-team-id=\"22\"] {\n  padding: 3px 1px;\n}\n\n/* campos */\n.team-logo-abbr:has(.junior-team-logo-driver[data-teamid=\"19\"]) img, .team-logo-abbr:has(.junior-team-logo-driver[data-teamid=\"28\"]) img {\n  width: 38px;\n}\n\n.junior-formula-logo img[data-junior-team-id=\"19\"], .junior-formula-logo img[data-junior-team-id=\"28\"] {\n  width: 30px;\n}\n\n/* invicta */\n.team-logo-abbr:has(.junior-team-logo-driver[data-teamid=\"12\"]) img {\n  width: 42px;\n}\n\n.junior-formula-logo img[data-junior-team-id=\"12\"] {\n  width: 32px;\n}\n\n\n/* dams */\n.team-logo-abbr:has(.junior-team-logo-driver[data-teamid=\"18\"]) img {\n  width: 36px;\n}\n\n\n/* jenzer */\n.team-logo-abbr:has(.junior-team-logo-driver[data-teamid=\"30\"]) img {\n  width: 38px;\n}\n\n.driver-space:not(.affiliates-space) .junior-formula-logo{\n  display: none;\n}\n\n.junior-formula-logo {\n  width: 26px;\n  height: 22px;\n  display: flex;\n  justify-content: center;\n}\n\n.junior-formula-logo img{\n  width: 26px;\n  height: 22px;\n}\n\n.junior-formula-logo.f2-team{\n  padding-left: 2px;\n  border-left: 2px solid var(--f2-back);\n}\n\n.junior-formula-logo.f3-team{\n  padding-left: 4px;\n  border-left: 2px solid var(--f3-back);\n}\n\n.team-logo-abbr-small {\n  font-size: 11px;\n}\n\n.team-logo-abbr-large {\n  font-size: 14px;\n}\n\n\n.drivers-table-logo {\n  padding: 0px 2px;\n}\n\n.logo-up-down,\n.logo-lotus-table {\n  padding: 5px 0;\n}\n\n.logo-up-down-little {\n  padding: 2px 1px;\n}\n\n.logo-up-down-mid {\n  padding: 6px 0px;\n}\n\n.logo-up-down-extra {\n  padding-top: 10px;\n  padding-bottom: 10px;\n}\n\n.bento-grid .logo-up-down-extra, .session-results-table .logo-up-down-extra {\n  padding-top: 8px;\n  padding-bottom: 8px;\n}\n\n.records-list .logo-up-down-extra {\n  padding-top: 12px;\n  padding-bottom: 12px;\n}\n\n.bento-grid .logo-ferrari-table{\n  padding: 4px;\n}\n\n.logo-ferrari-table{\n  padding: 5px;\n}\n\n.logo-andretti-table,\n.logo-renault-table {\n  padding: 4px 3px;\n}\n\n.logo-bmw-table{\n  padding: 2px 0 0 0;\n}\n\n.bmw-team-table-logo {\n  padding: 4px 3px 1px 3px !important;\n}\n\n.logo-porsche-table {\n  padding: 5px;\n}\n\n.bento-grid .logo-porsche-table{\n  padding: 4px;\n}\n\n.bento-grid .logo-sauber-table, .session-results-row .logo-sauber-table {\n  width: 16px !important;\n}\n\n.bento-grid .logo-toyota-table{\n  width: 20px !important;\n}\n\n.session-results-row .logo-toyota-table {\n  width: 22px !important;\n}\n\n.session-results-row .logo-ferrari-table{\n  padding: 4px !important;\n}\n\n.bento-grid .logo-cadillac-table, .session-results-row .logo-cadillac-table {\n  padding: 1px 0px;\n}\n\n.logo-ford-table,\n.logo-jordan-table,\n.logo-cadillac-table {\n  padding: 4px 2px;\n}\n\n.logo-racingpoint-table{\n  padding: 4px;\n}\n\n.logo-williams-table {\n  padding: 6px 4px;\n}\n\n.logo-toyota-table{\n  width: 24px;\n}\n\n.logo-sauber-table{\n  height: 20px;\n}\n\n.drivers-table-row .hahoverback, .drivers-table-row .afhoverback{\n  width: 30px !important;\n  height: 30px;\n}\n\n\n.drivers-table-logo-div:has(.logo-sauber-table),\n.drivers-table-logo-div:has(.logo-toyota-table){\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 24px;\n}\n\n.logo-merc-table {\n  padding: 4px;\n}\n\n\n.wihoverback {\n  width: 30px;\n  height: 30px;\n}\n\n.wihoverback:has(.logo-williams-2026-table) {\n  padding: 0px 0px;\n}\n\n.athoverback {\n  width: 30px;\n  height: 30px;\n}\n\n.athoverback:has(.logo-visarb-table) {\n  padding: 5px 3px;\n}\n\n.athoverback:has(.logo-hugo-table) {\n  padding: 2px 0px;\n}\n\n.athoverback:has(.logo-alphatauri-table) {\n  padding: 8px 4px;\n}\n\n.athoverback:has(.logo-brawn-table) {\n  padding: 12px 0px;\n}\n\n\n.logo-visarb-table {\n  width: 100%;\n  height: 100%;\n  -webkit-mask: url('/assets/images/logos/visarb.svg') no-repeat center;\n  mask: url('/assets/images/logos/visarb.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--text-general);\n}\n\n.logo-hugo-table {\n  width: 100%;\n  height: 100%;\n  -webkit-mask: url('/assets/images/logos/hugoboss.svg') no-repeat center;\n  mask: url('/assets/images/logos/hugoboss.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--text-general);\n}\n\n\n.logo-alphatauri-table {\n  width: 100%;\n  height: 100%;\n  -webkit-mask: url('/assets/images/logos/alphatauri.svg') no-repeat center;\n  mask: url('/assets/images/logos/alphatauri.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--text-general);\n}\n\n.logo-brawn-table {\n  width: 100%;\n  height: 100%;\n  -webkit-mask: url('/assets/images/logos/brawn.svg') no-repeat center;\n  mask: url('/assets/images/logos/brawn.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--text-general);\n}\n\n.logo-alpine-table {\n  width: 100%;\n  height: 100%;\n  -webkit-mask: url('/assets/images/logos/alpine.svg') no-repeat center;\n  mask: url('/assets/images/logos/alpine.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--text-general);\n}\n\n.logo-mclaren-table {\n  -webkit-mask: url('/assets/images/logos/mclaren.svg') no-repeat center;\n  mask: url('/assets/images/logos/mclaren.svg') no-repeat center;\n  -webkit-mask-size: 75%;\n  mask-size: 75%;\n  background-color: var(--mclaren-primary);\n}\n\n.logo-williams-2026-table {\n  width: 100%;\n  height: 100%;\n  -webkit-mask: url('/assets/images/logos/Williams_2026_logo.svg') no-repeat center;  \n  mask: url('/assets/images/logos/Williams_2026_logo.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--williams-primary);\n}\n\n.logo-toyota-table {\n  -webkit-mask: url('/assets/images/logos/toyota.svg') no-repeat center;\n  mask: url('/assets/images/logos/toyota.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--toyota-primary);\n}\n\n.logo-sauber-table {\n  -webkit-mask: url('/assets/images/logos/sauber.svg') no-repeat center;\n  mask: url('/assets/images/logos/sauber.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--sauber-primary);\n}\n\n.alhoverback {\n  width: 30px;\n  height: 30px;\n}\n\n.alhoverback:has(.logo-alpine-table) {\n  padding: 6px 2px;\n}\n\n.alhoverback:has(.logo-andretti-table),\n.alhoverback:has(.logo-renault-table) {\n  padding: 4px 3px\n}\n\n.alhoverback:has(.logo-lotus-table) {\n  padding: 5px 0px;\n}\n\n\n.logo-andretti-table {\n  width: 100%;\n  height: 100%;\n  -webkit-mask: url('/assets/images/logos/andretti.svg') no-repeat center;\n  mask: url('/assets/images/logos/andretti.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--text-general);\n}\n\n.logo-renault-table {\n  width: 100%;\n  height: 100%;\n  -webkit-mask: url('/assets/images/logos/renault.svg') no-repeat center;\n  mask: url('/assets/images/logos/renault.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--text-general);\n}\n\n.logo-lotus-table {\n  width: 100%;\n  height: 100%;\n  -webkit-mask: url('/assets/images/logos/lotus.svg') no-repeat center;\n  mask: url('/assets/images/logos/lotus.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--text-general);\n}\n\n.drivers-table-row:hover .logo-alpine-table,\n.drivers-table-row:hover .logo-mclaren-table,\n.drivers-table-row:hover .logo-visarb-table,\n.drivers-table-row:hover .logo-alphatauri-table,\n.drivers-table-row:hover .logo-williams-2026-table,\n.drivers-table-row:hover .logo-toyota-table,\n.drivers-table-row:hover .logo-sauber-table {\n  background-color: #f0f0f0;\n}\n\n.drivers-table-row:hover .logo-renault-table,\n.drivers-table-row:hover .logo-lotus-table,\n.drivers-table-row:hover .logo-andretti-table,\n.drivers-table-row:hover .logo-lotus-table,\n.drivers-table-row:hover .logo-brawn-table {\n  background-color: #333333;\n}\n\n.logo-reduce {\n  padding: 4px;\n}\n\n\n\n\n.logo-stake-table {\n  padding: 2px 0px;\n}\n\n\n.drivers-table-header .drivers-table-position,\n.teams-table-header .teams-table-position {\n  border-top-left-radius: 5px;\n}\n\n.drivers-table-driver,\n.teams-table-team {\n  width: calc(9.4% + 60px);\n  display: flex;\n  align-items: center;\n  padding-left: 4px;\n}\n\n.drivers-table-row .drivers-table-driver {\n  width: calc(9.4% + 30px);\n  border-right: 0px solid transparent;\n  gap: 3px;\n  overflow: hidden;\n}\n\n\n\n.drivers-table-points,\n.teams-table-points {\n  width: 80px;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n\n}\n\n.drivers-table-header .drivers-table-points,\n.teams-table-header .teams-table-points {\n  border-top-right-radius: 5px;\n}\n\n\n.drivers-table-row:hover .fehoverback {\n  background-color: var(--ferrari-primary)\n}\n\n.teams-table-row .feiconback {\n  background-color: var(--ferrari-primary)\n}\n\n.feNewBackground {\n  background-color: var(--ferrari-primary);\n}\n\n.drivers-table-row:hover .ashoverback {\n  background-color: var(--aston-primary)\n}\n\n.teams-table-row .asiconback {\n  background-color: var(--aston-primary)\n}\n\n.asNewBackground {\n  background-color: var(--aston-primary);\n}\n\n.drivers-table-row:hover .mehoverback {\n  background-color: var(--mercedes-primary)\n}\n\n.teams-table-row .meiconback {\n  background-color: var(--mercedes-primary)\n}\n\n.meNewBackground {\n  background-color: var(--mercedes-primary);\n}\n\n.drivers-table-row:hover .rbhoverback {\n  background-color: var(--redbull-primary)\n}\n\n.teams-table-row .rbiconback {\n  background-color: var(--redbull-primary)\n}\n\n.rbNewBackground {\n  background-color: var(--redbull-primary);\n}\n\n.drivers-table-row:hover .mchoverback {\n  background-color: var(--mclaren-primary)\n}\n\n.teams-table-row .mciconback {\n  background-color: var(--mclaren-primary)\n}\n\n.mcNewBackground {\n  background-color: var(--mclaren-primary);\n}\n\n\n.drivers-table-row:hover .alhoverback {\n  background-color: var(--alpine-primary)\n}\n\n.teams-table-row .aliconback {\n  background-color: var(--alpine-primary)\n}\n\n.alNewBackground {\n  background-color: var(--alpine-primary);\n}\n\n.drivers-table-row:hover .hahoverback {\n  background-color: var(--haas-primary)\n}\n\n.teams-table-row .haiconback {\n  background-color: var(--haas-primary)\n}\n\n.haNewBackground {\n  background-color: var(--haas-primary);\n}\n\n.drivers-table-row:hover .wihoverback {\n  background-color: var(--williams-primary)\n}\n\n.teams-table-row .wiiconback {\n  background-color: var(--williams-primary)\n}\n\n.wiNewBackground {\n  background-color: var(--williams-primary);\n}\n\n.drivers-table-row:hover .athoverback {\n  background-color: var(--alphatauri-primary)\n}\n\n.teams-table-row .aticonback {\n  background-color: var(--alphatauri-primary)\n}\n\n.athNewBackground {\n  background-color: var(--alphatauri-primary);\n}\n\n.drivers-table-row:hover .afhoverback {\n  background-color: var(--alfa-primary)\n}\n\n.teams-table-row .aficonback {\n  background-color: var(--alfa-primary)\n}\n\n.afNewBackground {\n  background-color: var(--alfa-primary);\n}\n\n.teams-table-row .cticonback {\n  background-color: var(--custom-team-primary)\n}\n\n.drivers-table-row:hover .cthoverback {\n  background-color: var(--custom-team-primary)\n}\n\n.ctNewBackground {\n  background-color: var(--custom-team-primary);\n}\n\nbody.light-theme .drivers-table:has(.f2-table-data) .drivers-table-row .drivers-table-logo-div,\nbody.light-theme .drivers-table:has(.f3-table-data) .drivers-table-row .drivers-table-logo-div {\n  background-color: var(--white-general);\n}\n\n.drivers-table-row:hover .prehoverback {\n  background-color: #ebebeb !important;\n}\n\n.teams-table-row .preiconback {\n  background-color: #ebebeb;\n}\n\n.drivers-table-row:hover .virhoverback {\n  background-color: #2a2a2a !important;\n}\n\n.teams-table-row .viriconback {\n  background-color: #2a2a2a;\n}\n\n.drivers-table-row:hover .carhoverback {\n  background-color: #1b6fe0 !important;\n}\n\n.teams-table-row .cariconback {\n  background-color: #1b6fe0;\n}\n\n.drivers-table-row:hover .hithoverback {\n  background-color: #9FB4C7 !important;\n}\n\n.teams-table-row .hiticonback {\n  background-color: #9FB4C7;\n}\n\n.drivers-table-row:hover .arthoverback {\n  background-color: #2b2d42 !important;\n}\n\n.teams-table-row .articonback {\n  background-color: #2b2d42;\n}\n\n.drivers-table-row:hover .mphoverback {\n  background-color: #FF9144 !important;\n}\n\n.teams-table-row .mpiconback {\n  background-color: #FF9144;\n}\n\n.drivers-table-row:hover .phmhoverback {\n  background-color: #793118 !important;\n}\n\n.teams-table-row .phmiconback {\n  background-color: #793118;\n}\n\n.drivers-table-row:hover .damhoverback {\n  background-color: #00C8FF !important;\n}\n\n.teams-table-row .damiconback {\n  background-color: #00C8FF;\n}\n\n.drivers-table-row:hover .camhoverback {\n  background-color: #707070 !important;\n}\n\n.teams-table-row .camiconback {\n  background-color: #707070;\n}\n\n.drivers-table-row:hover .varhoverback {\n  background-color: #FF5A00 !important;\n}\n\n.teams-table-row .variconback {\n  background-color: #FF5A00;\n}\n\n.drivers-table-row:hover .trihoverback {\n  background-color: #7B01FF !important;\n}\n\n.teams-table-row .triiconback {\n  background-color: #7B01FF;\n}\n\n.drivers-table-row:hover .jenhoverback {\n  background-color: #00C8FF !important;\n}\n\n.teams-table-row .jeniconback {\n  background-color: #00C8FF;\n}\n\n.new-team-logo {\n  max-width: 50%;\n  align-self: center;\n  max-height: 60%;\n}\n\n.new-team-name {\n  text-transform: uppercase;\n  font-size: 36px;\n}\n\n.new-drivers-names {\n  font-size: 28px;\n}\n\n.new-vs {\n  font-size: 22px;\n  font-family: 'Formula1';\n  padding: 0px 4px 4px 4px;\n  position: relative;\n}\n\n\n\n.new-team-text {\n  align-self: center;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  flex-direction: column;\n  line-height: 1;\n}\n\n.driver-comparison-overlay {\n  display: flex;\n  height: 100%;\n  justify-content: center;\n}\n\n.prob-viewer-data {\n  overflow-y: scroll;\n  max-height: 621px;\n}\n\n.prob-viewer-header,\n.prob-viewer-row {\n  display: flex;\n  flex-direction: row;\n  color: var(--text-general);\n}\n\n.prob-row-odd {\n  background-color: var(--elements);\n}\n\n.prob-row-even {\n  background-color: var(--superficials);\n}\n\n.negative-text:hover {\n  color: var(--negative-text) !important;\n}\n\n.dark-text:hover {\n  color: var(--dark-text) !important;\n}\n\n.prob-viewer-header .viewer-header-data,\n.prob-viewer-row .viewer-header-data {\n  margin-left: 4px;\n  z-index: 3;\n}\n\n.prob-viewer-header {\n  border-bottom: 1px solid var(--white-general);\n}\n\n.viewer-header-driver {\n  width: 210px;\n  padding: 0px 7px;\n  height: 34px;\n  display: flex;\n  align-items: center;\n  transition: background-color 0.15s, color 0.15s, text-shadow 0.15s;\n  z-index: 3;\n  overflow: hidden;\n}\n\n.prob-viewer-row {\n  transition: background-color 0.15s, color 0.15s;\n  position: relative;\n}\n\n.prob-viewer-row:hover {\n  background-color: var(--dropdown-hover);\n  cursor: pointer;\n}\n\n.prob-viewer-row .viewer-header-driver span.bold-font {\n  transition: background-color 0.15s, color 0.15s;\n  margin-left: 4px;\n}\n\n.prob-viewer-row .viewer-header-driver span {\n  transition: background-color 0.15s, color 0.05s;\n}\n\n\n.prob-viewer-row .viewer-header-driver span.bold-font {\n  transition: color 0.15s;\n}\n\n\n.prob-viewer-row .viewer-header-position {\n  transition: background-color 0.15s, color 0.15s;\n  padding-top: 4px;\n  text-align: center;\n}\n\n\n.viewer-header-position {\n  width: 50px;\n  text-align: center;\n  padding-top: 4px;\n  z-index: 3;\n  transition: text-shadow 0.15s;\n}\n\n.viewer-header-pos,\n.viewer-header-data {\n  flex: 1 0 0;\n  text-align: center;\n  /* background-color: wheat; */\n}\n\n.viewer-header-pos {\n  padding-top: 4px;\n  padding-left: 4px;\n}\n\n.viewer-header-data {\n  border-radius: 5px;\n  color: var(--negative-text);\n  transition: border 0.15s;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  height: 28px;\n  margin-top: 3px;\n}\n\n.viewer-header-data.i75-100 {\n  background-color: var(--positive-general);\n  transition: background-color 0.15s, color 0.15s, text-shadow 0.15s;\n}\n\n.prob-viewer-row:hover .viewer-header-data.i75-100 {\n  background-color: transparent;\n  color: var(--positive-general);\n  text-shadow: 1px 1px 0 black;\n}\n\n.viewer-header-data.i50-75 {\n  background-color: #7adfac;\n  transition: background-color 0.15s, color 0.15s, text-shadow 0.15s;\n}\n\n.prob-viewer-row:hover .viewer-header-data.i50-75 {\n  background-color: transparent;\n  color: #7adfac;\n  text-shadow: 1px 1px 0 black;\n}\n\n.viewer-header-data.i25-50 {\n  background-color: #a2dfc0;\n  transition: background-color 0.15s, color 0.15s, text-shadow 0.15s;\n}\n\n.prob-viewer-row:hover .viewer-header-data.i25-50 {\n  background-color: transparent;\n  color: #a2dfc0;\n  text-shadow: 1px 1px 0 black;\n}\n\n.viewer-header-data.i0-25 {\n  background-color: #c5e7d6;\n  transition: background-color 0.15s, color 0.15s, text-shadow 0.15s;\n}\n\n.prob-viewer-row:hover .viewer-header-data.i0-25 {\n  background-color: transparent;\n  color: #c5e7d6;\n  text-shadow: 1px 1px 0 black;\n}\n\n.save-selector-title {\n  color: var(--text-general);\n  transition: color 0.15s;\n}\n\n.save-selector-title.activeSelected {\n  color: var(--white-general) !important;\n}\n\n.confirm-section {\n  margin-left: 20px;\n  margin-right: 20px;\n  margin-bottom: 20px;\n  margin-top: 15px;\n  background-color: var(--tools-general);\n  border: 1px solid var(--separator);\n  border-radius: 10px;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  width: 100%;\n  min-height: 276px;\n}\n\n.custom-confirm {\n  width: 140px;\n  border: 2.5px solid transparent !important;\n  border-left: 0px !important;\n  border-right: 0px !important;\n  border-radius: 10px !important;\n  color: var(--white-general) !important;\n  transition: border-color 0.15s, background-color 0.15s, color 0.15s !important;\n  background-color: transparent !important;\n}\n\n.custom-confirm::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(ellipse 70% 150% at center bottom, var(--new-primary), transparent 70%);\n  opacity: 0;\n  transition: opacity 0.25s ease;\n  transition-delay: 0.15s;\n  pointer-events: none;\n  z-index: -1;\n}\n\n.custom-confirm:hover::before {\n  opacity: 1;\n}\n\n.custom-confirm:not(:hover)::before {\n  transition-delay: 0s;\n  /* No delay when not hovering */\n}\n\n.custom-confirm+.dropdown-line {\n  width: 0%;\n  background-color: var(--new-primary);\n}\n\n.custom-confirm:hover+.dropdown-line {\n  width: 100%;\n}\n\n.extra-inputs {\n  margin-bottom: 20px !important;\n  margin-top: 20px !important;\n}\n\n\n.custom-delete {\n  width: 140px;\n  border: 2.5px solid transparent !important;\n  border-left: 0px !important;\n  border-right: 0px !important;\n  border-radius: 10px !important;\n  color: var(--white-general) !important;\n  transition: border-color 0.15s, background-color 0.15s, color 0.15s !important;\n  background-color: transparent !important;\n  display: flex;\n  justify-content: center;\n}\n\n.custom-delete::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(ellipse 70% 150% at center bottom, var(--negative-general), transparent 70%);\n  opacity: 0;\n  transition: opacity 0.25s ease;\n  transition-delay: 0.15s;\n  pointer-events: none;\n  z-index: -1;\n}\n\n.custom-delete:hover::before {\n  opacity: 1;\n}\n\n.custom-delete:not(:hover)::before {\n  transition-delay: 0s;\n  /* No delay when not hovering */\n}\n\n.custom-delete+.dropdown-line {\n  width: 0%;\n  background-color: var(--negative-general);\n}\n\n.custom-delete:hover+.dropdown-line {\n  width: 100%;\n}\n\n.delete-mode:not(:hover) {\n  background-color: transparent !important;\n  color: var(--negative-general) !important;\n}\n\n.delete-mode:not(:hover) .dropdown-line {\n  width: 0%;\n}\n\n.trash-and-text {\n  display: flex;\n  flex-direction: row;\n  gap: 10px;\n  align-items: center;\n  font-size: 18px;\n}\n\n.trash-and-text:hover {\n  cursor: pointer;\n}\n\n.main-viewer-section {\n  margin-left: 14px;\n  margin-right: 14px;\n  background-color: var(--generals);\n  color: var(--white-general);\n  overflow: hidden;\n  border-radius: 10px;\n  box-shadow: var(--shadow-s);\n}\n\n\n.year-drivers-teams {\n  padding-top: 0.6rem;\n  padding-bottom: 0.7rem;\n  position: absolute;\n  display: flex;\n  gap: 10px;\n}\n\n.prediction-buttons {\n  padding-top: 0.6rem;\n  padding-bottom: 0.7rem;\n  position: absolute;\n  display: flex;\n}\n\n.year-and-race {\n  display: flex;\n  flex-direction: row;\n  gap: 10px;\n}\n\n.drivers-teams-pills {\n  display: flex;\n  align-items: flex-end;\n}\n\n.modal-buttons {\n  gap: 10px;\n  display: flex;\n}\n\n.team-table-logo-name {\n  display: flex;\n  align-items: center;\n  gap: 7px;\n  border-right: 4px solid transparent;\n  transition: border 0.15s;\n  width: 100%;\n  height: 100%;\n}\n\n.flag-header {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  gap: 5px;\n}\n\n.flag-header img {\n  width: 100%;\n  height: 33px;\n}\n\n.text-in-front {\n  position: absolute;\n  z-index: 4;\n  color: var(--text-in-front);\n  text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);\n  font-size: 15px;\n  background: linear-gradient(to right, var(--background), color-mix(in srgb, var(--background) 60%, transparent));\n  width: 100%;\n  height: 100%;\n  align-content: center;\n}\n\n.drivers-table:has(.f2-table-data) .sprint-label,\n.teams-table:has(.f2-table-data) .sprint-label {\n  color: var(--f2-border);\n}\n\n.sprint-result-cell{\n  box-sizing: border-box;\n  border-left: 1px solid var(--table-dnf);\n}\n\n.drivers-table:has(.f2-table-data) .standings-points-gap,\n.teams-table:has(.f2-table-data) .standings-points-gap, \n.drivers-table:has(.f3-table-data) .standings-points-gap,\n.teams-table:has(.f3-table-data) .standings-points-gap{\n  border-left: 1px solid var(--table-dnf);\n}\n\n\n.drivers-table:has(.f3-table-data) .sprint-label,\n.teams-table:has(.f3-table-data) .sprint-label {\n  color: var(--f3-border);\n}\n\n.light-theme .drivers-table-header .flag-header img,\n.light-theme .teams-table-header .flag-header img {\n  opacity: 0.85 !important;\n}\n\n.light-theme .text-in-front {\n  background: transparent;\n}\n\n.main-calendar {\n  width: 100%;\n  margin-right: 14px;\n}\n\n.main-calendar-section {\n  margin-left: 14px;\n  color: var(--white-general);\n  min-height: 660px;\n  max-height: 660px;\n  overflow-y: auto;\n  border-radius: 10px;\n  display: grid;\n  grid-template-columns: repeat(5, 1fr);\n  gap: 8px;\n  overflow-x: hidden;\n  grid-auto-rows: min-content;\n}\n\n\n.main-options-section {\n  margin-left: 1.5rem;\n  margin-right: 14px;\n  border: 1px solid var(--separator);\n  color: var(--white-general);\n  min-height: 660px;\n  max-height: 660px;\n  overflow-y: auto;\n  border-radius: 10px;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: flex-start;\n}\n\n.save-calendar-section {\n  height: 530px;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: flex-end;\n}\n\n.buttons-h2h {\n  display: flex;\n  gap: 10px;\n}\n\n#driver1Button,\n#driver2Button {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n}\n\n.race-calendar {\n  position: relative;\n  background-color: var(--elements);\n  border-radius: 10px;\n  padding: 8px;\n  color: var(--text-general);\n  transition: border-color 0.15s, color 0.15s, background-color 0.15s;\n  display: flex;\n  cursor: grab !important;\n  max-height: 112px;\n  gap: 8px;\n  box-shadow: var(--shadow-s);\n  justify-content: space-between;\n  border: none;\n}\n\n.race-calendar.completed {\n  cursor: default !important;\n}\n\n.race-calendar.drop-before {\n  box-shadow: var(--shadow-s);\n}\n\n.race-calendar.drop-after {\n  box-shadow: var(--shadow-s);\n}\n\n.race-series-badges {\n  position: absolute;\n  top: 6px;\n  left: 6px;\n  cursor: pointer;\n  display: flex;\n  gap: 4px;\n  z-index: 2;\n}\n\n.race-series-badge {\n  border: none;\n  border-radius: 6px;\n  padding: 2px 5px;\n  font-size: 12px;\n  background-color: var(--elements-hover);\n  color: var(--text-secondary);\n  cursor: default;\n  box-shadow: var(--shadow-xs);\n  transition: background-color 0.15s, color 0.15s;\n}\n\n.race-series-badge:hover {\n  background-color: var(--table-hover);\n  color: var(--text-general);\n}\n\n.race-series-badge:active {\n  transform: scale(0.96);\n}\n\n.race-series-badge-f2.active-badge {\n  color: var(--f2-back);\n  background-color: color-mix(in srgb, var(--f2-back) 30%, transparent);\n}\n\n.race-series-badge-f2.active-badge:hover {\n  color: var(--f2-border);\n  background-color: color-mix(in srgb, var(--f2-border) 30%, transparent);\n}\n\n.race-series-badge-f3.active-badge {\n  color: var(--f3-back);\n  background-color: color-mix(in srgb, var(--f3-back) 30%, transparent);\n}\n\n.race-series-badge-f3.active-badge:hover {\n  color: var(--f3-border);\n  background-color: color-mix(in srgb, var(--f3-border) 30%, transparent);\n}\n\n.race-calendar-number {\n  border-right: 2px solid var(--separator);\n  font-size: 30px;\n  display: flex;\n  align-items: center;\n  width: 20%;\n  justify-content: center;\n  padding-right: 12px;\n}\n\n.race-calendar-number-completed {\n  color: var(--positive-general);\n  font-size: 34px;\n}\n\n.race-calendar-number-delete {\n  color: var(--delete-div);\n  cursor: pointer;\n  font-size: 28px;\n}\n\n.race-calendar-number-delete i {\n  border-radius: 8px;\n  transition: background-color 0.15s;\n  padding: 0 4px;\n}\n\n.race-calendar-number-delete i:hover {\n  background-color: color-mix(in srgb, var(--delete-div) 30%, transparent);\n}\n\n.upper-text-and-flag {\n  display: flex;\n  flex-direction: row;\n  justify-content: center;\n  position: relative;\n  align-items: center;\n  width: 95px;\n}\n\n.left-race {\n  gap: 4px;\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n}\n\n.right-race {\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n  gap: 2px;\n}\n\n.full-quali-weather {\n  display: flex;\n  flex-direction: row;\n  gap: 4px;\n  justify-content: space-between;\n}\n\n.session-name {\n  font-size: 20px;\n}\n\n.weather-vis {\n  width: 30px;\n  height: 30px;\n  border-radius: 10px;\n  background-color: var(--superficials);\n  border: none;\n  font-size: 19px;\n  text-align: center;\n}\n\n.weather-selector {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  margin-left: 5px;\n  font-size: 20px;\n  padding-top: 2px;\n  gap: 4px;\n}\n\n.weather-selector i {\n  cursor: pointer;\n}\n\n\n.race-calendar:not(.completed):hover {\n  color: var(--white-general);\n  background-color: var(--elements-hover);\n}\n\n.race-calendar.completed,\n.race-calendar.completed:hover {\n  color: var(--text-general);\n  background-color: var(--elements);\n  border: none;\n  box-shadow: var(--shadow-s);\n}\n\n.race-calendar.completed .left-race,\n.race-calendar.completed .right-race,\n.race-calendar.completed .race-series-badges {\n  pointer-events: none;\n}\n\n.pit-crew-button {\n  width: 100px;\n}\n\n.pit-crew-group {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  gap: 10px;\n}\n\n.pit-crew-details {\n  display: flex;\n  flex-direction: column;\n  color: var(--text-general);\n  gap: 5px;\n}\n\n.pit-crew-stat {\n  width: 23%;\n}\n\n.complete-div {\n  position: absolute;\n  top: -1px;\n  left: -1px;\n  width: 100.9%;\n  height: 101.9%;\n  background-color: var(--blur-color);\n  z-index: 20;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  border-radius: 10px;\n  color: var(--positive-general);\n  transition: color 0.15s, border-color 0.15s;\n  cursor: default;\n  backdrop-filter: blur(5px);\n}\n\n.race-calendar.completed:hover {\n  border-color: transparent;\n}\n\n.delete-div {\n  position: absolute;\n  top: -1px;\n  left: -1px;\n  width: 100.9%;\n  height: 101.9%;\n  background-color: var(--blur-color);\n  z-index: 20;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  border-radius: 10px;\n  color: var(--text-general);\n  transition: color 0.15s, border-color 0.15s;\n  cursor: default;\n  backdrop-filter: blur(5px);\n  border: none;\n}\n\n.delete-div:hover {\n  color: var(--delete-div);\n}\n\n\n\n.upper-race {\n  font-size: 24px;\n  display: flex;\n  flex-direction: row;\n  gap: 10px;\n  position: absolute;\n  z-index: 2;\n  text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.76);\n  color: var(--text-in-front);\n}\n\n.flag {\n  width: 95px;\n  height: 45px;\n  border-radius: 6px;\n  opacity: 0.45;\n}\n\nbody.light-theme .flag,\nbody.light-theme .flag-header img {\n  opacity: 0.9;\n  position: relative;\n}\n\n\n\n.main-editStats-section {\n  background-color: var(--generals);\n  color: var(--white-general);\n  height: 660px;\n  border-radius: 10px;\n  scrollbar-width: thin;\n  scrollbar-color: var(--white-general);\n  box-shadow: var(--shadow-s);\n  margin-right: 14px;\n}\n\n.staff-list::-webkit-scrollbar,\n.news-grid::-webkit-scrollbar,\n.records-list::-webkit-scrollbar,\n#juniorTeamContractMenu::-webkit-scrollbar{\n  width: 4px;\n}\n\n.staff-list::-webkit-scrollbar-thumb,\n.news-grid::-webkit-scrollbar-thumb,\n.records-list::-webkit-scrollbar-thumb,\n#juniorTeamContractMenu::-webkit-scrollbar-thumb{\n  background-color: var(--white-general);\n  border-radius: 3px;\n}\n\n.staff-list::-webkit-scrollbar-thumb:hover,\n.news-grid::-webkit-scrollbar-thumb:hover,\n.records-list::-webkit-scrollbar-thumb:hover,\n#juniorTeamContractMenu::-webkit-scrollbar-thumb:hover {\n  background-color: var(--scrollbar-hover);\n}\n\n.staff-list {\n  overflow-y: auto;\n  height: 610px;\n  margin-right: 4px;\n}\n\n.staff-logo {\n  width: 27px;\n  height: 26px;\n}\n\n.marquee-wrapper {\n  position: relative;\n  overflow: hidden;\n  flex: 1;\n  display: flex;\n}\n\n#free-staff .staff-logo {\n  width: 32px;\n  height: 23px;\n}\n\n#driverstats {\n  margin-right: 14px;\n}\n\n.main-columns-drag-section::-webkit-scrollbar {\n  width: 4px;\n}\n\n\n.main-columns-drag-section::-webkit-scrollbar-thumb {\n  background-color: var(--white-general);\n  border-radius: 3px;\n}\n\n.main-columns-drag-section::-webkit-scrollbar-thumb:hover {\n  background-color: var(--scrollbar-hover);\n}\n\n\n\n.categoryPills {\n  color: #dbdbdb !important;\n}\n\n.categoryPills.active {\n  background-color: var(--separator) !important;\n  color: #fdfdfd !important;\n}\n\n#F2pill {\n  border: 2px solid transparent;\n  transition: border-color 0.15s, background-color 0.15s, color 0.15s;\n}\n\n#F2pill:hover {\n  border: 2px solid var(--f2-border);\n  background-color: var(--f2-back);\n  color: var(--white-general) !important;\n\n}\n\n#F3pill {\n  border: 2px solid transparent;\n  transition: border-color 0.15s, background-color 0.15s, color 0.15s;\n}\n\n#F3pill:hover {\n  border: 2px solid var(--f3-border);\n  background-color: var(--f3-back);\n  color: var(--white-general) !important;\n}\n\n#F2pill.active {\n  background-color: var(--f2-active) !important;\n}\n\n#F3pill.active {\n  background-color: red !important;\n}\n\n#mainH2h .col-3.main-viewer-section{\n  padding: 10px;\n}\n\n/*First .one-statH2H with margin top 25 px and no border top*/\n#raceh2h {\n  margin-top: 25px;\n}\n\n#dnfh2h {\n  margin-bottom: 0px;\n}\n\n.one-statH2H {\n  padding-top: 5px;\n  display: flex;\n  flex-direction: column;\n  font-size: 20px;\n  color: var(--text-general);\n  transition: border-color 0.15s, background-color 0.15s;\n  align-items: center;\n  min-height: 66px;\n  border-top: 2px solid var(--separator);\n  padding: 10px 10px 0px;\n  margin-bottom: 10px;\n}\n\n.one-statH2H:hover .name-H2H .only-name {\n  color: var(--white-general);\n}\n\n.one-statH2H:hover .driver1-number,\n.one-statH2H:hover .driver2-number {\n  color: var(--white-general);\n}\n\n.driver-names {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-around;\n  font-size: 20px;\n  height: 110px;\n  margin-top: 6px;\n}\n\n.driver-space {\n  min-width: 200px;\n  max-width: 200px;\n  min-height: 40px;\n}\n\n.staff-space {\n  flex: 1 0 0;\n  max-width: 20%;\n  min-height: 40px;\n  padding: 0 3px;\n}\n\n#free-staff .technical-chief-border {\n  border-left: 2px solid var(--technical-chief);\n  padding-left: 6px;\n}\n\n#free-staff .race-engineer-border {\n  border-left: 2px solid var(--race-engineer);\n  padding-left: 6px;\n}\n\n#free-staff .head-aero-border {\n  border-left: 2px solid var(--head-aero);\n  padding-left: 6px;\n}\n\n#free-staff .sporting-director-border {\n  border-left: 2px solid var(--sporting-director);\n  padding-left: 6px;\n}\n\n\n.staff-space[data-type=\"technical-chief\"] {\n  border-right: 1px solid var(--separator);\n  border-left: 1px solid var(--separator);\n}\n\n.staff-space[data-type=\"sporting-director\"],\n.staff-space[data-type=\"race-engineer\"][data-pos=\"2\"],\n.staff-space[data-type=\"head-aero\"] {\n  border-right: 1px solid var(--separator);\n}\n\n.affiliates-and-arrows {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 2px;\n  width: 60%;\n  flex-grow: 1;\n}\n\n.affiliates-space {\n  display: flex;\n  overflow-x: hidden;\n  flex: 1 1 auto;\n  min-width: 0;\n  width: 100%;\n  max-width: 100%;\n  flex-wrap: nowrap;\n  min-height: 40px;\n  align-items: center;\n}\n\n.affiliates-and-arrows .new-augment-button.affiliates-scroll-disabled {\n  opacity: 0.35;\n  pointer-events: none;\n}\n\n.affiliates-space .free-driver {\n  min-width: 200px;\n  max-width: 200px;\n  flex: 0 0 auto;\n  /* Asegura que los elementos mantengan su tamaño */\n}\n\n.team-template .free-driver {\n  margin: 1px 3px;\n}\n\n\n.driver1-name,\n.driver2-name {\n  display: flex;\n  flex-direction: column;\n  color: var(--white-general);\n  background-color: var(--elements);\n  border-radius: 10px;\n  width: 100%;\n  margin-left: 5px;\n  margin-right: 5px;\n  justify-content: center;\n  align-items: center;\n  transition: background-color 0.15s, color 0.15s;\n  box-shadow: var(--shadow-s);\n  position: relative;\n}\n\n.driver1-name[class*=\"-back-normal\"]::after,\n.driver2-name[class*=\"-back-normal\"]::after {\n  opacity: 0.45;\n  filter: saturate(0.75);\n}\n\n.driver1-first,\n.driver1-second,\n.driver2-first,\n.driver2-second,\n.team1,\n.team2 {\n  z-index: 1;\n}\n\n.driver1-name:hover,\n.driver2-name:hover {\n  color: var(--white-general);\n}\n\n.driver1-second,\n.driver2-second {\n  margin-top: -6px;\n}\n\n.part-performance-title:has(.arrows.d-none) .part-name-buttons{\n  margin-left: 0px;\n}\n\n.part-name-buttons {\n  display: flex;\n  flex-direction: row;\n  gap: 10px;\n  margin-left: 5px;\n  flex-grow: 1;\n}\n\n.part-buttons {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 5px;\n}\n\n\n.part-performance-title .redesigned-chevron{\n  height: 28px;\n  cursor: pointer;\n  transition: background-color 0.15s, transform 0.15s;\n}\n\n.part-performance-title .redesigned-chevron:hover{\n  background-color: var(--new-primary);\n}\n\n.custom-engines-div {\n  display: flex;\n  flex-direction: column;\n  gap: 5px;\n}\n\n.add-engine {\n  border: 2px dashed var(--dark-text);\n  color: var(--dark-text);\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  justify-content: space-between;\n  border-radius: 8px;\n  transition: color 0.15s, border 0.15s, transform 0.15s;\n  padding: 8px;\n  font-size: 18px;\n}\n\n.add-engine i {\n  font-style: normal;\n}\n\n.custom-engines-div .engine-performance-stats {\n  margin-top: 2px;\n  border-top: 2px solid var(--separator);\n}\n\n.engine-performance .bi-trash {\n  cursor: pointer;\n  transition: color 0.15s, transform 0.15s;\n  color: var(--text-general);\n  position: absolute;\n  right: 40px;\n  top: 5px;\n  font-size: 20px;\n}\n\n.engine-performance .bi-trash:hover {\n  color: var(--negative-general);\n  transform: scale(1.05);\n}\n\n\n.engine-performance .redesigned-chevron {\n  cursor: pointer;\n  transition: color 0.15s, transform 0.15s;\n  color: var(--text-general);\n  position: absolute;\n  right: 14px;\n  top: 7px;\n  height: 26px;\n}\n\n.engine-performance .redesigned-chevron:hover {\n  color: var(--text-selected);\n}\n\n.engine-performance .custom-engine-flag {\n  position: absolute;\n  right: 14px;\n  top: 7px;\n  font-size: 20px;\n  color: var(--text-tertiary);\n  pointer-events: auto;\n  cursor: pointer;\n  padding: 2px 6px;\n  border-radius: 6px;\n  transition: color 0.15s, background-color 0.15s, background 0.15s;\n}\n\n.engine-performance .custom-engine-flag.bi-trash {\n  background: color-mix(in srgb, var(--negative-general) 30%, transparent);\n  color: var(--negative-general);\n}\n\n.engine-performance .custom-engine-flag.bi-trash:active{\n  transform: scale(0.97);\n}\n\n.custom-engine-title {\n  max-width: 100%;\n  width: 100%;\n}\n\n.custom-engine-name {\n  background-color: transparent;\n  border: 0;\n  outline: none;\n  color: inherit;\n  width: 100%;\n  min-width: 0;\n  font: inherit;\n  text-transform: inherit;\n  field-sizing: content;\n}\n\n.part-performance,\n.engine-performance {\n  background-color: var(--superficials);\n  border-radius: 10px;\n  box-shadow: var(--shadow-s);\n  padding: 5px 10px;\n  overflow-y: hidden;\n  position: relative;\n}\n\n.main-columns-drag-section .engine-performance {\n  min-height: 318px;\n}\n\n.blank-engine-space{\n  height: 100px;\n  width: 100%;\n}\n\n.engine-f2 {\n  border-bottom: 2px solid var(--f2-border);\n}\n\n.engine-f3 {\n  border-bottom: 2px solid var(--f3-border);\n}\n\n.engine-fe {\n  border-bottom: 2px solid var(--ferrari-primary);\n}\n\n.engine-rb {\n  border-bottom: 2px solid var(--redbull-primary);\n}\n\n.engine-re {\n  border-bottom: 2px solid var(--renault-primary);\n}\n\n.engine-ho {\n  border-bottom: 2px solid var(--honda-primary);\n}\n\n.engine-me {\n  border-bottom: 2px solid var(--mercedes-primary);\n}\n\n.engine-al {\n  border-bottom: 2px solid var(--alpine-primary);\n}\n\n.engine-wi {\n  border-bottom: 2px solid var(--williams-primary);\n}\n\n.engine-af {\n  border-bottom: 2px solid var(--alfa-primary);\n}\n\n.engine-at {\n  border-bottom: 2px solid var(--alphatauri-primary);\n}\n\n.engine-ha {\n  border-bottom: 2px solid var(--haas-primary);\n}\n\n.engine-mc {\n  border-bottom: 2px solid var(--mclaren-primary);\n}\n\n.engine-ct {\n  border-bottom: 2px solid var(--custom-team-primary);\n}\n\n.engine-as {\n  border-bottom: 2px solid var(--aston-primary);\n}\n\ninput.engine-performance-title {\n  background-color: transparent;\n  border-bottom: 0px solid;\n  border-right: 0px solid;\n  border-left: 0px solid;\n  border-top: 0px solid;\n}\n\ninput.engine-performance-title:hover,\ninput.engine-performance-title:focus {\n  outline: none;\n  color: var(--text-selected);\n}\n\n.part-performance-title,\n.engine-performance-title {\n  text-transform: uppercase;\n  font-family: 'Formula1Bold';\n  font-size: 20px;\n  color: var(--white-general);\n  transition: color 0.15s, border-color 0.15s;\n}\n\n.part-performance-title {\n  display: flex;\n  justify-content: flex-start;\n  position: relative;\n}\n\n.engine-performance-title {\n  display: inline-flex;\n  align-items: center;\n  gap: 8px;\n  max-width: max-content;\n}\n\n\n.engine-performance-logo {\n  width: 30px;\n  height: 20px;\n  object-fit: contain;\n}\n\n.engine-modal-body {\n  display: flex;\n  flex-direction: column;\n  gap: 10px;\n  max-height: 600px;\n  min-height: 300px;\n  overflow-y: scroll;\n  padding: 0 10px 5px 10px !important;\n}\n\n.part-performance-stat,\n.engine-performance-stat {\n  display: flex;\n  justify-content: space-between;\n  color: var(--text-general);\n}\n\n.engine-performance-stat {\n  position: relative;\n  align-items: center;\n  margin: 4px 0;\n}\n\n.engine-performance-bar {\n  position: absolute;\n  bottom: 1px;\n  left: 0;\n  height: 2px;\n  width: 83%;\n}\n\n.engine-performance-progress {\n  width: 50%;\n  height: 2px;\n  transition: width 0.15s;\n  background-color: var(--new-primary);\n}\n\n.part-performance-title i.clicked {\n  color: var(--new-primary);\n}\n\n.parts-list {\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n  margin-top: 6px;\n  overflow-y: auto;\n  position: absolute;\n  top: 30px;\n  width: 95%;\n  transition: all 0.15s;\n  height: calc(100% - 50px);\n  padding-right: 5px;\n}\n\n\n.one-part {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n}\n\n.one-part-default {\n  border-bottom: 2px solid var(--separator);\n  margin-bottom: 3px;\n  padding: 3px 0;\n}\n\n.one-part-title {\n  font-size: 18px;\n  font-family: 'Formula1Bold';\n  color: var(--dark-text);\n  display: flex;\n}\n\n.one-part-flag-and-text {\n  position: relative;\n  font-family: 'Formula1Bold';\n  font-size: 16px;\n  color: var(--text-general);\n}\n\n.one-part-flag {\n  width: 48px;\n  height: 27px;\n  border-radius: 5px;\n  border: none;\n  opacity: 0.45;\n}\n\n.one-part-flag-title {\n  position: absolute;\n  top: 45%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  text-shadow: 2px 2px 4px var(--negative-text);\n}\n\n.part-performance-stats,\n.engine-performance-stats {\n  margin-top: 8px;\n  transition: all 0.15s;\n}\n\n.part-performance-stats {\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n  position: absolute;\n  top: 30px;\n  width: 95%;\n  height: 89% !important;\n}\n\n.part-performance-stats:not(.hidden) {\n  opacity: 1;\n  pointer-events: all;\n  transform: translateY(0px);\n}\n\n.part-performance-stats.hidden {\n  opacity: 0;\n  pointer-events: none;\n  transform: translateY(20px);\n}\n\n.part-performance:has(.part-performance-stats.hidden) .parts-list {\n  opacity: 1;\n}\n\n.part-performance:has(.part-performance-stats:not(.hidden)) .parts-list {\n  opacity: 0;\n}\n\n\n.fit-button {\n  font-family: 'Formula1Bold';\n  color: var(--text-general);\n  transition: color 0.15s, transform 0.15s;\n  margin-left: 4px;\n}\n\n\n.fit-button:hover,\n.reset-mentality-button:hover {\n  cursor: pointer;\n  color: var(--new-primary);\n  transform: scale(1.05);\n}\n\n.n-parts-error {\n  animation: errorAnim 0.5s;\n}\n\n.loadout-1-error {\n  animation: errorLoadout1 0.5s;\n}\n\n.loadout-2-error {\n  animation: errorLoadout2 0.5s;\n}\n\n@keyframes errorAnim {\n  0% {\n    color: var(--negative-general);\n  }\n\n  100% {\n    color: var(--dark-text);\n  }\n}\n\n@keyframes errorLoadout1 {\n  0% {\n    color: var(--negative-general);\n  }\n\n  100% {\n    color: var(--new-primary);\n  }\n}\n\n@keyframes errorLoadout2 {\n  0% {\n    color: var(--negative-general);\n  }\n\n  100% {\n    color: var(--new-secondary);\n  }\n}\n\n.fitted-icons {\n  margin-left: 10px;\n  display: flex;\n  flex-direction: row;\n  font-size: 25px;\n  max-height: 30px;\n  align-items: center;\n}\n\n.spare {\n  min-width: 25px;\n}\n\n.one-part-name {\n  transition: color 0.15s, transform 0.15s;\n}\n\n.one-part-name:hover {\n  cursor: pointer;\n  color: var(--text-selected);\n  transform: scale(1.05);\n}\n\n.one-part-name.editing {\n  color: var(--text-general);\n}\n\n.part-subtitle {\n  color: var(--dark-text);\n  font-size: 20px;\n  margin-left: -7px;\n}\n\n.fitted-icons .n-parts-buttons {\n  display: flex;\n  flex-direction: row-reverse;\n  gap: 3px;\n}\n\n.fitted-icons .n-parts-buttons i {\n  font-size: 14px;\n}\n\n.new-part {\n  border: none;\n  border-radius: 10px;\n  padding-left: 4px;\n  cursor: pointer;\n  max-width: max-content;\n  transition: border-color 0.15s, color 0.15s, transform 0.15s;\n  color: var(--dark-text);\n}\n\n.new-part i {\n  font-style: normal;\n}\n\n.new-part:hover {\n  color: var(--new-primary);\n  transform: scale(1.05);\n}\n\n.new-part ::before {\n  margin-right: 5px;\n}\n\n\n\n\n.fitted-icons .n-parts {\n  font-family: \"Formula1\";\n  font-size: 14px;\n  max-height: 30px;\n  margin-right: 5px;\n}\n\n.fitted-icons i:not(.fitted) {\n  transition: color 0.15s;\n}\n\n.fitted-icons .loadout-1.fitted {\n  color: var(--new-primary);\n}\n\n.fitted-icons .loadout-1 {\n  position: relative;\n  padding-bottom: 4px;\n  margin-left: 6px;\n}\n\n.loadout-1:not(.fitted):hover,\n.loadout-2:not(.fitted):hover {\n  cursor: pointer;\n  transform: scale(1.05);\n}\n\n.loadout-1:not(.fitted):hover {\n  color: var(--text-selected);\n}\n\n.loadout-2:not(.fitted):hover {\n  color: var(--text-selected-secondary);\n}\n\n.loadout-1 .number,\n.loadout-2 .number {\n  font-size: 10px;\n  font-family: 'Formula1Bold';\n  position: absolute;\n  bottom: 7px;\n  right: 3px;\n  z-index: 2;\n  padding-bottom: 4px;\n}\n\n.fitted-icons .loadout-2 {\n  position: relative;\n  padding-bottom: 4px;\n}\n\n.fitted-icons .loadout-2.fitted {\n  color: var(--new-secondary);\n}\n\n.new-or-existing-part {\n  font-family: 'Formula1Bold';\n  display: flex;\n  gap: 15px;\n  padding: 6px 2px;\n  color: var(--dark-text);\n}\n\n.existing-part {\n  font-size: 16px;\n  transition: color 0.15s, transform 0.15s;\n}\n\n.existing-part:hover {\n  cursor: pointer;\n  color: var(--text-selected);\n  transform: scale(1.05);\n}\n\n.existing-part.active-part {\n  color: var(--new-primary);\n}\n\n.part-performance-stat .custom-input-number,\n.engine-performance-stat .custom-input-number {\n  font-size: 16px;\n  max-width: 70px;\n}\n\n.teams-show.expertise-mode .part-performance-stat .custom-input-number {\n  color: var(--new-primary);\n}\n\n\n\n.overview-show {\n  background-color: transparent !important;\n  box-shadow: none !important;\n  display: grid;\n  grid-template-columns: repeat(5, minmax(0, 1fr));\n  grid-template-rows: repeat(2, minmax(0, 1fr));\n  gap: 8px;\n  flex: 1;\n  padding-right: 7px;\n  overflow-y: auto;\n}\n\n.overview-card {\n  background-color: var(--superficials);\n  border-radius: 10px;\n  padding: 8px;\n  display: flex;\n  flex-direction: column;\n  min-height: 0;\n  box-shadow: var(--shadow-s);\n}\n\n.overview-card-title {\n  font-size: 15px;\n  color: var(--text-secondary);\n  margin-bottom: 6px;\n}\n\n.overview-card-teams {\n  display: flex;\n  gap: 2px;\n  overflow-y: auto;\n  min-height: 0;\n  justify-content: space-between;\n  flex-direction: column;\n  height: 100%;\n}\n\n.overview-team .car-title {\n  font-size: 11px;\n  height: auto;\n  padding-bottom: 0;\n}\n\n.overview-team-left {\n  display: flex;\n  align-items: center;\n  gap: 4px;\n  min-width: 0;\n}\n\n.overview-team-rank {\n  color: var(--text-secondary);\n  font-size: 11px;\n  min-width: 12px;\n  text-align: right;\n}\n\n.overview-team .performance-bar {\n  height: 3px;\n  margin: 1px 0 2px;\n}\n\n.overview-team .performance-bar-progress {\n  height: 3px;\n}\n\n.overview-team-value {\n  color: var(--dark-text);\n  font-size: 11px;\n}\n.teams-show,\n.engines-show {\n  background-color: transparent !important;\n  box-shadow: none !important;\n  display: grid;\n  grid-template-columns: repeat(3, 0.333fr);\n  grid-template-rows: repeat(2, 1fr);\n  gap: 8px;\n  flex: 1;\n}\n\n.main-columns-drag-section:has(.teams-show:not(.d-none)),\n.main-columns-drag-section:has(.overview-show:not(.d-none)){\n  background-color: transparent !important;\n  box-shadow: none !important;\n}\n\n.engines-show {\n  /* Keep the grid layout but allow any number of rows (custom engines are appended). */\n  grid-template-columns: repeat(3, minmax(0, 1fr));\n  grid-template-rows: unset;\n  grid-auto-rows: max-content;\n  align-content: start;\n  padding-right: 7px;\n  max-height: 81vh;\n}\n\n\n.one-performance {\n  padding: 10px;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  font-size: 22px;\n  padding-left: 20px;\n  background-color: var(--component-general);\n  border-radius: 10px;\n  margin-top: 10px;\n  margin-left: 10px;\n  margin-right: 10px;\n  color: var(--text-general);\n  border: 2px solid transparent;\n  transition: border-color 0.15s, background-color 0.15s;\n}\n\n.one-performance:hover {\n  border-color: var(--white-general);\n  background-color: var(--component-general-hover);\n}\n\n.one-performance:hover .performance-name {\n  color: var(--white-general);\n}\n\n.performance-buttons {\n  padding: 10px;\n  display: flex;\n  width: 100px;\n  justify-content: space-around;\n}\n\n\n.perf-engine {\n  font-size: 20px;\n}\n\n.performance-buttons i {\n  cursor: pointer;\n  background-color: transparent;\n  border-radius: 10px;\n  transition: background-color 0.15s, color 0.15s;\n  background-color: transparent;\n  width: 25px;\n  height: 25px;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n\n.performance-buttons i:hover {\n  background-color: var(--background--buttons-hover) !important;\n  color: var(--white-general) !important;\n}\n\n.performance-buttons i:active {\n  background-color: var(--active-buttons-back) !important;\n  color: #e2e2e2 !important;\n  transition-duration: 0s;\n}\n\n.performance-name {\n  width: 200px;\n  transition: color 0.15s;\n  cursor: default !important;\n}\n\n.performance-name-engine {\n  width: 300px;\n  transition: color 0.15s;\n  cursor: default !important;\n}\n\n.custom-progress {\n  width: 603px;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  margin-left: 50px;\n}\n\n.name-H2H {\n  width: 100%;\n  transition: color 0.15s;\n  cursor: default !important;\n  text-align: center;\n}\n\n.only-name {\n  transition: color 0.15s;\n}\n\n#bestrh2h .name-H2H,\n#raceh2h .name-H2H,\n#qualih2h .name-H2H {\n  display: flex;\n  justify-content: space-between;\n}\n\n.custom-H2H {\n  width: 75%;\n  display: flex;\n  flex-direction: row;\n  background-color: var(--h2h-back);\n  height: 7px;\n  margin-top: 5px;\n}\n\n.driver1-bar {\n  float: right;\n  width: 0%;\n  height: 7px;\n  transition: width 0.15s;\n}\n\n.h2h-top {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between\n}\n\n.driver2-bar {\n  float: left;\n  width: 0%;\n  height: 7px;\n  transition: width 0.15s;\n}\n\n.driver2-space,\n.driver1-space {\n  width: 50%;\n  background-color: var(--background);\n  height: 7px;\n}\n\ni.disabled {\n  pointer-events: none;\n  color: var(--disabled-text);\n}\n\ninput.disabled {\n  pointer-events: none;\n  color: var(--disabled-text);\n}\n\n.red-part {\n  width: 300px;\n  height: 3px;\n  background-color: var(--negative-general);\n  position: relative;\n}\n\n.disabled-part {\n  width: 300px;\n  height: 3px;\n  background-color: var(--background-general);\n  position: relative;\n}\n\n.disabled-part-engine {\n  width: 100%;\n  height: 3px;\n  background-color: var(--background-general);\n  position: relative;\n}\n\n.green-part {\n  width: 0%;\n  height: 100%;\n  background-color: var(--positive-general);\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1;\n  transition: width 0.15s;\n}\n\n.white-part {\n  width: 0%;\n  height: 100%;\n  background-color: #f0f0f0;\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1;\n  transition: width 0.15s;\n}\n\n.separation-zone {\n  width: 3px;\n  height: 10px;\n  background-color: #f0f0f0;\n}\n\n.gray-part {\n  width: 100%;\n  height: 100%;\n  background-color: var(--background-general);\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1;\n  transition: width 0.15s;\n}\n\n.car-info {\n  font-size: 14px;\n}\n\nbody.og-theme .teams-columns,\nbody.og-theme .records-list {\n  padding: 12px 10px;\n}\n\n.teams-columns {\n  display: flex;\n  flex-direction: column;\n  overflow-y: hidden;\n  margin-left: 0%;\n  margin-right: 14px;\n  background: transparent;\n  box-shadow: none;\n  gap: 10px;\n}\n\n.performance-bar {\n  width: 300px;\n}\n\n.performance-section {\n  overflow: hidden;\n  margin-left: 0%;\n  margin-right: 14px;\n  display: flex;\n  height: 100%;\n}\n\n.btn-number {\n  background-color: transparent !important;\n  color: var(--white-general) !important;\n  padding-left: 0px !important;\n  border: none !important;\n}\n\n.collapse-number {\n  color: var(--white-general);\n  background-color: var(--custom-modal-back);\n}\n\n.contract-details {\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n  color: var(--white-general);\n}\n\n.number-and-contract {\n  display: flex;\n  flex-direction: column;\n  background-color: var(--custom-modal-back);\n}\n\n.custom-body {\n  color: var(--text-general);\n  background-color: var(--generals);\n  z-index: -2;\n  padding: 0px 20px 5px 20px;\n}\n\n.pos-relative {\n  position: relative;\n}\n\n\n.custom-modal {\n  min-width: 600px !important;\n  z-index: 2000 !important;\n  border-radius: 10px !important;\n}\n\n\n#patreonModal .custom-modal,\n#patreonModal .modal-dialog {\n  min-width: 800px !important;\n}\n\n\n.drivers-modal-zone,\n.teams-modal-zone {\n  border-radius: 10px;\n  width: 100%;\n  display: grid;\n  gap: 12px;\n  background-color: transparent;\n  grid-template-columns: repeat(4, 1fr);\n}\n\n\n.contract-details div {\n  color: var(--text-general);\n}\n\n.custom-header {\n  color: var(--white-general) !important;\n  background-color: var(--generals) !important;\n  display: flex;\n  justify-content: space-between;\n  border-bottom: none !important;\n  flex-direction: column;\n  align-items: flex-start;\n  position: relative;\n}\n\n\n.custom-footer {\n  color: var(--white-general) !important;\n  background-color: var(--generals) !important;\n  z-index: -3;\n  border-top: none !important;\n  padding: 5px 5px;\n}\n\n::-webkit-input-placeholder {\n  color: #999;\n  /* Cambia el color del texto del placeholder */\n}\n\n.rounded-input {\n  border: 2px solid transparent;\n  border-radius: 10px;\n  padding: 8px 12px;\n  max-width: 210px;\n  outline: none;\n  transition: border-color 0.15s;\n  background-color: var(--mid-gray-contrast);\n  color: #ebeaf0;\n}\n\n.rounded-input.retirement {\n  max-width: 75px;\n}\n\n.rounded-input.retirement::selection,\n.modal-subtitle::selection,\n#difficultySpan::selection {\n  background-color: transparent;\n}\n\n\n.driver1-number::selection,\n.driver2-number::selection {\n  background-color: transparent;\n}\n\n.custom-disabled {\n  background-color: -internal-light-dark(rgba(239, 239, 239, 0.3), rgba(59, 59, 59, 0.3));\n}\n\n\n.rounded-input:hover {\n  border-color: #cecece;\n}\n\n.rounded-input:focus {\n  outline: 0px solid transparent;\n  border-color: var(--white-general);\n  color: var(--white-general);\n}\n\n.confirm-area {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  padding-top: 50px;\n}\n\n.performance-data {\n  margin-left: 30px;\n  font-size: 26px;\n  width: 200px;\n  text-align: center;\n}\n\n.team,\n.engine {\n  border: 2px solid transparent;\n  border-radius: 10px;\n  padding: 4.8px;\n  cursor: pointer !important;\n  margin: 10px;\n  color: var(--text-general);\n  transition: border-color 0.15s, color 0.15s, background-color 0.15s;\n  position: relative;\n  font-size: 18px;\n}\n\n.team {\n  margin: 0;\n  border: none;\n  padding: 5.8px;\n  transition: background-color 0.15s;\n}\n\n\n.car {\n  border: 1px solid transparent;\n  border-radius: 7px;\n  padding: 4px;\n  cursor: pointer !important;\n  margin: 4px 6px;\n  color: var(--text-general);\n  transition: border-color 0.15s, color 0.15s, background-color 0.15s;\n  position: relative;\n  font-size: 18px;\n}\n\n\n\n.driver-info {\n  border-radius: 10px;\n  cursor: default !important;\n  padding: 10px;\n  margin: 9px 8px;\n  color: var(--text-general);\n  background-color: var(--dropdown-hover);\n  transition: border-color 0.15s, color 0.15s, background-color 0.15s;\n  position: relative;\n  font-size: 18px;\n  display: flex;\n  flex-direction: row;\n  box-shadow: 0px 0px 10px 1px var(--box-shadow);\n}\n\n.driver-info:hover {\n  background-color: var(--elements-hover);\n}\n\n.race:hover {\n  background-color: var(--text-general-transparent);\n  color: var(--negative-text);\n}\n\n\n.rb-gradient::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 200%, var(--redbull-primary), transparent 25%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.rb-gradient-mid::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 150%, var(--redbull-primary), transparent 25%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.rb-gradient-small::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 200%, var(--redbull-primary-transparent), transparent 30%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.rb-gradient:hover::before,\n.rb-gradient-small:hover::before,\n.rb-gradient-mid:hover::before {\n  opacity: 1;\n}\n\n.rb-back-gradient-primary {\n  background: radial-gradient(circle at 5% 100%, var(--redbull-primary), var(--elements) 35%);\n}\n\n.rb-back-gradient-secondary {\n  background: radial-gradient(circle at 5% 100%, var(--redbull-secondary), var(--elements) 35%);\n}\n\n.mc-gradient::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 200%, var(--mclaren-primary), transparent 25%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.mc-gradient-mid::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 150%, var(--mclaren-primary), transparent 25%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.mc-gradient-small::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 200%, var(--mclaren-primary-transparent), transparent 30%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.mc-back-gradient-primary {\n  background: radial-gradient(circle at 5% 100%, var(--mclaren-primary), var(--elements) 35%);\n}\n\n.mc-back-gradient-secondary {\n  background: radial-gradient(circle at 5% 100%, var(--mclaren-secondary), var(--elements) 35%);\n}\n\n.mc-gradient:hover::before,\n.mc-gradient-small:hover::before,\n.mc-gradient-mid:hover::before {\n  opacity: 1;\n}\n\n.as-gradient::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 200%, var(--aston-primary), transparent 25%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.as-gradient-mid::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 150%, var(--aston-primary), transparent 25%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.as-gradient-small::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 200%, var(--aston-primary-transparent), transparent 30%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.as-back-gradient-primary {\n  background: radial-gradient(circle at 5% 100%, var(--aston-primary), var(--elements) 35%);\n}\n\n.as-back-gradient-secondary {\n  background: radial-gradient(circle at 5% 100%, var(--aston-secondary), var(--elements) 35%);\n}\n\n.as-gradient:hover::before,\n.as-gradient-small:hover::before,\n.as-gradient-mid:hover::before {\n  opacity: 1;\n}\n\n.al-gradient::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 200%, var(--alpine-primary), transparent 25%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.al-gradient-mid::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 150%, var(--alpine-primary-transparent), transparent 25%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.al-gradient-small::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 200%, var(--alpine-primary-transparent), transparent 30%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.al-back-gradient-primary {\n  background: radial-gradient(circle at 5% 100%, var(--alpine-primary), var(--elements) 35%);\n}\n\n.al-back-gradient-secondary {\n  background: radial-gradient(circle at 5% 100%, var(--alpine-secondary), var(--elements) 35%);\n}\n\n.al-gradient:hover::before,\n.al-gradient-small:hover::before,\n.al-gradient-mid:hover::before {\n  opacity: 1;\n}\n\n.af-gradient::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 200%, var(--alfa-primary), transparent 25%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.af-gradient-small::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 200%, var(--alfa-primary-transparent), transparent 30%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.af-gradient-mid::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 150%, var(--alfa-primary), transparent 25%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.af-back-gradient-primary {\n  background: radial-gradient(circle at 5% 100%, var(--alfa-primary), var(--elements) 35%);\n}\n\n.af-back-gradient-secondary {\n  background: radial-gradient(circle at 5% 100%, var(--alfa-secondary), var(--elements) 35%);\n}\n\n.af-gradient:hover::before,\n.af-gradient-small:hover::before,\n.af-gradient-mid:hover::before {\n  opacity: 1;\n}\n\n.ha-gradient::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 200%, var(--haas-primary), transparent 25%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.ha-gradient-small::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 200%, var(--haas-primary-transparent), transparent 30%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.ha-gradient-mid::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 150%, var(--haas-primary), transparent 25%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.ha-back-gradient-primary {\n  background: radial-gradient(circle at 5% 100%, var(--haas-primary), var(--elements) 35%);\n}\n\n.ha-back-gradient-secondary {\n  background: radial-gradient(circle at 5% 100%, var(--haas-secondary), var(--elements) 35%);\n}\n\n.ha-gradient:hover::before,\n.ha-gradient-small:hover::before,\n.ha-gradient-mid:hover::before {\n  opacity: 1;\n}\n\n.wi-gradient::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 200%, var(--williams-primary), transparent 25%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.wi-gradient-small::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 200%, var(--williams-primary-transparent), transparent 30%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.wi-gradient-mid::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 150%, var(--williams-primary), transparent 25%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.wi-back-gradient-primary {\n  background: radial-gradient(circle at 5% 100%, var(--williams-primary), var(--elements) 35%);\n}\n\n.wi-back-gradient-secondary {\n  background: radial-gradient(circle at 5% 100%, var(--general-secondary), var(--elements) 35%);\n}\n\n.wi-gradient:hover::before,\n.wi-gradient-small:hover::before,\n.wi-gradient-mid:hover::before {\n  opacity: 1;\n}\n\n.at-gradient::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 200%, var(--alphatauri-primary), transparent 25%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.at-gradient-small::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 200%, var(--alphatauri-primary-transparent), transparent 30%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.at-gradient-mid::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 150%, var(--alphatauri-primary), transparent 25%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.at-back-gradient-primary {\n  background: radial-gradient(circle at 5% 100%, var(--alphatauri-primary), var(--elements) 35%);\n}\n\n.at-back-gradient-secondary {\n  background: radial-gradient(circle at 5% 100%, var(--alphatauri-secondary), var(--elements) 35%);\n}\n\n.at-gradient:hover::before,\n.at-gradient-small:hover::before,\n.at-gradient-mid:hover::before {\n  opacity: 1;\n}\n\n\n.fe-gradient::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 200%, var(--ferrari-primary), transparent 25%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.fe-gradient-small::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 200%, var(--ferrari-primary-transparent), transparent 30%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.fe-gradient-mid::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 150%, var(--ferrari-primary), transparent 25%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.fe-back-gradient-primary {\n  background: radial-gradient(circle at 5% 100%, var(--ferrari-primary), var(--elements) 35%);\n}\n\n.fe-back-gradient-secondary {\n  background: radial-gradient(circle at 5% 100%, var(--general-secondary), var(--elements) 35%);\n}\n\n.fe-gradient:hover::before,\n.fe-gradient-small:hover::before,\n.fe-gradient-mid:hover::before {\n  opacity: 1;\n}\n\n.me-gradient::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 200%, var(--mercedes-primary), transparent 25%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.me-gradient-mid::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 150%, var(--mercedes-primary), transparent 25%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.me-gradient-small::before {\n  border-radius: 10px;\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 200%, var(--mercedes-primary-transparent), transparent 30%);\n  opacity: 0;\n  transition: opacity 0.15s;\n  z-index: 0;\n}\n\n.me-back-gradient-primary {\n  background: radial-gradient(circle at 5% 100%, var(--mercedes-primary), var(--elements) 35%);\n}\n\n.me-back-gradient-secondary {\n  background: radial-gradient(circle at 5% 100%, var(--general-secondary), var(--elements) 35%);\n}\n\n.me-gradient:hover::before,\n.me-gradient-small:hover::before,\n.me-gradient-mid:hover::before {\n  opacity: 1;\n}\n\n\n\n.race {\n  border-radius: 10px;\n  cursor: pointer !important;\n  margin: 10px;\n  color: var(--text-general);\n  background-color: var(--elements);\n  transition: border-color 0.15s, color 0.15s, background-color 0.15s;\n  position: relative;\n  font-size: 24px;\n  text-transform: uppercase;\n  padding: 5px 0;\n  padding-left: 8px;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  box-shadow: 0px 0px 10px 1px var(--box-shadow);\n}\n\n\n.race-flag {\n  min-width: 80px;\n  max-width: 80px;\n  min-height: 45px;\n  max-height: 45px;\n  border-radius: 10px;\n  z-index: 2;\n  margin-right: 4px;\n}\n\n#patchNotesBody {\n  max-height: 600px;\n  overflow-y: scroll;\n}\n\n\n#raceMenu {\n  overflow-y: scroll;\n  height: 660px;\n}\n\n.config-content {\n  color: var(--text-selected);\n  font-size: 20px;\n}\n\n.toolbar-logo-and-title {\n  display: flex;\n  flex-direction: row;\n  gap: 8px;\n  padding: 10px;\n  align-items: center;\n  cursor: pointer;\n}\n\n.toolbar-logo {\n  width: 34px;\n  height: 34px;\n  object-fit: contain;\n}\n\n.toolbar-logo--ferrari {\n  width: 34px;\n  height: 26px;\n}\n\n.toolbar-logo--redbull {\n  width: 34px;\n  height: 34px;\n}\n\n.toolbar-logo--nightly {\n  width: 34px;\n  height: 30px;\n}\n\n.toolbar-logo--mclaren {\n  width: 34px;\n  height: 30px;\n}\n\n.toolbar-logo--mercedes {\n  width: 34px;\n  height: 24px;\n}\n\n.toolbar-logo--astonmartin {\n  width: 34px;\n  height: 34px;\n}\n\n.toolbar-logo--haas{\n  width: 34px;\n  height: 26px;\n}\n\n.toolbar-title {\n  font-size: 16px;\n  display: flex;\n  flex-direction: column;\n  justify-content: flex-start;\n  color: transparent;\n  position: relative;\n  /* Necesario para aplicar el gradiente */\n\n}\n\n\n\n.toolbar-title span {\n  display: inline-block;\n  line-height: 1;\n  background: linear-gradient(to right, var(--new-primary), var(--text-general), var(--new-primary));\n  background-clip: text;\n  -webkit-text-fill-color: transparent;\n  -webkit-background-clip: text;\n  background-size: 200% 200%;\n  animation: gradient-move-title 6s infinite linear;\n}\n\n.toolbar-title.nightly span {\n  display: inline-block;\n  line-height: 1;\n  background: linear-gradient(to right, var(--new-primary), var(--text-general), var(--new-primary));\n  background-clip: text;\n  -webkit-text-fill-color: transparent;\n  -webkit-background-clip: text;\n  background-size: 200% 200%;\n  animation: gradient-move-title 6s infinite linear;\n}\n\n.patreon-links {\n  display: flex;\n  flex-direction: row;\n  gap: 10px;\n}\n\n.patreon-themes .modal-subtitle {\n  margin-bottom: 3px;\n}\n\n.nightly-icon {\n  position: absolute;\n  top: 0px;\n  right: 0px;\n  width: 14px;\n  height: 14px;\n  font-size: 8px;\n  background-color: var(--new-primary);\n  border-radius: 50%;\n  color: var(--elements);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n@keyframes gradient-move-title {\n  0% {\n    background-position: 0% 50%;\n  }\n\n  100% {\n    background-position: -200% 50%;\n    /* Doble del tamaño inicial para un bucle suave */\n  }\n}\n\n\n#predictConfigContent {\n  margin-top: 12px;\n}\n\n\n#predictionMenu {\n  margin-left: 0px;\n  margin-right: 14px;\n  width: 100%;\n  display: flex;\n  flex-direction: row;\n}\n\n.prediction-table {\n  width: 50%;\n}\n\n.prediction-table-header,\n.prediction-table-driver {\n  display: flex;\n  flex-direction: row;\n  color: var(--text-general);\n  font-size: 20px;\n  margin: 20px 20px;\n}\n\n.driver-prediction {\n  width: 50%;\n  z-index: 100;\n}\n\n.prediction-table-header .driver-prediction,\n.prediction-table-header .position-prediction,\n.prediction-table-header .prediction-prediction {\n  text-transform: uppercase;\n}\n\n\n.position-prediction {\n  width: 25%;\n  display: flex;\n  justify-content: center;\n  gap: 15px;\n  padding-left: 40px;\n  z-index: 100;\n}\n\n.position-prediction> :first-child {\n  min-width: 50px;\n  margin-left: 20px;\n}\n\n.position-prediction> :nth-child(2) {\n  min-width: 50px;\n}\n\n.prediction-prediction {\n  width: 25%;\n  display: flex;\n  justify-content: center;\n  gap: 15px;\n  z-index: 100;\n}\n\n.front-gradient {\n  z-index: 10;\n}\n\n\n\n\n.rb-transparent:hover {\n  background-color: var(--redbull-primary-transparent) !important;\n  color: var(--white-general) !important;\n  border-color: transparent !important;\n}\n\n.rb-transparent .custom-icon i {\n  filter: drop-shadow(0px 0px 4px var(--redbull-primary));\n}\n\n.rb-transparent:hover .surname {\n  color: var(--redbull-primary) !important\n}\n\n.rb-back-transparent {\n  background-color: var(--redbull-primary-transparent);\n}\n\n.rb-back-transparent-secondary {\n  background-color: var(--redbull-secondary-transparent);\n}\n\n.mc-transparent:hover {\n  background-color: var(--mclaren-primary-transparent) !important;\n  color: var(--white-general) !important;\n  border-color: transparent !important;\n}\n\n.mc-transparent:hover .surname {\n  color: var(--mclaren-primary) !important\n}\n\n.mc-transparent .custom-icon i {\n  filter: drop-shadow(0px 0px 4px var(--mclaren-primary));\n}\n\n.mc-back-transparent {\n  background-color: var(--mclaren-primary-transparent);\n}\n\n.mc-back-transparent-secondary {\n  background-color: var(--mclaren-secondary-transparent);\n}\n\n.as-transparent:hover {\n  background-color: var(--aston-primary-transparent) !important;\n  color: var(--white-general) !important;\n  border-color: transparent !important;\n}\n\n.as-transparent:hover .surname {\n  color: var(--aston-primary) !important\n}\n\n.as-back-transparent {\n  background-color: var(--aston-primary-transparent);\n}\n\n.as-transparent .custom-icon i {\n  filter: drop-shadow(0px 0px 4px var(--aston-primary));\n}\n\n.as-back-transparent-secondary {\n  background-color: var(--aston-secondary-transparent);\n}\n\n.al-transparent:hover {\n  background-color: var(--alpine-primary-transparent) !important;\n  color: var(--white-general) !important;\n  border-color: transparent !important;\n}\n\n.al-transparent:hover .surname {\n  color: var(--alpine-primary) !important\n}\n\n.al-transparent .custom-icon i {\n  filter: drop-shadow(0px 0px 4px var(--alpine-primary));\n}\n\n.al-back-transparent {\n  background-color: var(--alpine-primary-transparent);\n}\n\n.al-back-transparent-secondary {\n  background-color: var(--alpine-secondary-transparent);\n}\n\n.af-transparent:hover {\n  background-color: var(--alfa-primary-transparent) !important;\n  color: var(--white-general) !important;\n  border-color: transparent !important;\n}\n\n.af-transparent:hover .surname {\n  color: var(--alfa-primary) !important\n}\n\n.af-transparent .custom-icon i {\n  filter: drop-shadow(0px 0px 4px var(--alfa-primary));\n}\n\n.af-back-transparent {\n  background-color: var(--alfa-primary-transparent);\n}\n\n.af-back-transparent-secondary {\n  background-color: var(--alfa-secondary-transparent);\n}\n\n.ha-transparent:hover {\n  background-color: var(--haas-primary-transparent) !important;\n  color: var(--white-general) !important;\n  border-color: transparent !important;\n}\n\n.ha-transparent:hover .surname {\n  color: var(--haas-primary) !important\n}\n\n.ha-back-transparent {\n  background-color: var(--haas-primary-transparent);\n}\n\n.ha-transparent .custom-icon i {\n  filter: drop-shadow(0px 0px 4px var(--haas-primary));\n}\n\n.ha-back-transparent-secondary {\n  background-color: var(--haas-secondary-transparent);\n}\n\n.wi-transparent:hover {\n  background-color: var(--williams-primary-transparent) !important;\n  color: var(--white-general) !important;\n  border-color: transparent !important;\n}\n\n.wi-transparent:hover .surname {\n  color: var(--williams-primary) !important\n}\n\n.wi-back-transparent {\n  background-color: var(--williams-primary-transparent);\n}\n\n.wi-transparent .custom-icon i {\n  filter: drop-shadow(0px 0px 4px var(--williams-primary));\n}\n\n.wi-back-transparent-secondary {\n  background-color: var(--general-secondary-transparent);\n}\n\n.at-transparent:hover {\n  background-color: var(--alphatauri-primary-transparent) !important;\n  color: var(--white-general) !important;\n  border-color: transparent !important;\n}\n\n.at-transparent:hover .surname {\n  color: var(--alphatauri-primary) !important\n}\n\n.at-back-transparent {\n  background-color: var(--alphatauri-primary-transparent);\n}\n\n.at-transparent .custom-icon i {\n  filter: drop-shadow(0px 0px 4px var(--alphatauri-primary));\n}\n\n.at-back-transparent-secondary {\n  background-color: var(--alphatauri-secondary-transparent);\n}\n\n.fe-transparent:hover {\n  background-color: var(--ferrari-primary-transparent) !important;\n  color: var(--white-general) !important;\n  border-color: transparent !important;\n}\n\n.fe-transparent:hover .surname {\n  color: var(--ferrari-primary) !important;\n}\n\n.fe-transparent .custom-icon i {\n  filter: drop-shadow(0px 0px 4px var(--ferrari-primary));\n}\n\n.fe-back-transparent {\n  background-color: var(--ferrari-primary-transparent);\n}\n\n.fe-back-transparent-secondary {\n  background-color: var(--general-secondary-transparent);\n}\n\n.me-transparent:hover {\n  background-color: var(--mercedes-primary-transparent) !important;\n  color: var(--white-general) !important;\n  border-color: transparent !important;\n}\n\n.me-transparent:hover .surname {\n  color: var(--mercedes-primary) !important;\n}\n\n.me-transparent .custom-icon i {\n  filter: drop-shadow(0px 0px 4px var(--mercedes-primary));\n}\n\n.me-back-transparent {\n  background-color: var(--mercedes-primary-transparent);\n}\n\n.me-back-transparent-secondary {\n  background-color: var(--general-secondary-transparent);\n}\n\n.ct-transparent .custom-icon i {\n  filter: drop-shadow(0px 0px 4px var(--custom-team-primary));\n}\n\n.ct-transparent:hover {\n  background-color: var(--custom-team-primary-transparent) !important;\n  color: var(--white-general) !important;\n  border-color: transparent !important;\n}\n\n.ct-back-transparent {\n  background-color: var(--custom-team-primary-transparent);\n}\n\n.ct-back-transparent-secondary {\n  background-color: var(--custom-team-secondary-transparent);\n}\n\n.ct-transparent:hover .surname {\n  color: var(--custom-team-primary) !important;\n}\n\n.rb-transparent.selected {\n  background-color: var(--redbull-primary-transparent) !important;\n  color: var(--white-general) !important;\n}\n\n.mc-transparent.selected {\n  background-color: var(--mclaren-primary-transparent) !important;\n  color: var(--white-general) !important;\n}\n\n.as-transparent.selected {\n  background-color: var(--aston-primary-transparent) !important;\n  color: var(--white-general) !important;\n}\n\n.al-transparent.selected {\n  background-color: var(--alpine-primary-transparent) !important;\n  color: var(--white-general) !important;\n}\n\n.af-transparent.selected {\n  background-color: var(--alfa-primary-transparent) !important;\n  color: var(--white-general) !important;\n}\n\n.ha-transparent.selected {\n  background-color: var(--haas-primary-transparent) !important;\n  color: var(--white-general) !important;\n}\n\n.wi-transparent.selected {\n  background-color: var(--williams-primary-transparent) !important;\n  color: var(--white-general) !important;\n}\n\n.at-transparent.selected {\n  background-color: var(--alphatauri-primary-transparent) !important;\n  color: var(--white-general) !important;\n}\n\n.fe-transparent.selected {\n  background-color: var(--ferrari-primary-transparent) !important;\n  color: var(--white-general) !important;\n}\n\n.me-transparent.selected {\n  background-color: var(--mercedes-primary-transparent) !important;\n  color: var(--white-general) !important;\n}\n\n.ct-transparent.selected {\n  background-color: var(--custom-team-primary-transparent) !important;\n  color: var(--white-general) !important;\n}\n\n.modal-team.rb-transparent:hover {\n  background-color: var(--redbull-primary-transparent);\n  color: var(--redbull-primary);\n}\n\n.modal-team.mc-transparent:hover {\n  background-color: var(--mclaren-primary-transparent);\n  color: var(--mclaren-primary);\n}\n\n.modal-team.as-transparent:hover {\n  background-color: var(--aston-primary-transparent);\n  color: var(--aston-primary);\n}\n\n.modal-team.al-transparent:hover {\n  background-color: var(--alpine-primary-transparent);\n  color: var(--alpine-primary);\n}\n\n.modal-team.af-transparent:hover {\n  background-color: var(--alfa-primary-transparent);\n  color: var(--alfa-primary);\n}\n\n.modal-team.ha-transparent:hover {\n  background-color: var(--haas-primary-transparent);\n  color: var(--haas-primary);\n}\n\n.modal-team.wi-transparent:hover {\n  background-color: var(--williams-primary-transparent);\n  color: var(--williams-primary);\n}\n\n.modal-team.at-transparent:hover {\n  background-color: var(--alphatauri-primary-transparent);\n  color: var(--alphatauri-primary);\n}\n\n.modal-team.fe-transparent:hover {\n  background-color: var(--ferrari-primary-transparent);\n  color: var(--ferrari-primary);\n}\n\n.modal-team.me-transparent:hover {\n  background-color: var(--mercedes-primary-transparent);\n  color: var(--mercedes-primary);\n}\n\n.free-driver:hover .future-contract-noti {\n  opacity: 0;\n}\n\n.future-contract-noti {\n  position: absolute;\n  top: 5px;\n  right: 5px;\n  width: 6px;\n  height: 6px;\n  border-radius: 50%;\n  animation: pulse 1.5s infinite;\n  opacity: 1;\n  transition: opacity 0.15s;\n}\n\n.noti-fe {\n  background-color: var(--ferrari-primary);\n}\n\n.noti-fe-affiliate{\n  background-color: transparent;\n  border: 1px solid var(--ferrari-primary);\n}\n\n.noti-rb {\n  background-color: var(--redbull-primary);\n}\n\n.noti-rb-affiliate{\n  background-color: transparent;\n  border: 1px solid var(--redbull-primary);\n}\n\n.noti-mc {\n  background-color: var(--mclaren-primary);\n}\n\n.noti-mc-affiliate{\n  background-color: transparent;\n  border: 1px solid var(--mclaren-primary);\n}\n\n\n.noti-as {\n  background-color: var(--aston-primary);\n}\n\n.noti-as-affiliate{\n  background-color: transparent;\n  border: 1px solid var(--aston-primary);\n}\n\n\n.noti-al {\n  background-color: var(--alpine-primary);\n}\n\n.noti-al-affiliate{\n  background-color: transparent;\n  border: 1px solid var(--alpine-primary);\n}\n\n\n.noti-af {\n  background-color: var(--alfa-primary);\n}\n\n\n.noti-af-affiliate{\n  background-color: transparent;\n  border: 1px solid var(--alfa-primary);\n}\n\n\n.noti-ha {\n  background-color: var(--haas-primary);\n}\n\n.noti-ha-affiliate{\n  background-color: transparent;\n  border: 1px solid var(--haas-primary);\n}\n\n\n.noti-wi {\n  background-color: var(--williams-primary);\n}\n\n.noti-wi-affiliate{\n  background-color: transparent;\n  border: 1px solid var(--williams-primary);\n}\n\n.noti-at {\n  background-color: var(--alphatauri-primary);\n}\n\n.noti-at-affiliate{\n  background-color: transparent;\n  border: 1px solid var(--alphatauri-primary);\n}\n\n\n.noti-me {\n  background-color: var(--mercedes-primary);\n}\n\n.noti-me-affiliate{\n  background-color: transparent;\n  border: 1px solid var(--mercedes-primary);\n}\n\n.noti-ct {\n  background-color: var(--custom-team-primary);\n}\n\n.noti-ct-affiliate{\n  background-color: transparent;\n  border: 1px solid var(--custom-team-primary);\n}\n\n.name-container {\n  display: flex;\n  overflow: hidden;\n  white-space: nowrap;\n  position: relative;\n  min-width: max-content;\n  gap: 5px;\n}\n\n.name-container span {\n  white-space: nowrap;\n}\n\n@keyframes marquee {\n  0% {\n    transform: translateX(0);\n  }\n\n  50% {\n    transform: translateX(calc(-1 * var(--scroll-amount)));\n  }\n\n  100% {\n    transform: translateX(0);\n  }\n}\n\n\n.free-driver .edit-container {\n  display: flex;\n  gap: 5px;\n  position: absolute;\n  left: -5px;\n  top: -6px;\n  width: 39px;\n  opacity: 0;\n  color: var(--text-general);\n  transition: opacity 0.15s, background-color 0.15s, color 0.15s;\n  cursor: pointer;\n  font-size: 14px;\n  border-bottom-right-radius: 3px;\n  z-index: 3;\n  padding-left: 8px;\n  padding-top: 1px;\n  height: 17px;\n  align-items: center;\n}\n\n.free-driver .bi-pencil-fill {\n  font-size: 8px;\n  height: 8PX;\n}\n\n.free-driver .bi-123 {\n  height: 17px;\n}\n\n.free-driver:hover .edit-container {\n  opacity: 1;\n}\n\n.free-driver .edit-container:hover {\n  background-color: var(--text-general);\n  color: var(--negative-text);\n}\n\n\n.free-driver {\n  background-color: var(--elements);\n  border-radius: 9px;\n  padding: 5px 6px;\n  cursor: grab !important;\n  margin: 6px 5px;\n  color: var(--text-general);\n  transition: border-color 0.15s, color 0.15s, background-color 0.15s;\n  position: relative;\n  font-size: 15px;\n  overflow: hidden;\n  height: 36px;\n  display: flex;\n  gap: 3px;\n  box-shadow: var(--shadow-s);\n  align-items: center;\n}\n\n.free-driver span:not(.bold-font) {\n  max-height: 22.5px;\n}\n\n.drivers-table-row .drivers-table-driver span:not(.bold-font),\n.viewer-header-driver span:not(.bold-font) {\n  max-height: 22.5px;\n  white-space: nowrap;\n}\n\n.main-viewer-section:has(.records-list:not(.d-none)) {\n  background-color: transparent;\n  box-shadow: none;\n}\n\n.records-list {\n  display: flex;\n  flex-direction: column;\n  gap: 10px;\n  background-color: transparent;\n  overflow-y: auto;\n  max-height: calc(100vh - 160px);\n  padding-right: 5px;\n}\n\n.record-surname {\n  text-transform: uppercase;\n}\n\n.records-list .record-item {\n  width: 100%;\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  background-color: var(--superficials);\n  border-radius: 10px;\n  padding: 10px 20px;\n  align-items: center;\n  height: 67px;\n  position: relative;\n  box-shadow: var(--shadow-s);\n}\n\n.number-and-name {\n  display: flex;\n  flex-direction: row;\n  gap: 20px;\n  align-items: center;\n  z-index: 2;\n}\n\n.record-number {\n  font-size: 22px;\n  font-family: 'NumbersBold';\n  padding-top: 4px;\n  width: 37px;\n  display: flex;\n  justify-content: center;\n}\n\n.record-logo-div{\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 40px;\n  height: 40px;\n  margin: 0 -10px;\n}\n\n.record-logo-div img, .record-logo-div div {\n  width: 40px;\n  height: 40px;\n}\n\n.record-team-drivers{\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 8px;\n  flex-wrap: wrap;\n}\n\n.record-drivers-separator{\n  color: var(--text-general);\n  user-select: none;\n}\n\n.record-team-driver{\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n}\n\n.record-driver-number{\n  font-family: 'NumbersFont';\n  padding-top: 1px;\n  height: 21px;\n}\n\n.record-name {\n  font-size: 20px;\n  color: var(--text-general);\n  line-height: 1.3;\n}\n\n.record-value {\n  font-size: 22px;\n  font-family: 'NumbersFont';\n  padding-top: 4px;\n  z-index: 2;\n}\n\n.name-and-team {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n}\n\n.record-team {\n  font-size: 14px;\n  color: var(--engine-table-name);\n}\n\n.rb-record::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -19% 4%, var(--redbull-primary), transparent 30%);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.rb-record .record-team {\n  color: var(--redbull-primary);\n}\n\n.rb-back::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 45%, var(--redbull-primary), transparent 120%);\n  border-radius: 10px;\n  z-index: 0;\n  border-radius: 0px;\n}\n\n.rb-back-normal::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--redbull-primary), transparent);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.rb-back-normal-secondary::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--redbull-secondary), transparent);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n\n.mc-record::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -19% 4%, var(--mclaren-primary), transparent 30%);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.mc-record .record-team {\n  color: var(--mclaren-primary);\n}\n\n.mc-back::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 45%, var(--mclaren-primary), transparent 120%);\n  border-radius: 10px;\n  z-index: 0;\n  border-radius: 0px;\n}\n\n.mc-back-normal::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--mclaren-primary), transparent);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.mc-back-normal-secondary::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--mclaren-secondary), transparent);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.as-record::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -19% 4%, var(--aston-primary), transparent 30%);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.as-record .record-team {\n  color: var(--aston-primary);\n}\n\n.as-back::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 45%, var(--aston-primary), transparent 120%);\n  border-radius: 10px;\n  z-index: 0;\n  border-radius: 0px;\n}\n\n.as-back-normal::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--aston-primary), transparent);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.as-back-normal-secondary::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--aston-secondary), transparent);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.al-record::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -19% 4%, var(--alpine-primary), transparent 30%);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.al-record .record-team {\n  color: var(--alpine-primary);\n}\n\n.al-back::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 45%, var(--alpine-primary), transparent 120%);\n  border-radius: 10px;\n  z-index: 0;\n  border-radius: 0px;\n}\n\n.al-back-normal::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--alpine-primary), transparent);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.al-back-normal-secondary::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--alpine-secondary), transparent);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.af-record::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -19% 4%, var(--alfa-primary), transparent 30%);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.af-record .record-team {\n  color: var(--alfa-primary);\n}\n\n.af-back::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 45%, var(--alfa-primary), transparent 120%);\n  border-radius: 10px;\n  z-index: 0;\n  border-radius: 0px;\n}\n\n.af-back-normal::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--alfa-primary), transparent);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.af-back-normal-secondary::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--alfa-secondary), transparent);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.ha-record::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -19% 4%, var(--haas-primary), transparent 30%);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.ha-record .record-team {\n  color: var(--haas-primary);\n}\n\n.ha-back::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 45%, var(--haas-primary), transparent 120%);\n  border-radius: 10px;\n  z-index: 0;\n  border-radius: 0px;\n}\n\n.ha-back-normal::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--haas-primary), transparent);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.ha-back-normal-secondary::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--haas-secondary), transparent);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.wi-record::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -19% 4%, var(--williams-primary), transparent 30%);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.wi-record .record-team {\n  color: var(--williams-primary);\n}\n\n.wi-back::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 45%, var(--williams-primary), transparent 120%);\n  border-radius: 10px;\n  z-index: 0;\n  border-radius: 0px;\n}\n\n.wi-back-normal::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--williams-primary), transparent);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.wi-back-normal-secondary::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--general-secondary), transparent);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.at-record::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -19% 4%, var(--alphatauri-primary), transparent 30%);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.at-record .record-team {\n  color: var(--alphatauri-primary);\n}\n\n.at-back::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 45%, var(--alphatauri-primary), transparent 120%);\n  border-radius: 10px;\n  z-index: 0;\n  border-radius: 0px;\n}\n\n.at-back-normal::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--alphatauri-primary), transparent);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.at-back-normal-secondary::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--alphatauri-secondary), transparent);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.fe-record::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -19% 4%, var(--ferrari-primary), transparent 30%);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.fe-record .record-team {\n  color: var(--ferrari-primary);\n}\n\n.fe-back::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 45%, var(--ferrari-primary), transparent 120%);\n  z-index: 0;\n  border-radius: 0px;\n}\n\n.fe-back-normal::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--ferrari-primary), transparent);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.fe-back-normal-secondary::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--general-secondary), transparent);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.me-record::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -19% 4%, var(--mercedes-primary), transparent 30%);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.me-record .record-team {\n  color: var(--mercedes-primary);\n}\n\n.me-back::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 45%, var(--mercedes-primary), transparent 120%);\n  border-radius: 10px;\n  z-index: 0;\n  border-radius: 0px;\n}\n\n.me-back-normal::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--mercedes-primary), transparent);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.me-back-normal-secondary::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--general-secondary), transparent);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.ct-record::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -19% 4%, var(--custom-team-primary), transparent 30%);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.ct-record .record-team {\n  color: var(--custom-team-primary);\n}\n\n.ct-back::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -5% 45%, var(--custom-team-primary), transparent 120%);\n  border-radius: 10px;\n  z-index: 0;\n  border-radius: 0px;\n}\n\n.ct-back-normal::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--custom-team-primary), transparent);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.ct-back-normal-secondary::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -60% 45%, var(--custom-team-secondary), transparent 120%);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.generic-record::after {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at -19% 4%, color-mix(in srgb, var(--text-general) 60%, var(--engine-table-name)), transparent 30%);\n  border-radius: 10px;\n  z-index: 0;\n}\n\n.generic-record .record-team {\n  color: color-mix(in srgb, var(--text-general) 60%, var(--engine-table-name));\n}\n\n.extra-stats-section {\n  display: grid;\n  grid-auto-flow: column;\n  grid-template-rows: repeat(2, auto);\n  grid-auto-columns: minmax(150px, max-content);\n  color: var(--engine-table-name);\n  border-left: 2px solid var(--engine-table-name);\n  padding-left: 25px;\n  column-gap: 15px;\n  font-size: 15px;\n  height: 45px;\n}\n\n#recordsTypeDropdown{\n  min-width: 215px;\n}\n\n#tableTypeDropdown{\n  right: 0px;\n}\n\n.dropdown-submenu {\n  position: relative;\n}\n\n.dropdown-global .redesigned-dropdown-menu.dropdown-submenu-menu {\n  top: 0;\n  left: 100%;\n  margin-top: 0;\n  margin-left: 6px;\n  opacity: 0;\n  visibility: hidden;\n  transform: translateX(-6px);\n  pointer-events: none;\n}\n\n.dropdown-global .redesigned-dropdown-menu.dropdown-submenu-menu .dropdown-submenu-menu{\n  margin-left: 1px;\n}\n\n.dropdown-global .redesigned-dropdown-menu.dropdown-submenu-menu::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: -6px;\n  width: 6px;\n  height: 100%;\n  background: transparent;\n}\n\n.dropdown-submenu:hover > .redesigned-dropdown-menu.dropdown-submenu-menu {\n  opacity: 1;\n  visibility: visible;\n  transform: translateX(0);\n  pointer-events: auto;\n}\n\n.dropdown-submenu:not(:hover)  .dropdown-submenu-menu {\n  pointer-events: none;\n}\n\n.session-results-gp-menu {\n  min-width: 240px;\n  overflow: visible;\n}\n\n.session-results-scroll {\n  max-height: 340px;\n  overflow-y: auto;\n  overflow-x: hidden;\n  padding-right: 2px;\n}\n\n#sessionResultsGpList::-webkit-scrollbar,\n.news-context-textarea::-webkit-scrollbar,\n.news-options-context-textarea::-webkit-scrollbar  {\n  width: 4px !important;\n}\n\n#sessionResultsGpList::-webkit-scrollbar-thumb,\n.news-context-textarea::-webkit-scrollbar-thumb,\n.news-options-context-textarea::-webkit-scrollbar-thumb {\n  background-color: var(--white-general);\n  border-radius: 3px !important;\n}\n\n#sessionResultsGpList::-webkit-scrollbar-thumb:hover,\n.news-context-textarea::-webkit-scrollbar-thumb:hover,\n.news-options-context-textarea::-webkit-scrollbar-thumb:hover {\n  background-color: var(--scrollbar-hover);\n  cursor: default !important;\n}\n\n#sessionResultsGpList {\n  scrollbar-width: thin;\n  scrollbar-color: var(--white-general) transparent;\n}\n\n.session-results-scroll .redesigned-dropdown-item {\n  min-width: 220px;\n}\n\n.session-results-session-menu {\n  min-width: 220px;\n  z-index: 120;\n}\n\n.dropdown-global .redesigned-dropdown-menu.dropdown-submenu-menu.is-open {\n  opacity: 1;\n  visibility: visible;\n  transform: translateX(0);\n  pointer-events: auto;\n}\n\n.free-driver:hover .bi-ban {\n  color: var(--negative-text);\n}\n\n.bi-ban:hover {\n  color: var(--negative-general);\n  cursor: pointer;\n}\n\n\n.H2Hradio {\n  border-bottom: none;\n  color: var(--text-general);\n  background-color: transparent;\n  transition: color 0.15s, background-color 0.15s;\n  height: 28px;\n  font-size: 16px;\n  padding: 1px 5px;\n  cursor: pointer;\n  z-index: 100;\n  position: relative;\n  border-radius: 5px;\n}\n\n.performance-graph-button {\n  color: var(--text-general);\n  background-color: transparent;\n  font-size: 24px;\n  padding: 0 3px;\n  cursor: pointer;\n  position: relative;\n  transition: color 0.15s, transform 0.15s;\n}\n\n.performance-graph-button:hover {\n  color: var(--text-selected);\n  transform: scale(1.1);\n}\n\n.performance-graph-button i.active {\n  color: var(--new-primary);\n}\n\n.GraphButton {\n  border-bottom: none;\n  color: var(--text-general);\n  background-color: transparent;\n  transition: color 0.15s, background-color 0.15s;\n  height: 28px;\n  font-size: 16px;\n  padding: 0 3px;\n  cursor: pointer;\n  z-index: 100;\n  position: relative;\n  border-radius: 5px;\n  padding: 1px 5px;\n}\n\n.buttons-drivers-modal {\n  display: flex;\n  gap: 4px;\n}\n\n.H2Hradio:hover {\n  background-color: var(--new-primary-transparent);\n}\n\n.GraphButton:hover {\n  background-color: var(--new-secondary-transparent);\n}\n\n.H2Hradio.activated {\n  background-color: var(--new-primary-transparent);\n  color: var(--text-selected);\n}\n\n.GraphButton.activated {\n  background-color: var(--new-secondary-transparent);\n  color: var(--text-selected-secondary);\n}\n\n.H2Hradio:active,\n.GraphButton:active {\n  transform: scale(0.95);\n}\n\n.no-pointer {\n  pointer-events: none;\n}\n\n.modal-dialog-lg {\n  min-width: 1300px !important;\n}\n\n.modal-dialog-med {\n  min-width: 900px !important;\n}\n\n.modal-dialog-sm {\n  min-width: 600px !important;\n}\n\n.predict-footer {\n  display: flex !important;\n  justify-content: space-between !important;\n}\n\n.custom-bar {\n  width: 350px;\n  --bs-progress-bar-bg: var(--new-primary) !important;\n}\n\n.bar-and-indicator {\n  opacity: 0;\n  display: flex;\n  align-items: center;\n  gap: 6px;\n}\n\n.indicator {\n  color: var(--new-primary);\n}\n\n.modal-driver {\n  background-color: var(--elements);\n  border-radius: 10px;\n  padding: 8px;\n  color: var(--text-general);\n  transition: border-color 0.15s, color 0.15s, background-color 0.15s;\n  position: relative;\n  font-size: 15px;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  box-shadow: var(--shadow-s);\n}\n\n.modal-team {\n  background-color: var(--elements);\n  border-radius: 10px;\n  padding: 2px 8px;\n  color: var(--text-general);\n  transition: border-color 0.15s, color 0.15s, background-color 0.15s;\n  position: relative;\n  font-size: 15px;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  box-shadow: var(--shadow-s);\n}\n\n.free-driver .custom-icon {\n  color: transparent;\n  transition: opacity 0.15s;\n  width: 80px;\n  opacity: 0;\n  z-index: 3;\n  display: flex;\n  position: absolute;\n  right: 6px;\n  top: 6px;\n  justify-content: flex-end;\n}\n\n.custom-icon i {\n  transition: transform 0.15s, color 0.15s;\n}\n\n\n\n.standardlogo {\n  width: 30px;\n  height: 30px;\n}\n\n\n.custom-icon .bi-pencil-square {\n  transition: color 0.15s, transform 0.15s;\n}\n\n.free-driver .bi-ban {\n  opacity: 1 !important;\n  transition: color 0.15s;\n  color: var(--white-general);\n  z-index: 10;\n  position: absolute;\n  right: 8px;\n  cursor: pointer;\n}\n\n.free-driver .bi-ban:hover {\n  color: var(--negative-general);\n}\n\n.custom-icon i:hover {\n  color: var(--white-general);\n  cursor: pointer;\n}\n\n.info-titles {\n  color: var(--dark-text);\n  font-size: 22px;\n  cursor: pointer;\n  transition: color 0.15s;\n}\n\n.info-titles:hover {\n  color: var(--new-primary);\n}\n\n\n.free-driver:hover .custom-icon {\n  color: var(--text-general);\n  opacity: 1;\n}\n\n#free-drivers .free-driver:hover .custom-icon i,\n#free-staff .free-driver:hover .custom-icon i {\n  color: var(--text-general);\n}\n\n#free-drivers .free-driver:hover .custom-icon i:hover,\n#free-staff .free-driver:hover .custom-icon i:hover {\n  transform: scale(1.05);\n}\n\n#free-drivers,\n#free-staff {\n  overflow-y: scroll;\n  margin-right: 4px;\n  margin-left: 0px;\n}\n\n#allDrivers {\n  box-shadow: var(--shadow-s);\n}\n\n#free-drivers {\n  box-shadow: none;\n}\n\n#free-staff {\n  box-shadow: none;\n}\n\n\n.free-driver:hover {\n  cursor: grab !important;\n  background-color: var(--table-hover);\n}\n\n.modal-driver:hover,\n.modal-team:hover {\n  cursor: default;\n}\n\n.modal-team.ferrari:hover {\n  color: var(--ferrari-primary);\n}\n\n.modal-team.redbull:hover {\n  color: var(--redbull-primary);\n}\n\n.modal-team.mclaren:hover {\n  color: var(--mclaren-primary);\n}\n\n.modal-team.merc:hover {\n  color: var(--mercedes-primary);\n}\n\n.modal-team.alpine:hover {\n  color: var(--alpine-primary);\n}\n\n.modal-team.williams:hover {\n  color: var(--williams-primary);\n}\n\n.modal-team.haas:hover {\n  color: var(--haas-primary);\n}\n\n.modal-team.alpha:hover {\n  color: var(--alphatauri-primary);\n}\n\n.modal-team.alfa:hover {\n  color: var(--alfa-primary);\n}\n\n.modal-team.aston:hover {\n  color: var(--aston-primary);\n}\n\n.blocking-div {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  z-index: 100;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  color: var(--white-general);\n  flex-direction: column;\n  justify-content: center;\n}\n\n.drop-area.drag-over {\n  border: 2px dashed var(--new-primary);\n  background-color: color-mix(in srgb, var(--new-primary) 5%, var(--elements));\n}\n\n.splash-text {\n  color: var(--dark-text);\n  display: flex;\n  justify-content: center;\n}\n\n.splash-logo {\n  height: 370px;\n  margin-bottom: 30px;\n}\n\n.blocking-confidence {\n  background-color: var(--blur-color);\n  z-index: 100;\n  display: flex;\n  color: var(--white-general);\n  backdrop-filter: blur(3px);\n  text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);\n  width: 20%;\n  height: 7%;\n  position: absolute;\n  border-radius: 10px;\n  text-align: center;\n  align-items: center;\n  justify-content: center;\n}\n\n.blocking-h2h {\n  background-color: var(--blur-color);\n  z-index: 100;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  color: var(--white-general);\n  backdrop-filter: blur(3px);\n  text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);\n  width: 24.9%;\n  height: 658px;\n  position: absolute;\n  border-radius: 10px;\n}\n\n\n.normal-driver {\n  background-color: var(--elements);\n  cursor: pointer;\n  border-radius: 10px;\n  padding: 10px;\n  margin: 10px 7px;\n  color: var(--text-general);\n  transition: border-color 0.15s, color 0.15s, background-color 0.15s;\n  display: flex;\n  justify-content: space-between;\n  position: relative;\n  box-shadow: var(--shadow-s);\n}\n\n.one-stat-panel,\n.one-stat-invisible {\n  border-radius: 10px;\n  color: var(--text-general);\n  transition: border-color 0.15s, background-color 0.15s;\n  min-height: 70px;\n  display: flex;\n  justify-content: space-around;\n  align-items: center;\n  max-height: 70px;\n  flex-direction: column;\n  flex: 1 1 0;\n}\n\n.one-stat-invisible {\n  pointer-events: none;\n  opacity: 0;\n}\n\n.one-stat-panel .custom-input-number {\n  width: 3ch;\n  padding: 0;\n}\n\n.super-license-holder {\n  display: flex !important;\n  font-size: 16px;\n  flex-direction: column;\n  align-items: flex-start;\n  justify-content: center;\n  padding-left: 0px !important;\n  margin-bottom: 0px !important;\n}\n\n.super-license-holder .form-check {\n  margin-bottom: 0px !important;\n}\n\n.name-and-stat {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: center;\n  width: 100%;\n  height: 20px !important;\n}\n\n.name-and-stat.mentality {\n  padding: 4px 0;\n}\n\n.bar-container {\n  height: 100%;\n  width: 100%;\n  align-items: center;\n  display: flex;\n}\n\n.one-stat-bar {\n  width: 100%;\n  height: 6px;\n  border-radius: 1px;\n  background-color: var(--background);\n  position: relative;\n}\n\n.one-stat-progress {\n  position: absolute;\n  background-color: var(--new-primary);\n  transition: width 0.15s;\n  border-radius: 1px;\n  height: 100%;\n}\n\n.bar-container:has(.mentality-level-indicator.comparison-bar) {\n  flex-direction: row-reverse;\n}\n\n.stat-number {\n  display: flex;\n  align-items: center;\n}\n\n.one-stat-panel span {\n  color: var(--text-general);\n  transition: color 0.15s;\n  padding-top: 4px;\n}\n\n\n\n.positive {\n  color: var(--positive-general);\n}\n\n.negative {\n  color: var(--negative-general);\n}\n\n.input-and-buttons {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  margin-right: 5px;\n  gap: 10px;\n}\n\n.team-viewer .input-buttons {\n  flex-direction: row-reverse;\n}\n\n.input-buttons {\n  display: flex;\n  flex-direction: column;\n  font-size: 16px !important;\n  padding-top: 2px;\n  gap: 5px;\n}\n\n.input-buttons .bi-chevron-up,\n.input-buttons .bi-chevron-down {\n  font-size: 14px !important;\n}\n\n\n.team-menu-logo {\n  width: 50px;\n  height: 42px;\n  display: flex;\n  align-items: center;\n}\n\n.team-menu-junior-generic {\n  width: 50px;\n  height: 42px;\n  object-fit: contain;\n}\n\n.junior-driver-row {\n  display: flex;\n  justify-content: flex-start;\n  align-items: center;\n  padding: 4px 0;\n}\n\n#juniorPosInTeam{\n  width: 30px !important;\n}\n\n.junior-driver-left {\n  display: flex;\n  gap: 10px;\n  align-items: baseline;\n}\n\n.junior-driver-car {\n  color: var(--text-general);\n  opacity: 0.75;\n  font-size: 12px;\n  min-width: 52px;\n}\n\n.junior-driver-name {\n  color: var(--text-general);\n}\n\n.junior-replacing-tag {\n  color: var(--new-primary);\n  font-weight: 700;\n}\n\n.team-menu-aston {\n  width: 50px;\n  height: 45px;\n  padding-bottom: 5px;\n  padding-left: 2px;\n  padding-top: 5px;\n  padding-right: 3px;\n}\n\n.team-menu-audi {\n  width: 45px;\n  height: 45px;\n  padding-bottom: 16px;\n  padding-left: 3px;\n  padding-top: 17px;\n}\n\n.changable-team-menu-visarb {\n  height: 45px !important;\n  padding-bottom: 7px !important;\n  padding-left: 6px !important;\n  padding-top: 7px !important;\n}\n\n.team-menu-haas {\n  width: 40px;\n  height: 40px;\n  padding-bottom: 5px;\n  padding-top: 7px;\n  padding-left: 6px;\n}\n\n.team-menu-custom {\n  width: 50px;\n  height: 40px;\n  padding-bottom: 1px;\n  padding-top: 1px;\n  padding-left: 3px;\n}\n\n.changable-team-menu-williams {\n  width: 45px;\n  height: 45px;\n  padding-bottom: 11px;\n  padding-left: 7px;\n  padding-top: 10px;\n  padding-right: 4px;\n  -webkit-mask: url('/assets/images/logos/Williams_2026_logo.svg') no-repeat center;\n  mask: url('/assets/images/logos/Williams_2026_logo.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--text-general);\n}\n\n.changable-team-menu-bmw {\n  width: 100%;\n  padding-left: 5px;\n}\n\n.changable-team-menu-brawn {\n  width: 50px !important;\n  height: 45px !important;\n  padding-bottom: 18px !important;\n  padding-left: 5px !important;\n  padding-top: 18px !important;\n  padding-right: 5px !important;\n  margin-left: 0px !important;\n}\n\n.changable-team-menu-andretti {\n  width: 100% !important;\n  height: 100% !important;\n  padding-bottom: 3px !important;\n  padding-top: 8px !important;\n  padding-left: 7px !important;\n}\n\n.team-menu-merc {\n  width: 50px;\n  height: 40px;\n  padding-bottom: 5px;\n  padding-top: 7px;\n  padding-left: 10px;\n  padding-right: 8px;\n}\n\n.team-menu-redbull {\n  width: 45px;\n  height: 40px;\n  padding-bottom: 8px;\n  padding-left: 3px;\n  padding-top: 7px;\n}\n\n.changable-team-menu-redbull {\n  width: 45px;\n  height: 40px;\n  padding-bottom: 8px;\n  padding-left: 3px;\n  padding-top: 7px;\n}\n\n.changable-team-menu-ford {\n  width: 45px;\n  height: 40px;\n  padding-bottom: 6px;\n  padding-left: 3px;\n  padding-top: 6px;\n}\n\n.changable-team-menu-aston {\n  width: 50px;\n  height: 45px;\n  padding-bottom: 5px;\n  padding-left: 2px;\n  padding-top: 5px;\n  padding-right: 3px;\n}\n\n.changable-team-menu-racingpoint,\n.changable-team-menu-jordan {\n  width: 45px;\n  height: 40px;\n  padding-bottom: 6px;\n  padding-left: 3px;\n  padding-top: 6px;\n}\n\n.changable-team-menu-cadillac {\n  width: 45px;\n  height: 40px;\n  padding-bottom: 6px;\n  padding-left: 3px;\n  padding-top: 6px;\n}\n\n.team-menu-mclaren {\n  width: 40px;\n  height: 40px;\n  padding-bottom: 4px;\n  padding-top: 7px;\n  padding-left: 6px;\n  -webkit-mask: url('/assets/images/logos/mclaren.svg') no-repeat center;\n  mask: url('/assets/images/logos/mclaren.svg') no-repeat center;\n  -webkit-mask-size: 90%;\n  mask-size: 90%;\n  background-color: var(--mclaren-primary);\n}\n\n.team-menu-ferrari {\n  width: 50px;\n  height: 40px;\n  padding-bottom: 6px;\n  padding-top: 8px;\n  padding-left: 9px;\n  padding-right: 9px;\n}\n\n.changable-team-menu-alpine {\n  width: 100% !important;\n  height: 100% !important;\n  padding-bottom: 6px !important;\n  padding-top: 9px !important;\n  padding-left: 6px !important;\n}\n\n.changable-team-menu-alphatauri {\n  width: 45px !important;\n  height: 45px !important;\n  padding-bottom: 12px !important;\n  padding-left: 8px !important;\n  padding-top: 12px !important;\n  padding-right: 4px !important;\n}\n\n.changable-team-menu-alfa {\n  width: 40px !important;\n  height: 40px !important;\n  padding-bottom: 3px !important;\n  padding-top: 5px !important;\n  padding-left: 7px !important;\n}\n\n.team-menu-renault {\n  width: 45px;\n  height: 40px;\n  padding-bottom: 6px;\n  padding-top: 8px;\n  padding-left: 10px;\n  padding-right: 5px;\n}\n\n.changable-team-menu-hugo {\n  height: 45px !important;\n  width: 50px !important;\n  padding-bottom: 7px !important;\n  padding-top: 7px !important;\n}\n\n.changable-team-menu-stake {\n  width: 40px !important;\n  height: 40px !important;\n  padding-bottom: 3px !important;\n  padding-top: 5px !important;\n  padding-left: 7px !important;\n}\n\n.changable-team-menu-sauber {\n  width: 100% !important;\n  height: 30px !important;\n}\n\n.changable-team-menu-lotus {\n  width: 100% !important;\n  height: 100% !important;\n  padding-bottom: 4px !important;\n  padding-top: 4px !important;\n  padding-left: 6px !important;\n}\n\n.changable-team-menu-renault {\n  width: 100% !important;\n  height: 100% !important;\n  padding-bottom: 6px;\n  padding-top: 8px;\n  padding-left: 9px;\n  padding-right: 9px;\n}\n\n.changable-team-menu-toyota {\n  width: 50px !important;\n  height: 45px !important;\n  padding-bottom: 9px !important;\n  padding-left: 5px !important;\n  padding-top: 8px !important;\n  padding-right: 6px !important;\n}\n\n.changable-team-menu-porsche {\n  width: 45px !important;\n  height: 40px !important;\n  padding-bottom: 6px !important;\n  padding-top: 8px !important;\n  padding-left: 10px !important;\n  padding-right: 5px !important;\n}\n\n#teamButton {\n  z-index: 2;\n}\n\n#teamsDiv {\n  display: flex;\n  flex-direction: column;\n  background-color: var(--superficials);\n  gap: 0px;\n  padding: 10px;\n  justify-content: space-between;\n}\n\n\n#carsDiv{\n  background-color: var(--superficials);\n}\n\n\n.generalPills {\n  color: var(--text-general) !important;\n  border: 0px 2px solid transparent !important;\n  transition: border-color 0.15s, background-color 0.15s, color 0.15s, width 0.15s !important;\n  display: flex;\n  position: relative;\n  background: none;\n  cursor: pointer !important;\n}\n\n.basic-label {\n  cursor: pointer;\n  z-index: 1;\n  transition: color 0.15s, transform 0.15s;\n  pointer-events: none;\n}\n\n.generalPills::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(ellipse 70% 150% at center bottom, var(--new-primary), transparent 70%);\n  opacity: 0;\n  transition: opacity 0.25s ease;\n  transition-delay: 0.15s;\n  pointer-events: none;\n  z-index: 0;\n}\n\n.generalPills:hover::before {\n  opacity: 1;\n}\n\n.generalPills:hover,\n.scriptPills:hover {\n  color: var(--white-general) !important;\n}\n\n.generalPills:not(:hover)::before {\n  transition-delay: 0s;\n}\n\n.generalPills.active::before {\n  opacity: 1;\n  transition-delay: 0s;\n}\n\n.generalPills.active {\n  background-color: transparent !important;\n  color: var(--white-general) !important;\n}\n\n.generalPills .pill-line {\n  background-color: var(--new-primary);\n  width: 0%;\n}\n\n.generalPills:hover .pill-line,\n.generalPills.active .pill-line {\n  width: 100%;\n}\n\n\n.scriptPills {\n  color: var(--text-general) !important;\n  border: 2px solid transparent !important;\n  transition: border-color 0.15s, background-color 0.15s, color 0.15s, width 0.15s !important;\n  width: 44px;\n  height: 40px;\n  display: flex;\n  position: relative;\n  background: none;\n}\n\n\n#predictpill:hover,\n#predictpill:hover .pill-line,\n#predictpill.active .pill-line,\n#predictpill.active {\n  width: 120px;\n}\n\n\n#h2hpill:hover,\n#h2hpill:hover .pill-line,\n#h2hpill.active .pill-line,\n#h2hpill.active {\n  width: 150px;\n}\n\n#newspill:hover,\n#newspill:hover .pill-line,\n#newspill.active .pill-line,\n#newspill.active {\n  width: 81px;\n}\n\n#viewerpill:hover,\n#viewerpill:hover .pill-line,\n#viewerpill.active .pill-line,\n#viewerpill.active {\n  width: 111px;\n}\n\n#transferpill:hover,\n#transferpill:hover .pill-line,\n#transferpill.active .pill-line,\n#transferpill.active {\n  width: 133px;\n}\n\n#statspill:hover,\n#statspill:hover .pill-line,\n#statspill.active .pill-line,\n#statspill.active {\n  width: 138px;\n}\n\n#constructorspill:hover,\n#constructorspill:hover .pill-line,\n#constructorspill.active .pill-line,\n#constructorspill.active {\n  width: 95px;\n}\n\n#calendarpill:hover,\n#calendarpill:hover .pill-line,\n#calendarpill.active .pill-line,\n#calendarpill.active {\n  width: 130px;\n}\n\n#regulationspill:hover,\n#regulationspill:hover .pill-line,\n#regulationspill.active .pill-line,\n#regulationspill.active {\n  width: 158px;\n}\n\n#carpill:hover,\n#carpill:hover .pill-line,\n#carpill.active .pill-line,\n#carpill.active {\n  width: 171px;\n}\n\n#modpill:hover,\n#modpill:hover .pill-line,\n#modpill.active .pill-line,\n#modpill.active {\n  width: 78px;\n}\n\n#specialCarIcon {\n  width: 20px;\n  height: 20px;\n  bottom: 8px;\n  -webkit-mask: url('/assets/images/car.svg') no-repeat center;\n  mask: url('/assets/images/car.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--text-general);\n}\n\n\n\n.download-save-button {\n  width: 44px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  align-content: center;\n  height: 40px;\n  transition: all 0.15s;\n  opacity: 1;\n}\n\n.download-save-controls {\n  display: flex;\n  align-items: center;\n  height: 100%;\n}\n\n.download-save-progress {\n  width: 160px;\n  min-width: 160px;\n  margin-left: 8px;\n  opacity: 1;\n  transition: width 0.15s, min-width 0.15s, margin-left 0.15s, opacity 0.15s;\n}\n\n.download-save-button.hidden {\n  opacity: 0;\n  pointer-events: none;\n}\n\n.download-save-progress.hidden {\n  width: 0;\n  min-width: 0;\n  margin-left: 0;\n  opacity: 0;\n  pointer-events: none;\n}\n\n.download-save-button i {\n  font-size: 20px;\n  cursor: pointer;\n  background-size: 200% 200%;\n  transition: all 0.15s, transform 0s;\n  display: inline-block;\n}\n\n.download-save-button i:hover {\n  background: linear-gradient(to right, var(--new-primary), var(--text-general), var(--new-primary));\n  background-clip: text;\n  -webkit-text-fill-color: transparent;\n  -webkit-background-clip: text;\n  animation: gradient-move-title 4s infinite linear;\n  background-size: 200% 200%;\n  transform: scale(1.1);\n}\n\n.download-save-button i:active {\n  transform: scale(0.98);\n}\n\n#panicDownloadButton{\n  width: max-content;\n  margin-top: 5px;\n}\n#amoLogo:hover {\n  background: linear-gradient(to right, var(--amo-1), var(--amo-2), var(--amo-1));\n  background-size: 200% 200%;\n  animation: gradient-move-title 5s linear infinite;\n  transform: scale(1.1);\n}\n\n#amoPill {\n  height: 100%;\n  display: flex;\n  align-items: center;\n  justify-content: flex-end;\n  position: absolute;\n  right: 0px;\n  background: linear-gradient(to right, transparent, #202020 50%);\n  width: 135px;\n  border-bottom-right-radius: 10px;\n}\n\n#amoLogo {\n  height: 30px;\n  width: 50px;\n  margin-right: 10px;\n  transition: transform 0.15s ease;\n  /* Solo transiciona transform */\n  cursor: pointer;\n\n  background: #dedde6;\n\n  -webkit-mask: url('../assets/images/AMO.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask: url('../assets/images/AMO.svg') no-repeat center;\n  mask-size: contain;\n\n  will-change: transform;\n}\n\n.pill-icon {\n  opacity: 1;\n  transition: opacity 0.10s;\n  font-size: 20px;\n  position: absolute;\n  bottom: 5px;\n}\n\n.pill-label {\n  opacity: 0;\n  transition: opacity 0.10s;\n  position: absolute;\n  left: 10px;\n  cursor: pointer;\n  pointer-events: none;\n}\n\n.pill-line {\n  width: 0px;\n  height: 2px;\n  transition: width 0.15s, background-color 0.15s;\n  background-color: var(--white-general);\n  position: absolute;\n  bottom: 0;\n  left: -2px;\n  pointer-events: none;\n}\n\n.scriptPills:hover .pill-icon,\n.scriptPills.active .pill-icon {\n  opacity: 0;\n}\n\n.scriptPills:hover .pill-label,\n.scriptPills.active .pill-label {\n  opacity: 1;\n}\n\n\n.scriptPills:hover {\n  width: 135px;\n}\n\n.scriptPills::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(ellipse 70% 150% at center bottom, var(--new-primary), transparent 70%);\n  opacity: 0;\n  transition: opacity 0.25s ease;\n  transition-delay: 0.15s;\n  pointer-events: none;\n}\n\n.scriptPills.active {\n  background-color: transparent !important;\n  color: var(--white-general) !important;\n}\n\n.scriptPills.active::before {\n  opacity: 1;\n  transition-delay: 0s;\n  /* Asegurarse de que no haya retraso en el estado activo */\n}\n\n.scriptPills .pill-line {\n  background-color: var(--new-primary);\n}\n\n.ai-pills::before {\n  background: radial-gradient(ellipse 75% 160% at center 110%, var(--mode-line-ai), transparent 70%);\n}\n\n.ai-pills .pill-line {\n  background-color: var(--ai-transparent);\n}\n\n.edit-pills::before {\n  background: radial-gradient(ellipse 70% 160% at center 110%, var(--mode-line-edit), transparent 70%);\n}\n\n.edit-pills .pill-line {\n  background-color: var(--edit-transparent);\n}\n\n\n.view-pills::before {\n  background: radial-gradient(ellipse 70% 160% at center 110%, var(--mode-line-view), transparent 70%);\n}\n\n.view-pills .pill-line {\n  background-color: var(--view-transparent);\n}\n\n.scriptPills:hover::before {\n  opacity: 1;\n}\n\n.scriptPills:not(:hover)::before {\n  transition-delay: 0s;\n  /* No delay when not hovering */\n}\n\n.custom-input-number {\n  background-color: transparent;\n  padding: 3px;\n  color: var(--text-general);\n  max-width: 52px;\n  border: 0px solid;\n  font-size: 20px;\n  transition: background-color 0.15s, color 0.15s, border-color 0.15s !important;\n  text-align: center;\n}\n\n.old-custom-input-number {\n  background-color: transparent;\n  padding: 6px;\n  margin-right: 7px;\n  color: var(--text-general);\n  max-width: 60px;\n  border-bottom: 2px solid transparent;\n  border-right: 0px solid;\n  border-left: 0px solid;\n  border-top: 0px solid;\n  font-size: 20px;\n  transition: background-color 0.15s, color 0.15s, border-color 0.15s !important;\n  text-align: center;\n}\n\n#contractModal .contract-modal-input {\n  padding: 6px;\n  margin-right: 0;\n  max-width: none;\n  text-align: left;\n  border-bottom: 2px solid transparent;\n  border-right: 0px solid;\n  border-left: 0px solid;\n  border-top: 0px solid;\n  width: 140px;\n  font-size: 18px;\n}\n\n#contractModal .contract-details .unit-and-input {\n  gap: 6px;\n  font-size: 16px;\n}\n\n.contract-details i:not(.new-augment-button) {\n  transition: transform 0.15s, color 0.15s;\n}\n\n.custom-input-number::selection {\n  background-color: transparent;\n}\n\n\n.custom-input-number:hover,\n.old-custom-input-number:hover {\n  border-color: var(--text-selected);\n}\n\n.custom-input-number:focus,\n.old-custom-input-number:focus {\n  color: var(--text-selected);\n  outline: 0px solid transparent;\n  border-color: var(--new-primary);\n}\n\n\ninput::-webkit-outer-spin-button,\ninput::-webkit-inner-spin-button {\n  -webkit-appearance: none;\n  margin: 0;\n}\n\ninput[type='number'] {\n  -moz-appearance: textfield;\n  appearance: textfield;\n}\n\n.normal-driver:hover {\n  background-color: var(--table-hover);\n}\n\n.normal-driver.clicked .surname {\n  color: var(--negative-text) !important;\n}\n\n.normal-driver.clicked .small-ovr {\n  color: var(--negative-text) !important;\n}\n\n.small-ovr {\n  gap: 5px;\n  display: flex;\n  overflow: hidden;\n}\n\n.small-ovr span {\n  width: 25px;\n}\n\n.mentality-small-ovr-positive {\n  color: var(--positive-general);\n}\n\n.normal-driver.clicked .mentality-small-ovr-positive {\n  color: var(--positive-general-clicked);\n}\n\n.mentality-small-ovr-negative {\n  color: var(--negative-general);\n}\n\n.normal-driver.clicked .mentality-small-ovr-negative {\n  color: var(--negative-general-clicked);\n}\n\n.race.selected,\n.normal-driver.clicked,\n.fe-transparent.clicked:hover,\n.mc-transparent.clicked:hover,\n.me-transparent.clicked:hover,\n.al-transparent.clicked:hover,\n.wi-transparent.clicked:hover,\n.ha-transparent.clicked:hover,\n.at-transparent.clicked:hover,\n.as-transparent.clicked:hover,\n.af-transparent.clicked:hover,\n.rb-transparent.clicked:hover {\n  background: var(--text-general) !important;\n  color: var(--negative-text) !important;\n}\n\n.normal-driver span,\n.normal-driver .bold-font {\n  z-index: 3;\n  position: relative;\n}\n\n.team-template {\n  background-color: var(--superficials);\n  border: none;\n  color: var(--white-general);\n  display: flex;\n  flex-direction: row;\n  position: relative;\n  padding: 5px;\n  box-shadow: var(--shadow-s);\n  flex-grow: 1;\n  border-radius: 10px;\n  overflow: hidden;\n}\n\n.viewer-top {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n}\n\n.team-performance,\n.car-performance {\n  display: flex;\n  flex-direction: column;\n  gap: 1px;\n}\n\n.car-performance {\n  gap: 0px\n}\n\n.performance-bar {\n  height: 5px;\n  width: 100%;\n  background-color: var(--background);\n  position: relative;\n  margin: 4px 0;\n}\n\n.car .performance-bar {\n  height: 3px;\n  margin: 0px;\n  margin-top: 2px;\n}\n\n.car .performance-bar-progress {\n  height: 3px;\n}\n\n.performance-bar-progress {\n  width: 0%;\n  height: 5px;\n  position: absolute;\n  border-right: 1px solid var(--text-general);\n}\n\n.performance-bar-progress.rb {\n  background-color: var(--redbull-primary);\n}\n\n.performance-bar-progress.fe {\n  background-color: var(--ferrari-primary);\n}\n\n.performance-bar-progress.mc {\n  background-color: var(--mclaren-primary);\n}\n\n.performance-bar-progress.me {\n  background-color: var(--mercedes-primary);\n}\n\n.performance-bar-progress.al {\n  background-color: var(--alpine-primary);\n}\n\n.performance-bar-progress.wi {\n  background-color: var(--williams-primary);\n}\n\n.performance-bar-progress.ha {\n  background-color: var(--haas-primary);\n}\n\n.performance-bar-progress.at {\n  background-color: var(--alphatauri-primary);\n}\n\n.performance-bar-progress.as {\n  background-color: var(--aston-primary);\n}\n\n.performance-bar-progress.af {\n  background-color: var(--alfa-primary);\n}\n\n.performance-bar-progress.ct {\n  background-color: var(--custom-team-primary);\n}\n\n.logo-and-name {\n  display: flex;\n  flex-direction: row;\n  max-height: 46px;\n  align-items: center;\n}\n\n.new-logo-and-name {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  min-width: 250px;\n  z-index: 1;\n}\n\n.logo-and-title {\n  display: flex;\n  flex-direction: row;\n  height: 54.5px;\n\n}\n\n.car-title {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  justify-content: space-between;\n  font-size: 13px;\n  height: 13.5px;\n  padding-bottom: 4px;\n}\n\n.team-title {\n  display: flex;\n  align-items: center;\n  font-size: 18px;\n  justify-content: space-between;\n}\n\n.team-performance:hover .team-title-value {\n  color: var(--white-general);\n}\n\n.team-performance.selected .team-title-value {\n  color: var(--white-general);\n}\n\n.team-title-value {\n  color: var(--dark-text);\n  transition: color 0.15s;\n}\n\n.car:hover .main-car,\n.team:hover .main-car {\n  border-left: 2px solid var(--white-general);\n}\n\n.car.selected .main-car,\n.team.selected .main-car {\n  border-left: 2px solid var(--white-general);\n}\n\n.main-car {\n  border-left: 2px solid var(--separator);\n  padding-left: 7px;\n  transition: border-color 0.15s;\n}\n\n.team .main-car {\n  padding-left: 12px;\n}\n\n.nunmber-and-car,\n.number-and-team {\n  display: flex;\n  flex-direction: row;\n}\n\n.performance-number {\n  width: 8%;\n  text-align: center;\n  padding-right: 7px;\n  font-size: 16px;\n  max-height: 16px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding-top: 4px;\n  transition: transform 0.15s;\n}\n\n/* move it 2 pixels to the right */\n.number-and-team:hover .team-number,\n.number-and-team.selected .team-number {\n  transform: translateX(2px);\n}\n\n.nunmber-and-car:hover .performance-number,\n.nunmber-and-car.selected .performance-number {\n  transform: translateX(2px);\n}\n\n.team-number {\n  width: 10%;\n  text-align: center;\n  font-size: 22px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding-right: 9.5px;\n  transition: transform 0.15s;\n}\n\n.car-performance.selected .value {\n  color: var(--white-general);\n}\n\n.car-performance:hover .value {\n  color: var(--white-general);\n}\n\n.car-missing-parts {\n  color: var(--negative-general);\n  font-size: 12px;\n  padding-top: 2px;\n  display: flex;\n  align-items: center;\n}\n\n.car-missing-parts .bi-check-all {\n  color: var(--positive-general);\n  font-size: 20px;\n}\n\n.car-missing-parts .bi-exclamation-triangle-fill {\n  padding-bottom: 2px;\n  margin-left: 4px;\n}\n\n.car-missing-parts .value {\n  color: var(--dark-text);\n  transition: color 0.15s;\n  width: 56px;\n  display: flex;\n  justify-content: flex-end;\n}\n\n.team-template .team-name {\n  max-width: 200px;\n}\n\n\n.team-name {\n  padding-bottom: 10px;\n  padding-left: 10px;\n  padding-top: 10px;\n  overflow: hidden;\n  white-space: nowrap;\n  text-transform: uppercase;\n}\n\n\n.perf-title {\n  padding-bottom: 10px;\n  padding-top: 5px;\n}\n\n.team-viewer {\n  display: flex;\n  flex-direction: row;\n  padding: 15px 20px;\n  align-items: center;\n  justify-content: space-between;\n}\n\n.team-separator{\n  width: 2px;\n  background-color: var(--separator-light);\n  height: 620px;\n}\n\n#teamBudgetInput {\n  min-width: 130px;\n}\n\n\n#costCapInput {\n  min-width: 150px;\n}\n\n.team-header {\n  font-size: 44px;\n  height: 55px;\n  width: 100%;\n}\n\n.component-and-title {\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  gap: 5px;\n}\n\n.component-and-title:has(.pit-crew-details) {\n  gap: 0px;\n}\n\n.viewer-component {\n  display: flex;\n  flex-direction: row;\n}\n\n.facility-component {\n  margin-top: 20px;\n  display: flex;\n  flex-direction: column;\n}\n\n\n.facility,\n.facility-level-indicator,\n.mentality-level-indicator {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n}\n\n.facility {\n  margin-top: 5px;\n  justify-content: space-between;\n  position: relative;\n  height: 52px;\n}\n\n.condition-container {\n  position: absolute;\n  bottom: 0px;\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n  align-items: center;\n}\n\n.condition-container-bar {\n  width: 100%;\n  background-color: var(--background);\n  height: 2px;\n  margin-right: 8px;\n  margin-top: 5px;\n}\n\n.condition-container-bar-progress {\n  width: 33%;\n  background-color: var(--positive-general);\n  height: 2px;\n  transition: width 0.15s;\n}\n\n.condition-container-buttons {\n  display: flex;\n  flex-direction: row;\n  font-size: 24px;\n  height: 30px;\n}\n\n.condition-container-buttons i {\n  cursor: pointer;\n  transition: transform 0.15s, color 0.15s;\n  display: flex;\n  align-items: center;\n}\n\n.condition-container-value {\n  font-family: \"Formula1Bold\";\n  color: var(--positive-general);\n  width: 60px;\n  text-align: right;\n}\n\n.condition-container-buttons i:hover {\n  transform: scale(1.05);\n  color: var(--positive-general);\n}\n\n.facility-refurbish {\n  width: 5%;\n  font-size: 20px;\n  display: flex;\n  justify-content: center;\n}\n\n.facility-refurbish svg {\n  width: 28px;\n  padding-bottom: 11px;\n  transition: color 0.15s, transform 0.15s;\n  cursor: pointer;\n}\n\n.facility-refurbish svg:hover {\n  color: var(--positive-general);\n  transform: scale(1.1);\n}\n\n.facility-level-indicator,\n.mentality-level-indicator {\n  gap: 6px;\n  margin: 0 10px;\n  padding-top: 1px;\n  flex-grow: 1;\n}\n\n.facility-name {\n  width: 50%;\n  color: var(--text-general);\n}\n\n.custom-button {\n  height: 40px;\n  font-size: 16px;\n  padding: 0 10px;\n}\n\n\n.color-selector {\n  display: flex;\n  align-items: center;\n  gap: 5px;\n}\n\n.color-selector .title-secondary{\n  width: 150px;\n}\n\n.logo-selector {\n  display: flex;\n  flex-direction: column;\n  gap: 5px;\n}\n\n.logo-and-preview {\n  display: flex;\n  flex-direction: row;\n  gap: 10px;\n  align-items: center;\n}\n\n.title-secondary{\n  color: var(--text-secondary);\n}\n\n.logo-preview {\n  width: 30px;\n  height: 30px;\n  background-color: transparent;\n  border: solid 1px var(--toast-background);\n}\n\n.color-reader {\n  background-color: transparent;\n  border: none;\n  color: var(--text-general);\n  width: 100px;\n}\n\n.color-picker {\n  width: 30px;\n  height: 30px;\n  background-color: transparent;\n  border: none;\n  cursor: pointer;\n}\n\n.custom-logo-selection {\n  display: flex;\n  gap: 10px;\n  flex-direction: row;\n}\n\n.colors-selector {\n  display: flex;\n  flex-direction: column;\n  gap: 10px;\n}\n\n#teamMenu a,\n.team-select-menu a {\n  display: flex;\n  align-items: center;\n  justify-content: flex-start;\n  padding: 0;\n}\n\n#teamContractMenu {\n  max-height: 250px;\n  overflow-y: scroll;\n}\n\n#teamContractMenu a {\n  display: flex;\n  align-items: center;\n  justify-content: flex-start;\n  padding: 0;\n  min-width: 215px;\n}\n\n.team-select-menu a {\n  display: flex;\n  align-items: center;\n  justify-content: flex-start;\n  padding: 0;\n}\n\n\n#viewer-first {\n  width: 49%;\n  padding-right: 20px;\n  display: flex;\n  flex-direction: column;\n  gap: 10px;\n}\n\n#viewer-second {\n  width: 50%;\n  padding-left: 20px;\n  align-self: flex-start;\n}\n\n.separator {\n  width: 2px;\n  background-color: var(--separator);\n  height: 100%;\n}\n\n.separator-2 {\n  margin-top: 30px;\n  width: 2px;\n  background-color: var(--elements);\n  height: 90%;\n}\n\n\n\n.main-second-viewer {\n  min-height: 580px;\n  position: relative;\n  overflow-y: auto;\n  max-height: 620px;\n  overflow-x: hidden;\n  padding-right: 13px;\n}\n\n.save-button-zone {\n  display: flex;\n  flex-direction: row;\n  justify-content: flex-end;\n  width: 100%\n}\n\n.level {\n  height: 8px;\n  width: 20%;\n  background-color: var(--mid-gray-contrast);\n  transition: background-color 0.15s;\n}\n\n.mentality-level {\n  height: 8px;\n  border-radius: 2px;\n  width: 20%;\n  background-color: var(--mid-gray-contrast);\n  transition: background-color 0.15s;\n}\n\n.mentality-and-emoji.demoralized {\n  color: var(--mentality-demoralized);\n}\n\n.mentality-level.demoralized {\n  background-color: var(--mentality-demoralized);\n}\n\n.mentality-and-emoji.negative {\n  color: var(--mentality-negative);\n}\n\n.mentality-level.negative {\n  background-color: var(--mentality-negative);\n}\n\n.mentality-and-emoji.positive {\n  color: var(--mentality-positive);\n\n}\n\n.mentality-level.positive {\n  background-color: var(--mentality-positive);\n}\n\n.mentality-and-emoji.enthusiastic {\n  color: var(--mentality-enthusiastic);\n}\n\n.mentality-and-emoji.neutral {\n  color: var(--mentality-neutral);\n}\n\n.mentality-level.neutral {\n  background-color: var(--mentality-neutral);\n}\n\n.mentality-level.enthusiastic {\n  background-color: var(--mentality-enthusiastic);\n}\n\n.bar-container i {\n  transition: color 0.15s;\n  cursor: pointer;\n}\n\n\n\n.name-and-emoji {\n  transition: color 0.15s;\n}\n\n.level.activated {\n  background-color: var(--white-general) !important;\n}\n\n.viewer-component .custom-input-number,\n.facility-component .custom-input-number,\n.facility-component-lg .custom-input-number {\n  background-color: transparent !important;\n  text-align: center;\n  padding: 8px;\n  height: 39.2px !important;\n}\n\n.facility .bi-chevron-right {\n  margin-right: 15px;\n}\n\n#confidenceInput {\n  min-width: 70px !important;\n}\n\n.condition-input {\n  max-width: 80px;\n}\n\n.facility-condition {\n  margin-left: 45px;\n  gap: 10px;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n}\n\n#longTermInput {\n  min-width: 70px;\n}\n\n#objectiveButton {\n  max-width: 290px !important;\n}\n\n#objectiveButton::before,\n#carDevButton::before,\n#operationButton::before,\n#staffButton::before,\n#engineButton::before {\n  z-index: 0 !important;\n}\n\n.pit-crew-details .one-stat-panel {\n  width: 33%;\n  margin: 5px 0;\n  /* background-color: transparent;\n  box-shadow: none; */\n}\n\n.pit-crew-details .one-stat-panel input {\n  font-size: 14px;\n  padding: 5px 0;\n  width: 51px;\n  text-align: center;\n}\n\n.component-title {\n  font-size: 20px;\n  color: var(--text-secondary);\n}\n\n.first-component,\n.second-component {\n  display: flex;\n  flex-direction: column;\n  justify-content: flex-start;\n  gap: 3px;\n}\n\n.first-component{\n  width: 35%;\n}\n\n.second-component{\n  flex-grow: 1;\n}\n\n#editorPill {\n  width: 81px;\n}\n\n#gamePill {\n  width: 78px;\n}\n\n\n\n.q-label {\n  background-color: red;\n  color: var(--white-general);\n  border-radius: 5px;\n  padding: 3px;\n}\n\n.component-subtitle {\n  font-size: 20px;\n  color: var(--text-secondary);\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: center;\n}\n\n.logo-margin-top {\n  margin-top: 2px;\n\n}\n\n.redbulllogo,\n#rblogo {\n  width: 40px;\n  height: 40px;\n  padding: 8px 0;\n}\n\n.ferrarilogo,\n#felogo {\n  width: 40px;\n  height: 40px;\n  padding: 5px;\n}\n\n.porschelogo {\n  width: 40px;\n  height: 40px;\n  padding: 5px;\n}\n\n.andrettilogo {\n  width: 100%;\n  height: 100%;\n  padding: 6px 4px;\n}\n\n.merclogo,\n#melogo {\n  width: 40px;\n  height: 40px;\n  padding-bottom: 7px;\n  padding-top: 5px;\n  padding-left: 5px;\n  padding-right: 4px;\n}\n\n.merclogo2 {\n  width: 40px;\n  height: 40px;\n  padding: 5px;\n}\n\n.renaultlogo,\n#relogo {\n  width: 100%;\n  height: 100%;\n  padding-bottom: 7px;\n  padding-top: 5px;\n  padding-left: 3px;\n  padding-right: 2px;\n}\n\n#teamContractMenu .alpine-logo-container {\n  width: 50px;\n}\n\n#teamContractMenu .alphatauri-logo-container {\n  width: 50px;\n  padding: 4px;\n}\n\n#teamMenu .alphatauri-logo-container:has(.alphataurilogo) {\n  width: 50px;\n  height: 40px;\n  padding: 0px 0px 0px 6px;\n}\n\n.alphatauri-logo-container:has(.alphataurilogo) {\n  width: 40px;\n  height: 40px;\n  padding: 8px 4px;\n}\n\n#teamMenu .alphatauri-logo-container:has(.visarblogo) {\n  width: 50px;\n  height: 40px;\n  padding: 0px 4px 0px 6px;\n}\n\n.alphatauri-logo-container:has(.visarblogo) {\n  width: 40px;\n  height: 40px;\n  padding: 0px 2px;\n}\n\n.alphatauri-logo-container:has(.brawnlogo) {\n  width: 40px;\n  height: 40px;\n  padding-left: 4px;\n}\n\n#teamMenu .alphatauri-logo-container:has(.hugologo) {\n  width: 50px;\n  height: 40px;\n  padding: 5px 0px 5px 2px;\n}\n\n.alphatauri-logo-container:has(.hugologo) {\n  width: 40px;\n  height: 40px;\n  padding: 5px 0px;\n}\n\n#teamMenu .alpine-logo-container:has(.alpinelogo) {\n  width: 50px;\n  height: 40px;\n  padding: 8px 2px 9px 7px;\n}\n\n.alpine-logo-container:has(.alpinelogo) {\n  width: 40px;\n  height: 40px;\n  padding: 8px 2px 9px 2px;\n}\n\n#teamMenu .alpine-logo-container:has(.andrettilogo) {\n  width: 50px;\n  height: 40px;\n  padding: 6px 2px 6px 7px;\n}\n\n.alpine-logo-container:has(.andrettilogo) {\n  width: 40px;\n  height: 40px;\n  padding: 6px 4px;\n}\n\n#teamMenu .alpine-logo-container:has(.renaultlogo) {\n  width: 50px;\n  height: 40px;\n  padding: 5px 0px 7px 5px;\n}\n\n.alpine-logo-container:has(.renaultlogo) {\n  width: 40px;\n  height: 40px;\n  padding: 5px 2px 7px 3px;\n}\n\n#teamMenu .alpine-logo-container:has(.lotuslogo) {\n  width: 50px;\n  height: 40px;\n  padding: 1px 0px 1px 5px;\n}\n\n.alpine-logo-container:has(.lotuslogo) {\n  width: 40px;\n  height: 40px;\n  padding: 1px 0px;\n}\n\n.alpinelogo,\n#allogo {\n  width: 100%;\n  height: 100%;\n  padding-bottom: 9px;\n  padding-top: 8px;\n  padding-left: 2px;\n  padding-right: 2px;\n  transition: opacity 0.15s;\n}\n\n.alpinelogo {\n  -webkit-mask: url('/assets/images/logos/alpine.svg') no-repeat center;\n  mask: url('/assets/images/logos/alpine.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--logos-general);\n}\n\n.renaultlogo {\n  -webkit-mask: url('/assets/images/logos/renault.svg') no-repeat center;\n  mask: url('/assets/images/logos/renault.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--logos-general);\n}\n\n.andrettilogo {\n  -webkit-mask: url('/assets/images/logos/andretti.svg') no-repeat center;\n  mask: url('/assets/images/logos/andretti.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--logos-general);\n}\n\n.lotuslogo {\n  -webkit-mask: url('/assets/images/logos/lotus.svg') no-repeat center;\n  mask: url('/assets/images/logos/lotus.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--logos-general);\n}\n\n.mclarenlogo,\n#mclogo {\n  width: 40px;\n  height: 40px;\n  padding: 2px;\n  -webkit-mask: url('/assets/images/logos/mclaren.svg') no-repeat center;\n  mask: url('/assets/images/logos/mclaren.svg') no-repeat center;\n  -webkit-mask-size: 90%;\n  background-color: var(--mclaren-primary);\n  transition: opacity 0.15s;\n  mask-size: 90%;\n}\n\n.alfalogo,\n#aflogo {\n  width: 40px;\n  height: 40px;\n  padding: 3px;\n}\n\n.team-menu-logo .astonlogo, .team-menu-logo .redbulllogo, .team-menu-logo .mclarenlogo {\n  width: 50px;\n}\n\n.astonlogo,\n#aslogo {\n  width: 40px;\n  height: 40px;\n  padding-bottom: 5px;\n  padding-left: 1px;\n  padding-top: 5px;\n}\n\n.fordlogo,\n.jordanlogo,\n.cadillaclogo {\n  width: 40px;\n  height: 40px;\n  padding: 6px 2px;\n}\n\n.racingpointlogo{\n  width: 40px;\n  height: 40px;\n  padding: 5px;\n}\n\n.brawnlogo {\n  width: 100% !important;\n  height: 100% !important;\n  padding: 16px 0px;\n  padding-left: 4px;\n}\n\n.brawnlogo {\n  -webkit-mask: url('/assets/images/logos/brawn.svg') no-repeat center;\n  mask: url('/assets/images/logos/brawn.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--text-general);\n}\n\n.audilogo {\n  width: 40px;\n  height: 40px;\n  padding: 12px 2px;\n}\n\n.team-menu-logo .audilogo {\n  width: 50px;\n}\n\n.sauberlogo {\n  width: 40px;\n  height: 31px;\n  padding: 6px 5px;\n}\n\n.sauberlogo {\n  -webkit-mask: url('/assets/images/logos/sauber.svg') no-repeat center;\n  mask: url('/assets/images/logos/sauber.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--sauber-primary);\n}\n\n.hugologo {\n  width: 100% !important;\n  height: 100% !important;\n  padding: 5px 0;\n}\n\n.hugologo {\n  -webkit-mask: url('/assets/images/logos/hugoboss.svg') no-repeat center;\n  mask: url('/assets/images/logos/hugoboss.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--text-general);\n}\n\n.visarblogo {\n  width: 100% !important;\n  height: 100% !important;\n  padding: 5px 2px;\n}\n\n.visarblogo {\n  -webkit-mask: url('/assets/images/logos/visarb.svg') no-repeat center;\n  mask: url('/assets/images/logos/visarb.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--text-general);\n}\n\n.team-menu-logo .visarblogo {\n  width: 46px;\n}\n\n.toyotalogo {\n  width: 40px;\n  height: 40px;\n  padding: 7px 2px;\n}\n\n.toyotalogo {\n  -webkit-mask: url('/assets/images/logos/toyota.svg') no-repeat center;\n  mask: url('/assets/images/logos/toyota.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: #EB0A1B; /* toyota primary color, different from their background gray color */\n}\n\n.haaslogo,\n#halogo {\n  width: 40px;\n  height: 40px;\n  padding-bottom: 6px;\n  padding-top: 4px;\n  padding-left: 3px;\n  padding-right: 2px;\n}\n\n.customlogo {\n  width: 40px;\n  height: 40px;\n}\n\n.lotuslogo {\n  width: 100%;\n  height: 100%;\n  padding: 1px 0px;\n}\n\n.alphataurilogo,\n#atlogo {\n  width: 100% !important;\n  height: 100% !important;\n  padding: 12px 4px;\n}\n\n.alphataurilogo {\n  -webkit-mask: url('/assets/images/logos/alphatauri.svg') no-repeat center;\n  mask: url('/assets/images/logos/alphatauri.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--logos-general);\n}\n\n.williamslogo,\n.bmwlogo,\n#wilogo {\n  width: 40px;\n  height: 40px;\n  padding-bottom: 9px;\n  padding-left: 6px;\n  padding-top: 8px;\n  padding-right: 6px;\n  transition: opacity 0.15s;\n}\n\n.team-menu-williams-replace.williamslogo{\n  width: 100%;\n  height: 100%;\n  padding: 0;\n}\n\n.williamslogo {\n  -webkit-mask: url('/assets/images/logos/Williams_2026_logo.svg') no-repeat center;\n  mask: url('/assets/images/logos/Williams_2026_logo.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--logos-general);\n}\n\n.bmwlogo {\n  padding: 1px;\n}\n\n.team1,\n.team2 {\n  max-width: 150px;\n  text-align: center;\n  position: relative;\n  min-height: 48px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  overflow: hidden;\n  padding: 0 4px;\n}\n\n.driver1-name .team1,\n.driver2-name .team2 {\n  color: var(--text-general) !important;\n  transition: color 0.15s;\n}\n\n.team-h2h-name-bg {\n  position: absolute;\n  left: 50%;\n  top: 50%;\n  transform: translate(-50%, -50%);\n  color: color-mix(in srgb, var(--text-general) 75%, transparent);\n  opacity: 0.5;\n  white-space: nowrap;\n  pointer-events: none;\n  letter-spacing: 1.2px;\n  font-size: 26px;\n  text-transform: uppercase;\n  max-width: 100%;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n.team-h2h-logo {\n  width: 40px;\n  height: 40px;\n  position: relative;\n  z-index: 1;\n}\n\n\n#redbull,\n.rbborder-down:hover {\n  border-bottom: 2px solid var(--redbull-primary) !important;\n}\n\n.rbborder-top {\n  border-top: 3px solid var(--redbull-primary) !important;\n}\n\n.rbborder::after {\n  content: '';\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 2px;\n  background-color: var(--redbull-primary);\n  border-bottom-left-radius: 10px;\n  border-bottom-right-radius: 10px;\n}\n\n\n.rbactivated {\n  background-color: var(--redbull-primary);\n}\n\n#ferrari,\n.feborder-down:hover {\n  border-bottom: 2px solid var(--ferrari-primary) !important;\n}\n\n.feborder-top {\n  border-top: 3px solid var(--ferrari-primary) !important;\n}\n\n.feborder::after {\n  content: '';\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 2px;\n  background-color: var(--ferrari-primary);\n  border-bottom-left-radius: 10px;\n  border-bottom-right-radius: 10px;\n}\n\n.feactivated {\n  background-color: var(--ferrari-primary);\n}\n\n#merc,\n.meborder-down:hover {\n  border-bottom: 2px solid var(--mercedes-primary) !important;\n}\n\n.meborder-top {\n  border-top: 3px solid var(--mercedes-primary) !important;\n}\n\n.meborder::after {\n  content: '';\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 2px;\n  background-color: var(--mercedes-primary);\n  border-bottom-left-radius: 10px;\n  border-bottom-right-radius: 10px;\n}\n\n.meactivated {\n  background-color: var(--mercedes-primary);\n}\n\n#mclaren,\n.mcborder-down:hover {\n  border-bottom: 2px solid var(--mclaren-primary) !important;\n}\n\n.mcborder-top {\n  border-top: 3px solid var(--mclaren-primary) !important;\n}\n\n.mcborder::after {\n  content: '';\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 2px;\n  background-color: var(--mclaren-primary);\n  border-bottom-left-radius: 10px;\n  border-bottom-right-radius: 10px;\n}\n\n.mcactivated {\n  background-color: var(--mclaren-primary);\n}\n\n\n#alpine,\n.alborder-down:hover {\n  border-bottom: 2px solid var(--alpine-primary) !important\n}\n\n.alborder-top {\n  border-top: 3px solid var(--alpine-primary) !important\n}\n\n.alborder-down-noC:hover {\n  border-bottom: 2px solid #2293D1 !important\n}\n\n.alborder::after {\n  content: '';\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 2px;\n  background-color: var(--alpine-primary);\n  border-bottom-left-radius: 10px;\n  border-bottom-right-radius: 10px;\n}\n\n.andrettiborder-down:hover {\n  border-bottom: 2px solid var(--andretti-primary) !important\n}\n\n.renaultborder-down:hover {\n  border-bottom: 2px solid var(--renault-primary) !important\n}\n\n.lotusborder-down:hover {\n  border-bottom: 2px solid var(--lotus-primary) !important\n}\n\n\n.alactivated {\n  background-color: var(--alpine-primary);\n}\n\n#alfaromeo,\n.afborder-down:hover {\n  border-bottom: 2px solid var(--alfa-primary) !important\n}\n\n.afborder-top {\n  border-top: 3px solid var(--alfa-primary) !important\n}\n\n.afborder-down-noC:hover {\n  border-bottom: 2px solid #C92D4B !important\n}\n\n.afborder::after {\n  content: '';\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 2px;\n  background-color: var(--alfa-primary);\n  border-bottom-left-radius: 10px;\n  border-bottom-right-radius: 10px;\n}\n\n\n.afactivated {\n  background-color: var(--alfa-primary);\n}\n\n#astonmartin,\n.asborder-down:hover {\n  border-bottom: 2px solid var(--aston-primary) !important\n}\n\n.asborder-top {\n  border-top: 3px solid var(--aston-primary) !important\n}\n\n.asactivated {\n  background-color: var(--aston-primary);\n}\n\n.asborder::after {\n  content: '';\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 2px;\n  background-color: var(--aston-primary);\n  border-bottom-left-radius: 10px;\n  border-bottom-right-radius: 10px;\n}\n\n#alphatauri,\n.atborder-down:hover,\n.hugoborder-down:hover {\n  border-bottom: 2px solid var(--alphatauri-primary) !important\n}\n\n.atborder-top {\n  border-top: 3px solid var(--alphatauri-primary) !important\n}\n\n.atborder-down-noC:hover {\n  border-bottom: 2px solid #5E8FAA !important\n}\n\n.hugoborder-down:hover {\n  border-bottom: 2px solid var(--hugo-primary) !important\n}\n\n.visarbborder-down:hover {\n  border-bottom: 2px solid var(--visarb-primary) !important\n}\n\n\n.toyotaborder-down:hover {\n  border-bottom: 2px solid var(--toyota-primary) !important\n}\n\n.porscheborder-down:hover {\n  border-bottom: 2px solid var(--porsche-primary) !important\n}\n\n.brawnborder-down:hover {\n  border-bottom: 2px solid var(--brawn-primary) !important\n}\n\n.stakeborder-down:hover {\n  border-bottom: 2px solid var(--stake-primary) !important\n}\n\n.audiborder-down:hover {\n  border-bottom: 2px solid var(--audi-primary) !important\n}\n\n.sauberborder-down:hover {\n  border-bottom: 2px solid var(--sauber-primary) !important\n}\n\n.atactivated {\n  background-color: var(--alphatauri-primary);\n}\n\n.atborder::after {\n  content: '';\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 2px;\n  background-color: var(--alphatauri-primary);\n  border-bottom-left-radius: 10px;\n  border-bottom-right-radius: 10px;\n}\n\n#williams,\n.wiborder-down:hover {\n  border-bottom: 2px solid var(--williams-primary) !important\n}\n\n.wiborder-top {\n  border-top: 3px solid var(--williams-primary) !important\n}\n\n.wiborder::after {\n  content: '';\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 2px;\n  background-color: var(--williams-primary);\n  border-bottom-left-radius: 10px;\n  border-bottom-right-radius: 10px;\n}\n\n\n.wiactivated {\n  background-color: var(--williams-primary);\n}\n\n#haas,\n.haborder-down:hover {\n  border-bottom: 2px solid var(--haas-primary) !important\n}\n\n.haborder-top {\n  border-top: 3px solid var(--haas-primary) !important\n}\n\n.haborder::after {\n  content: '';\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 2px;\n  background-color: var(--haas-primary);\n  border-bottom-left-radius: 10px;\n  border-bottom-right-radius: 10px;\n}\n\n.haactivated {\n  background-color: var(--haas-primary);\n}\n\n#ctstom,\n.ctborder-down:hover {\n  border-bottom: 2px solid var(--custom-team-primary) !important\n}\n\n.ctborder-top {\n  border-top: 3px solid var(--custom-team-primary) !important\n}\n\n.ctborder::after {\n  content: '';\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 2px;\n  background-color: var(--custom-team-primary);\n  border-bottom-left-radius: 10px;\n  border-bottom-right-radius: 10px;\n}\n\n.ctactivated {\n  background-color: var(--custom-team-primary);\n}\n\n.rbfont {\n  color: var(--redbull-primary);\n}\n\n.fefont {\n  color: var(--ferrari-primary);\n}\n\n.mefont {\n  color: var(--mercedes-primary);\n}\n\n.mcfont {\n  color: var(--mclaren-primary);\n}\n\n.alfont {\n  color: var(--alpine-primary);\n}\n\n.affont {\n  color: var(--alfa-primary);\n}\n\n.asfont {\n  color: var(--aston-primary);\n}\n\n.atfont {\n  color: var(--alphatauri-primary);\n}\n\n.wifont {\n  color: var(--williams-primary);\n}\n\n.hafont {\n  color: var(--haas-primary);\n}\n\n.ctfont {\n  color: var(--custom-team-primary);\n}\n\n.rbbar-primary {\n  background-color: var(--redbull-primary);\n}\n\n.rbbar-secondary {\n  background-color: var(--redbull-secondary);\n}\n\n.febar-primary {\n  background-color: var(--ferrari-primary);\n}\n\n.febar-secondary {\n  background-color: var(--general-secondary);\n}\n\n.mebar-primary {\n  background-color: var(--mercedes-primary);\n}\n\n.mebar-secondary {\n  background-color: var(--general-secondary);\n}\n\n.mcbar-primary {\n  background-color: var(--mclaren-primary);\n}\n\n.mcbar-secondary {\n  background-color: var(--mclaren-secondary);\n}\n\n.albar-primary {\n  background-color: var(--alpine-primary);\n}\n\n.albar-secondary {\n  background-color: var(--alpine-secondary);\n}\n\n.afbar-primary {\n  background-color: var(--alfa-primary);\n}\n\n.afbar-secondary {\n  background-color: var(--alfa-secondary);\n}\n\n.asbar-primary {\n  background-color: var(--aston-primary);\n}\n\n.asbar-secondary {\n  background-color: var(--aston-secondary);\n}\n\n.atbar-primary {\n  background-color: var(--alphatauri-primary);\n}\n\n.atbar-secondary {\n  background-color: var(--alphatauri-secondary);\n}\n\n.wibar-primary {\n  background-color: var(--williams-primary);\n}\n\n.wibar-secondary {\n  background-color: var(--general-secondary);\n}\n\n.habar-primary {\n  background-color: var(--haas-primary);\n}\n\n.habar-secondary {\n  background-color: var(--haas-secondary);\n}\n\n.ctbar-primary {\n  background-color: var(--custom-team-primary);\n}\n\n.ctbar-secondary {\n  background-color: var(--custom-team-secondary);\n}\n\n.rbborder-primary {\n  border: 2px solid var(--redbull-primary);\n}\n\n.rbborder-secondary {\n  border: 2px solid var(--redbull-secondary);\n}\n\n.feborder-primary {\n  border: 2px solid var(--ferrari-primary);\n}\n\n.feborder-secondary {\n  border: 2px solid var(--general-secondary);\n}\n\n.meborder-primary {\n  border: 2px solid var(--mercedes-primary);\n}\n\n.meborder-secondary {\n  border: 2px solid var(--general-secondary);\n}\n\n.mcborder-primary {\n  border: 2px solid var(--mclaren-primary);\n}\n\n.mcborder-secondary {\n  border: 2px solid var(--mclaren-secondary);\n}\n\n.alborder-primary {\n  border: 2px solid var(--alpine-primary);\n}\n\n.alborder-secondary {\n  border: 2px solid var(--alpine-secondary);\n}\n\n.afborder-primary {\n  border: 2px solid var(--alfa-primary);\n}\n\n.afborder-secondary {\n  border: 2px solid var(--alfa-secondary);\n}\n\n.asborder-primary {\n  border: 2px solid var(--aston-primary);\n}\n\n.asborder-secondary {\n  border: 2px solid var(--aston-secondary);\n}\n\n.atborder-primary {\n  border: 2px solid var(--alphatauri-primary);\n}\n\n.atborder-secondary {\n  border: 2px solid var(--alphatauri-secondary);\n}\n\n.wiborder-primary {\n  border: 2px solid var(--williams-primary);\n}\n\n.wiborder-secondary {\n  border: 2px solid var(--general-secondary);\n}\n\n.haborder-primary {\n  border: 2px solid var(--haas-primary);\n}\n\n.haborder-secondary {\n  border: 2px solid var(--haas-secondary);\n}\n\n.ctborder-primary {\n  border: 2px solid var(--custom-team-primary);\n}\n\n.ctborder-secondary {\n  border: 2px solid var(--custom-team-secondary);\n}\n\n.predict-warning {\n  font-size: 14px;\n}\n\n\n.drivers-section,\n.staff-section {\n  display: flex;\n  overflow: hidden;\n  width: 100%;\n  align-items: center;\n}\n\n\n.driver-template {\n  width: calc(50% - 5px);\n  padding: 10px;\n  background-color: rgba(255, 255, 255, 0.1);\n  border-radius: 5px;\n}\n\n.game-changes {\n  display: flex;\n  flex-direction: column;\n  gap: 25px;\n}\n\n/**\ngrid of 11 columns and one row\n*/\n.managing-team-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(50px, 1fr));\n  gap: 10px;\n  width: 100%;\n  height: 100%;\n  margin-top: 5px;\n}\n\n.team-logo-container {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  background-color: var(--elements);\n  border-radius: 5px;\n  border: 2px solid var(--modal-text);\n  transition: background-color 0.15s, border-color 0.15s;\n  cursor: pointer;\n}\n\n.team-logo-container.fe:hover,\n.team-logo-container.fe.active {\n  background-color: var(--ferrari-primary-transparent);\n  border-color: var(--ferrari-primary);\n}\n\n.team-logo-container.rb:hover,\n.team-logo-container.rb.active {\n  background-color: var(--redbull-primary-transparent);\n  border-color: var(--redbull-primary);\n}\n\n.team-logo-container.me:hover,\n.team-logo-container.me.active {\n  background-color: var(--mercedes-primary-transparent);\n  border-color: var(--mercedes-primary);\n}\n\n.team-logo-container.mc:hover,\n.team-logo-container.mc.active {\n  background-color: var(--mclaren-primary-transparent);\n  border-color: var(--mclaren-primary);\n}\n\n.team-logo-container.al:hover,\n.team-logo-container.al.active {\n  background-color: var(--alpine-primary-transparent);\n  border-color: var(--alpine-primary);\n}\n\n.team-logo-container.af:hover,\n.team-logo-container.af.active {\n  background-color: var(--alfa-primary-transparent);\n  border-color: var(--alfa-primary);\n}\n\n.team-logo-container.as:hover,\n.team-logo-container.as.active {\n  background-color: var(--aston-primary-transparent);\n  border-color: var(--aston-primary);\n}\n\n.team-logo-container.at:hover,\n.team-logo-container.at.active {\n  background-color: var(--alphatauri-primary-transparent);\n  border-color: var(--alphatauri-primary);\n}\n\n.team-logo-container.wi:hover,\n.team-logo-container.wi.active {\n  background-color: var(--williams-primary-transparent);\n  border-color: var(--williams-primary);\n}\n\n.team-logo-container.ha:hover,\n.team-logo-container.ha.active {\n  background-color: var(--haas-primary-transparent);\n  border-color: var(--haas-primary);\n}\n\n\n.team-logo-container.ct:hover,\n.team-logo-container.ct.active {\n  background-color: var(--custom-team-primary-transparent);\n  border-color: var(--custom-team-primary);\n}\n\n.team-logo-container:active {\n  transform: scale(0.96);\n}\n\n\n.team-logo-container,\n.team-logo-container img,\n.team-logo-container img.alfalogo {\n  max-width: 50px;\n  max-height: 50px;\n  width: auto;\n  height: auto;\n}\n\n.team-logo-container img {\n  padding: 10px;\n}\n\n.team-logo-container.rb img {\n  padding: 0px 2px;\n}\n\n.team-logo-container.as img {\n  padding: 4px;\n}\n\nbody:has(#mentalitySpan.frozen) #driverMentalityAttributes {\n  display: none;\n  pointer-events: none;\n}\n\n.mentality-difficulty {\n  display: flex;\n  flex-direction: row;\n}\n\n.mentality-changes {\n  display: flex;\n  flex-direction: column;\n  gap: 5px;\n  border-right: 2px solid var(--separator);\n  width: 50%;\n}\n\n\n\n#customGearButton {\n  margin-left: 5px;\n  transition: transform 0.15s ease, color 0.15s;\n  cursor: pointer;\n  display: inline-block;\n}\n\n#customGearButton:hover {\n  color: var(--text-selected);\n}\n\n#customGearButton.custom {\n  color: var(--new-primary);\n  transform: rotate(45deg);\n\n}\n\n.difficulty-changes {\n  display: flex;\n  flex-direction: column;\n  gap: 5px;\n  padding-left: 10px;\n  width: 50%;\n}\n\n.mentality-selector {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 10px;\n}\n\n.mentality-selector .form-switch {\n  padding-right: 0px;\n}\n\n.modal-text {\n  color: var(--modal-text);\n}\n\ninput[type=\"range\"] {\n  width: 100%;\n  outline: none;\n}\n\ninput[type=\"range\"]:focus,\ninput[type=\"range\"]:focus-visible {\n  outline: none;\n  box-shadow: none;\n}\n\ndatalist {\n  display: flex;\n  justify-content: space-between;\n  width: 100%;\n  padding: 0;\n  margin-top: -27px;\n  pointer-events: none;\n}\n\ndatalist .my-mark {\n  border-right: 2px solid var(--separator);\n  height: 10px;\n  width: 2px;\n}\n\n.slider-and-label{\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 10px;\n  width: 400px;\n}\n\n#turningPointsFrequencyLabel{\n  width: 160px;\n}\n\ninput[type=\"range\"]::-webkit-slider-thumb {\n  background-color: var(--new-primary-dark);\n  z-index: 2;\n  box-shadow: none;\n}\n\ninput[type=\"range\"]:focus::-webkit-slider-thumb,\ninput[type=\"range\"]:focus-visible::-webkit-slider-thumb {\n  box-shadow: none;\n}\n\ninput[type=\"range\"]::-webkit-slider-thumb:active {\n  background-color: var(--new-primary-dark);\n  box-shadow: none;\n}\n\ninput[type=\"range\"]::-webkit-slider-thumb:hover {\n  outline: 1px solid var(--new-primary);\n  transform: scale(1.05);\n}\n\ninput[type=\"range\"]::-webkit-slider-runnable-track {\n  background-color: var(--text-selected);\n}\n\ninput[type=\"range\"]::-moz-range-thumb {\n  background-color: var(--new-primary-dark);\n  border: none;\n  box-shadow: none;\n}\n\ninput[type=\"range\"]::-moz-range-thumb:active {\n  background-color: var(--new-primary-dark);\n  box-shadow: none;\n}\n\ninput[type=\"range\"]::-moz-range-track {\n  background-color: var(--text-selected);\n}\n\n.option-state {\n  padding-left: 5px;\n  transition: color 0.15s;\n}\n\n#turningPointsFrequencyLabel.tp-default {\n  color: var(--modal-text);\n}\n\n#turningPointsFrequencyLabel.tp-less {\n  color: var(--new-secondary);\n}\n\n#turningPointsFrequencyLabel.tp-more {\n  color: var(--new-primary);\n}\n\n.dif-warning {\n  cursor: pointer;\n}\n\n.dif-warning:hover {\n  transform: translateY(-1px);\n  filter: brightness(1.2);\n}\n\n.dif-warning::selection {\n  background-color: transparent;\n}\n\n.option-state.default,\n.dif-warning.default {\n  color: var(--new-secondary);\n}\n\nbody.og-theme .option-state.default,\nbody.og-theme .dif-warning.default {\n  color: var(--new-primary);\n}\n\nbody.og-theme .option-state.fixed {\n  color: var(--new-secondary);\n}\n\n.option-state.frozen,\n.dif-warning.frozen {\n  color: var(--frozen)\n}\n\n.option-state.extra-hard,\nspan.extra-hard,\n.dif-warning.extra-hard,\n.dif-status.extra-hard {\n  color: var(--extra-hard)\n}\n\n.option-state.brutal,\nspan.brutal,\n.dif-warning.brutal,\n.dif-status.brutal {\n  color: var(--brutal)\n}\n\n.option-state.unfair,\nspan.unfair,\n.dif-warning.unfair,\n.dif-status.unfair {\n  color: var(--unfair)\n}\n\n.option-state.insane,\nspan.insane,\n.dif-warning.insane,\n.dif-status.insane {\n  color: var(--insane)\n}\n\n.option-state.impossible,\nspan.impossible,\n.dif-warning.impossible,\n.dif-status.impossible {\n  color: var(--impossible)\n}\n\n.option-state.fixed,\nspan.fixed,\n.dif-warning.fixed,\n#lightDif.impossible,\n#lightDif~.dif-status.impossible {\n  color: var(--new-primary) !important;\n}\n\n.option-state.reduced-weight,\nspan.reduced-weight,\n.dif-warning.reduced-weight {\n  color: var(--new-primary)\n}\n\n.option-state.custom {\n  color: var(--text-general);\n}\n\n#refurbishTitle {\n  padding-top: 10px;\n  border-top: 2px solid var(--separator);\n  margin-right: 32px;\n}\n\n.difficulty-warnings {\n  font-size: 12px;\n  display: flex;\n  flex-wrap: wrap;\n  margin-top: -7px;\n  gap: 2px 7px;\n  height: 58px;\n  align-content: flex-start;\n}\n\n\n\n.dif-warning:not(.default) {\n  cursor: pointer;\n  transition: color 0.15s, opacity 0.1s, transform 0.15s, filter 0.15s;\n}\n\n.dif-warning.disabled,\n#lightDif.disabled {\n  text-decoration: line-through;\n  color: var(--text-general);\n  opacity: 0.63;\n}\n\n.modal-warning {\n  background-color: var(--modal-warning);\n  color: var(--modal-warning-text);\n  border-radius: 10px;\n  padding: 5px;\n}\n\n.name-and-arrows {\n  display: flex;\n  flex-direction: row-reverse;\n  align-items: center;\n}\n\n.part-performance-title .arrows {\n  display: flex;\n  flex-direction: row-reverse;\n  align-items: center;\n  gap: 3px;\n}\n\n.part-performance-title .arrows i {\n  font-size: 14px;\n}\n\n#blockDiv {\n  opacity: 1;\n  transition: all 0.15s;\n}\n\n#blockDiv.disappear {\n  opacity: 0;\n  pointer-events: none;\n}\n\n@keyframes fadeOut {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n  }\n}\n\n.splash-box {\n  background-color: var(--superficials);\n  border-radius: 20px;\n  padding: 20px 30px;\n  min-width: 80%;\n  min-height: 60%;\n  display: flex;\n  flex-direction: column;\n  gap: 20px;\n  box-shadow: var(--shadow-m);\n  opacity: 0;\n  transform: translateY(50px);\n  z-index: 2;\n}\n\nbody:has(#blockDiv:not(.disappear)) .footer .socials {\n  opacity: 0;\n}\n\nbody:has(#blockDiv:not(.disappear)){\n  overflow: hidden;\n}\n\n.socials-box {\n  background-color: var(--superficials);\n  border-radius: 20px;\n  padding: 15px 10px;\n  min-width: 80%;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 20px;\n  box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px;\n  opacity: 0;\n  transform: translateY(50px);\n  justify-content: space-around;\n}\n\n.socials-box a {\n  color: var(--text);\n  font-size: 22px;\n  text-decoration: none;\n  transition: color 0.15s;\n}\n\n@keyframes fadeIn {\n  0% {\n    opacity: 0;\n    transform: translateY(50px);\n  }\n\n  100% {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n@keyframes fadeAppearLeft {\n  0% {\n    opacity: 0;\n    transform: translateX(-10px);\n  }\n\n  100% {\n    opacity: 1;\n    transform: translateX(0);\n  }\n}\n\n@keyframes fadeInHigher {\n  0% {\n    opacity: 0;\n    transform: translateY(20px);\n  }\n\n  100% {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n.drop-area {\n  width: 100%;\n  height: 100%;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  border: 2px dashed var(--disabled-text);\n  border-radius: 20px;\n  display: flex;\n  flex-direction: column;\n  transition: all 0.15s;\n}\n\n.list-item {\n  display: flex;\n  flex-direction: row;\n  font-size: 20px;\n}\n\n.list-item:has(.completed) .number-icon span,\n.list-item:not(:has(.completed)) .number-icon i {\n  opacity: 0;\n  rotate: 90deg;\n}\n\n.list-item:has(.completed) .number-icon i,\n.list-item:not(:has(.completed)) .number-icon span {\n  opacity: 1;\n  rotate: 0;\n}\n\n.list-item:has(.completed) .number-icon i {\n  color: var(--positive-general);\n}\n\n.number-icon {\n  position: relative;\n  margin-right: 25px;\n}\n\n.number-icon span,\n.number-icon i {\n  position: absolute;\n  transition: all 0.15s;\n}\n\n.list-text {\n  transition: all 0.15s;\n}\n\n.list-text.completed {\n  color: var(--positive-general);\n}\n\n\n/* \n.icon-hidden{\n  opacity: 0;\n} */\n\n.title-and-spinner {\n  align-self: center;\n}\n\n.main-title {\n  font-size: 52px;\n  line-height: 1;\n}\n\n\n.glitch {\n  color: var(--text);\n  font-size: 52px;\n  font-weight: 700;\n  position: relative;\n  margin: 0 auto;\n  text-align: center;\n  line-height: 1;\n}\n\n\n\n\n.glitch::before,\n.glitch::after {\n  content: 'EDITOR';\n  position: absolute;\n  bottom: 5px;\n  left: 0;\n  overflow: hidden;\n  color: var(--text);\n  background-color: var(--background-color);\n\n\n}\n\n\n.glitch::before {\n  left: 2px;\n  text-shadow: 2px 0 var(--new-primary-dark);\n  animation: animate 3s infinite linear;\n  width: 100%;\n}\n\n\n.glitch::after {\n  left: -3px;\n  text-shadow: -3px 0 var(--new-secondary-dark);\n  animation: animate 2s infinite linear;\n  width: 100%;\n}\n\n\n@keyframes animate {\n  0% {\n    clip: rect(32px, 9999px, 29px, 0);\n  }\n\n  4% {\n    clip: rect(32px, 9999px, 29px, 0);\n  }\n\n  5% {\n    clip: rect(28px, 9999px, 20px, 0);\n  }\n\n  6% {\n    clip: rect(28px, 9999px, 20px, 0);\n  }\n\n  10% {\n    clip: rect(21px, 9999px, 23px, 0);\n  }\n\n\n  14% {\n    clip: rect(21px, 9999px, 23px, 0);\n  }\n\n  15% {\n    clip: rect(23px, 9999px, 7px, 0);\n  }\n\n  16% {\n    clip: rect(23px, 9999px, 7px, 0);\n  }\n\n  20% {\n    clip: rect(37px, 9999px, 34px, 0);\n  }\n\n  24% {\n    clip: rect(37px, 9999px, 34px, 0);\n  }\n\n  25% {\n    clip: rect(53px, 9999px, 58px, 0);\n  }\n\n  26% {\n    clip: rect(53px, 9999px, 58px, 0);\n  }\n\n  30% {\n    clip: rect(30px, 9999px, 44px, 0);\n  }\n\n  34% {\n    clip: rect(30px, 9999px, 44px, 0);\n  }\n\n  35% {\n    clip: rect(30px, 9999px, 19px, 0);\n  }\n\n  36% {\n    clip: rect(30px, 9999px, 19px, 0);\n  }\n\n  40% {\n    clip: rect(36px, 9999px, 39px, 0);\n  }\n\n  44% {\n    clip: rect(36px, 9999px, 39px, 0);\n  }\n\n  45% {\n    clip: rect(6px, 9999px, 47px, 0);\n  }\n\n  46% {\n    clip: rect(6px, 9999px, 47px, 0);\n  }\n\n  50% {\n    clip: rect(0px, 9999px, 33px, 0);\n  }\n\n  54% {\n    clip: rect(0px, 9999px, 33px, 0);\n  }\n\n  55% {\n    clip: rect(15px, 9999px, 33px, 0);\n  }\n\n  56% {\n    clip: rect(15px, 9999px, 33px, 0);\n  }\n\n  60% {\n    clip: rect(28px, 9999px, 19px, 0);\n  }\n\n  64% {\n    clip: rect(28px, 9999px, 19px, 0);\n  }\n\n  65% {\n    clip: rect(53px, 9999px, 58px, 0);\n  }\n\n  66% {\n    clip: rect(53px, 9999px, 58px, 0);\n  }\n\n  70% {\n    clip: rect(30px, 9999px, 44px, 0);\n  }\n\n  74% {\n    clip: rect(30px, 9999px, 44px, 0);\n  }\n\n  75% {\n    clip: rect(30px, 9999px, 19px, 0);\n  }\n\n  76% {\n    clip: rect(30px, 9999px, 19px, 0);\n  }\n\n  80% {\n    clip: rect(36px, 9999px, 39px, 0);\n  }\n\n  84% {\n    clip: rect(36px, 9999px, 39px, 0);\n  }\n\n  85% {\n    clip: rect(6px, 9999px, 47px, 0);\n  }\n\n  86% {\n    clip: rect(6px, 9999px, 47px, 0);\n  }\n\n  90% {\n    clip: rect(0px, 9999px, 33px, 0);\n  }\n\n  94% {\n    clip: rect(0px, 9999px, 33px, 0);\n  }\n\n  95% {\n    clip: rect(15px, 9999px, 33px, 0);\n  }\n\n  96% {\n    clip: rect(15px, 9999px, 33px, 0);\n  }\n\n  100% {\n    clip: rect(32px, 9999px, 29px, 0);\n  }\n}\n\n\n\nbody:has(#modpill.active):has(#mods2025View:not(.d-none)) {\n  background-color: transparent !important;\n  background-image: url('../assets/images/modback.png') !important;\n  background-size: cover;\n  background-position: center;\n  background-repeat: no-repeat;\n  filter: none;\n}\n\nbody:has(#modpill.active):has(#mods2025View:not(.d-none)) .version-panel{\n  background-color: #0F1D1D;\n}\n\nbody:has(#modpill.active):has(#mods2026View:not(.d-none)) .footer-notification{\n  opacity: 0;\n}\n\nbody:has(#modpill.active):has(#mods2026View:not(.d-none)) .version-panel{\n  background-color: var(--background);\n}\n\nbody:has(#modpill.active):has(#mods2026View:not(.d-none).illuminated) .version-panel{\n  background-color: #262626;\n}\n\nbody:has(#modpill.active) .tech-grid,\nbody:has(#modpill.active) .glow-spot {\n  display: none;\n}\n\nbody:has(#modpill.active):has(#mods2026View:not(.d-none):not(.illuminated)) {\n  background-color: var(--background) !important;\n  background-image:\n    repeating-linear-gradient(115deg, color-mix(in srgb, gray 9%, transparent) 0 1px, transparent 1px 20px),\n    repeating-linear-gradient(115deg, color-mix(in srgb, gray 8%, transparent) 0 1px, transparent 1px 22px),\n    repeating-linear-gradient(115deg, color-mix(in srgb, gray 9%, transparent) 0 1px, transparent 1px 20px) !important;\n  background-size: cover, cover, cover, 33.333% 100%, 33.333% 100%, 33.333% 100%;\n  background-position: center, center, center, left top, center top, right top;\n  background-repeat: no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat;\n  filter: none;\n  overflow: hidden !important;\n}\n\nbody:has(#modpill.active):has(#mods2026View:not(.d-none)) {\n  background-color: var(--background) !important;\n  background-image:\n    repeating-linear-gradient(115deg, color-mix(in srgb, var(--ferrari-primary) 9%, transparent) 0 1px, transparent 1px 20px),\n    repeating-linear-gradient(115deg, color-mix(in srgb, var(--ferrari-primary) 8%, transparent) 0 1px, transparent 1px 22px),\n    repeating-linear-gradient(115deg, color-mix(in srgb, var(--ferrari-primary) 9%, transparent) 0 1px, transparent 1px 20px) !important;\n  background-size: cover, cover, cover, 33.333% 100%, 33.333% 100%, 33.333% 100%;\n  background-position: center, center, center, left top, center top, right top;\n  background-repeat: no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat;\n  filter: none;\n  overflow: hidden !important;\n}\n\nbody:has(#modpill.active):has(#mods2026View:not(.d-none)) .scroll-wrapper{\n  height: 100%;\n}\n\n.aduo-tp-toggle{\n  position: absolute;\n  right: 0;\n  opacity: 0;\n  top: -35px;\n  padding: 0;\n}\n\n.apply-all-button{\n  position: absolute;\n  left: 0;\n  opacity: 0;\n  top: -40px;\n}\n\n.apply-all-button button{\n  display: flex;\n  align-items: center;\n  gap: 5px;\n}\n\n.apply-all-button button i{\n  opacity: 1 !important;\n  transform: rotate(270deg);\n}\n\n.apply-all-button button span{\n  padding-right: 5px !important;\n}\n\n.button-with-icon.apply-all-2026.applied{\n  background-color: var(--positive-transparent);\n  color: var(--positive-general);\n}\n\nbody:has(#modpill.active) .apply-all-button, body:has(#modpill.active) .aduo-tp-toggle {\n  animation: change-appear 0.6s ease-out forwards;\n  animation-delay: calc(0.8s + var(--order) * 0.1s);\n}\n\n.mod-banner {\n  display: flex;\n  flex-direction: row;\n  gap: 60px;\n  align-items: center;\n  justify-content: center;\n  width: 100%;\n  padding: 60px 0 60px 0;\n  scale: 1.1;\n}\n\n.mod-name img {\n  width: 600px;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  gap: 10px;\n  transform: translateY(-40px);\n  opacity: 0;\n  will-change: opacity, transform, filter;\n}\n\nbody:has(#modpill.active) .mods-year-view:not(.d-none) .mod-name img:not(.title-2026) {\n  animation: logo-appear 0.6s forwards;\n}\n\nbody:has(#modpill.active) .mods-year-view:not(.d-none) .mod-name img.title-2026 {\n  animation: logo-appear-blur 0.75s forwards;\n}\n\n@keyframes logo-appear {\n  0% {\n    opacity: 0;\n    transform: translateY(-40px);\n  }\n\n  100% {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n@keyframes logo-appear-blur {\n  0% {\n    opacity: 0;\n    transform: translateY(10px);\n    filter: blur(12px);\n  }\n\n  100% {\n    opacity: 1;\n    transform: translateY(0);\n    filter: blur(0);\n  }\n}\n\n@media (prefers-reduced-motion: reduce) {\n  body:has(#modpill.active) .mods-year-view:not(.d-none) .mod-name img {\n    animation: none !important;\n    opacity: 1;\n    transform: translateY(0);\n    filter: none;\n  }\n}\n\n.mod-drivers {\n  display: flex;\n  flex-direction: row;\n  align-items: flex-end;\n  position: relative;\n  overflow-x: clip;\n}\n\n.small-rectangle {\n  width: 127px;\n  height: 116px;\n  border-top-left-radius: 10px;\n  border-top-right-radius: 10px;\n  position: relative;\n  opacity: 0;\n  will-change: opacity;\n  transform: translateY(20px);\n  overflow-x: clip;\n}\n\n.small-rectangle img,\n.high-rectangle img {\n  width: 130px;\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  opacity: 0;\n  z-index: 20;\n  transform: translateY(20px);\n}\n\n.high-rectangle {\n  width: 130px;\n  height: 173px;\n  border-top-left-radius: 10px;\n  border-top-right-radius: 10px;\n  position: relative;\n  opacity: 0;\n  overflow-x: clip;\n}\n\n.ver-lines {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 101.5%;\n  height: 100%;\n  background-color: #020988;\n  mask-image: url('../assets/images/ver-lines.svg');\n  mask-size: cover;\n  mask-position: center;\n  mask-repeat: no-repeat;\n  z-index: -1;\n  border-top-left-radius: 10px;\n  border-top-right-radius: 10px;\n}\n\n\n.ant-lines {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 101.5%;\n  height: 100%;\n  mask-image: url('../assets/images/ant-lines.svg');\n  mask-size: cover;\n  mask-position: center;\n  mask-repeat: no-repeat;\n  z-index: -1;\n  opacity: 1;\n  border-top-left-radius: 10px;\n  border-top-right-radius: 10px;\n  background-color: #29e1c6;\n}\n\n.ham-lines {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 101.5%;\n  height: 100%;\n  mask-image: url('../assets/images/ham-lines.svg');\n  mask-size: cover;\n  mask-position: center;\n  mask-repeat: no-repeat;\n  z-index: -1;\n  opacity: 1;\n  border-top-left-radius: 10px;\n  border-top-right-radius: 10px;\n  background-color: #bb0e0f;\n}\n\nbody:has(#modpill.active) .small-rectangle,\nbody:has(#modpill.active) .high-rectangle,\nbody:has(#modpill.active) .small-rectangle img,\nbody:has(#modpill.active) .high-rectangle img {\n  animation: rectangle-appear 0.5s forwards;\n  animation-delay: calc(var(--order) * 0.08s);\n}\n\n@keyframes rectangle-appear {\n  0% {\n    opacity: 0;\n    transform: translateY(20px);\n  }\n\n  100% {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\nbody:has(#modpill.active) .mod-drivers .mv-gradient,\nbody:has(#modpill.active) .mod-drivers .lh-gradient,\nbody:has(#modpill.active) .mod-drivers .ka-gradient {\n  animation: gradient-appear 0.6s forwards;\n  animation-delay: calc(var(--order) * 0.08s);\n}\n\n@keyframes gradient-appear {\n  0% {\n    opacity: 0;\n  }\n\n  100% {\n    opacity: 0.7;\n  }\n}\n\n.ka-rectangle {\n  background: linear-gradient(to top, #41ffdb, #008e7f);\n}\n\n.ka-rectangle img {\n  left: -2px;\n  bottom: -1px;\n}\n\n.lh-rectangle img {\n  left: 1px;\n}\n\n.ka-gradient {\n  content: '';\n  position: absolute;\n  top: -1px;\n  left: 82px;\n  width: 107%;\n  height: 126px;\n  background: radial-gradient(circle at center bottom, #41ffdb 6%, transparent 51%);\n  z-index: -1;\n  opacity: 0;\n}\n\n.lh-gradient {\n  content: '';\n  position: absolute;\n  top: -1px;\n  right: 82px;\n  width: 107%;\n  height: 126px;\n  background: radial-gradient(circle at center bottom, #ff1500 6%, transparent 51%);\n  z-index: -1;\n  opacity: 0;\n}\n\n.mv-gradient {\n  content: '';\n  position: absolute;\n  top: -43px;\n  right: 0%;\n  width: 100%;\n  height: 112px;\n  background: radial-gradient(circle at center bottom, #0014aa 14%, transparent 51%);\n  z-index: -1;\n  opacity: 0;\n}\n\n.mv-rectangle {\n  background: linear-gradient(to top, #0014aa, #06093a);\n}\n\n.lh-rectangle {\n  background: linear-gradient(to top, #ff1500, #530000);\n}\n\n.mod-name {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  transform: translateY(-20px);\n}\n\n.mod-subtitle {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  font-size: 22px;\n  gap: 0.75em;\n  text-transform: uppercase;\n  color: #ffffff;\n  transform: translateY(-20px);\n  white-space: nowrap;\n  margin-top: -20px;\n}\n\n.mod-subtitle-letter {\n  display: inline-block;\n  opacity: 0;\n  text-shadow: none;\n  font-family: 'Formula1Dark';\n  will-change: opacity, text-shadow;\n  padding-top: 3px;\n}\n\n.mod-subtitle-letter.number{\n  font-family: 'NumbersFont';\n}\n\n.mod-subtitle-letter.number + .mod-subtitle-letter.number {\n  margin-left: -0.12em;\n}\n\n.mod-subtitle-space {\n  display: inline-block;\n  width: 0.6ch;\n}\n\nbody:has(#modpill.active) #mods2026View:not(.d-none) .mod-subtitle-letter {\n  animation: mod-subtitle-letter-appear 0.9s forwards;\n  animation-delay: calc(0.15s + (var(--order) * 0.06s));\n}\n\n.mod-creators {\n  display: flex;\n  flex-direction: row;\n  gap: 10px;\n  align-items: center;\n  justify-content: center;\n}\n\n.mod-creators a {\n  text-transform: uppercase;\n  font-size: 14px;\n  color: #dedde6;\n  text-shadow: none;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0;\n  transition: color 0.15s, text-shadow 0.15s;\n  position: relative;\n}\n\n.mod-creators a::before {\n  color: white;\n  text-shadow: 0 0 5px white;\n  opacity: 0;\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  z-index: 2;\n}\n\n.mod-creators a.littleonion::before {\n  content: 'LITTLEONION';\n}\n\n.mod-creators a.bonnex::before {\n  content: 'BONNEX';\n}\n\n.mod-creators a.grzelu::before {\n  content: 'GRZELU';\n}\n\n.mod-creators a.thatgingerdude::before {\n  content: 'THATGINGERDUDE';\n}\n\n.mod-creators a.n4x::before {\n  content: 'N4X';\n}\n\n.mod-creators a.nexus::before {\n  content: 'THEFIR3NEXUS';\n}\n\n.mod-creators a.w1echuz::before {\n  content: 'W1ECHUZ';\n}\n\n.mod-creators a.cody::before {\n  content: 'CMDESIGNS';\n}\n\n.mod-creators a.murillo::before {\n  content: 'PROJECT 212';\n}\n\n.mod-creators a.kevintaddo::before {\n  content: 'KEVINTADDO';\n}\n\n.mod-creators a.lucas::before {\n  content: 'LCSKPMN';\n}\n\n\n.mod-creators a:hover {\n  color: white;\n  text-shadow: 0 0 5px white;\n}\n\n.download-links{\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  justify-content: center;\n  gap: 10px;\n}\n\n.recommended-downloads{\n  transform: translateY(25px);\n  color: var(--text-general);\n  font-size: 17px;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n\n.grid-and-downloads{\n  display: flex;\n  flex-direction: column;\n  /* width: 50%; */\n  min-width: 63%;\n  margin-top: 100px;\n  z-index: 1;\n}\n\n#mods2026View{\n  flex-direction: row;\n  padding: 0 26px;\n  height: 100%;\n  align-items: flex-start;\n}\n\n#mods2026View .changes-grid{\n  grid-template-columns: repeat(3, 1fr);\n}\n\n.mods-2026-blocking{\n  width: 100%;\n  text-align: center;\n  margin-top: unset;\n  margin: auto;\n  padding: 0 7%;\n  transform: translateY(-30px);\n}\n\n.mods-2026-banner{\n  scale: 1;\n  width: 100%;\n  flex-direction: column;\n  padding: 0;\n  height: 100%;\n  z-index: 2;\n}\n\n#mods2026View .one-change{\n  box-shadow: none;\n  transition: box-shadow 0.15s;\n}\n\n#mods2026View.illuminated .one-change{\n  box-shadow: var(--shadow-s);\n}\n\n#mods2026View.illuminated .glow-2026{\n  opacity: 0.2;\n}\n\n#mods2026View.illuminated .driver-and-rectangle,\n#mods2026View.illuminated .mod-subtitle{\n  filter: grayscale(0) !important;\n}\n\n.driver-and-rectangle{\n  scale: 1.7;\n  opacity: 1;\n  transform: translateY(21px);\n  filter: grayscale(1);\n  transition: filter 0.15s;\n}\n\n@keyframes rectangle-2026-appear {\n  0% {\n    opacity: 0;\n    transform: translateY(20px);\n    filter: blur(10px);\n  }\n\n  100% {\n    opacity: 1;\n    transform: translateY(0);\n    filter: blur(0);\n  }\n  \n}\n\n@keyframes driver-appear {\n    0% {\n    opacity: 0;\n    transform: translateX(-50%) translateY(20px);\n    filter: blur(10px);\n  }\n\n  100% {\n    opacity: 1;\n    transform: translateX(-50%) translateY(0);\n    filter: blur(0);\n  }\n}\n\n.rectangle-2026{\n  width: 295px;\n  height: 340px;\n  border-top-left-radius: 40px;\n  border-top-right-radius: 40px;\n  position: relative;\n  opacity: 0;\n  will-change: opacity;\n  /* transform: translateY(20px); */\n  background: linear-gradient(to top, #F43627, #58120d);\n  overflow: clip;\n  animation: rectangle-2026-appear 0.5s forwards;\n}\n\n\n.glow-2026{\n  position: absolute;\n  bottom: 0;\n  left: 80%;\n  transform: translateX(-50%);\n  width: 100%;\n  height: 100%;\n  background: radial-gradient(circle at bottom, white 0%, transparent 48%);\n  z-index: 0;\n  opacity: 0;\n  transition: opacity 0.15s;\n}\n\n.driver-2026{\n  height: 485px;\n  position: absolute;\n  left: 50%;\n  bottom: 0;\n  opacity: 0;\n  transform: translateX(-50%) translateY(0px);\n  /* opacity: 0; */\n  z-index: 20;\n  animation: driver-appear 0.6s forwards 0.2s;\n}\n\n.lines-2026{\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 101.5%;\n  height: 100%;\n  z-index: 15;\n  transform: scaleY(1.7);\n}\n\n.mod-name.title-2026{\n  margin-bottom: 180px;\n  margin-top: -100px;\n  z-index: 22;\n}\n\nimg.title-2026{\n  margin-top: -70px;\n}\n\n.title-2026 .mod-subtitle{\n  background: red;\n  padding: 0 20px;\n  transform: skewX(325deg);\n  margin-top: -35px;\n  font-size: 17px;\n  filter: grayscale(1);\n  animation: mod-subtitle-appear 0.5s forwards;\n  transition: filter 0.15s;\n}\n\n@keyframes mod-subtitle-appear {\n  0% {\n    opacity: 0;\n    filter: blur(5px) grayscale(1);\n    transform: translateY(20px) skewX(325deg);\n  }\n\n  55% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 1;\n    filter: blur(0px) grayscale(1);\n    transform: translateY(0px) skewX(325deg);\n  }\n  \n}\n\n#mods2026View .mod-creators{\n  margin-top: 20px;\n  max-width: 600px;\n  flex-wrap: wrap;\n}\n\n.recommended-downloads-title {\n  --order: 0;\n}\n\n.recommended-downloads a{\n  color: var(--text-general);\n  text-decoration: none;\n}\n\n.recommended-downloads .download-link-text {\n  position: relative;\n  display: inline-block;\n  transition: color 0.15s, text-shadow 0.15s;\n}\n\n.recommended-downloads .download-link-text::before {\n  content: attr(data-glow);\n  text-shadow: 0 0 5px white;\n  opacity: 0;\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  z-index: 2;\n  pointer-events: none;\n  transition: opacity 0.15s;\n}\n\n.recommended-downloads a:hover .download-link-text::before {\n  opacity: 1;\n}\n\nbody:has(#modpill.active) .recommended-downloads .recommended-downloads-title,\nbody:has(#modpill.active) .recommended-downloads .download-link,\nbody:has(#modpill.active) .recommended-downloads .creator-separator {\n  opacity: 0;\n  filter: blur(3px);\n  transform: translateY(-10px);\n  animation: recommended-downloads 0.6s forwards;\n  animation-delay: calc((var(--order) * 0.07s) + 1.9s);\n}\n\nbody:has(#modpill.active) .mod-creators a {\n  animation: creator-appear 0.6s forwards;\n  animation-delay: calc((var(--order) * 0.07s));\n}\n\nbody:has(#modpill.active) .mod-creators a::before {\n  animation: before-appear 0.9s;\n  animation-delay: calc((var(--order) * 0.07s));\n}\n\n\n#season_mods {\n  align-items: center;\n  overflow: hidden;\n  height: 100%;\n}\n\n#modSelectPanel{\n  z-index: 2;\n  height: 49px;\n  align-self: flex-start;\n}\n\n.mods-year-view {\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  margin-top: -49px;\n}\n\n.mods-placeholder {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  gap: 8px;\n  margin-top: 30px;\n  opacity: 0.9;\n}\n\n.mods-2026-banner .mods-placeholder {\n  margin-top: 0;\n}\n\n.mods-placeholder-title {\n  color: #dedde6;\n  font-size: 44px;\n  font-family: 'NumbersFont';\n}\n\n.mods-placeholder-subtitle {\n  color: var(--text-general);\n  font-size: 16px;\n}\n\n.coming-soon {\n  display: flex;\n  flex-direction: column;\n  gap: 10px;\n  opacity: 0;\n  align-items: center;\n}\n\n.coming-soon span {\n  color: #dedde6;\n  font-size: 44px;\n  font-family: 'NumbersFont';\n}\n\nbody:has(#modpill.active) .coming-soon {\n  animation: creator-appear 0.7s forwards;\n  animation-delay: 1.1s;\n}\n\n@keyframes creator-appear {\n  0% {\n    opacity: 0;\n  }\n\n  100% {\n    opacity: 1;\n  }\n}\n\n@keyframes before-appear {\n  0% {\n    opacity: 0;\n  }\n\n  50% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n  }\n}\n\n@keyframes mod-subtitle-letter-appear {\n  0% {\n    opacity: 0;\n    filter: blur(2px);\n    transform: translateX(-7px) skewX(35deg);\n    /* text-shadow: 0 0 10px rgba(255, 255, 255, 0.95); */\n  }\n\n  55% {\n    opacity: 1;\n    /* text-shadow: 0 0 10px rgba(255, 255, 255, 0.95); */\n  }\n\n  100% {\n    opacity: 1;\n    filter: blur(0px);\n    transform: translateX(0) skewX(35deg);\n    /* text-shadow: none; */\n  }\n}\n\n@keyframes recommended-downloads {\n  0% {\n    opacity: 0;\n    filter: blur(3px);\n    transform: translateY(-10px);\n    /* text-shadow: 0 0 10px rgba(255, 255, 255, 0.95); */\n  }\n\n  55% {\n    opacity: 1;\n    /* text-shadow: 0 0 10px rgba(255, 255, 255, 0.95); */\n  }\n\n  100% {\n    opacity: 1;\n    filter: blur(0px);\n    transform: translateY(0);\n    /* text-shadow: none; */\n  }\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .mod-subtitle-letter {\n    opacity: 1;\n    animation: none !important;\n  }\n\n  body:has(#modpill.active) .recommended-downloads .recommended-downloads-title,\n  body:has(#modpill.active) .recommended-downloads .download-link,\n  body:has(#modpill.active) .recommended-downloads .creator-separator {\n    opacity: 1;\n    filter: none;\n    transform: none;\n    animation: none !important;\n  }\n}\n\n@keyframes separator-appear {\n  0% {\n    opacity: 0;\n  }\n\n  50% {\n    opacity: 1;\n    background-color: white;\n    box-shadow: 0 0 5px white;\n  }\n\n  100% {\n    opacity: 1;\n    background-color: var(--text-general);\n    box-shadow: none;\n  }\n}\n\n\n.creator-separator {\n  width: 2px;\n  background-color: var(--text-general);\n  height: 14px;\n  opacity: 0;\n}\n\nbody:has(#modpill.active) .creator-separator {\n  animation: separator-appear 0.6s forwards;\n  animation-delay: calc((var(--order) * 0.07s));\n}\n\n.status-info {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background-color: transparent;\n}\n\n.loader {\n  width: 18px;\n  height: 18px;\n  border: 2px solid var(--modal-text);\n  border-bottom-color: var(--new-primary);\n  border-radius: 50%;\n  display: inline-block;\n  box-sizing: border-box;\n  animation: rotation 1s linear infinite;\n  transition: opacity 0.1s;\n  opacity: 1;\n}\n\n.loader.hidden {\n  opacity: 0;\n}\n\n@keyframes rotation {\n  0% {\n    transform: rotate(0deg);\n  }\n\n  100% {\n    transform: rotate(360deg);\n  }\n}\n\n.footer .bi-exclamation-triangle-fill {\n  color: color-mix(in srgb, var(--negative-general) 60%, var(--generals));\n  transition: all 0.15s;\n  padding: 0px;\n}\n\n.footer .bi-exclamation-triangle-fill:hover {\n  color: color-mix(in srgb, var(--negative-general) 95%, var(--generals));\n}\n\nbody.og-theme footer a.bi-custom-patreon::before {\n  background-color: var(--slight-contrast);\n}\n\na.bi-custom-patreon::before,\ni.bi-custom-patreon::before {\n  content: \"\";\n  display: inline-block;\n  width: 1em;\n  height: 1em;\n  -webkit-mask: url('/assets/images/patreonLogo.svg') no-repeat center;\n  mask: url('/assets/images/patreonLogo.svg') no-repeat center;\n  -webkit-mask-size: contain;\n  mask-size: contain;\n  background-color: var(--text-general);\n  transition: background-color 0.15s;\n}\n\n.footer a.bi-custom-patreon::before {\n  background-color: var(--dark-text)\n}\n\na.bi-custom-patreon:hover::before {\n  background-color: var(--support-me) !important;\n}\n\na.bi-custom-patreon:hover {\n  color: var(--support-me) !important;\n}\n\na.bi-custom-patreon.open-slide-up {\n  animation: goUp 0.4s forwards;\n}\n\na.bi-custom-patreon.close-slide-up {\n  animation: goDown 0.4s forwards;\n}\n\n@keyframes goUp {\n  0% {\n    transform: translateY(0);\n  }\n\n  60% {\n    transform: translateY(5px);\n  }\n\n  100% {\n    transform: translateY(-30px);\n  }\n}\n\n@keyframes goDown {\n  0% {\n    transform: translateY(-30px);\n  }\n\n  60% {\n    transform: translateY(-5px);\n  }\n\n  100% {\n    transform: translateY(0);\n  }\n}\n\n.patreon-slide-up {\n  padding: 10px;\n  background-color: var(--elements-hover);\n  box-shadow: 0 0 10px var(--generals);\n  border-radius: 10px;\n  transform: translateY(125%);\n  transition: transform 0.15s;\n  position: fixed;\n  bottom: 42px;\n  left: 10px;\n  color: var(--text-general);\n  z-index: 190;\n  max-width: 600px;\n}\n\n.patreon-slide-up.open {\n  transform: translateY(0);\n}\n\n.slide-up-title-and-x {\n  margin-bottom: 10px;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  width: 100%;\n  font-size: 20px;\n  height: 30px;\n}\n\n#patreonSlideUpClose {\n  font-size: 26px;\n  cursor: pointer;\n  color: var(--modal-text);\n  transition: all 0.15s;\n}\n\n#patreonSlideUpClose:hover {\n  color: var(--negative-general);\n}\n\n.patreon-unlockables {\n  display: flex;\n  flex-direction: column;\n  gap: 10px;\n  margin-top: 10px;\n  padding-top: 5px;\n  border-top: 2px solid var(--separator);\n}\n\n#modelSelectorButton {\n  margin-top: 0px !important;\n}\n\n#aiModelmenu .dropdown-item {\n  display: flex;\n  flex-direction: row;\n  align-items: flex-start;\n  justify-content: space-between;\n}\n\n#aiModelmenu .dropdown-item i {\n  font-size: 22px;\n  height: 22px;\n  width: 22px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  pointer-events: none;\n  transition: transform 0.15s, opacity 0.15s;\n}\n\n.model-and-description {\n  display: flex;\n  flex-direction: column;\n  gap: 3px;\n  pointer-events: none;\n}\n\n.model-and-description .model-name {\n  color: var(--text-general);\n  font-family: \"Formula1Bold\";\n  pointer-events: none;\n}\n\n.model-and-description .model-description {\n  font-family: \"Formula1\";\n  color: var(--text-secondary);\n  pointer-events: none;\n  font-size: 14px;\n}\n\n.patreon-themes,\n.ai-model-settings {\n  display: flex;\n  flex-direction: column;\n  gap: 5px;\n}\n\n.patreon-unlockables .modal-subtitle {\n  font-size: 18px;\n  line-height: 1.3;\n}\n\n.api-key-section {\n  display: flex;\n  flex-direction: column;\n  gap: 5px;\n}\n\n#patreonChanges>.api-key-section {\n  margin-top: 10px;\n  padding-top: 5px;\n  border-top: 2px solid var(--separator);\n}\n\n#news .modal-text {\n  position: absolute;\n  top: 350%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  font-size: 20px;\n  text-align: center;\n}\n\n.modal-text a,\n.news-error-api-key a {\n  color: var(--new-primary);\n  transition: color 0.15s;\n}\n\n.modal-text a:hover {\n  color: var(--new-primary-dark);\n}\n\n\n.user-name-and-logout {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  gap: 5px;\n}\n\n#userButton,\n#userButton:hover,\n#userButton:hover i,\n#userButton:hover i::before {\n  color: var(--new-primary);\n  background-color: transparent;\n  cursor: default;\n}\n\n\n#patreonLogoutButton:hover {\n  color: var(--negative-general);\n  background-color: color-mix(in srgb, var(--elements) 75%, var(--negative-general));\n}\n\n#patreonLogoutButton:hover i,\n#patreonLogoutButton:hover i::before {\n  background-color: transparent;\n}\n\n\n.patreon-status.negative {\n  color: var(--negative-general) !important;\n}\n\n.patreon-status.positive {\n  color: var(--positive-general) !important;\n}\n\n.patreon-status {\n  color: var(--modal-text) !important;\n}\n\n\n.no-image-by-availability {\n  background-color: color-mix(in srgb, var(--new-primary-dark) 60%, var(--generals));\n  color: var(--text-general);\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: 20px;\n  font-size: 18px;\n  padding: 10px;\n  justify-content: center;\n  position: absolute;\n  top: 0;\n  height: 235px;\n  opacity: 0.97;\n  z-index: 5;\n}\n\n.no-image-by-availability i {\n  font-size: 130px;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  opacity: 0.2;\n  z-index: 1;\n}\n\n.no-image-by-availability span {\n  text-align: center;\n  z-index: 2;\n}\n\n\n.saved-status {\n  color: var(--positive-general);\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 2px;\n  opacity: 0;\n  transform: translateY(5px);\n  transition: opacity 0.15s, transform 0.15s;\n}\n\n.saved-status.api-loaded {\n  opacity: 1;\n  transform: translateY(0px);\n}\n\n.saved-status i,\n.remove-key i {\n  display: flex;\n  font-size: 28px;\n  max-height: 28px;\n}\n\n.remove-key {\n  color: var(--modal-text);\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 2px;\n  cursor: pointer;\n  opacity: 0;\n  transform: translateY(5px);\n  transition: opacity 0.15s, transform 0.15s;\n  pointer-events: none;\n  margin-left: -7px;\n}\n\n#savedKeySeparator {\n  opacity: 0;\n  transform: translateY(5px);\n  transition: opacity 0.15s, transform 0.15s;\n  pointer-events: none;\n}\n\n.limit-bar-and-text{\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 10px;\n  width: max-content;\n  padding: 4px 8px;\n  border-radius: 4px;\n}\n\n.limit-bar{\n  height: 8px;\n  width: 100px;\n  background-color: var(--elements);\n  border-radius: 4px;\n}\n\n.limit-bar-fill{\n  height: 8px;\n  background-color: var(--new-primary);\n  border-radius: 4px;\n  transition: width 0.15s;\n}\n\n.limit-text{\n  font-size: 14px;\n  color: inherit;\n}\n\n.rate-ok .limit-bar-fill {\n  background-color: var(--rate-ok-color);\n}\n\n.rate-ok.limit-bar-and-text {\n  color: var(--rate-ok-color);\n  background-color: var(--rate-ok-bg);\n}\n\n.rate-warning .limit-bar-fill {\n  background-color: var(--rate-warning-color);\n}\n.rate-warning.limit-bar-and-text {\n  color: var(--rate-warning-color);\n  background-color: var(--rate-warning-bg);\n}\n\n.rate-danger .limit-bar-fill {\n  background-color: var(--rate-danger-color);\n}\n.rate-danger.limit-bar-and-text {\n  color: var(--rate-danger-color);\n  background-color: var(--rate-danger-bg);\n}\n\n.rate-blocked .limit-bar-fill {\n  background-color: var(--rate-blocked-color);\n}\n\n.rate-blocked.limit-bar-and-text {\n  color: var(--rate-blocked-color);\n  background-color: var(--rate-blocked-bg);\n}\n\n.remove-key i,\n.remove-key span {\n  transition: color 0.15s, transform 0.15s;\n}\n\n.remove-key:hover i,\n.remove-key:hover span {\n  color: var(--negative-general);\n}\n\n.remove-key:active span {\n  transform: scale(0.95);\n}\n\n.themes-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fill, minmax(40px, 120px));\n  gap: 5px;\n}\n\n.one-theme {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  padding: 5px 8px 8px 8px;\n  border-radius: 5px;\n  transition: background-color 0.15s;\n  cursor: pointer;\n  background-color: var(--elements);\n  border-radius: 8px;\n}\n\n.one-theme:hover {\n  background-color: var(--elements-hover);\n}\n\n.theme-title {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: center;\n  width: 100%;\n}\n\n.theme-title .bi-check-lg {\n  color: var(--positive-general);\n  transition: all 0.15s;\n}\n\n.one-theme.active .theme-title .bi-check-lg {\n  rotate: 0deg;\n  opacity: 1;\n}\n\n.one-theme:not(.active) .theme-title .bi-check-lg {\n  rotate: 90deg;\n  opacity: 0;\n}\n\n.theme-colors {\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n}\n\n.theme-colors div {\n  height: 30px;\n  flex: 1;\n}\n\n#defaultTheme .background-color {\n  background-color: #202020;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n#defaultTheme .primary-color {\n  background-color: #c89efc;\n}\n\n#defaultTheme .secondary-color {\n  background-color: #9AD2CB;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n#lightTheme .background-color {\n  background-color: #e7e7e7;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n#lightTheme .primary-color {\n  background-color: #7a5fd8;\n}\n\n#lightTheme .secondary-color {\n  background-color: #66aabb;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n#ogTheme .background-color {\n  background-color: #1f1b3b;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n#ogTheme .primary-color {\n  background-color: #797599;\n}\n\n#ogTheme .secondary-color {\n  background-color: #dedde6;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n#vaporwaveTheme .background-color {\n  background-color: #230b55;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n#vaporwaveTheme .primary-color {\n  background-color: #ff5ec3;\n}\n\n#vaporwaveTheme .secondary-color {\n  background-color: #00b3ff;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n#nightlyTheme .background-color {\n  background-color: #202020;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n#nightlyTheme .primary-color {\n  background-color: #9AD2CB;\n}\n\n#nightlyTheme .secondary-color {\n  background-color: #c89efc;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n#ferrariTheme .background-color {\n  background-color: #211417;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n#ferrariTheme .primary-color {\n  background-color: #ff3d3d;\n}\n\n#ferrariTheme .secondary-color {\n  background-color: #ffb74d;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n#redbullTheme .background-color {\n  background-color: #132142;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n#redbullTheme .primary-color {\n  background-color: #4b7bff;\n}\n\n#redbullTheme .secondary-color {\n  background-color: #ffd24a;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n#mercedesTheme .background-color {\n  background-color: #0e2328;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n#mercedesTheme .primary-color {\n  background-color: #00f5d3;\n}\n\n#mercedesTheme .secondary-color {\n  background-color: #c8f9f2;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n#astonMartinTheme .background-color {\n  background-color: #07120f;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n#astonMartinTheme .primary-color {\n  background-color: #07977b;\n}\n\n#astonMartinTheme .secondary-color {\n  background-color: #c3dc00;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n#audiTheme .background-color {\n  background-color: #1a0f12;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n#audiTheme .primary-color {\n  background-color: #c00a26;\n}\n\n#audiTheme .secondary-color {\n  background-color: #f1f1f1;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n#vcarbTheme .background-color {\n  background-color: #101827;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n#vcarbTheme .primary-color {\n  background-color: #6c8ff3;\n}\n\n#vcarbTheme .secondary-color {\n  background-color: #f1f1f1;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n#williamsTheme .background-color {\n  background-color: #0c1526;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n#williamsTheme .primary-color {\n  background-color: #1868db;\n}\n\n#williamsTheme .secondary-color {\n  background-color: #f1f1f1;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n#haasTheme .background-color {\n  background-color: #17171d;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n#haasTheme .primary-color {\n  background-color: #f62039;\n}\n\n#haasTheme .secondary-color {\n  background-color: #c1c1c7;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n#alpineTheme .background-color {\n  background-color: #221523;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n#alpineTheme .primary-color {\n  background-color: #f168ba;\n}\n\n#alpineTheme .secondary-color {\n  background-color: #47c7fc;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n#mclarenTheme .background-color {\n  background-color: #22160f;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n#mclarenTheme .primary-color {\n  background-color: #ff8000;\n}\n\n#mclarenTheme .secondary-color {\n  background-color: #47c7fc;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n.big-subtitle p {\n  padding-top: 5px;\n  color: var(--new-primary)\n}\n\n.big-subtitle {\n  -webkit-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 50px;\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex;\n  border-radius: 8px;\n  margin-top: -5px;\n  font-size: 24px;\n}\n\n.words {\n  overflow: hidden;\n  position: relative;\n}\n\n.words::after {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  background: linear-gradient(var(--superficials) 10%,\n      transparent 30%,\n      transparent 70%,\n      var(--superficials) 90%);\n  z-index: 20;\n}\n\n.word {\n  display: block;\n  height: 100%;\n  padding-left: 6px;\n  padding-top: 5px;\n  color: var(--new-primary);\n  animation: move-gradient-title 5s linear infinite, spin_4991 15s infinite;\n  will-change: transform;\n\n}\n\n@keyframes spin_4991 {\n  0% {\n    transform: translateY(0%);\n  }\n\n  25% {\n    transform: translateY(0%);\n  }\n\n  27% {\n    transform: translateY(-102%);\n  }\n\n  30% {\n    transform: translateY(-100%);\n  }\n\n  32% {\n    transform: translateY(-202%);\n  }\n\n  36% {\n    transform: translateY(-200%);\n  }\n\n  38% {\n    transform: translateY(-302%);\n  }\n\n  42% {\n    transform: translateY(-300%);\n  }\n\n  44% {\n    transform: translateY(-402%);\n  }\n\n  48% {\n    transform: translateY(-400%);\n  }\n\n  50% {\n    transform: translateY(-502%);\n  }\n\n  54% {\n    transform: translateY(-500%);\n  }\n\n  56% {\n    transform: translateY(-602%);\n  }\n\n  60% {\n    transform: translateY(-600%);\n  }\n\n  62% {\n    transform: translateY(-702%);\n  }\n\n  66% {\n    transform: translateY(-700%);\n  }\n\n  68% {\n    transform: translateY(-802%);\n  }\n\n  72% {\n    transform: translateY(-800%);\n  }\n\n  74% {\n    transform: translateY(-902%);\n  }\n\n  78% {\n    transform: translateY(-900%);\n  }\n\n  80% {\n    transform: translateY(-1002%);\n  }\n\n  84% {\n    transform: translateY(-1000%);\n  }\n\n  100% {\n    transform: translateY(-1000%);\n  }\n}\n\n.everywhere {\n  opacity: 1;\n  animation: everywhere 15s infinite;\n  transform: translateX(-10px);\n}\n\n@keyframes everywhere {\n  0% {\n    opacity: 1;\n  }\n\n  25% {\n    opacity: 1;\n  }\n\n  27% {\n    opacity: 0;\n  }\n\n  88% {\n    opacity: 0;\n  }\n\n  90% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 1;\n  }\n\n}\n\n\n.patreon-members {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1;\n  width: 100%;\n  height: 50px;\n  overflow: hidden;\n  display: flex;\n  align-items: center;\n}\n\n.marquee {\n  white-space: nowrap;\n  overflow: hidden;\n  height: 100%;\n  display: flex;\n  align-items: center;\n}\n\n.marquee__inner {\n  display: flex;\n  animation: scroll 165s linear infinite;\n  gap: 1em;\n}\n\n.marquee__group {\n  display: flex;\n  gap: 1em;\n}\n\n\n.marquee__group span {\n  font-size: 20px;\n  font-weight: bold;\n}\n\n/* Estilos por tier */\n.backer {\n  color: color-mix(in srgb, var(--background) 40%, var(--dark-text))\n}\n\n.supporter {\n  color: color-mix(in srgb, var(--background) 40%, var(--disabled-text))\n}\n\n.founder {\n  color: color-mix(in srgb, var(--background) 40%, var(--table-first))\n}\n\nbody.light-theme .founder {\n  color: color-mix(in srgb, var(--dark-text) 40%, var(--table-first))\n}\n\n/* Animación de desplazamiento */\n@keyframes scroll {\n  0% {\n    transform: translateX(-50%);\n  }\n\n  /* Empieza con la segunda mitad visible */\n  100% {\n    transform: translateX(9px);\n  }\n\n  /* Vuelve a la posición inicial */\n}\n\n.changes-grid {\n  display: grid;\n  grid-template-columns: repeat(4, 1fr);\n  gap: 25px;\n  position: relative;\n}\n\n.one-change {\n  background-color: color-mix(in srgb, var(--elements) 60%, transparent);\n  padding: 15px 20px;\n  border-radius: 10px;\n  display: flex;\n  flex-direction: column;\n  gap: 10px;\n  align-items: center;\n  justify-content: space-between;\n  backdrop-filter: blur(2px);\n  box-shadow: var(--shadow-s);\n  opacity: 0;\n\n}\n\n\nbody.light-theme .one-change {\n  background-color: #f5f5f5;\n}\n\nbody.light-theme .one-change .one-change-description {\n  color: #282828;\n}\n\n.one-change-title {\n  text-transform: uppercase;\n  font-size: 20px;\n  color: var(--text-general);\n  text-align: center;\n}\n\n\n.one-change-description {\n  font-size: 16px;\n  color: var(--modal-text);\n}\n\n.one-change-description.add-results-team {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 12px;\n}\n\n.one-change-description.add-results-team .add-results-team__left {\n  display: inline-flex;\n  align-items: center;\n  gap: 10px;\n  min-width: 0;\n}\n\n.one-change-description.add-results-team .add-results-team__logo {\n  width: 26px;\n  height: 18px;\n  flex: 0 0 auto;\n  object-fit: contain;\n}\n\n.one-change-description.add-results-team .add-results-team__right {\n  display: inline-flex;\n  align-items: baseline;\n  gap: 6px;\n  white-space: nowrap;\n  flex: 0 0 auto;\n}\n\n.one-change-description.add-results-team .add-results-points {\n  font-size: 18px;\n  line-height: 1;\n  transition: color 0.15s;\n}\n\n.add-results-points.activated{\n  color: var(--dark-text);\n}\n\n.calendar-changes-2026{\n  transition: transform 0.15s ease;\n}\n\n.one-change:has(.completed) .calendar-changes-2026{\n  transform: translateX(-25px)\n}\n\n.one-change-description.regs-team {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 12px;\n}\n\n.one-change-description.regs-team .regs-team__name {\n  text-transform: uppercase;\n  white-space: nowrap;\n}\n\n.one-change-description.regs-team .regs-team__logo {\n  position: relative;\n  width: 26px;\n  height: 18px;\n  flex: 0 0 auto;\n}\n\n.one-change-description.regs-team .regs-team__logo::before,\n.one-change-description.regs-team .regs-team__logo::after {\n  content: '';\n  position: absolute;\n  inset: 0;\n  background-repeat: no-repeat;\n  background-position: center;\n  background-size: contain;\n  opacity: 0;\n  transform: translateY(-10px);\n  transition: opacity 0.2s ease, transform 0.2s ease;\n}\n\n.one-change-description.regs-team .regs-team__logo::before {\n  opacity: 1;\n  transform: translateY(0);\n}\n\n.one-change:has(.change-performance-2026.completed) .one-change-description.regs-team .regs-team__logo::before {\n  opacity: 0;\n  transform: translateY(10px);\n}\n\n.one-change:has(.change-performance-2026.completed) .one-change-description.regs-team .regs-team__logo::after {\n  opacity: 1;\n  transform: translateY(0);\n}\n\n.one-change-description.regs-team--aston .regs-team__logo::before {\n  background-image: url('/assets/images/logos/mercedes.png');\n}\n\n.one-change-description.regs-team--aston .regs-team__logo::after {\n  background-image: url('/assets/images/logos/honda.png');\n}\n\n.one-change-description.regs-team--stake .regs-team__logo::before {\n  background-image: url('/assets/images/logos/ferrari.png');\n}\n\n.one-change-description.regs-team--stake .regs-team__logo::after {\n  background-image: url('/assets/images/logos/audi.png');\n}\n\n.one-change-description.regs-team--stake .regs-team__name {\n  position: relative;\n  display: inline-block;\n  min-height: 1em;\n  color: transparent;\n}\n\n.one-change-description.regs-team--stake .regs-team__name::before,\n.one-change-description.regs-team--stake .regs-team__name::after {\n  position: absolute;\n  top: 0;\n  left: 0;\n  opacity: 0;\n  transform: translateY(-10px);\n  transition: opacity 0.2s ease, transform 0.2s ease;\n  color: var(--modal-text);\n}\n\nbody.light-theme .one-change-description.regs-team--stake .regs-team__name::before,\nbody.light-theme .one-change-description.regs-team--stake .regs-team__name::after {\n  color: #282828;\n}\n\n.one-change-description.regs-team--stake .regs-team__name::before {\n  content: 'Stake Sauber';\n  opacity: 1;\n  transform: translateY(0);\n}\n\n.one-change-description.regs-team--stake .regs-team__name::after {\n  content: 'Audi';\n  font-family: 'Formula1Bold';\n  color: var(--dark-text);\n}\n\n.one-change:has(.change-performance-2026.completed) .one-change-description.regs-team--stake .regs-team__name::before {\n  opacity: 0;\n  transform: translateY(10px);\n}\n\n.one-change:has(.change-performance-2026.completed) .one-change-description.regs-team--stake .regs-team__name::after {\n  opacity: 1;\n  transform: translateY(0);\n}\n\n.one-change-description.lineup-team {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 12px;\n}\n\n.one-change-description.lineup-team .lineup-team__name {\n  text-transform: uppercase;\n  white-space: nowrap;\n}\n\n.one-change-description.lineup-team .lineup-team__logo {\n  position: relative;\n  width: 28px;\n  height: 18px;\n  flex: 0 0 auto;\n}\n\n.one-change-description.lineup-team .lineup-team__logo::before,\n.one-change-description.lineup-team .lineup-team__logo::after {\n  content: '';\n  position: absolute;\n  inset: 0;\n  background-repeat: no-repeat;\n  background-position: center;\n  background-size: contain;\n  opacity: 0;\n  transform: translateY(-10px);\n  transition: opacity 0.22s ease, transform 0.22s ease;\n}\n\n.one-change-description.lineup-team .lineup-team__logo::before {\n  opacity: 1;\n  transform: translateY(0);\n}\n\n.one-change:has(.change-line-ups-2026.completed) .one-change-description.lineup-team .lineup-team__logo::before {\n  opacity: 0;\n  transform: translateY(10px);\n}\n\n.one-change:has(.change-line-ups-2026.completed) .one-change-description.lineup-team .lineup-team__logo::after {\n  opacity: 1;\n  transform: translateY(0);\n}\n\n/* 2026 Line-ups logos (right side) */\n.one-change-description.lineup-team--cadillac .lineup-team__logo::before {\n  /* nothing shown until applied */\n  opacity: 0;\n  transform: translateY(-10px);\n}\n\n.one-change-description.lineup-team--cadillac .lineup-team__logo::after {\n  background-image: url('/assets/images/logos/cadillac.png');\n  height: 26px;\n}\n\n.one-change:has(.change-line-ups-2026.completed) .one-change-description.lineup-team--cadillac .lineup-team__logo::after{\n  transform: translateY(-3px);\n}\n\n.one-change-description.lineup-team--hadjar .lineup-team__logo::before {\n  background-image: url('/assets/images/logos/visarb.png');\n}\n\n.one-change-description.lineup-team--hadjar .lineup-team__logo::after {\n  background-image: url('/assets/images/logos/redbull.png');\n}\n\n.one-change-description.lineup-team--lindblad .lineup-team__logo::before {\n  background-image: url('/assets/images/logos/campos.png');\n}\n\n.one-change-description.lineup-team--lindblad .lineup-team__logo::after {\n  background-image: url('/assets/images/logos/visarb.png');\n}\n\n.one-change-description.engine-renamed.engine-renamed-honda,\n.one-change-description.engine-appear {\n  color: var(--text-general);\n}\n\n.one-change-description.performance-year-switch {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  gap: 6px;\n}\n\n.one-change-description.performance-year-switch .performance-year-switch__year {\n  position: relative;\n  display: inline-block;\n  min-width: 44px;\n  min-height: 1em;\n  color: transparent;\n}\n\n.one-change-description.performance-year-switch .performance-year-switch__year::before,\n.one-change-description.performance-year-switch .performance-year-switch__year::after {\n  position: absolute;\n  top: -5px;\n  left: 0;\n  opacity: 0;\n  transform: translateY(-10px);\n  transition: opacity 0.2s ease, transform 0.2s ease;\n  color: var(--modal-text);\n}\n\nbody.light-theme .one-change-description.performance-year-switch .performance-year-switch__year::before {\n  color: #282828;\n}\n\n.one-change-description.performance-year-switch .performance-year-switch__year::before {\n  content: '2024';\n  opacity: 1;\n  transform: translateY(0);\n}\n\n.one-change-description.performance-year-switch .performance-year-switch__year::after {\n  content: '2026';\n  color: var(--dark-text);\n}\n\n.one-change:has(.change-performance-2026.completed) .one-change-description.performance-year-switch .performance-year-switch__year::before {\n  opacity: 0;\n  transform: translateY(10px);\n}\n\n.one-change:has(.change-performance-2026.completed) .one-change-description.performance-year-switch .performance-year-switch__year::after {\n  opacity: 1;\n  transform: translateY(0);\n}\n\n.one-change-description.engine-appear {\n  opacity: 0;\n  transform: translateY(10px);\n  transition: opacity 0.15s ease, transform 0.15s ease, max-height 0.15s ease;\n}\n\n.one-change-description.engine-appear.engine-appear-visible {\n  opacity: 1;\n  transform: translateY(0);\n}\n\n.engine-renamed{\n  min-height: 24px;\n}\n\n\nbutton.one-change-button {\n  background-color: var(--text-general);\n  color: var(--negative-text);\n  border: none;\n  padding: 7px 13px;\n  border-radius: 7px;\n  cursor: pointer;\n  transition: color 0.15s, background-color 0.15s, box-shadow 0.15s;\n  margin-top: 5px;\n  width: 100%;\n}\n\n\n#mods2026View button.one-change-button {\n  background-color: transparent;\n  background-repeat: no-repeat;\n  background-size: 100% 100%;\n  background-image: linear-gradient(\n    90deg,\n    var(--text-general) 0%,\n    var(--text-general) 50%,\n    var(--text-general) 100%\n  );\n  transition: color 0.15s, background-image 0.35s ease, box-shadow 0.15s;\n}\n\n#mods2026View button.one-change-button:hover {\n  background-color: transparent;\n  background-image: linear-gradient(\n    90deg,\n    var(--new-primary) 0%,\n    var(--new-primary) 50%,\n    var(--new-primary) 100%\n  );\n}\n\nbutton.one-change-button.disabled {\n  filter: brightness(0.6);\n  cursor: default;\n  pointer-events: none;\n}\n\nbutton.one-change-button:hover {\n  background-color: var(--new-primary);\n  box-shadow: 0 0 5px var(--new-primary);\n}\n\nbutton.one-change-button:active {\n  transform: scale(0.98);\n  /* Ajusta esto a tu gusto */\n  box-shadow: inset 0 2px 5px rgba(0, 0, 0, 0.2);\n}\n\nbutton.one-change-button.completed {\n  background-color: transparent;\n  color: var(--positive-general);\n  cursor: default;\n  pointer-events: none;\n}\n\n#mods2026View button.one-change-button.completed {\n  background-image: linear-gradient(\n    90deg,\n    transparent 0%,\n    var(--positive-transparent) 50%,\n    transparent 100%\n  );\n}\n\nbutton.one-change-button.completed:hover {\n  background-color: transparent;\n  box-shadow: none;\n}\n\nbutton.one-change-button .bi-check-lg {\n  transition: all 0.15s;\n}\n\nbutton.one-change-button:not(.completed) .bi-check-lg {\n  rotate: 90deg;\n  opacity: 0;\n}\n\nbutton.one-change-button.completed .bi-check-lg {\n  rotate: 0deg;\n  opacity: 1;\n}\n\nbutton.one-change-button span {\n  padding-right: 16px;\n  transition: all 0.15s;\n}\n\nbutton.one-change-button.completed span {\n  padding-right: 0;\n}\n\n@keyframes change-appear {\n  0% {\n    opacity: 0;\n    transform: translateY(20px);\n  }\n\n  100% {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\nbody:has(#modpill.active) .one-change {\n  animation: change-appear 0.6s ease-out forwards;\n  animation-delay: calc(0.8s + var(--order) * 0.1s);\n}\n\n.ham-transfer,\n.sai-transfer,\n.ant-transfer {\n  color: transparent;\n  position: relative;\n}\n\n.bor-ovr,\n.ant-ovr,\n.pia-ovr\n {\n  transform: skewX(-9deg);\n  display: inline-block;\n  min-width: 122px;\n}\n\n.had-ovr,\n.bea-ovr,\n#mods2026View .ant-ovr {\n  transform: skewX(0deg) !important;\n  display: inline-block;\n  min-width: 122px;\n  transition: color 0.15s;\n}\n\n.ovr-change {\n  color: var(--dark-text);\n}\n\n.ham-transfer::before,\n.sai-transfer::before,\n.ant-transfer::before {\n  font-family: 'Formula1Bold';\n  transition: all 0.15s;\n  transform: skewX(-9deg);\n  display: inline-block;\n}\n\n.ham-transfer::before {\n  content: 'HAMILTON';\n  position: absolute;\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 1;\n  z-index: 1;\n  color: var(--mercedes-primary);\n}\n\n.sai-transfer::before {\n  content: 'SAINZ';\n  position: absolute;\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 1;\n  z-index: 1;\n  color: var(--ferrari-primary);\n}\n\n.ant-transfer::before {\n  content: 'ANTONELLI';\n  position: absolute;\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 1;\n  z-index: 1;\n  color: var(--modal-text);\n}\n\n.one-change:has(.completed) .ham-transfer,\n.one-change:has(.completed) .sai-transfer,\n.one-change:has(.completed) .ant-transfer {\n  color: var(--modal-text);\n}\n\n.one-change:has(.completed) .ham-transfer::before {\n  transform: translateX(59px) skewX(-9deg);\n  color: var(--ferrari-primary);\n}\n\n.one-change:has(.completed) .sai-transfer::before {\n  transform: translateX(62px) skewX(-9deg);\n  color: var(--williams-primary);\n}\n\n.ant-team {\n  transform: translateX(22px);\n  padding-left: 50px;\n}\n\n.ham-team {\n  padding-left: 51px;\n  transition: all 0.15s;\n}\n\n.sai-team {\n  transition: all 0.15s;\n}\n\n\n\n.one-change:has(.completed) .ham-team,\n.one-change:has(.completed) .sai-team,\n.one-change:has(.completed) .ant-team {\n  color: transparent;\n  padding: 0;\n}\n\n.one-change:has(.completed) .ant-transfer::before {\n  transform: translateX(65px) skewX(-9deg);\n  color: var(--mercedes-primary);\n}\n\n.date-holder {\n  display: inline-flex;\n  gap: 5px;\n}\n\n\n.date-part {\n  position: relative;\n  display: inline-block;\n  text-align: center;\n  overflow: hidden;\n}\n\n\n\n@keyframes slide-down {\n  from {\n    transform: translateY(-20px);\n    opacity: 0;\n  }\n\n  to {\n    transform: translateY(0);\n    opacity: 1;\n  }\n}\n\n@keyframes slide-out-down {\n  from {\n    transform: translateY(0);\n    opacity: 1;\n  }\n\n  to {\n    transform: translateY(20px);\n    opacity: 0;\n  }\n}\n\n#dateDay::before {\n  content: '29th';\n  position: absolute;\n  font-family: 'Formula1Bold';\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  z-index: -1;\n  transform: translateY(-20px);\n  animation-delay: 0.1s;\n  color: var(--dark-text);\n}\n\n#dateDay2026,\n#dateMonth2026,\n#dateYear2026 {\n  --date-switch-delay: 0s;\n}\n\n#dateMonth2026 {\n  --date-switch-delay: 0.05s;\n}\n\n#dateYear2026 {\n  --date-switch-delay: 0.1s;\n}\n\n#dateDay2026,\n#dateMonth2026,\n#dateYear2026 {\n  transition: transform 0.2s ease, color 0.2s ease;\n  transition-delay: var(--date-switch-delay);\n  transform: translateY(0);\n  overflow: visible;\n}\n\n#dateDay2026::after,\n#dateMonth2026::after,\n#dateYear2026::after {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  transform: translateY(-20px);\n  transition: opacity 0.2s ease, transform 0.2s ease;\n  transition-delay: var(--date-switch-delay);\n  color: var(--dark-text);\n  font-family: 'Formula1Bold';\n  pointer-events: none;\n  z-index: 1;\n}\n\n#dateDay2026::after {\n  content: '29th';\n}\n\n#dateMonth2026::after {\n  content: 'December';\n}\n\n#dateYear2026::after {\n  content: '2025';\n}\n\n.one-change:has(.completed) #dateDay2026,\n.one-change:has(.completed) #dateMonth2026,\n.one-change:has(.completed) #dateYear2026 {\n  transform: translateY(10px);\n  color: transparent;\n}\n\n.one-change:has(.completed) #dateDay2026::after,\n.one-change:has(.completed) #dateMonth2026::after,\n.one-change:has(.completed) #dateYear2026::after {\n  opacity: 1;\n  transform: translateY(-10px);\n}\n\n#dateMonth, #dateMonth2026 {\n  min-width: 100px;\n}\n\n#dateDay, #dateDay2026 {\n  min-width: 50px;\n}\n\n#dateMonth::before {\n  content: 'December';\n  font-family: 'Formula1Bold';\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  z-index: -1;\n  transform: translateY(-20px);\n  animation-delay: 0.2s;\n  color: var(--dark-text);\n}\n\n#dateYear::before {\n  content: '2024';\n  position: absolute;\n  font-family: 'Formula1Bold';\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  z-index: -1;\n  transform: translateY(-20px);\n  animation-delay: 0.3s;\n  color: var(--dark-text);\n}\n\n.one-change:has(.completed) #dateDay::before {\n  animation: slide-down 0.3s forwards 0s;\n}\n\n.one-change:has(.completed) #dateMonth::before {\n  animation: slide-down 0.3s forwards 0.05s;\n}\n\n.one-change:has(.completed) #dateYear::before {\n  animation: slide-down 0.3s forwards 0.1s;\n}\n\n.one-change:has(.completed) #dateDay,\n.one-change:has(.completed) #dateMonth,\n.one-change:has(.completed) #dateYear {\n  transition: color 0.15s;\n  color: transparent;\n}\n\n.bor-change,\n.ant-change,\n.pia-change,\n.bea-change,\n.had-change {\n  position: relative;\n  overflow: hidden;\n  color: transparent;\n}\n\n.bor-change::before {\n  content: '78';\n  position: absolute;\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  z-index: 2;\n  transform: translateY(-20px);\n  color: var(--dark-text);\n}\n\n.bor-change::after {\n  content: '69';\n  position: absolute;\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 1;\n  z-index: 1;\n  transform: translateY(0);\n  color: var(--dark-text);\n}\n\n.one-change:has(.completed) .bor-change::before {\n  animation: slide-down 0.3s forwards 0s;\n}\n\n.one-change:has(.completed) .bor-change::after {\n  animation: slide-out-down 0.3s forwards 0s;\n}\n\n.ant-change::before {\n  content: '77';\n  position: absolute;\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  z-index: 2;\n  transform: translateY(-20px);\n  color: var(--dark-text);\n}\n\n#mods2026View .ant-change::before{\n  content: \"86\";\n  font-family: \"NumbersFont\";\n}\n\n#mods2026View .ant-change::after{\n  font-family: \"NumbersFont\";\n}\n\n.ant-change::after {\n  content: '71';\n  position: absolute;\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 1;\n  z-index: 1;\n  transform: translateY(0);\n  color: var(--dark-text);\n  \n}\n\n.one-change:has(.completed) .ant-change::before {\n  animation: slide-down 0.3s forwards 0.05s;\n}\n\n.one-change:has(.completed) .ant-change::after {\n  animation: slide-out-down 0.3s forwards 0.05s;\n}\n\n.pia-change::before {\n  content: '86';\n  position: absolute;\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  z-index: 2;\n  transform: translateY(-20px);\n  color: var(--dark-text);\n}\n\n.pia-change::after {\n  content: '84';\n  position: absolute;\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 1;\n  z-index: 1;\n  transform: translateY(0);\n  color: var(--dark-text);\n}\n\n.one-change:has(.completed) .pia-change::before {\n  animation: slide-down 0.3s forwards 0.1s;\n}\n\n.one-change:has(.completed) .pia-change::after {\n  animation: slide-out-down 0.3s forwards 0.1s;\n}\n\n.had-change::before {\n  content: '83';\n  position: absolute;\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  z-index: 2;\n  transform: translateY(-20px);\n  color: var(--dark-text);\n  font-family: \"NumbersFont\";\n}\n\n.had-change::after {\n  content: '75';\n  position: absolute;\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 1;\n  z-index: 1;\n  transform: translateY(0);\n  color: var(--dark-text);\n  font-family: \"NumbersFont\";\n}\n\n.one-change:has(.completed) .had-change::before {\n  animation: slide-down 0.3s forwards 0s;\n}\n\n.one-change:has(.completed) .had-change::after {\n  animation: slide-out-down 0.3s forwards 0s;\n}\n\n.bea-change::before {\n  content: '84';\n  position: absolute;\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  z-index: 2;\n  transform: translateY(-20px);\n  color: var(--dark-text);\n  font-family: \"NumbersFont\";\n}\n\n.bea-change::after {\n  content: '77';\n  position: absolute;\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 1;\n  z-index: 1;\n  transform: translateY(0);\n  color: var(--dark-text);\n  font-family: \"NumbersFont\";\n}\n\n.one-change:has(.completed) .bea-change::before {\n  animation: slide-down 0.3s forwards 0.1s;\n}\n\n.one-change:has(.completed) .bea-change::after {\n  animation: slide-out-down 0.3s forwards 0.1s;\n}\n\n.fast-lap-change::before {\n  content: '0';\n  position: absolute;\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  z-index: -1;\n  transform: translateY(-10px);\n  animation-delay: 0.1s;\n  color: var(--dark-text);\n}\n\n.one-change:has(.completed) .fast-lap-change::before {\n  animation: slide-down 0.3s forwards 0.05s;\n}\n\n.fast-lap-change {\n  position: relative;\n  margin-right: 2px;\n}\n\n.one-change:has(.completed) .fast-lap-change {\n  color: transparent;\n}\n\n.fast-lap-general {\n  color: #c90fd7;\n  transition: all 0.15s;\n}\n\n.one-change:has(.completed) .fast-lap-general {\n  color: var(--dark-text);\n}\n\n.cost-cap-change::before {\n  content: '215M €';\n  position: absolute;\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  z-index: -1;\n  transform: translateY(-10px);\n  animation-delay: 0.1s;\n  color: var(--dark-text);\n}\n\n.one-change:has(.completed) .cost-cap-change::before {\n  animation: slide-down 0.3s forwards 0.05s;\n}\n\n.cost-cap-change {\n  position: relative;\n}\n\n.one-change:has(.completed) .cost-cap-change {\n  color: transparent;\n}\n\n.cost-cap-general {\n  transition: all 0.15s;\n}\n\n.one-change:has(.completed) .cost-cap-general {\n  color: var(--dark-text);\n}\n\n.mclaren-cfd,\n.redbull-cfd,\n.ferrari-cfd {\n  position: relative;\n}\n\n.mclaren-cfd::before {\n  content: '4.2h';\n  position: absolute;\n  font-family: \"Formula1Bold\";\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  z-index: -1;\n  transform: translateY(-20px);\n  animation-delay: 0.1s;\n  color: var(--dark-text);\n}\n\n.one-change:has(.completed) .mclaren-cfd::before {\n  animation: slide-down 0.3s forwards 0.05s;\n}\n\n.one-change:has(.completed) .mclaren-cfd {\n  color: transparent;\n}\n\n.redbull-cfd::before {\n  content: '4.8h';\n  position: absolute;\n  font-family: \"Formula1Bold\";\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  z-index: -1;\n  transform: translateY(-20px);\n  animation-delay: 0.1s;\n  color: var(--dark-text);\n}\n\n.one-change:has(.completed) .redbull-cfd::before {\n  animation: slide-down 0.3s forwards 0s;\n}\n\n.one-change:has(.completed) .redbull-cfd {\n  color: transparent;\n}\n\n.ferrari-cfd::before {\n  content: '4.5h';\n  position: absolute;\n  font-family: \"Formula1Bold\";\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  z-index: -1;\n  transform: translateY(-20px);\n  animation-delay: 0.1s;\n  color: var(--dark-text);\n}\n\n.one-change:has(.completed) .ferrari-cfd::before {\n  animation: slide-down 0.3s forwards 0.1s;\n}\n\n.one-change:has(.completed) .ferrari-cfd {\n  color: transparent;\n}\n\n.cfd-name {\n  min-width: 125px;\n  display: inline-block;\n  color: var(--dark-text);\n}\n\n.one-change-performance-name {\n  min-width: 100px;\n  display: inline-block;\n  color: var(--dark-text);\n}\n\n.missing-staff,\n.missing-f2,\n.missing-academy {\n  position: relative;\n  width: 225px;\n  transition: width 0.15s;\n}\n\n.missing-staff::before,\n.missing-f2::before,\n.missing-academy::before {\n  content: 'Added!';\n  position: absolute;\n  font-family: \"Formula1Bold\";\n  bottom: 0px;\n  left: 0;\n  height: 100%;\n  opacity: 0;\n  z-index: -1;\n  transform: translateX(0);\n  animation-delay: 0.1s;\n  color: var(--dark-text);\n}\n\n.one-change:has(.completed) .missing-staff::before {\n  transform: translateX(120px);\n  opacity: 1;\n  color: var(--positive-general);\n}\n\n.one-change:has(.completed) .missing-f2::before {\n  transform: translateX(170px);\n  opacity: 1;\n  color: var(--positive-general);\n}\n\n.one-change:has(.completed) .missing-academy::before {\n  transform: translateX(227px);\n  opacity: 1;\n  color: var(--positive-general);\n}\n\n.one-change:has(.completed) .missing-f2,\n.one-change:has(.completed) .missing-staff,\n.one-change:has(.completed) .missing-academy {\n  width: 280px;\n}\n\n.season-change::before {\n  content: 'Australia';\n  position: absolute;\n  font-family: \"Formula1Bold\";\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  z-index: -1;\n  transform: translateY(-20px);\n  animation-delay: 0.1s;\n  color: var(--dark-text);\n}\n\n.sprint-change::before {\n  content: 'Belgium';\n  position: absolute;\n  font-family: \"Formula1Bold\";\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  z-index: -1;\n  transform: translateY(-20px);\n  animation-delay: 0.1s;\n  color: var(--dark-text);\n}\n\n.sprint-change-2026.change-1::before{\n  content: 'Canada,';\n  position: absolute;\n  font-family: \"Formula1Bold\";\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  z-index: -1;\n  transform: translateY(-20px);\n  animation-delay: 0.1s;\n  color: var(--dark-text);\n}\n\n.sprint-change-2026.change-2::before{\n  content: 'Silverstone,';\n  position: absolute;\n  font-family: \"Formula1Bold\";\n  bottom: 2px;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  z-index: -1;\n  transform: translateY(-20px);\n  animation-delay: 0.1s;\n  color: var(--dark-text);\n}\n\n.sprint-change-2026.change-3::before{\n  content: 'Zandvoort,';\n  position: absolute;\n  font-family: \"Formula1Bold\";\n  bottom: 2px;\n  left: 55px;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  z-index: -1;\n  transform: translateY(-20px);\n  animation-delay: 0.1s;\n  color: var(--dark-text);\n}\n\n.sprint-change-2026.change-4::before{\n  content: 'Singapore';\n  position: absolute;\n  font-family: \"Formula1Bold\";\n  bottom: 2px;\n  left: 100px;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  z-index: -1;\n  transform: translateY(-20px);\n  animation-delay: 0.1s;\n  color: var(--dark-text);\n}\n\n.one-change:has(.completed) .season-change::before {\n  animation: slide-down 0.3s forwards 0s;\n}\n\n.one-change:has(.completed) .season-change {\n  color: transparent;\n}\n\n.season-change {\n  position: relative;\n}\n\n.one-change:has(.completed) .sprint-change::before,  .one-change:has(.completed) .sprint-change-2026::before{\n  animation: slide-down 0.3s forwards 0.05s;\n}\n\n.one-change:has(.completed) .sprint-change, .one-change:has(.completed) .sprint-change-2026 {\n  color: transparent;\n}\n\n.sprint-change, .sprint-change-2026 {\n  position: relative;\n}\n\n.mod-blocking {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: 10px;\n}\n\n.mod-blocking:not(.mods-2026-blocking){\n  margin-top: 50px;\n}\n\n.mod-blocking-title {\n  font-size: 24px;\n  color: #dedde6;\n  font-family: 'Formula1Bold';\n}\n\n.mod-blocking-subtitle {\n  font-size: 18px;\n  color: var(--modal-text);\n}\n\n.one-change-description.performance-description {\n  display: flex;\n  flex-direction: row;\n  gap: 5px;\n  align-items: flex-end;\n}\n\n.one-change-bar-container {\n  background-color: var(--background);\n  width: 100px;\n  height: 4px;\n  margin-bottom: 7px;\n}\n\n.one-change-bar-fill.performance-bar-progress {\n  height: 4px;\n  position: relative;\n}\n\n.one-change-bar-fill.performance-bar-progress.rb {\n  width: 58.5%;\n  transition: width 0.15s;\n}\n\n.one-change-bar-fill.performance-bar-progress.mc {\n  width: 56.5%;\n  transition: width 0.15s;\n}\n\n.one-change-bar-fill.performance-bar-progress.wi {\n  width: 46.1%;\n  transition: width 0.15s;\n}\n\n.mclaren-performance,\n.williams-performance,\n.redbull-performance {\n  transition: all 0.15s;\n}\n\n.one-change:has(.completed) .one-change-bar-fill.performance-bar-progress.rb {\n  width: 60.42%;\n}\n\n.one-change:has(.completed) .mclaren-performance,\n.one-change:has(.completed) .williams-performance,\n.one-change:has(.completed) .redbull-performance {\n  color: var(--dark-text)\n}\n\n.one-change:has(.completed) .one-change-bar-fill.performance-bar-progress.mc {\n  width: 65.77%;\n}\n\n.one-change:has(.completed) .one-change-bar-fill.performance-bar-progress.wi {\n  width: 56.85%;\n}\n\n.mclaren-performance-description,\n.redbull-performance-description,\n.williams-performance-description {\n  transition: all 0.15s;\n}\n\n.one-change:has(.completed) .mclaren-performance-description {\n  transform: translateY(-24px);\n}\n\n.one-change:has(.completed) .redbull-performance-description {\n  transform: translateY(24px);\n}\n\n\n.news-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(450px, 1fr));\n  gap: 25px;\n  padding: 0 14px;\n  overflow-y: auto;\n  max-height: calc(100vh - 160px);\n  margin-right: 8px;\n}\n\n.news-item-clone .news-image-container {\n  max-width: 600px;\n}\n\n.news-item-clone.expanded .news-image-container,\n.news-item-clone.expanded .news-image {\n  border-top-right-radius: 0px;\n}\n\n.modal-header:has(img.news-image-background.d-none) {\n  background: var(--primary-gradient) !important;\n}\n\n.news-item {\n  background-color: var(--elements);\n  border-radius: 10px;\n  display: flex;\n  flex-direction: column;\n  z-index: 0;\n  transition: none;\n  box-shadow: var(--shadow-s);\n}\n\n.news-item.with-transition {\n  transition: transform 0.15s ease-out, opacity 0.15s ease-out;\n}\n\n.news-item.opened {\n  transform: translateY(-10px);\n  opacity: 0 !important;\n}\n\n.news-item:not(.news-item-clone) {\n  opacity: 0;\n}\n\n.news-item.active {\n  position: fixed;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%) scale(1.05);\n  z-index: 999;\n}\n\n.news-item.fade-in:not(.news-item-clone) {\n  animation: fadeInHigher 0.2s forwards;\n  animation-delay: calc(var(--order) * 0.05s);\n}\n\n.news-body {\n  padding: 10px;\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n  flex: 1;\n  gap: 10px;\n  min-height: 112px;\n}\n\n.title-and-article {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n}\n\n.title-and-article:has(.disabled-title) {\n  flex-direction: row;\n  align-items: center;\n  gap: 10px;\n}\n\n.title-and-article:has(.disabled-title) i {\n  color: var(--disabled-text);\n  font-size: 20px;\n}\n\n.news-article h1 {\n  font-size: 34px;\n  font-family: 'Formula1Bold';\n  color: var(--new-primary);\n  margin-bottom: 0;\n}\n\n.news-article h2 {\n  font-size: 28px;\n  font-family: 'Formula1Bold';\n  color: var(--text-general);\n  margin-bottom: 0;\n}\n\n.news-article h3 {\n  font-size: 22px;\n  font-family: 'Formula1Bold';\n  margin-bottom: 0;\n  color: var(--text-secondary);\n}\n\n.news-article ul{\n  margin-bottom: 0;\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n  padding-left: 28px;\n}\n\n.news-article p {\n  margin: 0;\n  color: var(--text-secondary);\n}\n\n.news-article em {\n  color: var(--text-selected);\n}\n\n.news-article strong {\n  color: var(--text-general);\n  font-family: 'Formula1Bold';\n}\n\n/* not first li (that doesn't have a p as a child) in a ul to have negative margin-top */\n.news-article ul li:not(:first-child):has(p:first-child) {\n  margin-top: -15px;\n}\n\n.news-article-date {\n  color: var(--news-date-text);\n  display: flex;\n  gap: 10px;\n  align-items: center;\n  margin-bottom: 7px;\n  opacity: 1;\n  transition: opacity 0.15s;\n  z-index: 1;\n  background: color-mix(in srgb, var(--text-general) 30%, transparent);\n  padding: 3px 8px;\n  border-radius: 8px;\n  backdrop-filter: blur(10px);\n  margin-top: 10px;\n}\n\nbody.default-theme .news-article-date {\n  background: color-mix(in srgb, white 30%, transparent);\n}\n\n.news-article-date.show {\n  opacity: 1;\n}\n\n.news-article-date i {\n  font-size: 20px;\n}\n\n.news-article {\n  color: color-mix(in srgb, var(--text-general) 80%, gray);\n  overflow-y: auto;\n  padding-right: 10px;\n  transition: opacity 0.15s ease;\n  height: 60vh;\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n}\n\n.news-article:has(.news-edit-textarea),\n.news-article:has(.news-edit-title){\n  padding-right: 0;\n}\n\n.modal-content {\n  background-color: var(--generals) !important;\n  /* evita el “hairline” durante la animación */\n}\n\n.modal-header {\n  border-bottom: 0 !important;\n}\n\n\n.news-image-background {\n  width: 100%;\n  position: absolute;\n  top: 0;\n  left: 0;\n  opacity: 0.5;\n  object-fit: cover;\n  height: 100%;\n  z-index: 0;\n  border-top-left-radius: 10px;\n  border-top-right-radius: 10px;\n}\n\n#newsModal .modal-footer {\n  border-top: 0 !important;\n}\n\n.news-edit-textarea {\n  background-color: transparent;\n  border: none;\n  resize: none;\n  width: 100%;\n  height: 100%;\n  padding-right: 10px;\n  min-height: 320px;\n  color: var(--text-general);\n  font: inherit;\n  outline: none;\n}\n\n.news-edit-title {\n  resize: none;\n  background: transparent;\n  color: var(--text-general);\n  font: inherit;\n  font-weight: 700;\n  border: none;\n  border-bottom: 2px solid var(--text-secondary);\n  outline: none;\n  box-sizing: border-box;\n  padding: 0;\n  margin: 0;\n  overflow: hidden;\n  white-space: nowrap;\n  overflow-x: hidden;\n  overflow-y: hidden;\n  field-sizing: content;\n  height: 42px;\n}\n\n\n\n\n#newsModalTitle {\n  z-index: 1;\n}\n\n#newsModalTitle:has(textarea){\n  height: 42px;\n}\n\n.news-title {\n  font-size: 20px;\n  color: var(--text-general);\n  line-height: 1.2;\n  /* transition: font-size 0.15s; */\n}\n\n.news-title.disabled-title {\n  color: var(--disabled-text);\n}\n\n.news-item-clone .news-title {\n  font-size: 28px;\n}\n\n#newsModal .modal-body {\n  display: flex;\n  flex-direction: column;\n  gap: 10px;\n  padding-top: 15px;\n}\n\n.modal-body .news-image-container {\n  height: auto;\n  width: 600px;\n  align-self: center;\n}\n\n.news-image-container {\n  width: 100%;\n  height: 235px;\n  overflow: hidden;\n  border-top-right-radius: 10px;\n  border-top-left-radius: 10px;\n  position: relative;\n}\n\n/* .news-image-container img{\n  padding: 1px 0px 0px 0px;\n} */\n\n.breaking-news-overlay {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: var(--primary-gradient);\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  padding: 20px;\n  z-index: 1;\n  color: white;\n  font-weight: bold;\n  text-transform: uppercase;\n}\n\n.breaking-news-breaking {\n  font-size: 50px;\n  letter-spacing: 0.1em;\n  text-shadow: 0 4px 8px rgba(0, 0, 0, 0.5);\n  margin-bottom: -0.2em;\n}\n\n.breaking-news-news {\n  font-size: 50px;\n  letter-spacing: 0.2em;\n  text-shadow: 0 4px 8px rgba(0, 0, 0, 0.5);\n}\n\n.breaking-news-bar {\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 8px;\n  background: #ffffff;\n}\n\n.hide-historic-drivers.active .bi-eye {\n  display: none;\n}\n\n.hide-historic-drivers.active .bi-eye-slash {\n  display: inline;\n}\n\n.hide-historic-drivers .bi-eye {\n  display: inline;\n}\n\n.hide-historic-drivers .bi-eye-slash {\n  display: none;\n}\n\n.reload-article {\n  opacity: 1;\n}\n\n.reload-news,\n.hide-historic-drivers {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 5px;\n  color: var(--dark-text);\n  cursor: pointer;\n  transition: color 0.15s, transfrorm 0.15s;\n  font-size: 16px;\n}\n\n.reload-news::selection,\n.hide-historic-drivers::selection {\n  background: transparent;\n}\n\n.reload-news:hover,\n.hide-historic-drivers:hover {\n  color: var(--new-primary);\n}\n\n.reload-news:active span,\n.hide-historic-drivers:active span {\n  transform: scale(0.96);\n}\n\n.race-overlay {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: linear-gradient(to right, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.05));\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  justify-content: flex-end;\n  padding: 10px 15px 4px 15px;\n  z-index: 2;\n}\n\n.reaction-overlay {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: linear-gradient(to right, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.05));\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 10px 15px;\n  z-index: 2;\n}\n\n.news-centered-overlay {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background: linear-gradient(to right, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.05));\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 10px 15px;\n  z-index: 2;\n}\n\n.news-centered-overlay .news-centered-block {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  gap: 2px;\n  padding: 6px 12px;\n  border-bottom: 3px solid transparent;\n  color: var(--news-overlays-text);\n  font-family: 'Formula1Bold';\n}\n\n.news-centered-overlay .news-centered-title {\n  font-size: 26px;\n  letter-spacing: 1px;\n  text-transform: uppercase;\n  text-align: center;\n}\n\n.news-centered-overlay .news-centered-subtitle {\n  font-size: 16px;\n  letter-spacing: 0.5px;\n  opacity: 0.9;\n  text-align: center;\n  text-transform: uppercase;\n}\n\n.news-centered-overlay .news-centered-subtitle.silly-season-names {\n  font-size: 18px;\n  letter-spacing: 1px;\n  opacity: 1;\n}\n\n.reaction-overlay .reaction-title {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  gap: 2px;\n  padding: 6px 12px;\n  border-bottom: 3px solid transparent;\n  color: var(--news-overlays-text);\n  font-family: 'Formula1Bold';\n  text-transform: uppercase;\n  letter-spacing: 1px;\n}\n\n.reaction-overlay .reaction-title-text {\n  font-size: 26px;\n}\n\n.reaction-overlay .reaction-race-name {\n  font-size: 16px;\n  letter-spacing: 0.5px;\n  opacity: 0.9;\n}\n\n.race-overlay .position {\n  font-size: 20px;\n  color: var(--news-overlays-text);\n  font-family: 'Formula1Bold';\n  text-align: center;\n  min-width: 45%;\n  text-align: left;\n  text-transform: uppercase;\n}\n\n.race-overlay .position.firstpos {\n  font-size: 24px;\n  min-width: 50%;\n}\n\n.news-image {\n  width: 100%;\n  height: 100%;\n  border-top-right-radius: 10px;\n  border-top-left-radius: 10px;\n  object-fit: cover;\n  opacity: 1;\n  transition: opacity 0.15s ease;\n}\n\n.news-image.loaded {\n  opacity: 1;\n}\n\n.position-team {\n  padding-left: 4px;\n  font-size: 16px;\n  line-height: 1;\n  margin-bottom: 10px;\n  margin-top: -3px;\n  color: var(--news-overlays-text);\n}\n\n.position-team.firstpost {\n  margin-bottom: 0px;\n}\n\n@media (max-height: 768px) {\n\n  .expanded .read-button-container {\n    position: absolute;\n    top: 10px;\n    right: 10px;\n  }\n}\n\n\n\n.read-button-container {\n  display: flex;\n  flex-direction: row;\n  justify-content: flex-end;\n  min-height: 30px;\n}\n\n.read-button-container:has(.turning-point-div) {\n  justify-content: space-between;\n}\n\n.read-actions {\n  display: flex;\n  align-items: center;\n  gap: 3px;\n  justify-content: flex-end;\n}\n\n.read-button {\n  border-radius: 5px;\n  background-color: var(--elements);\n  color: var(--dark-text);\n  align-self: flex-end;\n  padding: 5px 10px;\n  cursor: pointer;\n  position: relative;\n  transition: background-color 0.15s, color 0.15s;\n}\n\n.context-read-button {\n  border-radius: 5px;\n  background-color: var(--elements);\n  color: var(--dark-text);\n  align-self: flex-end;\n  padding: 5px 8px;\n  cursor: pointer;\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  opacity: 0;\n  pointer-events: none;\n  transform: translateX(6px);\n  transition: opacity 0.15s ease, transform 0.15s ease, background-color 0.15s, color 0.15s;\n}\n\n.context-read-button i {\n  font-size: 16px;\n}\n\n.news-item:hover .context-read-button,\n.news-item:focus-within .context-read-button {\n  opacity: 1;\n  pointer-events: auto;\n  transform: translateX(0);\n}\n\n.context-read-button:hover {\n  background-color: var(--elements-hover);\n  color: var(--text-general);\n}\n\n.news-context-textarea {\n  width: 100%;\n  min-height: 140px;\n  resize: vertical;\n  border-radius: 8px;\n  border: 1px solid var(--elements-hover);\n  background-color: color-mix(in srgb, var(--elements) 70%, transparent);\n  color: var(--text-general);\n  padding: 8px 10px;\n  outline: none;\n}\n\n.news-context-textarea:focus {\n  border-color: var(--new-primary);\n  box-shadow: 0 0 0 1px color-mix(in srgb, var(--new-primary) 50%, transparent);\n}\n\n.close-modal,\n.confirm-modal {\n  border-radius: 5px;\n  background-color: transparent;\n  color: var(--dark-text);\n  padding: 5px 10px;\n  cursor: pointer;\n  position: relative;\n  transition: background-color 0.15s, color 0.15s;\n  border: none;\n}\n\n.close-modal:hover {\n  background-color: color-mix(in srgb, var(--elements) 75%, var(--negative-general));\n  color: var(--negative-general);\n}\n\n.confirm-modal:hover {\n  background-color: color-mix(in srgb, var(--elements) 75%, var(--new-primary));\n  color: var(--new-primary);\n}\n\n.read-button:hover {\n  background-color: var(--elements-hover);\n  color: var(--text-general);\n}\n\n.read-button:active,\n.close-modal:active,\n.confirm-modal:active {\n  transform: scale(0.96);\n}\n\n@property --angle {\n  syntax: \"<angle>\";\n  initial-value: 0deg;\n  inherits: false;\n}\n\n\n.read-button:not(.closable):hover::after {\n  opacity: 1;\n}\n\n\n@keyframes spin {\n  from {\n    --angle: 0deg;\n  }\n\n  to {\n    --angle: 360deg;\n  }\n}\n\n.session {\n  background-color:\n    color-mix(in srgb, white 20%, transparent);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  color: var(--news-overlays-text);\n  padding: 5px 18px;\n  text-transform: uppercase;\n  font-size: 16px;\n  margin-bottom: 7px;\n  border-radius: 7px;\n}\n\n\n.news-error.model-error {\n  background-color: color-mix(in srgb, var(--negative-general) 20%, var(--elements));\n  padding: 15px 20px;\n  border-radius: 10px;\n  border: 1px solid var(--negative-general);\n  color: var(--negative-general);\n  text-align: center;\n  width: max-content;\n}\n\n.news-error.model-retry {\n  text-align: center;\n\n}\n\nspan.news-error {\n  color: color-mix(in srgb, var(--elements) 60%, var(--text-general));\n}\n\np.news-error-api-key {\n  display: inline-block;\n  top: 60%;\n  text-align: center;\n  color: color-mix(in srgb, var(--elements) 60%, var(--text-general));\n  text-wrap: wrap;\n  white-space: normal;\n  hyphens: none;\n}\n\n.loader-div,\n.news-error {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  gap: 3px;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  transition: opacity 0.15s;\n  opacity: 1;\n}\n\n.loader-div.show {\n  opacity: 1;\n}\n\n.loader-div span {\n  font-size: 20px;\n  color: var(--text-muted)\n}\n\n.ai-progress-bar {\n  height: 7px;\n  box-shadow: 0 0 0 2px var(--new-primary) inset;\n  background-color: transparent;\n  min-width: 160px;\n  border-radius: 5px;\n  overflow: hidden;\n  outline: none;\n}\n\n.progress-div {\n  width: 0%;\n  height: 100%;\n  border-radius: 5px;\n  background-color: var(--new-primary);\n  transition: width 0.15s;\n  will-change: width;\n}\n\n.loading-dots {\n  width: 15px;\n  display: inline-block;\n}\n\n\n.word-fade {\n  opacity: 0;\n  transition: opacity 0.15s ease;\n}\n\n@keyframes slide-in-from-right {\n  from {\n    transform: translateX(50px);\n    opacity: 0;\n  }\n\n  to {\n    transform: translateX(0);\n    opacity: 1;\n  }\n}\n\n/* Keyframes para entrada desde la izquierda */\n@keyframes slide-in-from-left {\n  from {\n    transform: translateX(-50px);\n    opacity: 0;\n  }\n\n  to {\n    transform: translateX(0);\n    opacity: 1;\n  }\n}\n\n.new-number {\n  font-family: \"NumbersFont\";\n  min-width: 27px;\n  display: inline-block;\n}\n\n#newsTypeMenu .redesigned-dropdown-item,\n#newsLanguageMenu .redesigned-dropdown-item{\n  min-width: 200px;\n}\n\n#newsTypeMenu .redesigned-dropdown-item i,\n#newsLanguageMenu .redesigned-dropdown-item i {\n  display: inline-block;\n  font-size: 18px;\n  margin-left: 8px;\n  transition: transform 0.15s, opacity 0.15s;\n  transform: rotate(0deg);\n}\n\n#season_viewer .redesigned-dropdown-menu .redesigned-dropdown-item i.bi-check {\n  display: inline-block;\n  font-size: 18px;\n  margin-left: 8px;\n  transition: transform 0.15s, opacity 0.15s;\n  transform: rotate(0deg);\n}\n\n#newsTypeMenu .redesigned-dropdown-item i.unactive,\n#newsLanguageMenu .redesigned-dropdown-item i.unactive,\n#season_viewer .redesigned-dropdown-menu .redesigned-dropdown-item i.unactive,\n#aiModelmenu .dropdown-item i.unactive {\n  transform: rotate(-90deg);\n  opacity: 0;\n}\n\n#customNewsModal .redesigned-dropdown-item i {\n  display: inline-block;\n  font-size: 18px;\n  margin-left: 8px;\n  transition: transform 0.15s, opacity 0.15s;\n  transform: rotate(0deg);\n}\n\n#customNewsModal .redesigned-dropdown-item i.unactive {\n  transform: rotate(-90deg);\n  opacity: 0;\n}\n\n#customNewsModal .custom-news-row {\n  display: grid;\n  grid-template-columns: repeat(12, minmax(0, 1fr));\n  gap: 16px;\n  align-items: start;\n}\n\n#customNewsModal #customNewsForm > .custom-news-row {\n  margin-bottom: 16px;\n}\n\n#customNewsModal #customNewsForm > .custom-news-row:last-of-type {\n  margin-bottom: 0;\n}\n\n#customNewsModal .custom-news-stack {\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n  min-width: 0;\n  grid-column: span 12;\n}\n\n#customNewsModal .custom-news-stack[data-span=\"3\"] {\n  grid-column: span 3;\n}\n\n#customNewsModal .custom-news-stack[data-span=\"4\"] {\n  grid-column: span 4;\n}\n\n#customNewsModal .custom-news-stack[data-span=\"6\"] {\n  grid-column: span 6;\n}\n\n#customNewsModal .custom-news-stack[data-span=\"12\"] {\n  grid-column: span 12;\n}\n\n@media (max-width: 768px) {\n  #customNewsModal .custom-news-stack {\n    grid-column: 1 / -1 !important;\n  }\n}\n\n#customNewsModal .custom-news-hidden {\n  display: none !important;\n}\n\n#customNewsModal .custom-news-title-input {\n  margin-top: 10px;\n}\n\n#customNewsModal .custom-news-params-top {\n  margin-top: 16px;\n}\n\n#customNewsModal .custom-news-error {\n  margin-top: 16px;\n  padding: 12px 14px;\n  border-radius: 10px;\n  border: 1px solid var(--negative-general);\n  background: var(--negative-transparent);\n  color: var(--negative-general);\n  line-height: 1.45;\n}\n\n#customNewsModal .custom-news-label {\n  margin: 0;\n}\n\n#customNewsModal .custom-news-input {\n  background-color: var(--elements-hover);\n  color: var(--text-general);\n  border: 1px solid transparent;\n  outline: none;\n  box-shadow: none;\n  border-radius: 6px;\n  padding: 5px 10px;\n  font-size: 16px;\n  font-family: Formula1;\n  transition: background-color 0.15s, color 0.15s, border-color 0.15s;\n}\n\n#customNewsModal textarea.custom-news-input {\n  min-height: 150px;\n  resize: vertical;\n  line-height: 1.5;\n}\n\n#customNewsModal .custom-news-input::placeholder {\n  color: var(--text-hover);\n}\n\n#customNewsModal .custom-news-input:hover {\n  background-color: var(--new-primary-background-dropdown);\n}\n\n#customNewsModal .custom-news-input:focus {\n  background-color: var(--new-primary-background-dropdown);\n  color: var(--text-selected);\n}\n\n#customNewsModal .custom-news-switch {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  min-height: 36px;\n}\n\n#customNewsModal .custom-news-switch .form-check-input {\n  margin-top: 0;\n}\n\n#customNewsModal .custom-news-switch .form-check-label {\n  color: var(--text-general);\n}\n\n#customNewsModal .custom-news-checkbox {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  color: var(--text-general);\n  cursor: pointer;\n  min-height: 22px;\n}\n\n#customNewsModal .custom-news-checkbox .form-check-input {\n  margin-top: 0;\n  flex: 0 0 auto;\n}\n\n#customNewsModal .custom-news-checkbox .form-check-input:checked{\n  background-color: var(--new-primary);\n  border-color: var(--new-primary);\n}\n\n#customNewsModal .custom-news-checkbox-label {\n  font-family: Formula1Bold;\n}\n\n#customNewsModal .custom-news-number-control {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n}\n\n#customNewsModal .custom-news-number-input {\n  flex: 1;\n  min-width: 0;\n  text-align: center;\n}\n\n#customNewsModal .custom-news-number-control.disabled {\n  opacity: 0.55;\n}\n\n#customNewsModal .custom-news-number-control.disabled .custom-news-step-button {\n  pointer-events: none;\n}\n\n#customNewsModal .custom-news-step-button {\n  border: none;\n  color: inherit;\n  padding: 0;\n}\n\n#customNewsModal .custom-news-params {\n  margin-top: 14px;\n  display: flex;\n  flex-direction: column;\n  gap: 16px;\n}\n\n#customNewsModal .custom-news-help {\n  color: var(--text-hover);\n  font-size: 13px;\n  line-height: 1.45;\n}\n\n#customNewsDateInput::-webkit-calendar-picker-indicator {\n  filter: invert(1);\n  opacity: 0.9;\n}\n\n#customNewsModal .custom-news-info {\n  padding: 10px 12px;\n  border-radius: 10px;\n  background: var(--elements-hover);\n  color: var(--text-hover);\n  font-size: 13px;\n  line-height: 1.45;\n}\n\n#customNewsModal .custom-news-preview-frame {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  min-height: 190px;\n  padding: 12px;\n  border-radius: 12px;\n  border: 1px solid var(--elements-hover);\n  background: linear-gradient(180deg, var(--elements-hover), var(--elements-color));\n}\n\n#customNewsModal .custom-news-preview-frame img {\n  width: 100%;\n  max-height: 260px;\n  object-fit: cover;\n  border-radius: 10px;\n  box-shadow: 0 12px 24px rgba(0, 0, 0, 0.18);\n}\n\n#customNewsModal .custom-news-preview-frame.is-empty {\n  color: var(--text-hover);\n  font-size: 13px;\n  text-align: center;\n}\n\n#customNewsModal .dropdown-global {\n  width: 100%;\n  display: block;\n}\n\n#customNewsModal .redesigned-dropdown {\n  justify-content: space-between;\n  gap: 10px;\n  background-color: var(--elements-hover);\n}\n\n#customNewsModal .redesigned-dropdown:hover{\n    background-color: var(--new-primary-background-dropdown) !important;\n}\n\n#customNewsModal .redesigned-dropdown .dropdown-label {\n  min-width: 0;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n#customNewsModal .redesigned-dropdown-menu {\n  width: 100%;\n  max-width: none;\n  max-height: 250px;\n  overflow-y: auto;\n  min-width: 285px;\n}\n\n#customNewsModal .redesigned-dropdown-menu::-webkit-scrollbar,\n#customNewsModal .custom-news-image-grid::-webkit-scrollbar {\n  width: 4px;\n}\n\n#customNewsModal .redesigned-dropdown-menu::-webkit-scrollbar-thumb,\n#customNewsModal .custom-news-image-grid::-webkit-scrollbar-thumb {\n  background-color: var(--white-general);\n  border-radius: 3px;\n}\n\n#customNewsModal .redesigned-dropdown-menu::-webkit-scrollbar-thumb:hover,\n#customNewsModal .custom-news-image-grid::-webkit-scrollbar-thumb:hover {\n  background-color: var(--scrollbar-hover);\n}\n\n#customNewsTypeMenu .redesigned-dropdown-item{\n  padding-left: 14px;\n}\n\n.custom-dropdown-section-title {\n  padding: 4px 8px;\n  color: var(--text-secondary);\n  font-size: 16px;\n  overflow: hidden;\n}\n\n.custom-dropdown-section-title::marker {\n  display: none;\n  color: transparent;\n}\n\n#customNewsModal .custom-news-image-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fill, minmax(116px, 1fr));\n  gap: 12px;\n  max-height: 330px;\n  overflow-y: auto;\n  padding-right: 4px;\n}\n\n#customNewsModal .custom-news-image-card {\n  appearance: none;\n  display: flex;\n  flex-direction: column;\n  gap: 8px;\n  width: 100%;\n  padding: 0px;\n  height: 70px;\n  border: 1px solid transparent;\n  border-radius: 12px;\n  background: var(--elements-hover);\n  color: var(--text-general);\n  text-align: left;\n  cursor: pointer;\n  overflow: hidden;\n}\n\n#customNewsModal .custom-news-image-card:hover img {\n  transform: translateY(-2px)  scale(1.04);\n  filter: brightness(1.13);\n}\n\n#customNewsModal .custom-news-image-card.selected {\n  background: var(--elements-color);\n  border-color: var(--new-primary);\n  box-shadow: 0 0 0 1px rgba(225, 6, 0, 0.22);\n}\n\n#customNewsModal .custom-news-image-card:focus-visible {\n  outline: none;\n  border-color: var(--new-primary);\n  box-shadow: 0 0 0 2px rgba(225, 6, 0, 0.22);\n}\n\n#customNewsModal .custom-news-image-card img {\n  width: 100%;\n  aspect-ratio: 16 / 10;\n  object-fit: cover;\n  border-radius: 9px;\n  background: var(--background-general);\n  height: 100%;\n}\n\n#customNewsModal .custom-news-image-caption {\n  display: block;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  color: var(--text-hover);\n  font-size: 12px;\n}\n\n@media (max-width: 767px) {\n  #customNewsModal .modal-footer.custom-footer {\n    flex-direction: column-reverse;\n  }\n\n  #customNewsModal .modal-footer.custom-footer .close-modal,\n  #customNewsModal .modal-footer.custom-footer .confirm-modal {\n    width: 100%;\n  }\n}\n\n.turning-point-div {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 7px;\n}\n\n.turning-point-div .bi {\n  font-size: 18px;\n}\n\n.tp-button {\n  border-radius: 5px;\n  padding: 1px 5px;\n  border: 1px solid transparent;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n}\n\n.tp-button-selected {\n  border: none !important;\n  cursor: default !important;\n  width: 100px !important;\n  justify-content: center;\n}\n\n.tp-result-span {\n  opacity: 0;\n  animation: fadeAppearLeft 0.2s forwards 0.05s;\n}\n\n.tp-button:not(.tp-button-selected):hover {\n  transform: scale(1.04);\n}\n\n.tp-button:not(.tp-button-selected):active {\n  transform: scale(0.96);\n}\n\n.cancel-tp {\n  color: var(--negative-general);\n  background-color: color-mix(in srgb, var(--elements) 60%, var(--negative-general));\n  cursor: pointer;\n  border: 1px solid var(--negative-general);\n}\n\n.approve-tp {\n  color: var(--positive-general);\n  background-color: color-mix(in srgb, var(--elements) 60%, var(--positive-general));\n  cursor: pointer;\n  border: 1px solid var(--positive-general);\n}\n\n.random-tp {\n  color: var(--random-general);\n  background-color: color-mix(in srgb, var(--elements) 60%, var(--random-general));\n  cursor: pointer;\n  border: 1px solid var(--random-general);\n}\n\n\n.tech-grid {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  z-index: 0;\n  pointer-events: none;\n  background-size: 40px 40px;\n  background-image: linear-gradient(to right, var(--tech-grid-line) 1px, transparent 1px),\n    linear-gradient(to bottom, var(--tech-grid-line) 1px, transparent 1px);\n  mask-image: radial-gradient(circle at center, black 40%, transparent 80%);\n  -webkit-mask-image: radial-gradient(circle at center, black 40%, transparent 80%);\n}\n\n.tech-grid::after {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  pointer-events: none;\n  background-size: inherit;\n  background-image: linear-gradient(to right, var(--tech-grid-highlight-color) 1px, transparent 1px),\n    linear-gradient(to bottom, var(--tech-grid-highlight-color) 1px, transparent 1px);\n  opacity: var(--tech-grid-highlight-opacity);\n  mask-image: radial-gradient(circle var(--tech-grid-highlight-radius) at var(--glow-x) var(--glow-y), rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, 1) 20%, rgba(0, 0, 0, 0) 70%);\n  -webkit-mask-image: radial-gradient(circle var(--tech-grid-highlight-radius) at var(--glow-x) var(--glow-y), rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, 1) 20%, rgba(0, 0, 0, 0) 70%);\n}\n\n.glow-spot {\n  position: absolute;\n  top: 0;\n  left: 50%;\n  transform: translateX(-50%);\n  width: 600px;\n  height: 600px;\n  background-color: var(--new-primary);\n  border-radius: 50%;\n  filter: blur(120px);\n  opacity: 0.1;\n  z-index: 0;\n  pointer-events: none;\n  transition: opacity 0.15s ease;\n}\n\n.glow-spot--off {\n  opacity: 0;\n}\n\n/* --- UTILIDADES TEXTO --- */\n.text-primary {\n  color: var(--new-primary);\n}\n\n.upload-desc {\n  color: var(--text-muted);\n  height: 30px;\n}\n\n.upload-desc input {\n  background-color: transparent;\n  border: none;\n  color: var(--new-primary);\n  text-decoration: underline;\n  outline: none;\n  cursor: pointer;\n}\n\n\n\n.font-mono {\n  font-family: monospace;\n}\n\n/* --- NAVBAR --- */\n.navbar {\n  position: relative;\n  z-index: 10;\n  width: 100%;\n  max-width: 1280px;\n  /* max-w-7xl */\n  margin: 0 auto;\n  padding: 1.5rem;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n\n.nav-brand {\n  display: flex;\n  align-items: center;\n  gap: 0.5rem;\n  font-size: 1.125rem;\n  font-weight: 600;\n  letter-spacing: -0.025em;\n}\n\n.nav-brand span span {\n  color: #64748b;\n}\n\n.nav-links {\n  display: flex;\n  gap: 1.5rem;\n  font-size: 0.875rem;\n  font-weight: 500;\n}\n\n.nav-links a:hover {\n  color: var(--new-primary);\n}\n\n/* --- MAIN CONTAINER --- */\n.main-container {\n  position: relative;\n  z-index: 10;\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  padding: 0 1rem;\n  text-align: center;\n}\n\n/* --- HERO SECTION --- */\n.hero-section {\n  max-width: 56rem;\n  align-items: center;\n  display: flex;\n  flex-direction: column;\n  margin: 0 auto 1rem auto;\n  opacity: 0;\n  transform: translateY(20px);\n  animation: fadeIn 0.8s ease-out forwards;\n}\n\n.badge-version {\n  display: inline-block;\n  padding: 0.25rem 0.75rem;\n  border-radius: 9999px;\n  background-color: var(--new-primary-transparent);\n  border: 1px solid var(--new-primary);\n  color: var(--new-primary);\n  font-size: 0.75rem;\n  font-weight: 700;\n  letter-spacing: 0.1em;\n  text-transform: uppercase;\n  cursor: pointer;\n  margin-bottom: 1.5rem;\n  transition: background-color 0.15s, color 0.15s;\n}\n\n.badge-version:hover {\n  background-color: var(--new-primary);\n  color: var(--white-general);\n}\n\n.badge-version:active {\n  transform: scale(0.96);\n}\n\n\n.hero-title {\n  font-size: 3rem;\n  /* fallback mobile */\n  font-weight: 900;\n  white-space: nowrap;\n  text-transform: uppercase;\n  line-height: 0.9;\n  text-shadow: 0 0 40px rgba(200, 158, 252, 0.2);\n  color: var(--hero-title);\n  margin-bottom: 1.5rem;\n  text-align: center;\n  font-family: 'Formula1Dark';\n}\n\n\n@media (min-width: 768px) {\n  .hero-title {\n    font-size: 5.5rem;\n  }\n}\n\n\n#statusTitle {\n  color: var(--text-general) !important;\n}\n\n.gradient-text {\n  background: linear-gradient(135deg, var(--hero-title) 30%, var(--new-primary) 100%);\n  -webkit-background-clip: text;\n  -webkit-text-fill-color: transparent;\n}\n\n.hero-desc {\n  color: var(--text-muted);\n  font-size: 1.125rem;\n  font-weight: 300;\n  max-width: 42rem;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  margin: 0 auto;\n  text-align: center;\n  line-height: 1.6;\n}\n\n.fake-text-and-animated-container {\n  position: relative;\n  height: 28px;\n}\n\n#animatedText {\n  white-space: pre;\n  text-align: left;\n  height: 28px;\n  display: inline-block;\n  position: absolute;\n  left: 0px;\n  top: 0px;\n  color: var(--text-muted);\n}\n\n.fake-text {\n  opacity: 0;\n  height: 28px;\n  pointer-events: none;\n  white-space: nowrap;\n}\n\n#static-text {\n  color: var(--text-muted);\n}\n\n@keyframes pop-in {\n  0% {\n    opacity: 0;\n    transform: translateY(-11px) scale(0.8);\n    color: var(--text-general);\n  }\n\n  50% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 1;\n    transform: translateY(0) scale(1);\n    color: var(--text-muted);\n  }\n}\n\n#animatedText .char {\n  display: inline-block;\n  opacity: 0;\n  animation: pop-in 0.10s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;\n}\n\n.drop-zone {\n  position: relative;\n  padding: 3rem;\n  transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n  overflow: hidden;\n}\n\n\n.select-file-input {\n  position: relative;\n  display: inline-block;\n  width: 100%;\n  height: 100%;\n  color: var(--new-primary);\n}\n\n.file-input-hidden {\n  position: absolute;\n  inset: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0;\n  cursor: pointer;\n  z-index: 20;\n}\n\n.socials-container {\n  display: flex;\n  flex-direction: row;\n  justify-content: center;\n  align-items: center;\n  gap: 25px;\n  margin-top: 4rem;\n  color: var(--text-muted);\n}\n\n.socials-container a {\n  color: var(--text-muted);\n  text-decoration: none;\n  transition: color 0.15s;\n}\n\n.socials-container a.bi-custom-patreon::before {\n  background-color: var(--text-muted);\n}\n\n.icon-circle {\n  width: 5rem;\n  height: 5rem;\n  border-radius: 50%;\n  background-color: color-mix(in srgb, var(--new-primary) 25%, var(--background));\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-bottom: 1rem;\n  transition: background-color 0.15s ease, transform 0.15s ease;\n}\n\n.icon-circle.success-mode {\n  background-color: color-mix(in srgb, var(--positive-general) 25%, var(--background)) !important;\n}\n\n.idle-content {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n\n.icon-circle.success-mode i {\n  color: var(--positive-general) !important;\n}\n\n.icon-scale-0 {\n  transform: scale(0) !important;\n}\n\n.icon-circle i {\n  font-size: 3.1rem;\n  padding-bottom: 4px;\n}\n\n#statusIcon {\n  transition: transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275), color 0.15s ease;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  transform: scale(1);\n}\n\n.bi-lock#statusIcon {\n  font-size: 2.8rem;\n  color: var(--new-secondary);\n}\n\n.drop-zone h3 {\n  font-size: 1.5rem;\n  font-weight: 700;\n  margin-bottom: 0.5rem;\n  transition: color 0.15s;\n}\n\n.tags-container {\n  display: flex;\n  gap: 1rem;\n  font-size: 0.75rem;\n  color: #475569;\n  /* slate-600 */\n  font-family: monospace;\n}\n\n.tag {\n  background-color: #0f172a;\n  /* slate-900 */\n  padding: 0.25rem 0.5rem;\n  border-radius: 0.25rem;\n  border: 1px solid #1e293b;\n  /* slate-800 */\n}\n\n/* Estados: Cargando y Éxito */\n.overlay-state {\n  display: none;\n  /* Oculto por defecto */\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  border-radius: 1rem;\n  z-index: 30;\n}\n\n.overlay-state.visible {\n  display: flex;\n}\n\n.loading-bg {\n  background-color: rgba(19, 19, 31, 0.9);\n  backdrop-filter: blur(8px);\n}\n\n.success-bg {\n  background-color: rgba(19, 19, 31, 0.95);\n  backdrop-filter: blur(8px);\n}\n\n/* Spinner */\n.spinner {\n  width: 4rem;\n  height: 4rem;\n  border: 4px solid rgba(200, 158, 252, 0.3);\n  border-top-color: var(--new-primary);\n  border-radius: 50%;\n  animation: spin 1s linear infinite;\n  margin-bottom: 1rem;\n}\n\n\n.drag-active {\n  border-color: var(--new-primary);\n  /* Un borde sólido morado */\n  color: var(--new-primary);\n\n  box-shadow: inset 0 0 60px 7px var(--new-primary);\n}\n\n\n\n/* --- Spinner Personalizado --- */\n.loading-spinner {\n  width: 50px;\n  height: 50px;\n  border: 5px solid var(--new-primary-transparent);\n  border-radius: 50%;\n  border-top-color: var(--new-primary);\n  opacity: 0;\n  position: absolute;\n  transition: opacity 0.15s ease-in-out;\n}\n\n.loading-spinner.show {\n  animation: spin 1s ease-in-out infinite;\n  opacity: 1;\n}\n\n.save-file-button {\n  text-decoration: none !important;\n  color: var(--new-primary);\n  background-color: transparent;\n  padding: 3px 5px;\n  border-radius: 5px;\n  transition: background-color 0.15s, color 0.15s;\n}\n\n.save-file-button:hover {\n  text-decoration: none;\n  background-color: var(--new-primary-transparent);\n}\n\n.save-file-button:active {\n  transform: scale(0.96);\n}\n\n.recents-container {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n\n.recent-label {\n  font-size: 18px;\n  color: var(--text-general);\n}\n\n.recents-list {\n  display: flex;\n  flex-direction: row;\n  gap: 10px;\n  flex-wrap: wrap;\n  justify-content: center;\n}\n\n.recent-file {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 3px;\n}\n\n.file-name:hover {\n  background-color: color-mix(in srgb, var(--new-primary) 25%, var(--background));\n}\n\n.file-name:active {\n  transform: scale(0.96);\n}\n\n\n.file-name {\n  color: var(--new-primary);\n  font-size: 14px;\n  cursor: pointer;\n  background-color: transparent;\n  padding: 3px 5px;\n  border-radius: 5px;\n  transition: background-color 0.15s, color 0.15s;\n  text-decoration: underline;\n}\n\n.last-opened-time {\n  font-size: 12px;\n  cursor: pointer;\n  color: var(--text-muted);\n  background-color: transparent;\n  padding: 3px 5px;\n  border-radius: 5px;\n  min-width: 67px;\n  text-align: center;\n  transition: color 0.15s, background-color 0.15s;\n}\n\n.last-opened-time:hover {\n  color: var(--negative-general);\n  background-color: color-mix(in srgb, var(--elements) 75%, var(--negative-general));\n}\n\n@keyframes spin {\n  to {\n    transform: rotate(360deg);\n  }\n}\n\n.success-icon-bg {\n  background-color: var(--positive-transparent);\n  /* Tu variable */\n  width: 4rem;\n  height: 4rem;\n  margin-bottom: 1rem;\n  border-radius: 50%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin: 0 auto 1rem auto;\n}\n\n\n/* --- ANIMACIONES --- */\n@keyframes fadeIn {\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n@keyframes pulse-glow {\n\n  0%,\n  100% {\n    box-shadow: 0 0 15px var(--new-primary-glow);\n    border-color: var(--new-primary);\n  }\n\n  50% {\n    box-shadow: 0 0 30px var(--new-primary-glow);\n    border-color: #e0c4ff;\n  }\n}\n\n.redesigned-dropdown {\n  display: flex;\n  align-items: center;\n  background: transparent;\n  outline: none;\n  border: none;\n  border-radius: 6px;\n  color: var(--text-general);\n  gap: 10px;\n  transform: rotate(0deg);\n  transition: background-color 0.15s, color 0.15s;\n  padding: 5px 10px;\n}\n\n.redesigned-dropdown i {\n  transform: rotate(0deg);\n  transition: transform 0.15s;\n}\n\n.redesigned-dropdown.open i {\n  transform: rotate(180deg);\n}\n\n.redesigned-dropdown:hover,\n.redesigned-dropdown.open {\n  background-color: var(--new-primary-background-dropdown);\n  color: var(--white-general);\n}\n\n.redesigned-dropdown:hover .redesigned-chevron,\n.redesigned-dropdown.open .redesigned-chevron {\n  background-color: var(--white-general);\n}\n\n.redesigned-dropdown-menu {\n  background-color: var(--dropdown-back);\n  border: none;\n  box-shadow: var(--shadow-m);\n  border-radius: 10px;\n  margin-top: 5px;\n  padding: 5px;\n  position: absolute;\n  z-index: 100;\n  transition: opacity 0.15s, transform 0.15s;\n}\n\n.dropdown-global {\n  position: relative;\n  display: inline-block;\n}\n\n#teamMenu .redesigned-dropdown-item, .team-select-menu .redesigned-dropdown-item {\n  padding: 2px 8px 2px 0px !important;\n}\n\n.team-select-menu .redesigned-dropdown-item{\n  min-width: 230px;\n}\n\n#objectiveMenu {\n  min-width: 280px;\n}\n\n#attributeMenu{\n  min-width: 200px;\n}\n\n#staffMenu{\n  min-width: 220px;\n}\n\n.redesigned-dropdown-item {\n  padding: 4px 8px;\n  border-radius: 7px;\n  cursor: pointer;\n  text-decoration: none;\n  color: var(--text-general);\n  transition: background-color 0.15s, color 0.15s;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  min-width: 100px;\n  gap: 8px;\n}\n\n.redesigned-dropdown-item:hover {\n  background-color: var(--dropdown-hover);\n  color: var(--white-general);\n}\n\n.custom-news-driver-option {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  min-width: 0;\n  flex: 1;\n}\n\n.custom-news-driver-option-logo {\n  width: 18px;\n  height: 18px;\n  object-fit: contain;\n  flex: 0 0 18px;\n}\n\n.custom-news-driver-option-text {\n  min-width: 0;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.dropdown-global:has(.redesigned-dropdown:not(.open)) .redesigned-dropdown-menu {\n  opacity: 0;\n  transform: translateY(-10px);\n  pointer-events: none;\n}\n\n.dropdown-global:has(.redesigned-dropdown.open) .redesigned-dropdown-menu {\n  transform: translateY(0);\n  pointer-events: auto;\n}\n\n\n\n/*svg image*/\n.redesigned-chevron {\n  mask: url('/assets/images/redesigned-chevron.svg') no-repeat center;\n  mask-size: contain;\n  background-color: var(--text-general);\n  transition: background-color 0.15s, transform 0.15s;\n  width: 12px;\n  height: 12px;\n}\n\n.redesigned-chevron.clicked{\n  transform: rotate(180deg);\n}\n\n#teamMenu {\n  padding-right: 0px;\n  width: 250px;\n}\n\n#seasonObjectiveInput {\n  width: 40px;\n}\n\n.team-viewer .custom-input-number {\n  padding: 5px 8px;\n  text-align: left;\n  font-size: 18px;\n}\n\n.pit-crew-middle {\n  border-left: 2px solid var(--separator-light);\n  border-radius: 0;\n  border-right: 2px solid var(--separator-light);\n  padding: 0 12px;\n}\n\n.pit-crew-group .one-stat-panel {\n  padding: 0 12px;\n  border-radius: 0;\n}\n\n.team-viewer .bar-container {\n  height: auto;\n}\n\n.unit-and-input {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  padding: 0 0px 0 10px;\n  border-radius: 7px;\n}\n\n.unit-label {\n  color: var(--text-secondary)\n}\n\n.gauge-container {\n  position: relative;\n  height: 50px;\n  font-family: sans-serif;\n}\n\n.gauge-svg {\n  width: 100%;\n  height: 100%;\n  transform: rotate(135deg);\n}\n\n.gauge-circle {\n  fill: none;\n  stroke-width: 8;\n  stroke-linecap: round;\n}\n\n.gauge-bg {\n  stroke: var(--separator-light);\n  stroke-dasharray: 212 283;\n}\n\n.gauge-progress {\n  stroke: var(--positive-general);\n  transition: stroke-dashoffset 0.15s ease;\n\n  stroke-dasharray: 212 283;\n  stroke-dashoffset: calc(212 - (212 * var(--perc) / 100));\n}\n\n.gauge-indicator{\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  font-size: 14px;\n  color: var(--positive-general);\n  font-family: \"Formula1Bold\";\n}\n\n.gauge-and-buttons{\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 12px;\n  margin-left: 15px;\n}\n\n.gauge-and-buttons .input-buttons{\n  flex-direction: column;\n  gap: 6px;\n}\n\n.gauge-and-buttons .input-buttons i:hover{\n  color: var(--positive-general);\n}\n\n.facility .stats-header-separator{\n  height: 90%;\n}\n\n.facility-group{\n  width: 100%;\n}\n\n/*margin top top facility group but not the first one*/\n.facility-group:not(:first-child){\n  margin-top: 20px;\n}\n\n\n.script-view.hide .facility-group{\n  pointer-events: none;\n}\n\n.script-view.hide *{\n  pointer-events: none;\n}\n\n\n.facilities-pills a::before{\n  z-index: 0;\n}\n\n.facilities-pills .basic-label{\n  z-index: 1;\n}\n\n.facilities-pills a:not(.active) .basic-label{\n  color: var(--text-secondary);\n}\n\n.facilities-pills a:hover .basic-label{\n  color: var(--text-general);\n}\n\n.unit-measure{\n  color: var(--text-tertiary);\n}\n\n.new-augment-button.bi-chevron-left, .new-augment-button.bi-chevron-right{\n  font-size: 14px;\n  width: 18px;\n  height: 18px;\n  padding-top: 1px;\n}\n\n.new-augment-button.bi-chevron-left{\n  padding-right: 2px;\n}\n\n.new-augment-button.bi-chevron-right{\n  padding-left: 2px;\n}\n\n.news-options-global{\n  position: absolute;\n  right: 10px;\n  top: 10px;\n  /* display: flex; */\n  text-align: center;\n  z-index: 200;\n}\n\n.news-options{\n  background-color: var(--elements);\n  border-radius: 5px;\n  width: 24px;\n  height: 24px;\n  color: var(--text-general);\n  cursor: pointer;\n}\n\n.news-options:hover{\n  color: var(--new-primary);\n}\n\n.news-options:active{\n  transform: scale(0.96);\n}\n\n.news-options i{\n  pointer-events: none;\n}\n\n.news-options-menu{\n  background-color: var(--dropdown-back);\n  border-radius: 10px;\n  box-shadow: var(--shadow-m);\n  position: absolute;\n  z-index: 200;\n  margin-top: 5px;\n  padding: 5px;\n  width: max-content;\n  right: 0;\n  opacity: 0;\n  pointer-events: none;\n  transform: translateY(-10px);\n  transition: opacity 0.15s, transform 0.15s;\n}\n\n.news-options-context{\n  margin-top: 0px;\n  border-top: 0 solid color-mix(in srgb, var(--text-general) 12%, transparent);\n  padding: 0;\n  max-height: 0;\n  opacity: 0;\n  overflow: hidden;\n  transform: translateY(-6px);\n  pointer-events: none;\n  transition: max-height 0.25s ease, opacity 0.15s ease, transform 0.25s ease, padding 0.25s ease, margin-top 0.25s ease;\n}\n\n.news-options-context.open{\n  padding: 0px;\n  margin-top: 5px;\n  max-height: 220px;\n  opacity: 1;\n  transform: translateY(0);\n  pointer-events: auto;\n}\n\n.news-options-context-textarea{\n  width: 300px;\n  height: 110px;\n  resize: none;\n  background: transparent;\n  border: 1px solid color-mix(in srgb, var(--text-general) 18%, transparent);\n  border-radius: 10px;\n  padding: 10px;\n  color: var(--text-general);\n  outline: none;\n  font: inherit;\n}\n\n.news-options-context-textarea:focus{\n  border-color: color-mix(in srgb, var(--new-primary) 60%, transparent);\n}\n\n.news-options-context-actions{\n  display: flex;\n  justify-content: flex-end;\n  gap: 10px;\n  margin-top: 5px;\n}\n\n.news-options-global:has(.news-options.active) .news-options-menu{\n  opacity: 1;\n  pointer-events: auto;\n  transform: translateY(0);\n}\n\n.difficulty-options{\n  display: flex;\n  flex-direction: column;\n  gap: 10px;\n  width: 100%;\n}\n\n.one-difficulty{\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  gap: 5px;\n}\n\n.dif-title{\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 5px;\n  width: 100%;\n}\n\n.dif-buttons{\n  display: flex;\n  flex-direction: row;\n  gap: 3px;\n}\n\n.dif-title .avg-separator{\n  background-color: var(--disabled-text);\n  width: 1px;\n}\n\n.dif-status{\n  font-size: 13px;\n  flex-grow: 1;\n}\n\n.dif-description{\n  font-size: 13px;\n}\n\n.dif-status.disabled{\n  color: var(--text-tertiary);\n}\n\n\n#contractModal .modal-subtitle{\n  color: var(--text-secondary);\n  margin: 0;\n  font-size: 16px;\n}\n\n.junior-driver-right{\n  margin-left: 10px;\n}\n\n#juniorTeamContractMenu{\n  max-height: 300px;\n  min-width: 400px;\n  overflow-y: auto;\n}\n\n#juniorTeamContractMenu a{\n  font-size: 16px;\n  justify-content: flex-start;\n}\n\n.junior-team-drivers-list{\n  display: flex;\n  flex-direction: column;\n  margin-top: 10px;\n}\n\n.contract-categories{\n  display: flex;\n  flex-direction: row;\n  gap: 8px;\n  align-items: center;\n  margin-left: 10px;\n  flex-grow: 1;\n}\n\n.contract-categories .contract-category{\n  padding: 2px 5px;\n  border-radius: 5px;\n  background-color: transparent;\n  color: var(--text-tertiary);\n  font-size: 14px;\n  cursor: pointer;\n  transition: background-color 0.15s, color 0.15s;\n}\n\n.contract-categories .contract-category.active{\n  background-color: var(--new-primary-transparent);\n  color: var(--new-primary);\n}\n\n.contract-categories .contract-category:hover{\n  background-color: var(--new-primary-transparent);\n  color: var(--new-primary);\n}\n\n.contract-categories .contract-category:active{\n  transform: scale(0.96);\n}\n\n/* customizable snowflake styling */\n.snowflake {\n  color: #fff;\n  font-size: 1em;\n  font-family: Arial, sans-serif;\n  text-shadow: 0 0 5px #000;\n}\n \n.snowflake,.snowflake .inner{animation-iteration-count:infinite;animation-play-state:running}@keyframes snowflakes-fall{0%{transform:translateY(0)}100%{transform:translateY(110vh)}}@keyframes snowflakes-shake{0%,100%{transform:translateX(0)}50%{transform:translateX(80px)}}.snowflake{position:fixed;top:-10%;z-index:9999;-webkit-user-select:none;user-select:none;cursor:default;pointer-events:none;animation-name:snowflakes-shake;animation-duration:3s;animation-timing-function:ease-in-out}.snowflake .inner{animation-duration:10s;animation-name:snowflakes-fall;animation-timing-function:linear}.snowflake:nth-of-type(0){left:1%;animation-delay:0s}.snowflake:nth-of-type(0) .inner{animation-delay:0s}.snowflake:first-of-type{left:10%;animation-delay:1s}.snowflake:first-of-type .inner,.snowflake:nth-of-type(8) .inner{animation-delay:1s}.snowflake:nth-of-type(2){left:20%;animation-delay:.5s}.snowflake:nth-of-type(2) .inner,.snowflake:nth-of-type(6) .inner{animation-delay:6s}.snowflake:nth-of-type(3){left:30%;animation-delay:2s}.snowflake:nth-of-type(11) .inner,.snowflake:nth-of-type(3) .inner{animation-delay:4s}.snowflake:nth-of-type(4){left:40%;animation-delay:2s}.snowflake:nth-of-type(10) .inner,.snowflake:nth-of-type(4) .inner{animation-delay:2s}.snowflake:nth-of-type(5){left:50%;animation-delay:3s}.snowflake:nth-of-type(5) .inner{animation-delay:8s}.snowflake:nth-of-type(6){left:60%;animation-delay:2s}.snowflake:nth-of-type(7){left:70%;animation-delay:1s}.snowflake:nth-of-type(7) .inner{animation-delay:2.5s}.snowflake:nth-of-type(8){left:80%;animation-delay:0s}.snowflake:nth-of-type(9){left:90%;animation-delay:1.5s}.snowflake:nth-of-type(9) .inner{animation-delay:3s}.snowflake:nth-of-type(10){left:25%;animation-delay:0s}.snowflake:nth-of-type(11){left:65%;animation-delay:2.5s}\n\n\n/* BENTO GRID STYLES */\n\n.main-viewer-section:has(.season-review-bento:not(.d-none)), .main-viewer-section:has(.session-results-table:not(.d-none)) {\n  background-color: transparent;\n  box-shadow: none;\n}\n\n.season-review-bento {\n  display: flex;\n  width: 100%;\n  height: calc(100vh - 140px);\n  align-items: center;\n  justify-content: center;\n}\n\n.bento-grid {\n  display: grid;\n  width: 100%;\n  height: 100%;\n  grid-template-columns: repeat(8, 1fr);\n  grid-template-rows: repeat(5, 1fr);\n  gap: 12px;\n  padding: 2px 8px;\n  color: var(--text-general);\n} \n\n.bento-item {\n  background-color: var(--superficials);\n  display: flex;\n  flex-direction: column;\n  padding: 12px 15px;\n  justify-content: flex-start;\n  gap: 8px;\n  border-radius: 10px;\n  box-shadow: var(--shadow-m);\n  outline: 2px solid transparent;\n  transition: outline-color 0.15s ease, background-color 0.15s ease;\n  /* min-height: 120px; */\n}\n\n.item-1:hover, .item-2:hover, .item-3:hover, .item-5:hover, .item-6:hover, .item-7:hover, .item-8:hover, .item-9:hover, .item-10:hover {\n  outline-color: var(--new-primary);\n  background-color: color-mix(in srgb, var(--new-primary-transparent) 50%, var(--superficials))\n}\n\n.item-1:active, .item-2:active, .item-3:active, .item-5:active, .item-6:active, .item-7:active, .item-8:active, .item-9:active, .item-10:active {\n  transform: scale(0.98);\n}\n\n/* Layout específico de cada bloque */\n.item-1 {\n  grid-column: span 2;\n  grid-row: span 4;\n  cursor: pointer;\n}\n\n.item-2 {\n  grid-column: span 2;\n  grid-row: span 2;\n  cursor: pointer;\n}\n\n.item-3 {\n  grid-column: span 4;\n  grid-row: span 2;\n  cursor: pointer;\n}\n\n.item-4 {\n  grid-column: span 4;\n  grid-row: span 2;\n}\n\n.item-5 {\n  grid-column: span 2;\n  grid-row: span 2;\n  cursor: pointer;\n}\n\n.item-6 {\n  grid-column: span 1;\n  grid-row: span 1;\n  cursor: pointer;\n}\n\n.item-7 {\n  grid-column: span 2;\n  grid-row: span 1;\n  cursor: pointer;\n}\n\n.item-8 {\n  grid-column: span 2;\n  grid-row: span 1;\n  cursor: pointer;\n}\n\n.item-9 {\n  grid-column: span 2;\n  grid-row: span 1;\n  cursor: pointer;\n}\n\n.item-10 {\n  grid-column: span 1;\n  grid-row: span 1;\n  cursor: pointer;\n}\n\n@media (min-height: 1080px) {\n  .item-6, .item-7, .item-8, .item-9, .item-10 {\n    height: fit-content;\n  }\n\n  .bento-split-list{\n    flex-grow: 0;\n  }\n\n  .bento-standings-half, .item-6 .wins-drivers-list, .item-10 .wins-drivers-list{\n    justify-content: flex-start;\n    gap: 8px;\n  }\n}\n\n.bento-grid .stats-header-separator{\n  background-color: var(--text-tertiary);\n}\n\n\n.bento-title{\n  font-size: 18px;\n  color: var(--text-general);\n  display: flex;\n  align-items: baseline;\n  gap: 5px;\n}\n\n.bento-subtitle{\n  font-size: 16px;\n  font-family: \"Formula1\";\n  color: var(--text-tertiary);\n}\n\n.bento-driver-standings{\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  justify-content: space-between;\n  height: 100%;\n}\n\n.bento-team-standings{\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  justify-content: space-between;\n  height: 100%;\n}\n\n.bento-split-list{\n  display: flex;\n  flex-direction: row;\n  width: 100%;\n  gap: 10px;\n  flex-grow: 1;\n}\n\n.bento-split-list .bento-standings-half + .bento-standings-half{\n  border-left: 2px solid var(--text-tertiary);\n  padding-left: 12px;\n}\n\n.bento-standings-half{\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  justify-content: space-between;\n}\n\n.season-review-driver{\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 8px;\n}\n\n.season-review-driver:has(.season-review-driver-position.champion) .season-review-driver-position{\n  border-left: 2px solid #FEDB37;\n  background: linear-gradient(90deg, rgba(254, 219, 55, 0.35) 0%, transparent 75%);\n}\n\n.season-review-driver:has(.season-review-driver-position.champion) .season-review-driver-points:not(.diff){\n  border-right: 2px solid #FEDB37;\n  background: linear-gradient(270deg, rgba(254, 219, 55, 0.35) 0%, transparent 75%);\n}\n\n.season-review-driver-logo-div{\n  width: 24px;\n  height: 24px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.season-review-driver-logo-div .drivers-table-logo{\n  width: 24px;\n  height: 24px;\n  object-fit: contain;\n}\n\n.season-review-driver-name{\n  flex-grow: 1;\n  color: var(--text-general);\n}\n\n.season-review-driver-position{\n  font-family: \"NumbersBold\";\n  width: 25px;\n  text-align: center;\n  padding-top: 1px;\n  height: 22px;\n}\n\n.season-review-driver-points{\n  font-family: \"NumbersBold\";\n  width: 52px;\n  text-align: center;\n  padding-top: 1px;\n  height: 22px;\n}\n\n.season-review-driver-points.diff{\n  font-family: \"NumbersFont\";\n  color: var(--text-tertiary);\n  margin-right: -15px;\n}\n\n#standings2ndhalf{\n  border-left: 1px solid var(--separator-light);\n  padding-left: 15px;\n}\n\n#standings1sthalf{\n  padding-right: 5px;\n}\n\n.season-review-driver-name span:not(.bold-font){\n  color: var(--text-secondary);\n}\n\n.season-review-driver-name span.bold-font{\n  text-transform: uppercase;\n}\n\n.season-review-team{\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 8px;\n  height: 22px;\n}\n\n.season-review-team:has(.season-review-team-position.champion) .season-review-team-position{\n  border-left: 2px solid #FEDB37;\n  background: linear-gradient(90deg, rgba(254, 219, 55, 0.35) 0%, transparent 75%);\n}\n\n.season-review-team:has(.season-review-team-position.champion) .season-review-team-points:not(.diff){\n  border-right: 2px solid #FEDB37;\n  background: linear-gradient(270deg, rgba(254, 219, 55, 0.35) 0%, transparent 75%);\n}\n\n.season-review-team-logo-div{\n  width: 24px;\n  height: 24px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.season-review-team-logo-div .drivers-table-logo{\n  width: 24px;\n  height: 24px;\n  object-fit: contain;\n}\n\n.season-review-team-name{\n  flex-grow: 1;\n  text-transform: uppercase;\n  color: var(--text-general);\n}\n\n.season-review-team-position{\n  font-family: \"NumbersBold\";\n  width: 25px;\n  text-align: center;\n  height: 22px;\n}\n\n.season-review-team-points{\n  font-family: \"NumbersBold\";\n  width: 52px;\n  text-align: center;\n  height: 22px;\n}\n\n.season-review-team-points.diff{\n  font-family: \"NumbersFont\";\n  color: var(--text-tertiary);\n  margin-right: -15px;\n}\n\n#teamStandings{\n  width: 100%;\n}\n\n.bento-comparison-container{\n  display: flex;\n  flex-direction: row;\n  gap: 9px;\n  align-items: flex-start;\n  justify-content: space-between;\n}\n\n.bento-sub-item-comparison{\n  display: flex;\n  flex-direction: row;\n  align-items: flex-start;\n  width: 50%;\n  gap: 4px;\n}\n\n.bento-qualifying-container{\n  display: flex;\n  flex-direction: row;\n  gap: 12px;\n  align-items: flex-start;\n  justify-content: space-between;\n}\n\n.bento-sub-item-qualifying{\n  display: flex;\n  flex-direction: row;\n  align-items: flex-start;\n  width: 33.333%;\n}\n\n.bento-sub-item-qualifying .bento-vertical-label{\n  font-size: 20px;\n}\n\n.poles-comparison,\n.q3-comparison,\n.q2-comparison{\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n}\n\n.poles-comparison.with-scrollbar,\n.q3-comparison.with-scrollbar,\n.q2-comparison.with-scrollbar,\n.bento-driver-standings.with-scrollbar,\n.bento-team-standings.with-scrollbar,\n.race-comparison.with-scrollbar,\n.quali-comparison.with-scrollbar {\n  padding-right: 6px;\n}\n\n.bento-vertical-label{\n  writing-mode: vertical-rl;\n  text-orientation: sideways;\n  transform: rotate(180deg);\n  color: var(--text-tertiary);\n  font-size: 28px;\n  letter-spacing: 1px;\n  user-select: none;\n  line-height: 1;\n}\n\n.bento-subtitle{\n  color: var(--text-tertiary);\n}\n\n.race-comparison{\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  justify-content: space-between;\n  padding: 2px;\n}\n\n.quali-comparison{\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  justify-content: space-between;\n  padding: 2px;\n}\n\n.season-review-comparison-row{\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  width: 100%;\n  height: 22px;\n  border-radius: 4px;\n  outline: 1px solid transparent;\n  padding: 0 6px;\n  cursor: pointer;\n}\n\n.season-review-comparison-row.fe:hover{\n  outline-color: var(--ferrari-primary);\n  background-color: color-mix(in srgb, var(--ferrari-primary) 12%, var(--superficials));\n}\n\n.season-review-comparison-row.mc:hover{\n  outline-color: var(--mclaren-primary);\n  background-color: color-mix(in srgb, var(--mclaren-primary) 12%, var(--superficials));\n}\n\n.season-review-comparison-row.rb:hover{\n  outline-color: var(--redbull-primary);\n  background-color: color-mix(in srgb, var(--redbull-primary) 12%, var(--superficials));\n}\n\n.season-review-comparison-row.me:hover{\n  outline-color: var(--mercedes-primary);\n  background-color: color-mix(in srgb, var(--mercedes-primary) 12%, var(--superficials));\n}\n\n.season-review-comparison-row.al:hover{\n  outline-color: var(--alpine-primary);\n  background-color: color-mix(in srgb, var(--alpine-primary) 12%, var(--superficials));\n}\n\n.season-review-comparison-row.wi:hover{\n  outline-color: var(--williams-primary);\n  background-color: color-mix(in srgb, var(--williams-primary) 12%, var(--superficials));\n}\n\n.season-review-comparison-row.ha:hover{\n  outline-color: var(--haas-primary);\n  background-color: color-mix(in srgb, var(--haas-primary) 12%, var(--superficials));\n}\n\n.season-review-comparison-row.at:hover{\n  outline-color: var(--alphatauri-primary);\n  background-color: color-mix(in srgb, var(--alphatauri-primary) 12%, var(--superficials));\n}\n\n.season-review-comparison-row.af:hover{\n  outline-color: var(--alfa-primary);\n  background-color: color-mix(in srgb, var(--alfa-primary) 12%, var(--superficials));\n}\n\n.season-review-comparison-row.as:hover{\n  outline-color: var(--aston-primary);\n  background-color: color-mix(in srgb, var(--aston-primary) 12%, var(--superficials));\n}\n\n.season-review-comparison-row.ct:hover{\n  outline-color: var(--custom-team-primary);\n  background-color: color-mix(in srgb, var(--custom-team-primary) 12%, var(--superficials));\n}\n\n.season-review-comparison-row:active{\n  transform: scale(0.98);\n}\n\n.season-review-comparison-name{\n  flex: 1;\n  font-size: 14px;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  text-transform: uppercase;\n  color: var(--text-general);\n}\n\n.season-review-comparison-name.right{\n  text-align: right;\n}\n\n.season-review-comparison-score{\n  font-family: \"NumbersFont\";\n  width: 26px;\n  text-align: center;\n  padding-top: 3px;\n  font-size: 14px;\n}\n\n.season-review-qualifying-row{\n  display: flex;\n  align-items: center;\n  width: 100%;\n  height: 22px;\n  gap: 4px;\n}\n\n.season-review-qualifying-position{\n  font-family: \"NumbersBold\";\n  width: 28px;\n  text-align: center;\n  font-size: 14px;\n  padding-top: 3px;\n  height: 22px;\n}\n\n.season-review-qualifying-name{\n  flex: 1;\n  font-size: 14px;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  text-transform: uppercase;\n  color: var(--text-general);\n}\n\n.season-review-qualifying-count{\n  font-family: \"NumbersFont\";\n  width: 26px;\n  text-align: center;\n  padding-top: 3px;\n  font-size: 14px;\n  height: 22px;\n}\n\n.wins-drivers-list{\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n}\n\n.bento-item.item-10 .wins-drivers-list, .bento-item.item-6 .wins-drivers-list{\n  justify-content: space-between;\n  height: 100%;\n}\n\n.bento-item.item-5 .wins-drivers-list{\n  gap: 3px;\n}\n\n.season-review-wins-row{\n  display: flex;\n  align-items: center;\n  width: 100%;\n  height: 22px;\n  gap: 4px;\n}\n\n.season-review-wins-row.phantom-row{\n  visibility: hidden;\n  pointer-events: none;\n}\n\n.rounds-counter{\n  margin-left: auto;\n  padding-right: 8px;\n  color: var(--text-tertiary);\n  font-family: \"Formula1\";\n}\n\n.first-number{\n  padding-right: 2px;\n}\n\n.round-number{\n  font-family: \"NumbersFont\";\n  width: 18px;\n  text-align: center;\n  font-size: 16px;\n  padding-top: 3px;\n  height: 22px;\n}\n\n.season-review-wins-position{\n  font-family: \"NumbersBold\";\n  width: 18px;\n  text-align: center;\n  font-size: 14px;\n  padding-top: 3px;\n  height: 22px;\n}\n\n.season-review-wins-name{\n  flex: 1;\n  font-size: 14px;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  color: var(--text-general);\n}\n\n.season-review-wins-name .bold-font{\n  text-transform: uppercase;\n}\n\n.season-review-wins-name span:not(.bold-font){\n  color: var(--text-secondary);\n}\n\n.season-review-wins-count{\n  font-family: \"NumbersFont\";\n  width: 26px;\n  text-align: center;\n  padding-top: 3px;\n  font-size: 14px;\n  height: 22px;\n  margin-left: auto;\n}\n\n.podiums-teams-list .season-review-wins-position,\n.poles-teams-list .season-review-wins-position,\n.bento-split-list .season-review-wins-position{\n  width: 18px;\n}\n\n.podiums-teams-list .season-review-wins-name,\n.poles-teams-list .season-review-wins-name,\n.item-8 .bento-split-list .season-review-wins-name{\n  max-width: 135px;\n}\n\n.item-7 .bento-split-list .season-review-wins-name,\n.item-9 .bento-split-list .season-review-wins-name{\n  max-width: 135px;\n}\n\n.session-results-rows{\n  display: flex;\n  flex-direction: column;\n  gap: 0;\n  color: var(--text-general);\n}\n\n.session-results-title{\n  font-family: 'Formula1Dark' !important;\n  text-transform: uppercase;\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  column-gap: 10px;\n  padding: 16px 20px 12px 18px;\n  letter-spacing: -0.3px;\n  color: var(--text-general);\n  position: relative;\n  overflow: hidden;\n  row-gap: 0px;\n  background-color: var(--generals);\n  box-shadow: var(--shadow-s);\n  border-top-right-radius: 10px;\n  border-top-left-radius: 10px;\n}\n\n#sessionResultsEditToggle{\n  cursor: pointer;\n}\n\n#sessionResultsCompactToggle{\n  cursor: pointer;\n}\n\n.session-results-table.is-compact{\n  width: 55vw;\n  margin-left: auto;\n  margin-right: auto;\n}\n\n.session-results-title::before{\n  content: '';\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: var(--session-results-flag-window-width, 280px);\n  background-image: var(--session-results-flag-bg, none);\n  background-repeat: no-repeat;\n  background-position: left center;\n  background-size: var(--session-results-flag-width, 280px) auto;\n  opacity: 0.5;\n  -webkit-mask-image: linear-gradient(90deg, #000 0%, transparent 100%);\n  mask-image: linear-gradient(90deg, #000 0%, transparent 100%);\n  -webkit-mask-repeat: no-repeat;\n  mask-repeat: no-repeat;\n  -webkit-mask-size: 100% 100%;\n  mask-size: 100% 100%;\n  pointer-events: none;\n  z-index: 0;\n}\n\n.session-results-title.session-results-title-tall-flag::before{\n  background-size: var(--session-results-flag-width, 280px) 130%;\n}\n\n.session-results-title > *{\n  position: relative;\n  z-index: 1;\n}\n\n.session-results-title-main{\n  order: 1;\n  font-size: 24px;\n  line-height: 1;\n}\n\n.session-results-title-session{\n  order: 2;\n  font-family: 'Formula1Dark';\n  font-size: 24px;\n  line-height: 1;\n  color: var(--text-tertiary);\n}\n\n.session-results-title-track{\n  order: 4;\n  flex: 0 0 100%;\n  margin-top: 2px;\n  font-family: 'Formula1';\n  font-size: 14px;\n  line-height: 0.6;\n  color: var(--text-general);\n}\n\n.session-results-title-round{\n  order: 3;\n  margin-left: auto;\n  font-family: 'Formula1Dark';\n  font-size: 16px;\n  line-height: 1;\n  color: var(--text-secondary);\n  letter-spacing: -0.2px;\n}\n\n.session-results-footer{\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  padding: 10px 20px 10px 18px;\n  background-color: var(--generals);\n  box-shadow: inset 0 1px 0 rgba(255,255,255,0.06);\n  text-transform: uppercase;\n  border-bottom-right-radius: 10px;\n  border-bottom-left-radius: 10px;\n}\n\n.session-results-footer-label{\n  font-family: 'NumbersBold';\n  font-size: 16px;\n  color: color-mix(in srgb, #B14DFF 70%, var(--text-general));\n  flex: 0 0 auto;\n  padding-top: 3px;\n  line-height: 1;\n}\n\n.session-results-footer-right{\n  margin-left: auto;\n  color: var(--text-secondary);\n}\n\n.session-results-footer-time{\n  font-family: 'NumbersFont';\n  font-size: 16px;\n  color: var(--text-general);\n  flex: 0 0 auto;\n  color: color-mix(in srgb, #B14DFF 70%, var(--text-general));\n  transform: translateY(2px);\n}\n\n.session-results-footer .session-results-team{\n  border-right: 2px solid var(--text-tertiary);\n  padding-right: 11px;\n}\n\n.session-results-row{\n  display: grid;\n  grid-template-columns: var(--session-results-col-drag, 0px) 42px var(--session-results-col-grid, 46px) 310px 340px 1fr var(--session-results-col-q1, 0px) var(--session-results-col-q2, 0px) var(--session-results-col-q3, 0px) var(--session-results-col-laps, 0px) var(--session-results-col-fl, 100px) var(--session-results-col-time, 130px) var(--session-results-col-quali-grid, 0px) var(--session-results-col-points, 70px);\n  align-items: center;\n  background-color: var(--table-default);\n  column-gap: 0px;\n}\n\n.session-results-cell{\n  margin: 0 4px;\n}\n\n.session-results-cell.hidden{\n  margin: 0;\n}\n\n.session-results-row > .session-results-cell:first-child{\n  margin-left: 0;\n}\n\n.session-results-row > .session-results-cell:last-child{\n  margin-right: 0;\n}\n\n.session-results-table.is-edit{\n  --session-results-col-drag: 22px;\n}\n\n.session-results-drag{\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 0 !important;\n}\n\n.session-results-drag-handle{\n  cursor: grab;\n}\n\n.session-results-drag-handle:active{\n  cursor: grabbing;\n}\n\n.session-results-drag-icon{\n  width: 12px;\n  height: 18px;\n  background:\n    radial-gradient(circle, var(--text-tertiary) 1.2px, transparent 1.3px) 0 0/6px 6px;\n  opacity: 0.8;\n}\n\n.session-results-row.dragging{\n  opacity: 0.7;\n}\n\n.session-results-time-input{\n  width: 100%;\n  min-width: 0;\n  border: 1px solid rgba(255,255,255,0.12);\n  background: rgba(0,0,0,0.2);\n  color: var(--text-general);\n  border-radius: 6px;\n  padding: 0px 4px;\n  font-family: 'NumbersFont', 'Formula1', sans-serif;\n  font-size: 14px;\n  text-align: center;\n  height: 20px;\n}\n\n.session-results-time-input:disabled{\n  opacity: 0.6;\n}\n\n.session-results-table.is-quali{\n  --session-results-col-q1: 100px;\n  --session-results-col-q2: 100px;\n  --session-results-col-q3: 100px;\n  --session-results-col-fl: 0px;\n  --session-results-col-time: 0px;\n}\n\n.session-results-table.is-quali.has-quali-grid{\n  --session-results-col-quali-grid: 58px;\n}\n\n.session-results-table.is-practice{\n  --session-results-col-laps: 70px;\n  --session-results-col-points: 0px;\n}\n\n.session-results-table.no-points{\n  --session-results-col-points: 0px;\n}\n\n.session-results-table.no-grid{\n  --session-results-col-grid: 0px;\n}\n\n.session-results-table.no-time{\n  --session-results-col-time: 0px;\n}\n\n.session-results-row > div.hidden{\n  padding: 0 !important;\n  overflow: hidden;\n  visibility: hidden;\n  pointer-events: none;\n  margin: 0;\n}\n\n.session-results-gained-lost.hidden{\n  padding: 0 !important;\n  overflow: hidden;\n  visibility: hidden;\n  pointer-events: none;\n}\n\n.session-results-time.hidden{\n  padding: 0 !important;\n  overflow: hidden;\n  visibility: hidden;\n  pointer-events: none;\n}\n\n.session-results-row.quali-cut-q2,\n.session-results-row.quali-cut-q3{\n  border-bottom: 2px solid var(--f1-first);\n}\n\n.session-results-row.odd {\n  background-color: var(--table-default-odd);\n}\n\n.session-results-row > div {\n  padding: 4px 8px;\n  min-width: 0;\n}\n\n@media (max-height: 950px) {\n  .session-results-row > div {\n    padding: 2px 8px;\n  }\n\n  .changes-grid{\n    gap: 15px !important;\n  }\n\n  .recommended-downloads{\n    margin-top: -10px !important;\n    font-size: 14px !important;\n  }\n\n  .mod-name.title-2026{\n    margin-top: -50px !important;\n  }\n}\n\n.session-results-row:hover {\n  background-color: var(--session-results-hover);\n}\n\n.session-results-row:hover .session-results-driver-name,\n.session-results-row:hover .session-results-engine-name,\n.session-results-row:hover .session-results-fastest-lap:not(.fastest),\n.session-results-row:hover .session-results-time,\n.session-results-row:hover .session-results-laps,\n.session-results-row:hover .session-results-quali-lap:not(.fastest){\n  color: var(--text-general);\n}\n\n.session-results-position {\n  font-family: 'NumbersBold';\n  font-size: 16px;\n  height: 32px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding-top: 7px !important;\n  margin-left: 0px;\n}\n\n.session-results-gained-lost {\n  font-family: 'NumbersFont';\n  font-size: 13px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: 2px;\n  line-height: 1;\n  padding-top: 7px !important;\n}\n\n.session-results-gained-lost .bi-caret-up-fill, .bi-caret-down-fill, .standings-pos-change .bi-caret-up-fill, .standings-pos-change .bi-caret-down-fill {\n  font-size: 10px;\n}\n\n.session-results-gained-lost.up {\n  color: var(--positive-general);\n}\n\n.session-results-gained-lost.down {\n  color: var(--negative-general);\n}\n\n.session-results-gained-lost.neutral {\n  color: var(--text-general);\n}\n\n.session-results-driver-name {\n  display: flex;\n  align-items: center;\n  gap: 4px;\n  white-space: nowrap;\n  min-width: 0;\n}\n\n.session-results-first-name {\n  color: var(--text-secondary);\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  text-transform: capitalize;\n  min-width: 0;\n}\n\n.session-results-surname {\n  text-transform: uppercase;\n  flex: 0 0 auto;\n  color: var(--text-general);\n}\n\n.session-results-dotd {\n  color: var(--positive-general);\n  font-family: \"Formula1Bold\";\n  font-size: 12px;\n  margin-left: 6px;\n  flex: 0 0 auto;\n}\n\n.session-results-nationality-flag{\n  width: 24px;\n  height: 16px;\n  object-fit: cover;\n  border-radius: 4px;\n  flex: 0 0 auto;\n  margin-right: 4px;\n}\n\n.session-results-team {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  min-width: 0;\n}\n\n.session-results-team-name {\n  font-family: \"Formula1Bold\";\n  color: var(--text-general);\n  text-transform: uppercase;\n  min-width: 0;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.session-results-engine-name {\n  color: var(--text-secondary);\n  text-transform: uppercase;\n  font-family: \"Formula1\";\n  font-size: 13px;\n  white-space: nowrap;\n  flex: 0 0 auto;\n  margin-left: 6px;\n}\n\n.session-results-spacer {\n  padding: 0 !important;\n}\n\n.session-results-fastest-lap,\n.session-results-laps,\n.session-results-quali-lap,\n.session-results-time {\n  color: var(--text-secondary);\n}\n\n.session-results-quali-lap.session-results-q3{\n  color: var(--text-general);\n}\n\n.session-results-row.leader .session-results-time {\n  color: var(--text-general);\n}\n\n.session-results-row.leader .session-results-fastest-lap:not(.fastest) {\n  color: var(--text-general);\n}\n\n.session-results-fastest-lap.session-results-fastest-lap-practice:not(.fastest) {\n  color: var(--text-general);\n}\n\n.session-results-fastest-lap,\n.session-results-laps,\n.session-results-quali-lap,\n.session-results-time{\n  font-family: 'NumbersFont';\n  font-size: 14px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  text-align: center;\n  padding-top: 7px !important;\n}\n\n.session-results-points{\n  font-family: 'NumbersBold';\n  font-size: 16px;\n  height: 32px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  text-align: center;\n  padding-top: 7px !important;\n}\n\n.session-results-grid-position {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  text-align: center;\n  font-size: 14px;\n  white-space: nowrap;\n  color: var(--text-secondary);\n  font-family: 'NumbersFont';\n}\n\n.session-results-grid-position.penalty {\n  color: var(--f1-first);\n}\n\n.session-results-points.positive {\n  color: var(--positive-general);\n}\n\n.session-results-row:has(.session-results-position.champion) .session-results-position {\n  border-left: 2px solid #FEDB37;\n  color: #FEDB37;\n  background: linear-gradient(90deg, rgba(254, 219, 55, 0.35) 0%, transparent 75%);\n}\n\n.session-results-row.odd:has(.session-results-position.champion) .session-results-position {\n  color: #FEDB37;\n  background: linear-gradient(90deg, rgba(254, 219, 55, 0.35) 0%, transparent 75%);\n}\n\n.session-results-row:has(.session-results-position.second) .session-results-position {\n  border-left: 2px solid #C0C0C0;\n  background: linear-gradient(90deg, rgba(192, 192, 192, 0.35) 0%, transparent 75%);\n}\n\n.session-results-row.odd:has(.session-results-position.second) .session-results-position {\n  background: linear-gradient(90deg, rgba(192, 192, 192, 0.35) 0%, transparent 75%);\n}\n\n.session-results-row:has(.session-results-position.third) .session-results-position {\n  border-left: 2px solid #CD7F32;\n  background: linear-gradient(90deg, rgba(205, 127, 50, 0.35) 0%, transparent 75%);\n}\n\n.session-results-row.odd:has(.session-results-position.third) .session-results-position {\n  background: linear-gradient(90deg, rgba(205, 127, 50, 0.35) 0%, transparent 75%);\n}\n\n.session-results-fastest-lap.fastest,\n.session-results-quali-lap.fastest {\n  border-left: 2px solid #B14DFF;\n  background: linear-gradient(90deg, rgba(177, 77, 255, 0.35) 0%, transparent 75%);\n  text-decoration: none;\n  color: color-mix(in srgb, #B14DFF 70%, var(--text-general));\n}\n\n.session-results-driver-logo-div {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 24px;\n  height: 24px;\n  padding: 0 !important;\n  flex: 0 0 auto;\n}\n\n.session-results-driver-logo-div img, .session-results-driver-logo-div div {\n  width: 24px;\n  height: 24px;\n  object-fit: contain;\n}\n"
  },
  {
    "path": "src/themes.css",
    "content": ":root {\n    /*\n  GENERAL COLORS\n  */\n\n    --hero-title: #eeeeee;\n    --background: #111111;\n    --generals: #1e1e1e;\n    --superficials: #222222;\n    --dropdown-back: #313131;\n    --elements: #303030;\n    --augment-buttons-bg: #474747;\n    --augment-buttons-hover: #5a5a5a;\n    --dropdown-hover: #414141;\n    --table-default: #1b1b1b;\n    --table-default-odd: #1e1e1e;\n    --table-header: #2f2f2f;\n    --dark-text: #b1b1b1;\n    --disabled-text: #7a7a7a;\n    --modal-text: #777777;\n    --text-muted: #94a3b8; \n    --negative-text: #292929;\n    --new-primary: #c89efc;\n    /* C37CF9 alternative*/\n    --new-primary-dark: #ba82ff;\n    --new-primary-transparent: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --new-primary-background-dropdown: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --new-primary-background-dropdown-items: color-mix(in srgb, var(--new-primary) 45%, var(--elements));\n    --text-selected: #e7d3ff;\n    --text-selected-secondary: #b1dbd6;\n    --new-secondary: #9AD2CB;\n    --new-secondary-transparent: color-mix(in srgb, var(--new-secondary) 25%, var(--elements));\n    --new-secondary-dark: #74aaa4;\n    --table-hover: #4a4a4a;\n    --elements-hover: #3a3a3a;\n    --box-shadow: #00000033;\n    --table-first: #fde06b;\n    --table-first-light: #f0e2ac;\n    --table-second: #b5bcc6;\n    --table-second-light: #cacaca;\n    --table-third: #d7985a;\n    --table-third-light: #f2cda6;\n    --table-dnf: #676767;\n    --text-outline: #000000;\n    --blur-color: #616161d3;\n    --toast-background: #5a5b5c;\n    --console-transparent: #42424299;\n    --separator: #4a4a4a;\n    --separator-light: #4f4f4f;\n    --frozen: #77e2f0;\n    --extra-hard: #edf037;\n    --brutal: #f0c537;\n    --unfair: #f09a37;\n    --insane: #f06b37;\n    --impossible: #f03737;\n    --modal-warning: #f03737a1;\n    --modal-warning-text: #f8bbbb;\n    --engine-table-name: #878787;\n    --engine-table-name-hover: #575757;\n    --support-me: #f96854;\n    --twitter: #51afe9;\n    --reddit: #f87444;\n    --custom-dif: #52ebbd;\n    --discord: #7289da;\n\n    --table-hover-text: #292929;\n    --session-results-hover: #4a4a4a;\n\n    --news-overlays-text: #dedde6;\n    --news-date-text: #292929;\n\n    --primary-gradient: linear-gradient(to right, var(--new-primary) 0%, #ffb38c 100%);\n\n    --scrollbar-hover: color-mix(in srgb, var(--white-general) 70%, var(--elements));\n\n    --amo-1: #bd6962;\n    --amo-2: #eec987;\n\n    --rate-ok-color: #2ecc71;\n    --rate-ok-bg: color-mix(in srgb, var(--rate-ok-color) 30%, transparent);\n\n    --rate-warning-color: #f1c40f;\n    --rate-warning-bg: color-mix(in srgb, var(--rate-warning-color) 30%, transparent);\n\n    --rate-danger-color: #e67e22;\n    --rate-danger-bg: color-mix(in srgb, var(--rate-danger-color) 30%, transparent);\n\n    --rate-blocked-color: #e74c3c;\n    --rate-blocked-bg: color-mix(in srgb, var(--rate-blocked-color) 30%, transparent);\n\n    --mentality-enthusiastic: #c055e3;\n    --mentality-positive: #10ffff;\n    --mentality-neutral: #f3f3f3;\n    --mentality-negative: #e9de35;\n    --mentality-demoralized: #dd3356;\n\n    --technical-chief: #ec4e98;\n    --race-engineer: #bce64a;\n    --head-aero: #5097e7;\n    --sporting-director: #925aeb;\n\n    --background-general: #110f24;\n    --slight-contrast: #797599;\n    --white-general: #f3f3f3;\n    --tech-grid-color: var(--text-general);\n    --tech-grid-line: color-mix(in srgb, var(--tech-grid-color) 2%, transparent);\n    --glow-x: 50%;\n    --glow-y: 0px;\n    --tech-grid-highlight-color: var(--new-primary);\n    --tech-grid-highlight-opacity: 0.54;\n    --tech-grid-highlight-radius: 240px;\n    --gold-gradient-text: #f3f3f3;\n\n\n    --text-general: #dedde6;\n    --text-general-transparent: #e9e8f0be;\n\n    --logos-general: #f0f0f0;\n\n    --text-secondary: #a8a8a8;\n    --text-tertiary: #777777;\n\n    --negative-general: #e95656;\n    --negative-general-clicked: #cf2626;\n    --negative-transparent: color-mix(in srgb, var(--negative-general) 25%, var(--elements));\n    --positive-general: #5bd999;\n    --positive-transparent: color-mix(in srgb, var(--positive-general) 25%, var(--elements));\n    --positive-general-clicked: #11ac5e;\n    --positive-general-darker: #3f8a6b;\n    --positive--general-darker2: #2f6a4b;\n    --random-general: #d4ff6f;\n    --h2h-general: #34c297;\n    --graph-general: #34bdc2;\n    --h2h-detail: #88ebcd;\n    --graph-detail: #95ebee;\n    --tools-general: #18152e;\n    --component-general: #3f3c57;\n    --component-general-hover: #4e4b69;\n    --component-general-hover-extra: #5d5a7c;\n    --overall-holder: #21202e;\n    --dropdown-back-general: #8b87af;\n    --active-general: #1a1826;\n    --row-cell: #110D14;\n    --row-odd-cell: #15121B;\n    --special-columns: #464166;\n    --delete-div: #f15353;\n    --weather-vis-back: #292738;\n    --weather-vis-border: #2c2b3b;\n    --h2h-back: #1f1b3b;\n    --h2h-back-hover: #302a57;\n    --active-buttons-back: #5f5a7c;\n    --mid-gray-contrast: #63636e;\n    --awaiting-color: #8a8a8a;\n    --mode-line-edit: #fff7b0;\n    --mode-line-ai: #baffea;\n    --mode-line-view: #e8b6ff;\n    --prob-viewer-hover: #625e86;\n    --custom-modal-back: #393744;\n    --text-in-front: #eeedf3;\n    --background--buttons-hover: #6f698f;\n    --ai-transparent: #baffea99;\n    --edit-transparent: #fff7b099;\n    --view-transparent: #e8b6ff99;\n    --white-gradient: #ffffff99;\n\n    --f2-border: #38c8f0;\n    --f2-back: #388cd5;\n    --f2-active: #1374fc;\n    --f3-back: #cf2e2e;\n    --f3-border: #ff6956;\n    --f1-first: #ff0000;\n\n    --shadow-no: 0 1px 2px #00000030,\n        /*dark shadow */\n        0 2px 4px #00000015;\n    /*soft shadow */\n\n    --shadow-s: inset 0 1px 2px #ffffff30,\n        /*top highlight */\n        0 1px 2px #00000030,\n        /*dark shadow */\n        0 2px 4px #00000015;\n    /*soft shadow */\n\n    --shadow-xs: inset 0 1px 2px #ffffff20,\n        /*top highlight */\n        0 1px 2px #00000020,\n        /*dark shadow */\n        0 2px 4px #00000010;\n\n    --shadow-m: inset 0 1px 2px #ffffff50,\n        /*top highlight */\n        0 2px 4px #00000030,\n        /*dark shadow */\n        0 4px 8px #00000015;\n    /*soft shadow */\n\n    --shadow-l: inset 0 1px 2px #ffffff70,\n        /*top highlight */\n        0 4px 6px #00000030,\n        /*dark shadow */\n        0 6px 110px #00000015;\n    /*soft shadow */\n\n    --shadow-red:\n        inset 0 -1px 2px #ff3b3b25,   /* light from bottom */\n        2px 2px 4px #ff3b3b20,        /* red glow bottom-right */\n        -1px -1px 2px #00000030,      /* opposite shadow */\n        0 2px 4px #00000020;          /* soft depth */\n\n\n    --switch-border-on: var(--new-primary);\n    --switch-border-off: var(--text-general);\n\n\n    /*\n  TEAMS COLORS\n  */\n    --alphatauri-original: #5E8FAA;\n    --alphatauri-secondary-original: #f1f1f1;\n    --alpine-original: #F168BA;\n    --alpine-secondary-original: #f1f1f1;\n    --andretti-primary: #fac51c;\n    --andretti-secondary: #1e7696;\n    --lotus-primary: #b09247;\n    --lotus-secondary: #595959;\n    --visarb-primary: #6c8ff3;\n    --visarb-secondary: #f1f1f1;\n    --toyota-primary: #989898;\n    --toyota-secondary: #f1f1f1;\n    --hugo-primary: #bd9514;\n    --hugo-secondary: #f1f1f1;\n    --alphatauri-primary: #5E8FAA;\n    --porsche-primary: #873AC4;\n    --porsche-secondary: #f1f1f1;\n    --brawn-primary: #d0e610;\n    --brawn-secondary: #f1f1f1;\n    --ferrari-primary: #f53311;\n    --general-secondary: #f1f1f1;\n    --mercedes-primary: #00F5D3;\n    --redbull-original: #3172bf;\n    --redbull-secondary-original: #ffd300;\n    --redbull-primary: #3172bf;\n    --redbull-secondary: #ffd300;\n    --ford-primary: #3172bf;\n    --ford-secondary: #f1f1f1;\n    --stake-primary: #54d650;\n    --stake-secondary: #595959;\n    --audi-primary: #C00A26;\n    --audi-secondary: #f1f1f1;\n    --sauber-primary: #f50537;\n    --aston-original: #07977b;\n    --aston-secondary-original: #c3dc00;\n    --aston-primary: #07977b;\n    --aston-secondary: #c3dc00;\n    --racingpoint-primary: #F395C7;\n    --racingpoint-secondary: #f1f1f1;\n    --jordan-primary: #e6e624;\n    --jordan-secondary: #1f1f1f;\n    --alfa-original: #C92D4B;\n    --alfa-secondary-original: #f1f1f1;\n    --alfa-primary: #C92D4B;\n    --alfa-secondary: #f1f1f1;\n    --alphatauri-secondary: #f1f1f1;\n    --haas-original: #c1c1c7;\n    --haas-secondary-original: #f62039;\n    --haas-primary: #c1c1c7;\n    --haas-secondary: #f62039;\n    --mclaren-primary: #FF8000;\n    --mclaren-secondary: #47c7fc;\n    --williams-original: #1868DB;\n    --williams-secondary-original: #f1f1f1;\n    --williams-primary: #1868DB;\n    --williams-secondary: #f1f1f1;\n    --bmw-primary: #f1f1f1;\n    --bmw-secondary: #1957bb;\n    --alpine-primary: #F168BA;\n    --alpine-secondary: #f1f1f1;\n    --cadillac-primary: #111111;\n    --cadillac-secondary: #d8d8d8;\n    --renault-primary: #f7c82f;\n    --honda-primary: #d80000;\n    --custom-team-primary: #ffffff;\n    --custom-team-secondary: #ffffff;\n\n    --redbull-primary-transparent: color-mix(in srgb, var(--redbull-primary) 30%, var(--elements));\n    --redbull-secondary-transparent: color-mix(in srgb, var(--redbull-secondary) 30%, var(--elements));\n    --redbull-primary-transparent-original: color-mix(in srgb, var(--redbull-original) 30%, var(--elements));\n    --redbull-secondary-transparent-original: color-mix(in srgb, var(--redbull-secondary-original) 30%, var(--elements));\n    --ford-primary-transparent: color-mix(in srgb, var(--ford-primary) 18%, var(--elements));\n    --ford-secondary-transparent: color-mix(in srgb, var(--ford-secondary) 18%, var(--elements));\n    --ferrari-primary-transparent: color-mix(in srgb, var(--ferrari-primary) 18%, var(--elements));\n    --general-secondary-transparent: color-mix(in srgb, var(--general-secondary) 18%, var(--elements));\n    --mercedes-primary-transparent: color-mix(in srgb, var(--mercedes-primary) 18%, var(--elements));\n    --mclaren-primary-transparent: color-mix(in srgb, var(--mclaren-primary) 18%, var(--elements));\n    --mclaren-secondary-transparent: color-mix(in srgb, var(--mclaren-secondary) 18%, var(--elements));\n    --williams-primary-transparent: color-mix(in srgb, var(--williams-primary) 18%, var(--elements));\n    --williams-primary-transparent-original: color-mix(in srgb, var(--williams-original) 18%, var(--elements));\n    --williams-secondary-transparent: color-mix(in srgb, var(--williams-secondary) 18%, var(--elements));\n    --williams-secondary-transparent-original: color-mix(in srgb, var(--williams-secondary-original) 18%, var(--elements));\n    --bmw-primary-transparent: color-mix(in srgb, var(--bmw-primary) 18%, var(--elements));\n    --bmw-secondary-transparent: color-mix(in srgb, var(--bmw-secondary) 18%, var(--elements));\n    --haas-primary-transparent: color-mix(in srgb, var(--haas-primary) 18%, var(--elements));\n    --haas-secondary-transparent: color-mix(in srgb, var(--haas-secondary) 18%, var(--elements));\n    --haas-primary-transparent-original: color-mix(in srgb, var(--haas-original) 18%, var(--elements));\n    --haas-secondary-transparent-original: color-mix(in srgb, var(--haas-secondary-original) 18%, var(--elements));\n    --alphatauri-primary-transparent: color-mix(in srgb, var(--alphatauri-primary) 18%, var(--elements));\n    --alphatauri-primary-transparent-original: color-mix(in srgb, var(--alphatauri-original) 18%, var(--elements));\n    --alphatauri-secondary-transparent: color-mix(in srgb, var(--alphatauri-secondary) 18%, var(--elements));\n    --alphatauri-secondary-transparent-original: color-mix(in srgb, var(--alphatauri-secondary-original) 18%, var(--elements));\n    --sauber-primary-transparent: color-mix(in srgb, var(--sauber-primary) 18%, var(--elements));\n    --alpine-primary-transparent: color-mix(in srgb, var(--alpine-primary) 18%, var(--elements));\n    --alpine-primary-transparent-original: color-mix(in srgb, var(--alpine-original) 18%, var(--elements));\n    --alpine-secondary-transparent: color-mix(in srgb, var(--alpine-secondary) 18%, var(--elements));\n    --alpine-secondary-transparent-original: color-mix(in srgb, var(--alpine-secondary-original) 18%, var(--elements));\n    --renault-primary-transparent: color-mix(in srgb, var(--renault-primary) 18%, var(--elements));\n    --cadillac-primary-transparent: color-mix(in srgb, var(--cadillac-primary) 18%, var(--elements));\n    --cadillac-secondary-transparent: color-mix(in srgb, var(--cadillac-secondary) 18%, var(--elements));\n    --aston-primary-transparent: color-mix(in srgb, var(--aston-primary) 18%, var(--elements));\n    --aston-secondary-transparent: color-mix(in srgb, var(--aston-secondary) 18%, var(--elements));\n    --aston-primary-transparent-original: color-mix(in srgb, var(--aston-original) 18%, var(--elements));\n    --aston-secondary-transparent-original: color-mix(in srgb, var(--aston-secondary-original) 18%, var(--elements));\n    --racingpoint-primary-transparent: color-mix(in srgb, var(--racingpoint-primary) 18%, var(--elements));\n    --racingpoint-secondary-transparent: color-mix(in srgb, var(--racingpoint-secondary) 18%, var(--elements));\n    --jordan-primary-transparent: color-mix(in srgb, var(--jordan-primary) 18%, var(--elements));\n    --jordan-secondary-transparent: color-mix(in srgb, var(--jordan-secondary) 18%, var(--elements));\n    --alfa-primary-transparent: color-mix(in srgb, var(--alfa-primary) 18%, var(--elements));\n    --alfa-primary-transparent-original: color-mix(in srgb, var(--alfa-original) 18%, var(--elements));\n    --alfa-secondary-transparent: color-mix(in srgb, var(--alfa-secondary) 18%, var(--elements));\n    --alfa-secondary-transparent-original: color-mix(in srgb, var(--alfa-secondary-original) 18%, var(--elements));\n    --audi-primary-transparent: color-mix(in srgb, var(--audi-primary) 18%, var(--elements));\n    --audi-secondary-transparent: color-mix(in srgb, var(--audi-secondary) 18%, var(--elements));\n    --toyota-primary-transparent: color-mix(in srgb, var(--toyota-primary) 18%, var(--elements));\n    --toyota-secondary-transparent: color-mix(in srgb, var(--toyota-secondary) 18%, var(--elements));\n    --porsche-primary-transparent: color-mix(in srgb, var(--porsche-primary) 18%, var(--elements));\n    --porsche-secondary-transparent: color-mix(in srgb, var(--porsche-secondary) 18%, var(--elements));\n    --brawn-primary-transparent: color-mix(in srgb, var(--brawn-primary) 18%, var(--elements));\n    --brawn-secondary-transparent: color-mix(in srgb, var(--brawn-secondary) 18%, var(--elements));\n    --stake-primary-transparent: color-mix(in srgb, var(--stake-primary) 18%, var(--elements));\n    --stake-secondary-transparent: color-mix(in srgb, var(--stake-secondary) 18%, var(--elements));\n    --visarb-primary-transparent: color-mix(in srgb, var(--visarb-primary) 18%, var(--elements));\n    --visarb-secondary-transparent: color-mix(in srgb, var(--visarb-secondary) 18%, var(--elements));\n    --hugo-primary-transparent: color-mix(in srgb, var(--hugo-primary) 18%, var(--elements));\n    --hugo-secondary-transparent: color-mix(in srgb, var(--hugo-secondary) 18%, var(--elements));\n    --lotus-primary-transparent: color-mix(in srgb, var(--lotus-primary) 18%, var(--elements));\n    --lotus-secondary-transparent: color-mix(in srgb, var(--lotus-secondary) 18%, var(--elements));\n    --andretti-primary-transparent: color-mix(in srgb, var(--andretti-primary) 18%, var(--elements));\n    --andretti-secondary-transparent: color-mix(in srgb, var(--andretti-secondary) 18%, var(--elements));\n    --custom-team-primary-transparent: color-mix(in srgb, var(--custom-team-primary) 18%, var(--elements));\n    --custom-team-secondary-transparent: color-mix(in srgb, var(--custom-team-secondary) 18%, var(--elements));\n}\n\nbody.light-theme {\n    --background: #e4e4e4;\n    --generals: #dadada;\n    --superficials: #d0d0d0;\n    --dropdown-back: #cfcfcf;\n    --elements: #cccccc;\n    --table-default: #f5f5f5;\n    --table-default-odd: #e0e0e0;\n    --dropdown-hover: #bbbbbb;\n    --text-general: #252525;\n    --text-secondary: #666666;\n    --text-tertiary: #999999;\n\n    --hero-title: #111111;\n    --text-muted: #475569;\n    --logos-general: #333333;\n\n    --augment-buttons-bg: #bbbbbb;\n    --augment-buttons-hover: #aaaaaa;\n\n    --white-general: #131313;\n    --tech-grid-color: var(--text-general);\n    --tech-grid-line: color-mix(in srgb, var(--tech-grid-color) 5%, transparent);\n    --dark-text: #444444;\n    --disabled-text: #888888;\n    --modal-text: #666666;\n    --negative-text: #eeeeee;\n    --new-primary: #7a5fd8;\n    --new-primary-dark: #5a42b5;\n    --new-primary-transparent: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --text-selected: #aa88ff;\n    --text-selected-secondary: #55aaa9;\n    --new-secondary: #66aabb;\n    --new-secondary-dark: #447788;\n    --new-secondary-transparent: color-mix(in srgb, var(--new-secondary) 25%, var(--elements));\n    --table-hover: #cccccc;\n    --elements-hover: #bbbbbb;\n    --box-shadow: #00000022;\n\n    --switch-border-on: var(--new-primary);\n    --switch-border-off: var(--text-general);\n\n    --tech-grid-highlight-color: var(--new-primary);\n\n    --new-primary-background-dropdown: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --new-primary-background-dropdown-items: color-mix(in srgb, var(--new-primary) 45%, var(--elements));\n\n    --table-first: #c5ad4d;\n    --table-first-light: #f0e2ac;\n    --table-second: #797b80;\n    --table-second-light: #cacaca;\n    --table-third: #b87a3c;\n    --table-third-light: #f2cda6;\n    --table-header: #d1d1d1;\n    --table-dnf: #8b8b8b;\n\n    --sessions-results-hover: #d1d1d1;\n\n    --positive-general: #2a9b63;\n\n    --rate-ok-color: #24a45a;\n    --rate-ok-bg: color-mix(in srgb, var(--rate-ok-color) 30%, transparent);\n\n    --rate-warning-color: #bca211;\n    --rate-warning-bg: color-mix(in srgb, var(--rate-warning-color) 30%, transparent);\n\n    --rate-danger-color: #d46a11;\n    --rate-danger-bg: color-mix(in srgb, var(--rate-danger-color) 30%, transparent);\n\n\n    --general-secondary: #f1f1f1;\n    --mercedes-primary: #13c2a2;\n    --haas-primary: #57575a;\n\n    --mentality-enthusiastic: #c055e3;\n    --mentality-positive: #10ffff;\n    --mentality-neutral: #222222;\n    --mentality-negative: #8a8100;\n    --mentality-demoralized: #dd3356;\n\n    --scrollbar-hover: color-mix(in srgb, var(--white-general) 70%, var(--elements));\n\n    --redbull-primary-transparent: color-mix(in srgb, var(--redbull-primary) 30%, var(--elements));\n    --redbull-secondary-transparent: color-mix(in srgb, var(--redbull-secondary) 30%, var(--elements));\n    --ferrari-primary-transparent: color-mix(in srgb, var(--ferrari-primary) 18%, var(--elements));\n    --general-secondary-transparent: color-mix(in srgb, var(--general-secondary) 18%, var(--elements));\n    --mercedes-primary-transparent: color-mix(in srgb, var(--mercedes-primary) 18%, var(--elements));\n    --mclaren-primary-transparent: color-mix(in srgb, var(--mclaren-primary) 18%, var(--elements));\n    --mclaren-secondary-transparent: color-mix(in srgb, var(--mclaren-secondary) 18%, var(--elements));\n    --williams-primary-transparent: color-mix(in srgb, var(--williams-primary) 18%, var(--elements));\n    --haas-primary-transparent: color-mix(in srgb, var(--haas-primary) 18%, var(--elements));\n    --haas-secondary-transparent: color-mix(in srgb, var(--haas-secondary) 18%, var(--elements));\n    --alphatauri-primary-transparent: color-mix(in srgb, var(--alphatauri-primary) 18%, var(--elements));\n    --alphatauri-primary-transparent-original: color-mix(in srgb, var(--alphatauri-original) 18%, var(--elements));\n    --alphatauri-secondary-transparent: color-mix(in srgb, var(--alphatauri-secondary) 18%, var(--elements));\n    --alphatauri-secondary-transparent-original: color-mix(in srgb, var(--alphatauri-secondary-original) 18%, var(--elements));\n    --sauber-primary-transparent: color-mix(in srgb, var(--sauber-primary) 18%, var(--elements));\n    --alpine-primary-transparent: color-mix(in srgb, var(--alpine-primary) 18%, var(--elements));\n    --alpine-primary-transparent-original: color-mix(in srgb, var(--alpine-original) 18%, var(--elements));\n    --alpine-secondary-transparent: color-mix(in srgb, var(--alpine-secondary) 18%, var(--elements));\n    --alpine-secondary-transparent-original: color-mix(in srgb, var(--alpine-secondary-original) 18%, var(--elements));\n    --renault-primary-transparent: color-mix(in srgb, var(--renault-primary) 18%, var(--elements));\n    --cadillac-primary-transparent: color-mix(in srgb, var(--cadillac-primary) 18%, var(--elements));\n    --cadillac-secondary-transparent: color-mix(in srgb, var(--cadillac-secondary) 18%, var(--elements));\n    --aston-primary-transparent: color-mix(in srgb, var(--aston-primary) 18%, var(--elements));\n    --aston-secondary-transparent: color-mix(in srgb, var(--aston-secondary) 18%, var(--elements));\n    --alfa-primary-transparent: color-mix(in srgb, var(--alfa-primary) 18%, var(--elements));\n    --alfa-primary-transparent-original: color-mix(in srgb, var(--alfa-original) 18%, var(--elements));\n    --alfa-secondary-transparent: color-mix(in srgb, var(--alfa-secondary) 18%, var(--elements));\n    --alfa-secondary-transparent-original: color-mix(in srgb, var(--alfa-secondary-original) 18%, var(--elements));\n    --audi-primary-transparent: color-mix(in srgb, var(--audi-primary) 18%, var(--elements));\n    --audi-secondary-transparent: color-mix(in srgb, var(--audi-secondary) 18%, var(--elements));\n    --toyota-primary-transparent: color-mix(in srgb, var(--toyota-primary) 18%, var(--elements));\n    --toyota-secondary-transparent: color-mix(in srgb, var(--toyota-secondary) 18%, var(--elements));\n    --porsche-primary-transparent: color-mix(in srgb, var(--porsche-primary) 18%, var(--elements));\n    --porsche-secondary-transparent: color-mix(in srgb, var(--porsche-secondary) 18%, var(--elements));\n    --brawn-primary-transparent: color-mix(in srgb, var(--brawn-primary) 18%, var(--elements));\n    --brawn-secondary-transparent: color-mix(in srgb, var(--brawn-secondary) 18%, var(--elements));\n    --stake-primary-transparent: color-mix(in srgb, var(--stake-primary) 18%, var(--elements));\n    --stake-secondary-transparent: color-mix(in srgb, var(--stake-secondary) 18%, var(--elements));\n    --visarb-primary-transparent: color-mix(in srgb, var(--visarb-primary) 18%, var(--elements));\n    --visarb-secondary-transparent: color-mix(in srgb, var(--visarb-secondary) 18%, var(--elements));\n    --hugo-primary-transparent: color-mix(in srgb, var(--hugo-primary) 18%, var(--elements));\n    --hugo-secondary-transparent: color-mix(in srgb, var(--hugo-secondary) 18%, var(--elements));\n    --lotus-primary-transparent: color-mix(in srgb, var(--lotus-primary) 18%, var(--elements));\n    --lotus-secondary-transparent: color-mix(in srgb, var(--lotus-secondary) 18%, var(--elements));\n    --andretti-primary-transparent: color-mix(in srgb, var(--andretti-primary) 18%, var(--elements));\n    --andretti-secondary-transparent: color-mix(in srgb, var(--andretti-secondary) 18%, var(--elements));\n    --custom-team-primary-transparent: color-mix(in srgb, var(--custom-team-primary) 18%, var(--elements));\n    --custom-team-secondary-transparent: color-mix(in srgb, var(--custom-team-secondary) 18%, var(--elements));\n}\n\nbody.og-theme {\n    --background: #110f24;\n    --generals: #18152e;\n    --superficials: #1f1b3b;\n    --dropdown-back: #5f5c77;\n    --elements: #323046;\n    --dropdown-hover: #706c8b;\n    --dark-text: #d3d3e7;\n    --disabled-text: #a8a8c3;\n    --modal-text: #9797b8;\n    --negative-text: #3c3c5b;\n    --new-primary: #8f89b8;\n    --new-primary-dark: #6a678f;\n    --new-primary-transparent: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --text-selected: #e7d3ff;\n    --text-selected-secondary: #ff8f63;\n    --new-secondary: #ff7c47;\n    --new-secondary-dark: #d76a3b;\n    --new-secondary-transparent: color-mix(in srgb, var(--new-secondary) 25%, var(--elements));\n    --table-hover: #50577c;\n    --elements-hover: #3a3852;\n    --box-shadow: #00000044;\n    --footer-og: #797599;\n    --separator: #5f5c77;\n    --table-dnf: #7d7a93;\n\n    --text-secondary: #8d88b4;\n    --text-tertiary: #757197;\n\n    --switch-border-on: var(--new-secondary);\n    --switch-border-off: var(--text-general);\n\n    --tech-grid-color: transparent;\n    --tech-grid-line: transparent;\n\n    --augment-buttons-bg: #5f5c77;\n    --augment-buttons-hover: #64617d;\n\n    --scrollbar-hover: color-mix(in srgb, var(--white-general) 70%, var(--elements));\n    --session-results-hover: #4a4a4a;\n\n    --table-default: #494561;\n    --table-default-odd: #3c3952;\n    --table-header: #252335;\n\n    --tech-grid-highlight-color: var(--new-primary);\n\n    --new-primary-background-dropdown: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --new-primary-background-dropdown-items: color-mix(in srgb, var(--new-primary) 45%, var(--elements));\n\n    --redbull-primary-transparent: color-mix(in srgb, var(--redbull-primary) 30%, var(--elements));\n    --redbull-secondary-transparent: color-mix(in srgb, var(--redbull-secondary) 30%, var(--elements));\n    --ferrari-primary-transparent: color-mix(in srgb, var(--ferrari-primary) 18%, var(--elements));\n    --general-secondary-transparent: color-mix(in srgb, var(--general-secondary) 18%, var(--elements));\n    --mercedes-primary-transparent: color-mix(in srgb, var(--mercedes-primary) 18%, var(--elements));\n    --mclaren-primary-transparent: color-mix(in srgb, var(--mclaren-primary) 18%, var(--elements));\n    --mclaren-secondary-transparent: color-mix(in srgb, var(--mclaren-secondary) 18%, var(--elements));\n    --williams-primary-transparent: color-mix(in srgb, var(--williams-primary) 18%, var(--elements));\n    --haas-primary-transparent: color-mix(in srgb, var(--haas-primary) 18%, var(--elements));\n    --haas-secondary-transparent: color-mix(in srgb, var(--haas-secondary) 18%, var(--elements));\n    --alphatauri-primary-transparent: color-mix(in srgb, var(--alphatauri-primary) 18%, var(--elements));\n    --alphatauri-primary-transparent-original: color-mix(in srgb, var(--alphatauri-original) 18%, var(--elements));\n    --alphatauri-secondary-transparent: color-mix(in srgb, var(--alphatauri-secondary) 18%, var(--elements));\n    --alphatauri-secondary-transparent-original: color-mix(in srgb, var(--alphatauri-secondary-original) 18%, var(--elements));\n    --sauber-primary-transparent: color-mix(in srgb, var(--sauber-primary) 18%, var(--elements));\n    --alpine-primary-transparent: color-mix(in srgb, var(--alpine-primary) 18%, var(--elements));\n    --alpine-primary-transparent-original: color-mix(in srgb, var(--alpine-original) 18%, var(--elements));\n    --alpine-secondary-transparent: color-mix(in srgb, var(--alpine-secondary) 18%, var(--elements));\n    --alpine-secondary-transparent-original: color-mix(in srgb, var(--alpine-secondary-original) 18%, var(--elements));\n    --renault-primary-transparent: color-mix(in srgb, var(--renault-primary) 18%, var(--elements));\n    --cadillac-primary-transparent: color-mix(in srgb, var(--cadillac-primary) 18%, var(--elements));\n    --cadillac-secondary-transparent: color-mix(in srgb, var(--cadillac-secondary) 18%, var(--elements));\n    --aston-primary-transparent: color-mix(in srgb, var(--aston-primary) 18%, var(--elements));\n    --aston-secondary-transparent: color-mix(in srgb, var(--aston-secondary) 18%, var(--elements));\n    --aston-primary-transparent-original: color-mix(in srgb, var(--aston-original) 18%, var(--elements));\n    --aston-secondary-transparent-original: color-mix(in srgb, var(--aston-secondary-original) 18%, var(--elements));\n    --racingpoint-primary-transparent: color-mix(in srgb, var(--racingpoint-primary) 18%, var(--elements));\n    --racingpoint-secondary-transparent: color-mix(in srgb, var(--racingpoint-secondary) 18%, var(--elements));\n    --jordan-primary-transparent: color-mix(in srgb, var(--jordan-primary) 18%, var(--elements));\n    --jordan-secondary-transparent: color-mix(in srgb, var(--jordan-secondary) 18%, var(--elements));\n    --alfa-primary-transparent: color-mix(in srgb, var(--alfa-primary) 18%, var(--elements));\n    --alfa-primary-transparent-original: color-mix(in srgb, var(--alfa-original) 18%, var(--elements));\n    --alfa-secondary-transparent: color-mix(in srgb, var(--alfa-secondary) 18%, var(--elements));\n    --alfa-secondary-transparent-original: color-mix(in srgb, var(--alfa-secondary-original) 18%, var(--elements));\n    --audi-primary-transparent: color-mix(in srgb, var(--audi-primary) 18%, var(--elements));\n    --audi-secondary-transparent: color-mix(in srgb, var(--audi-secondary) 18%, var(--elements));\n    --toyota-primary-transparent: color-mix(in srgb, var(--toyota-primary) 18%, var(--elements));\n    --toyota-secondary-transparent: color-mix(in srgb, var(--toyota-secondary) 18%, var(--elements));\n    --porsche-primary-transparent: color-mix(in srgb, var(--porsche-primary) 18%, var(--elements));\n    --porsche-secondary-transparent: color-mix(in srgb, var(--porsche-secondary) 18%, var(--elements));\n    --brawn-primary-transparent: color-mix(in srgb, var(--brawn-primary) 18%, var(--elements));\n    --brawn-secondary-transparent: color-mix(in srgb, var(--brawn-secondary) 18%, var(--elements));\n    --stake-primary-transparent: color-mix(in srgb, var(--stake-primary) 18%, var(--elements));\n    --stake-secondary-transparent: color-mix(in srgb, var(--stake-secondary) 18%, var(--elements));\n    --visarb-primary-transparent: color-mix(in srgb, var(--visarb-primary) 18%, var(--elements));\n    --visarb-secondary-transparent: color-mix(in srgb, var(--visarb-secondary) 18%, var(--elements));\n    --hugo-primary-transparent: color-mix(in srgb, var(--hugo-primary) 18%, var(--elements));\n    --hugo-secondary-transparent: color-mix(in srgb, var(--hugo-secondary) 18%, var(--elements));\n    --lotus-primary-transparent: color-mix(in srgb, var(--lotus-primary) 18%, var(--elements));\n    --lotus-secondary-transparent: color-mix(in srgb, var(--lotus-secondary) 18%, var(--elements));\n    --andretti-primary-transparent: color-mix(in srgb, var(--andretti-primary) 18%, var(--elements));\n    --andretti-secondary-transparent: color-mix(in srgb, var(--andretti-secondary) 18%, var(--elements));\n    --custom-team-primary-transparent: color-mix(in srgb, var(--custom-team-primary) 18%, var(--elements));\n    --custom-team-secondary-transparent: color-mix(in srgb, var(--custom-team-secondary) 18%, var(--elements));\n}\n\nbody.vaporwave-theme {\n    --background: #0d0221;\n    --generals: #1a0942;\n    --superficials: #230b55;\n    --elements: #301070;\n    --dropdown-back: #2a0f63;\n    --dropdown-hover: #43208e;\n    --elements-hover: #5329b5;\n\n    --text-general: #f7dfff;\n    --text-secondary: #cdb7ff;\n    --text-tertiary: #9a82d8;\n    --white-general: #ffffff;\n\n    --new-primary: #ff5ec3;\n    --new-primary-dark: #e94eb1;\n    --new-primary-transparent: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n\n    --new-secondary: #00b3ff;\n    --new-secondary-dark: #0090d1;\n    --new-secondary-transparent: color-mix(in srgb, var(--new-secondary) 25%, var(--elements));\n    --text-selected: #ff9fff;\n    --text-selected-secondary: #6ef9ff;\n\n    --switch-border-on: var(--new-primary);\n    --switch-border-off: var(--text-general);\n\n    --table-default: #250d58;;\n    --table-default-odd: #2a0f61;\n    --table-header: #3a1488;\n    --table-dnf: #614ab1;\n\n    --augment-buttons-bg: #3a1488;\n    --augment-buttons-hover: #4b1da3;\n\n    --table-hover: #44238e;\n    --box-shadow: #00000066;\n    --separator: #5b36b8;\n\n    --positive-general: #5dfbc0;\n    --negative-general: #ff477e;\n\n    --news-overlays-text: #fae6ff;\n    --news-date-text: #0d0221;\n\n    --primary-gradient: linear-gradient(to right, var(--new-primary), var(--new-secondary));\n\n    --scrollbar-hover: color-mix(in srgb, var(--white-general) 70%, var(--elements));\n    --session-results-hover: #3a1488;\n\n    --tech-grid-highlight-color: var(--new-primary);\n\n    --new-primary-background-dropdown: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --new-primary-background-dropdown-items: color-mix(in srgb, var(--new-primary) 45%, var(--elements));\n\n    --redbull-primary-transparent: color-mix(in srgb, var(--redbull-primary) 30%, var(--elements));\n    --redbull-secondary-transparent: color-mix(in srgb, var(--redbull-secondary) 30%, var(--elements));\n    --ferrari-primary-transparent: color-mix(in srgb, var(--ferrari-primary) 18%, var(--elements));\n    --general-secondary-transparent: color-mix(in srgb, var(--general-secondary) 18%, var(--elements));\n    --mercedes-primary-transparent: color-mix(in srgb, var(--mercedes-primary) 18%, var(--elements));\n    --mclaren-primary-transparent: color-mix(in srgb, var(--mclaren-primary) 18%, var(--elements));\n    --mclaren-secondary-transparent: color-mix(in srgb, var(--mclaren-secondary) 18%, var(--elements));\n    --williams-primary-transparent: color-mix(in srgb, var(--williams-primary) 18%, var(--elements));\n    --haas-primary-transparent: color-mix(in srgb, var(--haas-primary) 18%, var(--elements));\n    --haas-secondary-transparent: color-mix(in srgb, var(--haas-secondary) 18%, var(--elements));\n    --alphatauri-primary-transparent: color-mix(in srgb, var(--alphatauri-primary) 18%, var(--elements));\n    --alphatauri-primary-transparent-original: color-mix(in srgb, var(--alphatauri-original) 18%, var(--elements));\n    --alphatauri-secondary-transparent: color-mix(in srgb, var(--alphatauri-secondary) 18%, var(--elements));\n    --alphatauri-secondary-transparent-original: color-mix(in srgb, var(--alphatauri-secondary-original) 18%, var(--elements));\n    --sauber-primary-transparent: color-mix(in srgb, var(--sauber-primary) 18%, var(--elements));\n    --alpine-primary-transparent: color-mix(in srgb, var(--alpine-primary) 18%, var(--elements));\n    --alpine-primary-transparent-original: color-mix(in srgb, var(--alpine-original) 18%, var(--elements));\n    --alpine-secondary-transparent: color-mix(in srgb, var(--alpine-secondary) 18%, var(--elements));\n    --alpine-secondary-transparent-original: color-mix(in srgb, var(--alpine-secondary-original) 18%, var(--elements));\n    --renault-primary-transparent: color-mix(in srgb, var(--renault-primary) 18%, var(--elements));\n    --cadillac-primary-transparent: color-mix(in srgb, var(--cadillac-primary) 18%, var(--elements));\n    --cadillac-secondary-transparent: color-mix(in srgb, var(--cadillac-secondary) 18%, var(--elements));\n    --aston-primary-transparent: color-mix(in srgb, var(--aston-primary) 18%, var(--elements));\n    --aston-secondary-transparent: color-mix(in srgb, var(--aston-secondary) 18%, var(--elements));\n    --aston-primary-transparent-original: color-mix(in srgb, var(--aston-original) 18%, var(--elements));\n    --aston-secondary-transparent-original: color-mix(in srgb, var(--aston-secondary-original) 18%, var(--elements));\n    --racingpoint-primary-transparent: color-mix(in srgb, var(--racingpoint-primary) 18%, var(--elements));\n    --racingpoint-secondary-transparent: color-mix(in srgb, var(--racingpoint-secondary) 18%, var(--elements));\n    --jordan-primary-transparent: color-mix(in srgb, var(--jordan-primary) 18%, var(--elements));\n    --jordan-secondary-transparent: color-mix(in srgb, var(--jordan-secondary) 18%, var(--elements));\n    --alfa-primary-transparent: color-mix(in srgb, var(--alfa-primary) 18%, var(--elements));\n    --alfa-primary-transparent-original: color-mix(in srgb, var(--alfa-original) 18%, var(--elements));\n    --alfa-secondary-transparent: color-mix(in srgb, var(--alfa-secondary) 18%, var(--elements));\n    --alfa-secondary-transparent-original: color-mix(in srgb, var(--alfa-secondary-original) 18%, var(--elements));\n    --audi-primary-transparent: color-mix(in srgb, var(--audi-primary) 18%, var(--elements));\n    --audi-secondary-transparent: color-mix(in srgb, var(--audi-secondary) 18%, var(--elements));\n    --toyota-primary-transparent: color-mix(in srgb, var(--toyota-primary) 18%, var(--elements));\n    --toyota-secondary-transparent: color-mix(in srgb, var(--toyota-secondary) 18%, var(--elements));\n    --porsche-primary-transparent: color-mix(in srgb, var(--porsche-primary) 18%, var(--elements));\n    --porsche-secondary-transparent: color-mix(in srgb, var(--porsche-secondary) 18%, var(--elements));\n    --brawn-primary-transparent: color-mix(in srgb, var(--brawn-primary) 18%, var(--elements));\n    --brawn-secondary-transparent: color-mix(in srgb, var(--brawn-secondary) 18%, var(--elements));\n    --stake-primary-transparent: color-mix(in srgb, var(--stake-primary) 18%, var(--elements));\n    --stake-secondary-transparent: color-mix(in srgb, var(--stake-secondary) 18%, var(--elements));\n    --visarb-primary-transparent: color-mix(in srgb, var(--visarb-primary) 18%, var(--elements));\n    --visarb-secondary-transparent: color-mix(in srgb, var(--visarb-secondary) 18%, var(--elements));\n    --hugo-primary-transparent: color-mix(in srgb, var(--hugo-primary) 18%, var(--elements));\n    --hugo-secondary-transparent: color-mix(in srgb, var(--hugo-secondary) 18%, var(--elements));\n    --lotus-primary-transparent: color-mix(in srgb, var(--lotus-primary) 18%, var(--elements));\n    --lotus-secondary-transparent: color-mix(in srgb, var(--lotus-secondary) 18%, var(--elements));\n    --andretti-primary-transparent: color-mix(in srgb, var(--andretti-primary) 18%, var(--elements));\n    --andretti-secondary-transparent: color-mix(in srgb, var(--andretti-secondary) 18%, var(--elements));\n    --custom-team-primary-transparent: color-mix(in srgb, var(--custom-team-primary) 18%, var(--elements));\n    --custom-team-secondary-transparent: color-mix(in srgb, var(--custom-team-secondary) 18%, var(--elements));\n}\n\n/* Same as default, but swap primary and secondary accent colors. */\nbody.nightly-theme {\n    --new-primary: #9AD2CB;\n    --new-primary-dark: #74aaa4;\n    --new-primary-transparent: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --new-primary-background-dropdown: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --new-primary-background-dropdown-items: color-mix(in srgb, var(--new-primary) 45%, var(--elements));\n\n    --new-secondary: #c89efc;\n    --new-secondary-dark: #ba82ff;\n    --new-secondary-transparent: color-mix(in srgb, var(--new-secondary) 25%, var(--elements));\n\n    --switch-border-on: var(--new-primary);\n    --switch-border-off: var(--text-general);\n\n    --text-selected: #b1dbd6;\n    --text-selected-secondary: #e7d3ff;\n\n    --primary-gradient: linear-gradient(to right, var(--new-primary) 0%, #ffb38c 100%);\n\n    --tech-grid-highlight-color: var(--new-primary);\n}\n\nbody.ferrari-theme {\n    --background: #130c0d;\n    --generals: #1a1012;\n    --superficials: #211417;\n    --dropdown-back: #3b252a;\n    --elements: #2e1c20;\n    --augment-buttons-bg: #4a2c33;\n    --augment-buttons-hover: #5d3740;\n    --dropdown-hover: #4b2f36;\n    --table-default: #191012;\n    --table-default-odd: #1f1316;\n    --table-header: #342026;\n    --dark-text: #b7afb1;\n    --disabled-text: #7f7478;\n    --modal-text: #8f8388;\n    --negative-text: #292929;\n    --new-primary: #ff3d3d;\n    --new-primary-dark: #d12a2a;\n    --new-secondary: #ffb74d;\n    --new-secondary-dark: #d49034;\n    --text-selected: #ffd3d3;\n    --text-selected-secondary: #ffe0ba;\n    --table-hover: #59343c;\n    --elements-hover: #3b252b;\n    --box-shadow: #0000003a;\n    --separator: #5a3a42;\n    --separator-light: #69444d;\n    --background-general: #140d10;\n    --tools-general: #181012;\n    --component-general: #4f2f37;\n    --component-general-hover: #5d3740;\n    --component-general-hover-extra: #6b404a;\n    --overall-holder: #28181d;\n    --dropdown-back-general: #96606d;\n    --active-general: #1f1115;\n    --row-cell: #160d10;\n    --row-odd-cell: #1b1115;\n    --special-columns: #5f3943;\n    --h2h-back: #2a1720;\n    --h2h-back-hover: #3a202b;\n    --active-buttons-back: #6b404a;\n    --prob-viewer-hover: #6a3f4a;\n    --custom-modal-back: #3f2c33;\n    --background--buttons-hover: #7b4855;\n    --primary-gradient: linear-gradient(to right, var(--new-primary) 0%, #ff8f6b 100%);\n    --session-results-hover: #4a2c33;\n    --table-dnf: #7f7478;\n    --new-primary-background-dropdown: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --new-primary-background-dropdown-items: color-mix(in srgb, var(--new-primary) 45%, var(--elements));\n    --new-primary-transparent: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --tech-grid-highlight-color: var(--new-primary);\n    --text-secondary: #cbbdc1;\n    --text-tertiary: #a89299;\n    --switch-border-on: var(--new-primary);\n    --switch-border-off: var(--text-general);\n}\n\nbody.redbull-theme {\n    --background: #090f1e;\n    --generals: #10172b;\n    --superficials: #132142;\n    --dropdown-back: #263963;\n    --elements: #1e2f52;\n    --augment-buttons-bg: #324874;\n    --augment-buttons-hover: #3e5b8e;\n    --dropdown-hover: #2c426b;\n    --table-default: #101a33;\n    --table-default-odd: #12203d;\n    --table-header: #22365d;\n    --dark-text: #afbdd8;\n    --disabled-text: #7887a8;\n    --modal-text: #8797bb;\n    --negative-text: #292929;\n    --new-primary: #4b7bff;\n    --new-primary-dark: #345fd4;\n    --new-secondary: #ffd24a;\n    --new-secondary-dark: #cfa41f;\n    --text-selected: #d8e5ff;\n    --text-selected-secondary: #ffe593;\n    --table-hover: #344d7f;\n    --elements-hover: #2a406b;\n    --box-shadow: #00000045;\n    --separator: #39578f;\n    --separator-light: #4668a4;\n    --background-general: #0c1429;\n    --tools-general: #11182d;\n    --component-general: #355181;\n    --component-general-hover: #406093;\n    --component-general-hover-extra: #4b6fa7;\n    --overall-holder: #192642;\n    --dropdown-back-general: #6188c0;\n    --active-general: #10192f;\n    --row-cell: #0e162b;\n    --row-odd-cell: #111c34;\n    --special-columns: #3b588b;\n    --h2h-back: #142446;\n    --h2h-back-hover: #1c3260;\n    --active-buttons-back: #4b6fa7;\n    --prob-viewer-hover: #44679e;\n    --custom-modal-back: #253656;\n    --background--buttons-hover: #567ab3;\n    --primary-gradient: linear-gradient(to right, var(--new-primary) 0%, #8aa7ff 100%);\n    --session-results-hover: #2a406b;\n    --table-dnf: #7887a8;\n    --new-primary-background-dropdown: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --new-primary-background-dropdown-items: color-mix(in srgb, var(--new-primary) 45%, var(--elements));\n    --new-primary-transparent: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --tech-grid-highlight-color: var(--new-primary);\n    --text-secondary: #c1cce6;\n    --text-tertiary: #92a2c8;\n    --switch-border-on: var(--new-primary);\n    --switch-border-off: var(--text-general);\n}\n\nbody.mercedes-theme {\n    --background: #071316;\n    --generals: #0b1b1f;\n    --superficials: #0e2328;\n    --dropdown-back: #1e3a40;\n    --elements: #153038;\n    --augment-buttons-bg: #234751;\n    --augment-buttons-hover: #2c5b67;\n    --dropdown-hover: #21424a;\n    --table-default: #0b1c20;\n    --table-default-odd: #0d2025;\n    --table-header: #15343b;\n    --dark-text: #a9b9bd;\n    --disabled-text: #6d8086;\n    --modal-text: #7f949a;\n    --negative-text: #292929;\n    --new-primary: #00f5d3;\n    --new-primary-dark: #00cdb1;\n    --new-secondary: #c8f9f2;\n    --new-secondary-dark: #93eadd;\n    --text-selected: #b9fff5;\n    --text-selected-secondary: #e6fffb;\n    --table-hover: #244a54;\n    --elements-hover: #1b3f48;\n    --box-shadow: #00000045;\n    --separator: #2a515c;\n    --separator-light: #336472;\n    --background-general: #09171a;\n    --tools-general: #0d1b1f;\n    --component-general: #2b5560;\n    --component-general-hover: #346574;\n    --component-general-hover-extra: #3d7688;\n    --overall-holder: #10272d;\n    --dropdown-back-general: #5aa6b4;\n    --active-general: #0c1d22;\n    --row-cell: #081417;\n    --row-odd-cell: #0a191d;\n    --special-columns: #2f5b68;\n    --h2h-back: #0e2328;\n    --h2h-back-hover: #14323a;\n    --active-buttons-back: #3d7688;\n    --prob-viewer-hover: #356675;\n    --custom-modal-back: #1a2f34;\n    --background--buttons-hover: #457f92;\n    --primary-gradient: linear-gradient(to right, var(--new-primary) 0%, #7ff6e4 100%);\n    --session-results-hover: #1b3f48;\n    --table-dnf: #6d8086;\n    --new-primary-background-dropdown: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --new-primary-background-dropdown-items: color-mix(in srgb, var(--new-primary) 45%, var(--elements));\n    --new-primary-transparent: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --tech-grid-highlight-color: var(--new-primary);\n    --text-secondary: #b8d6d3;\n    --text-tertiary: #85aba6;\n    --switch-border-on: var(--new-primary);\n    --switch-border-off: var(--text-general);\n}\n\nbody.astonmartin-theme {\n    --background: #020706;\n    --generals: #050d0b;\n    --superficials: #07120f;\n    --dropdown-back: #122822;\n    --elements: #0c1b16;\n    --augment-buttons-bg: #215042;\n    --augment-buttons-hover: #2a6654;\n    --dropdown-hover: #17332b;\n    --table-default: #050f0c;\n    --table-default-odd: #06130f;\n    --table-header: #102b22;\n    --dark-text: #a7bdb4;\n    --disabled-text: #6a867b;\n    --modal-text: #7f9e92;\n    --negative-text: #292929;\n    --new-primary: #07977b;\n    --new-primary-dark: #057a63;\n    --new-secondary: #c3dc00;\n    --new-secondary-dark: #9db300;\n    --text-selected: #a9ffe9;\n    --text-selected-secondary: #f2ffb0;\n    --table-hover: #17332b;\n    --elements-hover: #0f241e;\n    --box-shadow: #00000045;\n    --separator: #2a5a4a;\n    --separator-light: #33705b;\n    --background-general: #040b09;\n    --tools-general: #060f0c;\n    --component-general: #1a4036;\n    --component-general-hover: #215246;\n    --component-general-hover-extra: #296458;\n    --overall-holder: #081813;\n    --dropdown-back-general: #6bb5a1;\n    --active-general: #060f0c;\n    --row-cell: #030a08;\n    --row-odd-cell: #040d0a;\n    --special-columns: #214b3f;\n    --h2h-back: #07120f;\n    --h2h-back-hover: #0b1b16;\n    --active-buttons-back: #3b8974;\n    --prob-viewer-hover: #225246;\n    --custom-modal-back: #0b1b16;\n    --background--buttons-hover: #409e82;\n    --primary-gradient: linear-gradient(to right, var(--new-primary) 0%, #b4d400 100%);\n    --session-results-hover: #0f241e;\n    --table-dnf: #6a867b;\n    --new-primary-background-dropdown: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --new-primary-background-dropdown-items: color-mix(in srgb, var(--new-primary) 45%, var(--elements));\n    --new-primary-transparent: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --tech-grid-highlight-color: var(--new-primary);\n    --text-secondary: #b9d0c8;\n    --text-tertiary: #89a9a0;\n    --switch-border-on: var(--new-primary);\n    --switch-border-off: var(--text-general);\n}\n\nbody.audi-theme {\n    --background: #0c0708;\n    --generals: #140b0d;\n    --superficials: #1a0f12;\n    --dropdown-back: #31171d;\n    --elements: #231114;\n    --augment-buttons-bg: #472027;\n    --augment-buttons-hover: #5a2831;\n    --dropdown-hover: #3b1c23;\n    --table-default: #12090b;\n    --table-default-odd: #160b0e;\n    --table-header: #2a1318;\n    --dark-text: #c7b7bb;\n    --disabled-text: #8a767b;\n    --modal-text: #a08b90;\n    --negative-text: #292929;\n    --new-primary: #C00A26;\n    --new-primary-dark: #9a071e;\n    --new-secondary: #f1f1f1;\n    --new-secondary-dark: #cfcfcf;\n    --text-selected: #ffd0d8;\n    --text-selected-secondary: #f3f3f3;\n    --table-hover: #4a232b;\n    --elements-hover: #32171c;\n    --box-shadow: #0000003a;\n    --separator: #4a1f27;\n    --separator-light: #5b2730;\n    --background-general: #0e0709;\n    --tools-general: #130a0c;\n    --component-general: #4b222a;\n    --component-general-hover: #5a2831;\n    --component-general-hover-extra: #6a303a;\n    --overall-holder: #1b0d10;\n    --dropdown-back-general: #a96471;\n    --active-general: #140a0d;\n    --row-cell: #0d0708;\n    --row-odd-cell: #11090b;\n    --special-columns: #4f222b;\n    --h2h-back: #1a0f12;\n    --h2h-back-hover: #241317;\n    --active-buttons-back: #6a303a;\n    --prob-viewer-hover: #5a2831;\n    --custom-modal-back: #231114;\n    --background--buttons-hover: #7a3844;\n    --primary-gradient: linear-gradient(to right, var(--new-primary) 0%, #ff6a7f 100%);\n    --session-results-hover: #32171c;\n    --table-dnf: #8a767b;\n    --new-primary-background-dropdown: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --new-primary-background-dropdown-items: color-mix(in srgb, var(--new-primary) 45%, var(--elements));\n    --new-primary-transparent: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --tech-grid-highlight-color: var(--new-primary);\n    --text-secondary: #d8c6ca;\n    --text-tertiary: #b59ea4;\n    --switch-border-on: var(--new-primary);\n    --switch-border-off: var(--text-general);\n}\n\nbody.vcarb-theme {\n    --background: #070a12;\n    --generals: #0d111d;\n    --superficials: #101827;\n    --dropdown-back: #1f2d4b;\n    --elements: #172033;\n    --augment-buttons-bg: #2c3e63;\n    --augment-buttons-hover: #37507d;\n    --dropdown-hover: #26385a;\n    --table-default: #0c0f1a;\n    --table-default-odd: #0e1321;\n    --table-header: #1a2740;\n    --dark-text: #b8c6de;\n    --disabled-text: #7888a5;\n    --modal-text: #8fa0bf;\n    --negative-text: #292929;\n    --new-primary: #6c8ff3;\n    --new-primary-dark: #4f6fcf;\n    --new-secondary: #f1f1f1;\n    --new-secondary-dark: #cfcfcf;\n    --text-selected: #d8e2ff;\n    --text-selected-secondary: #f3f3f3;\n    --table-hover: #2a3e66;\n    --elements-hover: #1f2c48;\n    --box-shadow: #00000045;\n    --separator: #2b3f6b;\n    --separator-light: #355081;\n    --background-general: #090c16;\n    --tools-general: #0d111d;\n    --component-general: #2f446f;\n    --component-general-hover: #37507d;\n    --component-general-hover-extra: #415d91;\n    --overall-holder: #111a2a;\n    --dropdown-back-general: #6e90cc;\n    --active-general: #0d1220;\n    --row-cell: #080a13;\n    --row-odd-cell: #0a0d18;\n    --special-columns: #314a7a;\n    --h2h-back: #101827;\n    --h2h-back-hover: #16223a;\n    --active-buttons-back: #415d91;\n    --prob-viewer-hover: #37507d;\n    --custom-modal-back: #172033;\n    --background--buttons-hover: #4a69a3;\n    --primary-gradient: linear-gradient(to right, var(--new-primary) 0%, #b1c4ff 100%);\n    --session-results-hover: #1f2c48;\n    --table-dnf: #7888a5;\n    --new-primary-background-dropdown: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --new-primary-background-dropdown-items: color-mix(in srgb, var(--new-primary) 45%, var(--elements));\n    --new-primary-transparent: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --tech-grid-highlight-color: var(--new-primary);\n    --text-secondary: #c8d4e8;\n    --text-tertiary: #9fb1cd;\n    --switch-border-on: var(--new-primary);\n    --switch-border-off: var(--text-general);\n}\n\nbody.williams-theme {\n    --background: #050a12;\n    --generals: #09101d;\n    --superficials: #0c1526;\n    --dropdown-back: #162a4d;\n    --elements: #0f1d33;\n    --augment-buttons-bg: #1f3b6b;\n    --augment-buttons-hover: #284a86;\n    --dropdown-hover: #1b3460;\n    --table-default: #070e1a;\n    --table-default-odd: #081122;\n    --table-header: #12284b;\n    --dark-text: #b8cbe4;\n    --disabled-text: #7489aa;\n    --modal-text: #8fa8c8;\n    --negative-text: #292929;\n    --new-primary: #1868DB;\n    --new-primary-dark: #0f52b0;\n    --new-secondary: #f1f1f1;\n    --new-secondary-dark: #cfcfcf;\n    --text-selected: #d7e8ff;\n    --text-selected-secondary: #f3f3f3;\n    --table-hover: #1b3a6a;\n    --elements-hover: #13294b;\n    --box-shadow: #00000045;\n    --separator: #173a70;\n    --separator-light: #1d4586;\n    --background-general: #060c16;\n    --tools-general: #09101d;\n    --component-general: #21427a;\n    --component-general-hover: #284a86;\n    --component-general-hover-extra: #2f579d;\n    --overall-holder: #0c1628;\n    --dropdown-back-general: #5b83c6;\n    --active-general: #081020;\n    --row-cell: #050a12;\n    --row-odd-cell: #060d18;\n    --special-columns: #22447f;\n    --h2h-back: #0c1526;\n    --h2h-back-hover: #0f1f38;\n    --active-buttons-back: #2f579d;\n    --prob-viewer-hover: #284a86;\n    --custom-modal-back: #0f1d33;\n    --background--buttons-hover: #3564b3;\n    --primary-gradient: linear-gradient(to right, var(--new-primary) 0%, #6fa7ff 100%);\n    --session-results-hover: #13294b;\n    --table-dnf: #7489aa;\n    --new-primary-background-dropdown: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --new-primary-background-dropdown-items: color-mix(in srgb, var(--new-primary) 45%, var(--elements));\n    --new-primary-transparent: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --tech-grid-highlight-color: var(--new-primary);\n    --text-secondary: #c8d7ee;\n    --text-tertiary: #9fb7d6;\n    --switch-border-on: var(--new-primary);\n    --switch-border-off: var(--text-general);\n}\n\nbody.haas-theme {\n    --background: #0b0b0d;\n    --generals: #121216;\n    --superficials: #17171d;\n    --dropdown-back: #2a2a36;\n    --elements: #1f1f29;\n    --augment-buttons-bg: #343443;\n    --augment-buttons-hover: #414154;\n    --dropdown-hover: #30303f;\n    --table-default: #101013;\n    --table-default-odd: #131318;\n    --table-header: #24242f;\n    --dark-text: #c6c6cf;\n    --disabled-text: #858591;\n    --modal-text: #9b9baa;\n    --negative-text: #292929;\n    --new-primary: #f62039;\n    --new-primary-dark: #cf1a2f;\n    --new-secondary: #c1c1c7;\n    --new-secondary-dark: #9d9da4;\n    --text-selected: #ffd1d7;\n    --text-selected-secondary: #e7e7ea;\n    --table-hover: #343443;\n    --elements-hover: #2a2a36;\n    --box-shadow: #00000045;\n    --separator: #3c3c4c;\n    --separator-light: #48485a;\n    --background-general: #0e0e12;\n    --tools-general: #121216;\n    --component-general: #3b3b4c;\n    --component-general-hover: #47475c;\n    --component-general-hover-extra: #54546b;\n    --overall-holder: #17171d;\n    --dropdown-back-general: #8d8d9e;\n    --active-general: #121216;\n    --row-cell: #0d0d11;\n    --row-odd-cell: #101015;\n    --special-columns: #3a3a4a;\n    --h2h-back: #17171d;\n    --h2h-back-hover: #1f1f29;\n    --active-buttons-back: #54546b;\n    --prob-viewer-hover: #47475c;\n    --custom-modal-back: #1f1f29;\n    --background--buttons-hover: #64647d;\n    --primary-gradient: linear-gradient(to right, var(--new-primary) 0%, #ff7a88 100%);\n    --session-results-hover: #2a2a36;\n    --table-dnf: #858591;\n    --new-primary-background-dropdown: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --new-primary-background-dropdown-items: color-mix(in srgb, var(--new-primary) 45%, var(--elements));\n    --new-primary-transparent: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --tech-grid-highlight-color: var(--new-primary);\n    --text-secondary: #d1d1da;\n    --text-tertiary: #a7a7b5;\n    --switch-border-on: var(--new-primary);\n    --switch-border-off: var(--text-general);\n}\n\nbody.alpine-theme {\n    --background: #120b11;\n    --generals: #1a101a;\n    --superficials: #221523;\n    --dropdown-back: #3b243e;\n    --elements: #2a182c;\n    --augment-buttons-bg: #4a2c4f;\n    --augment-buttons-hover: #5a3560;\n    --dropdown-hover: #4b2a50;\n    --table-default: #19101a;\n    --table-default-odd: #1f1321;\n    --table-header: #34203a;\n    --dark-text: #cbbdcf;\n    --disabled-text: #8a7b8f;\n    --modal-text: #a08ea7;\n    --negative-text: #292929;\n    --new-primary: #F168BA;\n    --new-primary-dark: #cc4f9a;\n    --new-secondary: #47c7fc;\n    --new-secondary-dark: #2da6d6;\n    --text-selected: #ffe0f2;\n    --text-selected-secondary: #cdefff;\n    --table-hover: #4a2c4f;\n    --elements-hover: #3b2440;\n    --box-shadow: #0000003a;\n    --separator: #5a3a5f;\n    --separator-light: #6a4670;\n    --background-general: #140d14;\n    --tools-general: #181018;\n    --component-general: #5b3a60;\n    --component-general-hover: #6a4570;\n    --component-general-hover-extra: #7a5182;\n    --overall-holder: #281828;\n    --dropdown-back-general: #b77cb8;\n    --active-general: #1f121f;\n    --row-cell: #160d16;\n    --row-odd-cell: #1b111b;\n    --special-columns: #5f3f66;\n    --h2h-back: #221523;\n    --h2h-back-hover: #2f1f33;\n    --active-buttons-back: #7a5182;\n    --prob-viewer-hover: #6a4570;\n    --custom-modal-back: #2a182c;\n    --background--buttons-hover: #8a5a92;\n    --primary-gradient: linear-gradient(to right, var(--new-primary) 0%, #47c7fc 100%);\n    --session-results-hover: #3b2440;\n    --table-dnf: #8a7b8f;\n    --new-primary-background-dropdown: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --new-primary-background-dropdown-items: color-mix(in srgb, var(--new-primary) 45%, var(--elements));\n    --new-primary-transparent: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --tech-grid-highlight-color: var(--new-primary);\n    --text-secondary: #d8c6d8;\n    --text-tertiary: #b59eb5;\n    --switch-border-on: var(--new-primary);\n    --switch-border-off: var(--text-general);\n}\n\nbody.mclaren-theme {\n    --background: #120b08;\n    --generals: #1a100c;\n    --superficials: #22160f;\n    --dropdown-back: #3b2a1f;\n    --elements: #2a1b13;\n    --augment-buttons-bg: #4a3124;\n    --augment-buttons-hover: #5a3a2b;\n    --dropdown-hover: #4b3326;\n    --table-default: #19100c;\n    --table-default-odd: #1f140f;\n    --table-header: #342218;\n    --dark-text: #b7ada8;\n    --disabled-text: #7f746e;\n    --modal-text: #8f847d;\n    --negative-text: #292929;\n    --new-primary: #ff8000;\n    --new-primary-dark: #d86a00;\n    --new-secondary: #47c7fc;\n    --new-secondary-dark: #2da6d6;\n    --text-selected: #ffd9b5;\n    --text-selected-secondary: #cdefff;\n    --table-hover: #5a3a2b;\n    --elements-hover: #3b281e;\n    --box-shadow: #0000003a;\n    --separator: #5a4033;\n    --separator-light: #6a4b3c;\n    --background-general: #140d0a;\n    --tools-general: #18100c;\n    --component-general: #5b3a2c;\n    --component-general-hover: #6a4534;\n    --component-general-hover-extra: #7a5140;\n    --overall-holder: #281a13;\n    --dropdown-back-general: #b77c5d;\n    --active-general: #1f120d;\n    --row-cell: #160d09;\n    --row-odd-cell: #1b110c;\n    --special-columns: #5f3f33;\n    --h2h-back: #22160f;\n    --h2h-back-hover: #2f1f16;\n    --active-buttons-back: #7a5140;\n    --prob-viewer-hover: #6a4534;\n    --custom-modal-back: #2a1b13;\n    --background--buttons-hover: #8a5a44;\n    --primary-gradient: linear-gradient(to right, var(--new-primary) 0%, #ffb46b 100%);\n    --session-results-hover: #3b281e;\n    --table-dnf: #7f746e;\n    --new-primary-background-dropdown: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --new-primary-background-dropdown-items: color-mix(in srgb, var(--new-primary) 45%, var(--elements));\n    --new-primary-transparent: color-mix(in srgb, var(--new-primary) 25%, var(--elements));\n    --tech-grid-highlight-color: var(--new-primary);\n    --text-secondary: #d2c1b7;\n    --text-tertiary: #b0978a;\n    --switch-border-on: var(--new-primary);\n    --switch-border-off: var(--text-general);\n}\n"
  },
  {
    "path": "vercel.json",
    "content": "{\n    \"headers\": [\n      {\n        \"source\": \"/assets/images/(.*)\", \n        \"headers\": [\n          {\n            \"key\": \"Cache-Control\",\n            \"value\": \"public, max-age=31536000, immutable\"\n          }\n        ]\n      }\n    ]\n  }\n  "
  },
  {
    "path": "webpack.config.js",
    "content": "const path = require('path');\nconst HtmlWebpackPlugin = require('html-webpack-plugin');\nconst MiniCssExtractPlugin = require('mini-css-extract-plugin');\nconst CopyWebpackPlugin = require('copy-webpack-plugin');\nconst webpack = require('webpack');\nconst packageJson = require('./package.json');\n\n\nmodule.exports = {\n  mode: process.env.NODE_ENV || 'development',\n\n  entry: './src/index.js',  // Archivo de entrada principal\n\n  output: {\n    path: path.resolve(__dirname, 'dist'),\n    filename: 'bundle.js',\n  },\n\n  plugins: [\n    new HtmlWebpackPlugin({\n      template: './src/index.html', // Path a tu HTML original\n      filename: 'index.html'       // El HTML generado irá a 'dist/index.html'\n    }),\n    new MiniCssExtractPlugin({\n      filename: 'styles.css',\n    }),\n    new CopyWebpackPlugin({\n      patterns: [\n        {\n          from: 'assets/images', // ajusta esta ruta a donde tengas tus imágenes\n          to: 'assets/images'\n        },\n        {\n          from: 'src/data',\n          to: 'data'\n        }\n\n      ]\n    }),\n    new webpack.DefinePlugin({\n      APP_VERSION: JSON.stringify(packageJson.version),\n        BUILD_ID: JSON.stringify(\n          process.env.BUILD_ID ||\n          process.env.VERCEL_DEPLOYMENT_ID ||\n          'local'\n        ),\n      'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),\n      'process.env.PATREON_CLIENT_ID': JSON.stringify(process.env.PATREON_CLIENT_ID),\n      'process.env.PATREON_REDIRECT_URI': JSON.stringify(process.env.PATREON_REDIRECT_URI),\n    })\n  ],\n\n  resolve: {\n    extensions: ['.js'],\n    fallback: {\n      // Si tu código usa 'buffer' (p.ej. new Buffer o Buffer.from)\n      buffer: require.resolve('buffer/'),\n      \"vm\": false,\n      \"stream\": false,\n      \"fs\": false,\n      \"path\": false,\n      \"crypto\": false,\n    },\n  },\n\n  module: {\n    rules: [\n      {\n        test: /\\.js$/,\n        exclude: /node_modules/,\n        use: {\n          loader: 'babel-loader',\n        },\n      },\n      {\n        test: /\\.css$/i,\n        use: [MiniCssExtractPlugin.loader, 'css-loader'], // Usa el plugin en lugar de 'style-loader'\n      },\n      {\n        test: /\\.(png|jpe?g|gif|svg)$/i,\n        type: 'asset/resource',\n        generator: {\n          filename: 'assets/images/[name][ext]',  // Copia las imágenes en dist/assets/images\n        },\n      },\n    ],\n  },\n};"
  }
]