Torn Dopewars – Travel Edition

A classic DOS-style Dopewars mini-game overlay that auto-runs while flying in Torn. Features Torn NPC events, draggable game window, and destination-based trading.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да инсталирате разширение, като например Tampermonkey .

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         Torn Dopewars – Travel Edition
// @namespace    https://greasyfork.org/users/000000   // (replace with your GF user number)
// @version      1.7.6
// @description  A classic DOS-style Dopewars mini-game overlay that auto-runs while flying in Torn. Features Torn NPC events, draggable game window, and destination-based trading.
// @author       loneblackbear
// @license      MIT
// @match        *://www.torn.com/*
// @grant        GM_addStyle
// @run-at       document-end
// ==/UserScript==

/*
MIT License

Copyright (c) 2025 loneblackbear

Permission 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:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE 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.
*/

(function() {
    'use strict';

    const LOCATIONS = [
        "Mexico","Cayman Islands","Canada","Hawaii","United Kingdom",
        "Argentina","Switzerland","Japan","China","UAE","South Africa"
    ];

    const COMMODITIES = [
        { id: 1, name: "Weed",    baseMin: 100,  baseMax: 400   },
        { id: 2, name: "LSD",     baseMin: 500,  baseMax: 1200  },
        { id: 3, name: "Cocaine", baseMin: 5000, baseMax: 15000 },
        { id: 4, name: "Heroin",  baseMin: 3000, baseMax: 8000  },
        { id: 5, name: "Ecstasy", baseMin: 700,  baseMax: 2000  },
        { id: 6, name: "Speed",   baseMin: 200,  baseMax: 900   },
        { id: 7, name: "Shrooms", baseMin: 150,  baseMax: 700   }
    ];

    const RANDOM_EVENTS = [
        { label: "Leslie crate", apply: s => { const i = rnd(s.items); const e = ri(5,20); i.owned += e; s.message = `Leslie hooks you up with +${e} ${i.name}!`; } },
        { label: "Duke",         apply: s => { const v = Math.min(s.cash, ri(1000,5000)); s.cash -= v; s.message = `Duke's boys shake you down for $${v}.`; } },
        { label: "Xmas",         apply: s => { const v = ri(2000,10000); s.cash += v; s.message = `Christmas Town blessing! You gain $${v}.`; } },
        { label: "Dump",         apply: s => { const v = ri(500,4000); s.cash += v; s.message = `You flip dump junk for $${v}.`; } },
        { label: "Casino",       apply: s => { const v = Math.min(s.cash, ri(500,6000)); s.cash -= v; s.message = `Casino tilt! You blow $${v}.`; } },
        { label: "BF",           apply: s => { const i = rnd(s.items); i.price = ri(1,3); s.message = `Black Friday deal! ${i.name} costs only $${i.price}!`; } }
    ];

    const DAYS_TOTAL  = 30;
    const START_CASH  = 2000;
    const START_DEBT  = 5500;
    const MAX_LOAN    = 10000;
    const MAX_SPACE   = 100;

    let gameState = null;
    let gameActive = false;
    let inFlight   = false;

    let ui = { container: null, pre: null, help: null, toggleBtn: null };
    let dragState = { active: false, offsetX: 0, offsetY: 0 };

    let mode = "idle";   // "idle" | "intro" | "game"

    // intro typing state
    let introFullText = "";
    let introIndex    = 0;
    let introTimer    = null;
    let introCursorOn = true;
    let cursorTimer   = null;

    let bootPlayedThisFlight = false;
    let bootRunning = false;
    let bootSkipHandler = null;

    let audioCtx = null;

    // WarGames-style voice clip (user-provided)
    const WARGAMES_VOICE_WAV = "data:audio/wav;base64,UklGRnhaAABXQVZFZm10IBAAAAABAAEAESsAABErAAABAAgAZGF0YVNaAACAgICAf3p8gIGGhoSBgYOAgISGhoOEgYSAgICAgIGAfXyAgICBhoaGiYaGiYaHhoaGhoSBhoaGhoGAgH96en+Af398f31/fICBhoSAf3x8enp6fIB/enl2dnZ2eXyDgHp5en18gISGh4OAenp/gICBhoR8enp5eoCEg4eGhIB9gISGioyNhoF9enqAg4GGhoF/enl5f4SGh4aEhIGEg4eGhomGhHx5eoGKjZCQj4d8end5eXZ0cG5rcHF6iZWbn6GelYmBgYN8dHBqZWFhZXN2fISGjJCWm5uen5+flpCKenFza2poZWRla2trdHqAioyNioqMlZOQmZ6em5aShH98fH99f3p6enRtYmViYmpudnZ2eXZ0cXqAfICGiYGBhoeKhoaGjI+HioqJhoOJioSAenqAgISEgICDfHRraHN3h4qHioOEfHZ5eoCGiYaEgIGAfICEioqPmIyDh4B6gIGHhICAf3+EhICDgH90a32Ad4ePioeEgICAfH+BhISGh312dnF2hISGkoqDhICEgHZ5f4F3fIB8f4SHf4qPiomBhIqQj4yPioR6dnqJioaPiX2Af3Fwdn+AgIaBhIF8enR2gYB8gH96cGt5eXaDgHZ8gYSAeYODfICDgYR9iYqDiYeEgHx/enZ/gH+EhIR/dnp9eoCHgH9/hnx6fXN9gYSEhomBf3N/hoCAkIR3iYd0h5CJhI+PfYCNiXp5iYSAgIGBZHGHd3eJgICDfIB6fYmBhIN3g3pzh4CAiYaGgYN/eoCDgI+Pd4CHdnqKjXl/h32Diod8gIyMg4CNhIGMg4mEfYeDdn99gISAgXp2g3p3g3x6f4GHgHZ9f3p8g4B8g4BzfIR8gImDh4F/f3yAg4SAd3p/dn99gX2AgYR3fIF/hH+Nf3eJg3aBiXx/gImAcXyKf3eMhn98gH93f4GGfYeEeXp5hIB5j5Z5fY95fICAiYGJjHx8h3x5f4CPen2YbnGJg3SHj4Bzh5VffI+AfYqPg3F5kHB3jYqAg4aDenqEiYSDj4N5c4mGao2cgH2WhHZ9mIF0mYp3kH9qjHSAj3SEinZ2g4F/do+Kc5N5d4Zraph9c42HfXF9bnZ5f39/hn2NgHeEcXGGd3aBhnqHhHl/h4NodpOGdn2Zf4SHfINweoFlg5Z0gZB5f3d0jXR8noePhoGJcH1/eoGEhI+Kd4aEdoFxgY1wgJZ5fYaNgGuDj21wm39xh5iAcJWAcYeBj5J9faR3YpV5Yn+Zh22HlWKJd16VdlmrjF+YnmJ2loRreaKBapaQdKGPa5+PaomcfWuYqmd8rVtonGVulndxn4lTfZZeXq55YqeMc4F2cIB3a4aHcYCrW16hc16MjGiDiW6Hg2eQj1+DmF95mXxzkJtrbpZwc5JejZZnn4dTmHdtfHebhH2ldHGWbYd3dKh8faRubqVuWZ+KZ3qffHl5mYpojI+KbnSPd2KiilmrgWWkbWqYdoSDepZ2inxnloCAmHaQkGGVh2iVgX+PgI1xa5V0Z5+Pa4OGfIBhipZufaWcXnq8dl68nkqYsVKDll+AmYF3mW1lk4BnfZl5hI90aISAim19pYFKm39Kj4OBeneedmGPa3R8hJVhfKdnYpuJZ4Chhlx9n3NSjK1WXMJ9O5+kU1yumFZztn1VkpaDc4ChfV+SkG2Ag5twcYqWZWucfYF/kG2BloBriqFwg49uhJuHZHqwYYGNdHSNjWhllZ50a3ynj2KhfXx8h5VTerB8aol6jXFwmHGKkH92cZKGXoChgXOHiX+SgW6bn4mGh2eQlmdZqqthdp98YZCGYYSclm5VhKJcgIl2g6GMTGueg2SHfY16c4d8ZIGMfW6lgViPin9SfZtbca1xYZWYh2VlnopchJKMZIOhd2KWhmJqm3+GgICiaJB/bYCScXqcc5yBcHyMjF9xp3d5mHpnnoNkf5N3dod9mXyMfY90a6VzTaqhVoqcf4yBbnmZjGeJnH2WgU2KmGR5jG6rg2qZd32JgGh8m6JTecVfX6FzinZwoYR3lXqPipaGWJOuaGuPlpVkg59igI90enylhmWQh316f250gZJ6doOAgV95nHFqipJkfJxoVqGHPoSnXG6bg3d5kIRrd5NzdoeDjXl9lnFwg4aEZYaoeXCfcWiPbnmNcZOYa4SEhHR/h4R6oXZurWVzoXRwkmt8ioCTaly2k1N8npJcaq2PU6GVaHeGlmJopYdbmJVnioODeneSfWWkg2iPhHGbiVuDq3pNh6pkXKWSXHalh2phm59Sd7SEa4ShfXOhh2uZn4Buf5aDX5WbYoShblyJlmhuoXNksH1JeqKBc3+Wllt3nGVhk4x5X5+cTGGWeWeSkGh8jXl0Z32neWKYh16DjV6AoXZuoXBhlXRwjYmHepN/fYp0gJuNd5KJg2V0oXBwnIdxgJZ2Z4aHgX19lY9hg5Nobp+VaIGnd2GKj3l6ho1/cIGEdnePinSAkIBxg4l9fISEg32GhoB8gICAd4OGiYSBiXxxiZBwbpWhd1+MmYF8hIqMlZiAbYCZknd5hISBiXlkepOJfY2PgHR2gIB9hISAgYB2bnR8gIGAeoCEfHd8fYCAfHp2dnZ/gICEhH12enRteomJh5OThn+AgHZ2f3x3gIR/gIeGgYSGiYaJioSEg4R8dnl2cXF3eXyEhoeGhoSAhIOGhoyPhH+Ag3F2fXN6hIB5fY1/ZXmPiYCEjZCQkIdzfZKPfHN/gYaSinZ2hIN2enxxdoGEfHqDgYCEiYaGio+EgYSAfH+Af3yAhIaJioqKjJOPhoaDf3p0cG5xf4N9h4eMkI2PhHx6a2FiamVicYB6fI2Pio+PiYaPkoB0dHRwZ2FqdICKhoOTn5yKg4qQj4BtcHeBbWJudnl6bl53m41oc5uijHp3ipufimp2nqeGaHCBm62ba159jX9wcHNra2phcI+YjJWoqJWAcXR/g3Zreo+QbVJcd4qZm5ywy8KbdGplX084NUptgJCqyNjUxbCbh2pKLCYrLDFBXHqWs8jS3ePYxbmlj3ZYQS4vNTUyPmWJmaiwus/hzqukqKeKYkpHWV9QQ01obl9NX4aThG58mJmVj4aQpJmAhp+bd3CYrZhtXmt8g2E6RICqlW1ifai5oWhHWXd/dHBxdoSZnpaWnpucm5yEbXeQmY+JipuuqHMrI0RZVU9tpdjt1KGMk4FJIyIxRmV3faHS593Oxq6KZD0dECI3QVBrj7DP18Cus7aYa1JMVWFqYWSAlZaWm5uhqrCom5uTfX+EeWpna2dibWhMTXN/cWtnan2krn1ij7qqf4CNjKW/lXSky41BZKeSUjhDapmlWSlnvbdoND1hjaJ8RE+HpJ+bkGtVepyYgYGZtMKxg1VYfIR2boGu0caZZ0lJSkFBT4Cxycm6pIpxYVY6KEZ0lqurs8PY2KRtaHl2TSgdMlyHhmp5rtHIraGhoaKKZ09cdHZwa252ipyZj4aTpK6wm4aBiYdtVlJZYWtkUkxcc2tYWWF0gIyZnJ+lsK2TkqSelqeooqq2kkxQioxcPlOHqKVxO0+bt301K1uNp5BTQG2rxr+kfE9EX3N3h6rO5NuzdkQxLj1Sd6jO5N28g0MiGSAxTHmhw9LCmXRhVUZAR1uEscjOw7alkIR6bmReZGVham10gI+VnKikk4aGioR5Z2d3io1zYW2PnpaEd4akt6eBdoCPj31uZ3aDdFVBTGp/g3FnbYSQemVtk66zqJaPkKeqfVxqiqWzqG1Bba6hUyg+hMLCejhQpcuPOyNPotW2YjdepMKxhmVeepB/YWSPwtW9kGteYVZDRminy8arimtbTDcpQXSis66fkImBdFxPXmp0d4abp7SznIB2dGpfVltrhJiVhoGKk4+Df4SKlZiKf3p/d3BubnB5iZOVlZWQj4eEgIGPlY+BenRramVkZXB0bXF2eXmAiYGBipCVm5mPh5OZkJaZhn2EiomGh3Bkh5t5TEZ0nqiTYURtpaVtRFONvcWKQzRipMK5mX16iYdrWGKTws/Cm3xuZVZHTXGfwsOohmtZTEQ9TG6VrbCqmYN/bVtQUmFxgJCepKScjIB6eW5fX2VudHx/fISSk4+Hio+PiYB5dn+AenRta3B6hIyTlZKKhoaGj5mVj4F6cWpqaG52hIaAeXFra3F5fYyZmZWVk4eGhomGh5mZjIqPg3d/eVxZhJuGcXGAj495Ukd2pKWBa3GPq6V2QzpflbzDqoRtbnRrYWuNrsO6m3ZYUlZfa4ScqrGljXFhW1ZWZ4CVqLaun4x8a1hVUl92kJ+lopWGenZ3dnZ2c3l8gH92eoGHipCTkI+Minxta2trbm5rbXqBhICAgH2AhI+TlpiKgHp6enZ0cXZ2dnl2dnZ8gHx2eoGNkJCQjI+QkIyDgImJhpOek4GAc1heg4+AeYSNj4dwVlN/pJmAd4qepZhnPkNuma62pYp6eXNiZXeVqrStj3RhVlBWa42ot7CZempfUkxTa4ant7CfjH90a2VhZXaGlZuem5WQjI2Kg3ZxcGtwdnp/gY2QmZuVioGDfXx8fHRqZGRlbnqAgYaJiYaDhISBhIqNjIqEd3RwamdrbnF5fH96dndzdn2EiYyVlZCQj4d9h42GipCNg4aNfHB0eXBreoyTkIdzZHqPinZodo+kqIpcRFmEqLyzk25hZWtwfIyfs7qqh1xGPURhiq69uaSEa1tQTE1kgJmoqp+QgHd6dnBra258kpmWlZWMioqEd3Rta2trdHyEk56koZ6Qg3p3enyBhoR8dnRra3B2f4aQkoyPjImGiYF8fX9/enl0cXRxdnBoa2txeoCAgICEho+MiYaKiYGJkJONiXptdISKhIB9cGt2gYZ9dGtwiaSlhGVhdpKfkmtSX4OnvbqZcVtYZXGAj5+zurGVbVA9QFJ6p8XOvZ+BZUw9QFBxmbO8tKWTgHRnW1Nba4CTm56em5mPgHRra2tra3B0f4SMk5WMiYePkJONfHBnZWp0gIaEf3p/gYmKiYqQmZublo+Ed3Zzdnp8eXZ3dnZ5enl2dHF5gIaPk4+GhoN3gId8doCSj4GDdmdea32AgHx0doyhjWVNW3aWpY1nU2eNqrmohFxNX3eKlp+kpaqfhGtPQENfirnPxa2KZ1BHSlNuiZmkpaKVhn9xZWFha3yPkpOQkJOSlZCJf3RraGtwdnZ2gI+ZoqWklol6cG5xeXyAgHp3dnRwcHR6hJCbm5aTjIR/dnl8fHp6enp/fHRwcHR2f4GGiYaJj4+GipKMioqDfIacnol2a2FidoqYj31rYnSKknlYUmqNp6eEWExhhKSzpHxhXGd5hpCVm6Kfj3FWQ0FVf6e9v7GWgGtbT0lQZYScqK2hkIR6dGpfW19wg5OfpaWflYeEfHRwamhna3B2hJCZn6Sfm5WKgHZ2dnd/gYB5a2hncICPmZ+cj4SAgIeMkIyBf3d6fH9/dmphYWdxg4+TjISAgIeKhoaAfIaVm56ckHlnanR/h4qHf3Z5fYyWloBnWGJ/lZ6Pc2VrhJuopIZrXF9ugZifp6SWiXZhUEZMYomqw8m5mXFQOzdBVnaQn6qrqqSTemFPPUBSa4mbqKutpZ+VhHNfVUxWbXyKk5CQkJKQmZmPh3x6fICDgH92cGtocHeEipCTlpmVj42GhHx6fICDgICAenRra2trcHZ/gYSEio+PiYaAen2NlZufnop3dnZxdHp9en1/gIePkoBrZWd5hId6a2pxiZ+qp492Z2p3jJ6lp6GZiXlqXFthdo+qubquk3NZRkFMYXqQoqiooZaJdmRVSkpWanyPnqWqpaKVhHRhVVBSXGd0gI+Zn6KfmY+DenZ3dnp6dnd2cXBxeXyEhoyVm5+blYyEf3Z2dnZ9gISBf3Zramt0dnZ2dn+Ekp6lqJ6PfXZ/ipiWj3pnZ3aJlZuTfXRtcHR/h4qJgXZuZV9fa4CWrrm9s5Z0U0E9Rlt6mbC9v7mum4RoUkE+Slx6ma69w7yqlYBrW1JPUFtlcYOMlp+lp6KekIZ/cWpna25wcG10eoCEio+QkJCMiYaJipCSkI+EdmtnZWJqcHZ6enZzcXSAjZCShHZucH+MlZmVjYaGhoyTlZKGemVSR0dWdJCqvcO0mXpYRj5BUmuKpbnDw72tmHdhTEFBUmuKpbnDxrmqlXxqWFBMSVVfboCQoauxq6SZj4BxamRhYmFhYWdweomQmZuWlY+JhoqPkJOQioB0a2doZ25xc3l8gIGGjJaem496cG52iZakpaGelpOMhoR8dGtkW1ZbZ3SGmaeonolqVUE6OEdkhqrAycm/rYxwVkpBQUpcd5ClucPGv66TdllBNTVAT2F0hJmosLe0rqGQf2hbVlVVX2pxeYCGj5CYlpuem5mVlZaVkIyHf3RuZ2RlamdrdHp6fICEjJCMhICAhI+Znp+blY+KhoaBg4GEgHZua2twdoCKkoyDcGFQREZQZ4mlvMXDuaSJa1lMTFBcdIynucPOy8OwmYNnUz01Mj1MYXmVqrm6ubOokHpuZ2RcWVZYZGdrdH+HjJOWm56emZaZlZCPgX96dG5nZF5cW1xlbXZ/ipOQj4R6eoGKkp6fnpWMjYqKioqJhoB0amVnbXB6hI+ShndqX1lWWWJ2ip6utrmun4pzZFhWVmF5la69xci/s5+JcFhHPTtASlttgJWhqKqooZmPgHlwaGFcW1tfZXB/jJyfn6Sfm5aVlZWVkI2BdmpfW1ZZX2p2gISGio+QkIZ9c3F5hpmkraqknpKPhoaGgYB8dGdkZGd0fIqVlYdwWUQ1MTdMa5Ozw9HOv6WGalJEPUNWa4mkucjPzsCulXpcQzUyN0BKX3eQoa62ureqm4Z2ZVxZVltfZ3N6hI+Znp+ioaGfm5mQj4qBenFqZWVlZWVqcHR3f4GJj4+KgYCBipWbop+em5aTjY+Pj4+Mh3drZWdzeoCAgH9xZFVMTExbcISbqK2knpWJemtkXmRqdo+lucPOzsOxm4BqW0pBREdSXGd5jJ6kqqqkmYZ2a2dlZWFhZ25xeYCMmZuen5mVkI+HiYaAenRuZWFhYWhrbm5ubnF5gIaJioqMkJCQk5WVlpmVj4qKhoaBgHx5dnZ5en+BhH90bmJfXGFqdomVnp+bmY+Hf3Rwa3N2f4mWp660tKuikHpnX1lWWVxlcXyEj5mfpJ6VioF5a2VkYmVlZWpxeYCJj5aem5mVlZWQkIyJgXp0cHNwcHR2fXp6enyEhoeGiYmKj42QkJCQjZCQj4qBf3l0a2trbXR2fISGhHpwZ2FhYWVxg4+Wm5uZj4N5dnRxcXR2g4qQkJWVlZOMg3p0bmdlamtzdoCMlZWQkpCPhHlua21rcHR2eXd6fH2Eh4qPlZmWk42MioSAgYaGhIB9gH18enp6enp8gYmGhIGJioaEgYmMjIqKjYqDenZ3dnRxc3l8f3p5eXZ3dnp/gISGj5OVk4yKioR/dnZ2eXp5f4aPjY+PkI+KhIB/f3x6fYaPkJOVk5CGf3Z0cG5ua21ramprbnF5fISKkJCQkJCPjYeKioaEf316eXZ2dnN0cHB0en99f3+AgH2AhIqPjI+Qj4qEf3p6enp6fIB8eXZ2eXZ3dnyBgYCBhoaKioyQkI+GgYOBhICAhIaAfHx/gISGhomKiYaEgYGDgIOEhHx2d3Z6enp/gYR8eXl6f4CAgYSAfHp8gISGhoaGhH9/gYaGiYmHiYR/fICEg4eGhISAenyBhomJhoSBgH+AhIaGhoGAgH93en+Ag4B/f399en+BhIGBf3x/enZ9gIOBgYB9gH18f4CAfX98gICAgIGEgHx6d3p6en+BhoaGhoaJhoGAfHp2dnN2en2AgYaJhomHioyKhoGAgHp5eXmAhICAhIOGhomKkJKMioqGhoGAgYR/dnZzdnZ6f4GHhoaGg4aGioqGiYR/fHx5dn+Bh4mJhoOEgYaJhoeGhH92dnZ3eXp8f399gISBgICAgYGBg4qVnJ+hm5WKfXRxc3Z6gISKj4qEgHp3cW5oamVfW1xlcH+Qn62zs7Cnn5CDdGdfVU9MUFVYX2JrdoSPlqSut7m5s6ukkIB5bWhhX1ZTVlJPUFtqdoSPmZ6fnpuZlZWVlZOPg3p8hIqTlpaVkI+GgYB6dGtlXFVTUltqdIOMkpCKgHFwdH+Gk56lraWfm5KPhoB6enp6f4aQmZaTjId5YVBDQDs7QExkepCovczP0cm9rp+JcWVbUEpBQUFGSlZugZuwwM7V2M7Dv7aqnJOAa1lHOiwrKCw1PUpVX2t3hIaPmaSxtK6rsLO2urq0rqGVjIR8cWpcVUY6MTE4QVJldIOKiYF3dGtudoSTpK6wt7SuqJ+VkIyKio+ZoaWqqJ+TgGtWRzosLC44TGF5lbDAy9HLw7ahiW1bRzcxLjU7RlJlepCqwNTe5OPe2NTLuqiYgGVKMSAXFxwiKzE+TFtrgJOhsbm6ubCurrO0sK6qqq6qp6GZj4R/cWVcVUpGRkNERkxTXG6BlqSqp5mKenBraHN/iY+WmZCKhoGEipCZpK62vbq0rp+Ja1AyIBcUHCg6UGuElqi5v8PAvKuZg2tZSkRBQUZNWWV6kKW6y9jj493Pw7qwpJaKd19HPS8iJiwvMT1NVmRxhJKbrbOwtLq5qqSkpailnIZ8gIeTlpWJdmphYWFhYV5fW1lWU1lcZXSAj5aclpCKgYSMlZmhrrCwsKWWj4l9dHSAipCcn5yTioR2ZVxPOzU0MjpHYXmQqrm9vbq3qp6PgGtWSkE7OkBKWHSKm7DAzs/Y2MvDva6Zj4l2W1BELB8lJiIoO0lDUm1wcYensLHFzsjM3dS2n5uZlp6bd1NSX2VrdGtcXG55d3+Eg3yBjYN2dmtkYnB2dHFwamd0gI+bsMbLz86/qpmShn19dG5rcHR8gISEgHpwYlZDQD43QFBfcYekub/J0si5s6WJbWdeQ0BKSkRTbXF3n8LDxuPp1cnOwJaPmINWSVtAFyg3HBAxTDg6bop5h7HDusvjzrTO4cyimJN9fIdrQD5YX1Zld2pVaG5rdHZ6gYSBhH90cHZ/dHeNin95fH1td5ONjaWxqqGkn4yGjYB2eX9/fY+ZkIqJfWdWUEpBQUZKVmpxhJuwyNXa2tLDsJl8ZVJBOzcxLjtJUmqKn7DF29XP0djFs7mzk3N/cTUuUkAWKVNBJUFqXFaEm4ycw8Kiq9TMqLC6pZilpX9hf4ZiYXl2WFZua1xqdmttf4R9doOEfHyBhIB9hHxzf4N6gI2Qk5aWk4eEfYCAd32DeXyTkoOYnoyAgYFZRFZKNEZeYWF6m5mYur2tsLSog3FzXEZEVVNEVnNrdp6xsMPb2sbJzLOkm5aPaGd0SStJTCwpVV86RHNrXnqcoZm5w6iotrmnm6elkIyTfGR5h3N6jHdxd3Fxen90d49zZHxrXGt2dmdzh3Zof4aGipanm5OkpJaSoaSJipmKd4CNjIqTmY99eXZlU1ZeUkxZX1xrg4yZqLS5rqillXxzbVZHRj01MkRQWHCKnKq/0tTL1NrGzsyrlZCBT0FbNxc4PiIgSVUsOHBzX4m3tqvJ3sCzz8yllaeceYCPbVhqcV5YbnRnaICEenyKiXl/gHx6en99f3p3eW1wenZ6iYmKkJmelpacm56Zk5yNg5KKfYqPfYCNd2Vla1VEWUo6VmpndJOkn6W/vJ+npJmEc3xqTVZeTENbdnBzpbOkudHJurzGtqGlp4lucHNVMUdYKSZTVTQ7cXNDXpiEcJm/tKLD2K2fv7CPgY+KZXSBYVZlamVka3lxbn10g4FleYNnZXRzYWKDgWh/lYeEipyYhJ6unpKlq4yBm5N3gI2Adnp/d210fXR0gH1rbm5iYWVrcHqHj5ykq7Orp6qfjIR5Z19WTEZGSUpVZG2Bm6etxdfP1N3UxcC5n4OPbkRSQx8jNCIjREk6VnpnZ4+klZzCzsO3xc62q7yzkpCYgGFbYllKW2RTUGFxZ2uGjYaQmZCKhoqHfH+Ed2drbmFlcHZ6fISGgYSHk5iSp6qbpJ6HjI99f4R9Z2V8alx2dF9famhTUmRiVW6Dh4+YraWhvMOwp7CifGtzX0dMVkdBUFteXoCepK7O2svO0s7DurylkIR0WUE6MSgrLiwvREY+ZX1tga2tk6vUw6K6z7qrtsOlj6unfXGDekpKblI0TGRHNV5xVl6Pj3qPpKKSpLaim6SkjHmAg3BrfXptc3p5aHeMhImZnpuWmZmPipKKgX1xamRhZGJqa2doXFZbX1xebXl2gZOVmK60uby3uqWWk31nX15VR0xcSkZrbmR/nqeeutTAus7IsKKnk21ocVU7QU0+LDtKODdQZ2FojaSbmL/Ura3X1bGzz8CNlbGNaHeDa09ielhJaGVMRFleSVJzbl52kI+GkKWemLG0q66uqqSVh4l8bW5wbmJhbmtea3RwcYCPj4yfqJiZpJyKhpCBdHl9bmdzcGRfZ2peZ3dxbXyDeoCTnp6qubq6ua6nloR5a1ZMTEY4O0FER1VkcYSbrbnAzs/JwsO5q56Th3FkZFA3Oj4vKDtNPkltc2iApKKKq9W3pczatJm5v4R6qJJhcZB5UGuDXklncVZPaGtTZYN2YnaWh32Zp5mbrq6fm5+YhomJfXp2enpranRuanR/enqKkoaKlZmTkJWYh4GHeWt0eW1reXlqZ3BrYWdza2h3enF8k56hsL2/wMO6pZ6ZinlnX1A9Ojo3PU9bZXmPmaG0w8bOz8nAua6bhHZuW0pANSsiJiguO0dVW2J3gISTq726xdXDtr/ApZuqp4R3inpeYW5qXmt3YltrbVtcc3FncX90a4GJhpCfpaGen6KZlZiVj4yKf3F0cWtzdnZ2fXp6gIGEhoqPjI2MkIyHiYF/d3Z0bXB0eXZ2eXp0cXZxbXR2cXaAhI+ZpbO5ury2saifk310alZKREA9REpWZW6AjJmotsPCyM7FtrColYB6bllQSjcsLzI6PUdVXGVweomVpLO6ur+5s66qpaWklZCWemRqalZPZGVJUmhcT2F8enmJmIp6io+AfY+SgYSPhHF3jYaEmJ6VkpuWjIqQioOGhnx5enRxdnZxcHRwbnR5fICEhoaGioaAgImJho2JgYSGhIGMkIyPj4N5cGVcVlthanGDj5mkq7m2s7ConpWHcFxSSkE+QUFET1xwhJ6zusK/wr+9urSrqJmDcGRWRkFBQUdQWV9lbnR2g4+Zn6GkqKefn5+Zj4yKh4F/gIB2dn92YVxqZFNkdHBten90cHZ6dnyNj4SEiod5f4SAgI+TjIyTkomGjYqGioyHgIB/dnl6dHFxdHN0dHp/gYSBhoaBhImNj5CQjIR8eXFweYSSlpufm5mQhnx0c2tlYWVkYW56hJCkrrCztKukmY98a19SR0NGR0xba3mAj5mcpKuxtLq3qp6PgHBnZGFfW1lWVltcZG56hIqPjJOZm5+kqqiknpuVjIqPjISBiXpocHRnYWt0ZGJzbmdwfYB8g4qDd3+DenZ/f3Z2g3xxeomGhpKVk5CVlY2TlY+GhH90bmtqZWdqZWVqcHNxf4SGipCZmJuemZOMh4B6dnZ5enqAhoaGh4mGhoF/dnFwa250gIyVnqWtq66uqqGbj3ZnWUdAQEFGTFVfanmGmaW5w8i/t7eqn5uQf3FtX1JMR0ZHUFthanR2dnyEj5+urq6qpaGem5ufmZWQh3Z6f25reXlra25lW2Fubmt5hIN2d4R9fISKiYOHgXZ0gIaAhI+KhoaNioqMkJKMiol8dHR5dHB0cGtramdrc3Z6fHx/gICBiYqKjYqEhIaBfYSJiYqQk5KTkI+KhoeBenRwbmdncHZ/jJmhqrGrpJaPhHZuZ2RhW1ZWWVxkanaEk5+qsLS0s6unn5WEenRuZV9WUlBPTExVX210gI+QmJmeoaKlqKioqqiflZCPiXx/hnxzdndrZWpqX1xta2prfYSBhIqKg4aGgYCEioqHiol/dnyDgISKjIqKiYF8f3x/gICBgXpzdHBrbm1zdHd5d3p8gIB/f4GEgICBg4aGh4mKioqKj5WZm5mQj4R5bmhqanB0fISMj4yQk5WVlZOTjINxbmdfW1hfZWtudIOMlZmfpKWkn56clpKJgHlxal9ZVltfYWdrc3RxdHqEhoyTmZ+fmZabmZWQkJWTjImGhIB8end6enl2dnd2dnZ2eXd5eXp/fYCAgISGhoaHhoaGg4aGiYmGhoOEgHx/fHp8fHyAgHx5enx6enl2eXdxdHZ/gHp0cHR2d4CDiYaEgYB9fISGjY+Mh4B/gIGEhomMj4R8f4GEhIaPjY+JgYB9gISJiYmGfXl2en+AhIaJhnx2dnmAgYSGhIB6eXZ5fIOEiomAeXeAgICEhomGgYB9gIGEhIaNhoSAgISDhISGhoGAfYCEhomGhoaBgHx/hIaGhoaGhIB8gIaHhoSAgIB8eoCEgHx9enp8fH18gIB6eXd5eXp/gICAf3p6f31/fICBgYB9gICAgICDhIGAfH+AgICAgICAfXyAhoaGhISBg32AhImHhIOEhICAgYOGhoGEg4aBf4CDhoaEgH9/fX9/g4SBgH2AgH96fICBgYCAg4B/fHx9en+AgISGh4aGgXx6d3qAgYSGh4aEfHd/gICEiomDhoGAgICDgYaGhomGhoaAfICAgIOEiYaGh4aGhoaGgYB9g4SGh4ODenp6d3p8f3+AhIOAenZ2dnp8gIGDhH18enp6fICAgICAgH1/end6en16en+EhICAgYGAfHl3gYaGhoaEgHx9en1/gISGiYqEgICAgH98gYmGhICAgYB9fICEhIN9hIaEgH2DgYSAgISJiYaGhoGAgICEhoaGh4aBgHx9fICAgISGhoF/enyAgICBgYSDhICAhIF/f4CBgYCAg4SBgICAfHp8gISGhoaGiYaAd3+HioqKiYaBgHx6gIGEhoaGgHx8f4CAgYF/d3p6eXl8hIGAgH96en18gIGGhIB/d3l6gIOAgICAf3x6eoCDgIF8fHp6enyAhISAfYSEeXR/hIaJhoCAhoGAgISKiYOEgYGEhoSAgICAf4CEhISEiYN8gICAgIB8g4GEg4aHfXyAhIB2en2AgYaBfYmMhH2AhIGEioB6gIZ2dIeJdnONkoB8gIOBj4lzcYCNgHFxgI+VmIFwd4qPh4+MgHZ6end5eoSKio2KgHZ6enp6hJCTj4SAfHp2fXp2gIqHd3aAhH92dnN2eXZ2eoSKjIqJg3FnanBxdoOEdnF8hHd/nJuMlqGBcIeNa2SNm31weoSBjJV2ZISch2RreoSToYdkaISKhpChkHx/g3BfbnZ3h5ONfYCAenZ9k5+oqp+JcW5nXGR0gI+VlYyAenRucXRxg4aPnJyem5mPg3p0a2pfWVtla2uDioaWp6Wlsa6Pc4CHbVtWZXqEfWtnfJuiinqKp7O3m2hZa4OJioRzbnBxamRxhJCQhn1wa2tqboCSm6GcinZrZ2drdIGVn6GekIB2dnRqXlZfZXSDkKSrrqifmIZ2YlZPTFVhcH+Qnpykqq6on5J3Z3B6d2tnanR5bl9cdpinnIaEmbO8qIBufJKfoYlqVU1SVltldoSMioB0a2tzcXyPqry/uaWWj4B0cXaAj5mVhGtVQC4rKDFEYZK/4/j88t7IpYBWMhcNDRcmOk1qj7TS5PP17eDSuZZ5XEAoIiUoLDdMZYGbp7DA2OHYxbCkm5B3UjcuPVNha2tnanR/gYSEgH16eXZxd4CNm665wMO5qJODdnFua3F6gYaAdGFVRjg1MkBSa42rydrk5+DUvZ56VjomHBcdLEFZdpm5z+Pp5+PUwqqPcVlELiYsNTU4TGF3ipmfrcbPyLaloqGkk21JPkZSX2pramt6gH9/gIOBiY+VlZmkq7C3vbmomIBlUEdGTFx0ipmhopiGenBkW1tfYnSGm7PAyMO5pYx0VkExKCgxQFBqiaW9z93g3dLFqodwVj43NzQoLERVX2iAma68ua6rub2qkIB5enptTTc4TGV8iYR/gIqTlZWVkJCMh4B8gIaJj5men56Qg3Fra2tucXmAhoqGgHRqZFtWVltrgJm0w8vPzsCwm4NkTEA1LzE7Slx8n7nI1NvUycOzlXxzXEE3Ny8oO1hfX3aZsL/DtKGlvb2ed2dqdoZ9W0FJYnB2enBka4OPjI+QlZuoqJuZm56Zk4+Ef3pwXFJYX2VqdH2Ek5uQfHBqYV9bVllnf5ChrrS3trSokHphTEAyLDJGW3CGocPU29rUyLawpHxYSkAyMj43Lkl9nJaQnLTJ0r2QgJu2pHNSUmqEhl80N19/h3xrYnacp5WDkKGopJmMjJmZioCEkpWPgHFnZWReYWt6h5Cin42EdmVWVlVNXHqSn668vby6rYptYlJBOzdAVn2PlaXJ4NTDv7ehm5ZlNTtJQENfYklenLSSc3eSs8axfXOlz799T01ng4FKGRpNeYmEdm2GpZ+Gd4GbpaeWhnyAkpWQkI2bqJ55TDg9SlBWYYCtw8CllpJ8ZVA7MkZkdIaow9HSw6WMemtVODVKZGt2iZuzw7+uqqiikIdxYW1tVklPUlx2hnNhkMnLpYOGnrGrfFNfnLSKWE1hd4l8RylDdoaBg3yAlrGunJ+qqp+Vh2tcYXB8jJyhq7m5nGpHOzo7PURej7zIwLazpYlhPjdASlZoirPIycO6sJl6Vjg4RkxVZ4qoubyupJaMgGpSUmJkWF50eXZ2dnOKp6F2ZZCtnHFZao2llW1fh7CkcU1NYXR3YVJfgJmhpZ+MfIGYloyKlq2zpINnZWtubnSEnrO2pIlrVkdAO0BWfJ60w8a6pIp0W0pBPlJ2mairucO/pIZxZGRbTFJxkpuWm6qxpYx3dnRrbXB5enZ5eW5qbmVkfYmJlr3ImIefpYNcT1Nwj5J2bp7CqHZYW2t3c1lSa42ZlpaWj4OMnp+VkJiVinRWQ0dZZXGKq8PDuaV8UDIiGSg9Xoy93uzeyKqEWzIiIjFMcJW62uTbxa6Sa0cyLjVGX3mPpLS6sKiZhHRwbmFWXG59gICEh5uij32BhoqHdnGPrqV/fZ6ojWJbZ3BzYU1bjaKPgIaYm5ODaGRud3FxhJOYn6u0trGkj3ZhTDg3PVJ0lbHDyci0j149KB0iNFBzoc7m59rMq4RfQCssRFx2lbnS3djIsJyBYT4uNT1BTGGDm62wq6uqnH1nXFZVTExNZH+PmZyqtLOcgH1xZWRkX2eSqpWHnquVdFtSVVZYR0p2n7GuqrO5sJVwVlZfYWF2maiqsbm9s56HcWJQQTtAU2uPqLnIy7+keVA3KygxQVyKudLe49i/onpSNykxPVJ2n8PR3d3OtJ59UjsvJig4T2GApLnDw7mqm4RoVklMTFJhdoqZpK6wq6iZgYGDa153mI9/la2kjHxzZ2RiVklYfY+Kj5mfpKeSbWFqbWFngJOTmKiqoZmPgHFqX1VQWGt6hJOkraGMdlxKPThBVnmZsbrOz7CVhHRbR0ZHVnSPn7bO2M/CsJV2VT0xLzVEVmuBm62tsLCllYyDbWViXmRreX+EipWYjIySh4qVkoGJp6F3d5aPbVxbVVBWX1Nom66opaqklo96VkZfa2h5la2wtsO3qpuEbltQTEpNZXmKn66upZ+PbVJANzdAVW2PtNLb1c62mXpbQTc7R1h2kK7F0tLJwrCPakw3KCUoN0xihJuosLq3opmPfGpfWVJVXmFnepCVkp+kmZKelX2GnJBtcYp8ZVxkZGFua2FwjZiMj5mVjZCEaGF0gYaMoqqkpKifkIR/cWtramdrdoSSmaKfmY1xVkM3Mj1TZYOqyNLU0b+kinBQODc9Rl+Ap8PY4+DUv6SDXEArICAsQFBuj6S0wMO5rpuGdGFWVlZZX256iZmbpK6qnKSiiYGQloB3jY96a2pkXF9kX1xxhIF/gIeJio2EdnGAj4yPm6WfmJyTgHZwZV5lcHBxgI+WmZWPhnBbRjIvNUBScZu6ztTRwKuTcVU9O0BHX32fwNjm6ePPuZltRiwgFx0vQV5/lq6/xsW/t6SKc2FSSkdMUGF0hJCZqLGrq7OqmZmhim1wf3BhYWJhYmVqZW2DiomGjI2DiYR2bXyJhoqZmZWWm5uVkIyEfHl2dHB2hIaGiol/dm5fUlVWXGt/kKSxtreqmYNrVkdBRlJqhqjA1Nra18Wuk3FQNyYdGSk3TGeEnqu5urSwp5B9dmFWVUxMUltqdIGWnJafraWepbOfiZiZf2hraFhWX1hMX3NxcXyKkJanpJCPmZmMio+KgYGHgYCJjI+NkpCGfHZ2cWtwc3Z2dHBrdHyAhpOZlpiPg3ZrX1JQUl9wgJm2ztrk49jMs49qSi8dGhwiMUNfepm5yc/U1MWxnoRrVkpEPUNHVmpxip6ksMK8sLO0p4yMkIBwa2VfUlVSSkxfamtueoaKlqWclp+onpCQinx2dnZzdnp8en2JiYaGh4eAenRnZWFbVlxlbXmAj5WbnpuVinxzXltfanaMp7nDztLOw7ObgWVHNSgiJjFBVnSPqr/Lz8vGuaWSd2FVRjo3PUlbZ4Chpa69wrexvbOVio99YlxbVVVbX1hfbnZ3eoSKh5KVj4OGj4yKkJaQkJOTioqPioaJh4SAfHlzdnp2dnl3cW5rdHl8hI+VlpaPfXRuYVtYX2d5ipuxwM7Py8OwmXpWQC4iIiksRF5tiaS8wsDLwKueiWtWSkY9OEZTXGd3lZ6csbyrpLCwj4GWj3lxd3RnZWpfXGp0bWt2fXaAko+JjZ6fm6KhlpCQj4aGhoB/fHl2enp6enx/enZ2dnZzdHF2gIaKjJOYjIR/dGtlXlhld4ybsMbLz87As56AZUw3KyUiKztSboenucPOy8O5qpWAblxMRkFBTGJkd5KWn7O3p6e5tJaMm5N8bmtuYl5iVlJfZFxcanF2gZOSjJienpuhpJaMj4+AfH98fH98enp5dnZ5dnF0cGtobWhrcYCGh5OVkJKGenFqZWFkcICQpLTFz8/Ov6uZfF9DNzUuMTtMYXqTqrnDyci/s6GMdl5QR0BAQU1SZ3+Gk668trG9vaiYpJuGf3ZuX1tfVkxWZ2FhanF6hpOTjZmfmZmZk5CKg4aJhoaGj4yJh4F/enp5cGtrbmtna3Z6fISPkJOVk4yJg3BkYV9cZXGBnKu5wsLGv66ZgWtSPTIrKzJATGeEm7C5w8nAuaqYhHBWRzs3N0BGUnSHiaG3trO2wK6YpZ+GdHBzX1JkYVNcamdlcH+Ah6GflZahopaVlY+JiomGgYeKh4GPj4SAgH1zdG5rc3FubnB0en+BhoqQj4R6cWtqYWVxgJCfrr/Lz8vDuaSJalA4LyMiKDtQZ4GfucPP2M/Jw6uKcWFKMiwxNTtManF8n7qxts7Xvai3royAemtcW1xHPUxVTE1kdHaBnp6Poa6hm6SijYGEf3ZxcHF2dnp5c3l6eXl9h4aEgHx5dnZ2dn9/enx6dnRua2twdnmAk6GuucDIycO0m4RwVT0yNTIyQVNYdpultM7Y0svDsJaDa1hDQD09Oj5cZWSEp6qnusi5pbe2mJCShHBnaltMU1lZVl9qaHGAiYONq6qlqq6klpmZioSEfXBraGVhZ3B3gIGKj5CPioSAgYR8fXx8fXZ5enRwa2tra3mGip+3urq9vKiSiXBSSUA1MjtGUmR6laW0vb+9tq6fg3ZrWUdBQUFAR19obYqemZmrv6uhubmflZiKdnBzX09eYVhWWGRla4OKipKnqKGosKWbpJ+Vj4aAdnFwa2prdnRteX95fIOEfICEenqEg3yEj4Z/gINxcXp8f4qZpKKqsKqclY13aF9VR0NKUFtrhJmksbm/uraupJCAa1tMQDdARD5WdHF3nK2hqsPIs7PFtp+Vk4Roam1VR1NVR0dWXF9xh4SBk6Sim6Som5iWk4F8f3lrcXlwaHR5cHF/f3mEhHp2dnRtcHR2eXp9fHp2f398iZCVmaSqq6uupZ6VhHFhVUxKQ0pWYXOEmaiwvL+/v7mllYNrW09AQEFHQVJoZHSSnpytw7+uub2qm5yWhHZ2bVNQWVBHUl5WW2t2cXmTm5uttLOwsK6hm5aPgXx0a2piZGRncHN2enx9enp8gIGJioyQkIqJhoR8eXZ0dICGipWfoqWkmY+DdGJbVlVTUl9reYOToqqztK6kmY12ZVZQST5ESkNMZGtuiqWhpLbCsKi3sJuWlYRtampZTFVfW1lkbWtxg4aGkJ6emJ6fmZKWm5aVlY+KhoSAfHp3eXZ0cHBwaGtrbXR3eoCJj4yPkI+Mhn96fXd6gIaTn6SkpaSWj4F2a2VeVllcZG56iZmkqKqtpJyPgHRqX1JMTExPT2FweoqZpKWrt7SrrrOqn5uViXdxal9bXFtSUltcX2t2eoGKkJWZnJ+bnJ6clZCPiYB/enZzcGhnaGJlZ2pqcXZzeXx/gIOGhoqGgYB8eXZ6f4SPlp+kqqiln5WKgG5kWFVQUltidoaVn6qztrSupZ6MemdZSkZBQUdSZG52ip6iqLC8trC2rp+Wj4NxcGthWFteVllfaGp2hoOGj5WVlZmbmZWVk4yKioaGhod8dnl0cG1ubnB0dnZzdnx9gYaNj4+NhoeBfXZ2eXyEho+Ym5+hoZ+Zj4B0ZVtVUFBVX2pxgI+Zn6WopaSZinpwZVhQT1BVVl9qcXyKk5aiqKSioaSZj4qGgHp0a2VkYmRhZW1xdnqAhIePkJWZm5uWk5CPjIyKh4mBf316eXZ0dHZ5d3l2dnl6fXyAgICAgICAgISGiYqKioqKioqKioqKiYaEhIGAgICBgYB9f3x8enp6fHx6enp6enx8f4GEgYSEg4aGh4aGh4aGhoaGhoaDhoaEhIOEgICEgYOAgICAgH1/fHx/fH16enx8f31/fHx6en18f3+AgIB/enp6en+AgISGhICAgH9/gICAgIGBg4CDgYGEgYOAgIB8f3x9f4CEg4aGhISGh4aEhISEgX96f4SEfHx/fICEgHqEk4p3f4mEenZ9gYaKg3Z9k5WEdnZ9hpKEcGp2hIaKj4qBfYSGhomGgYCAfXBra25xgI+Wnp+ZiXZqYWFhZ3SAk5+kn5mShoBxZ2VrbnaKmZubpKKViX9xamdqYWJ3gYaGjJmYmZCMioN0a2pqamVneXpwdHZ2gJCEc4eom3B6kol0cXZ6gYl6YnGWlm1bX2p6iX1ZW3aJj5aem5WNlqekm56ZgW1rYlZSYXeKoq6zrqGQa0c7O0BGVnekw8/Rw7OkhmRDQEpSaoakusjIuqSPfVtHRD5KVmd6jJ6rtLSun5WHdG5lXmhnX2Fwc2V3enCKoo1/qsmlhKfCpYZ6enR0cVI+ZI2GYlZhcYOPfVhSboqTlqStoaq9w7muqJiEa19WU1tndICPnJ6SelxELiIjMT1WhKrI2NjItp9/WUA7QFJriq7M1drVybeWdFA3LCsrN0piiZyhrreupJB/dnRqWFZndH96gZulp7ewmJu3sH90m5x2XFtfZGphTFN9jHFVRFNwiY12Ynecn5uuuqqbpbOwsKqbk5WPgXZwbnl2cXmDfWdVQSwrLC84WYSlvc7RwKqPdF9MRkxegKS91Ofv59S/p31WOygrMUBQYXmMmZuelY2PhoB2dnNiXFxqa2h0eoCZqJ6VudfDnJiljWFDPkRMWFBMZ5KfgGJfcIONfVZEX3mAjLG/trbIzsW/sJuJem5bTFBca4SbrrmzmWU1HRAIEytKdqXI3eDYw6eAX0o4O0lkhKvO4Obk28Chf1Y7MTE6SWF3jJ6qsaukmYp2Z19bVlZfboCNj5mclp6Zj4ebqpB9j5mMfXp6dnZuW1JkdHFlYneGlZ6Pdm16hIGKmZyWn660ubqzoY93YVBBQVBif5WosaiTcEosIBwgMU16pL/Oy8OwlXlcSkNHVnCPrsjU2NLCro9wVkdAODtEUGJ2hJalq7Cqn5OAcF9WVVJbanB6k56hsLywoaWojW50enBlZ25tdH95dICSj4B2cXR2eW5cXHGJlqW3ubOrqKWfmIZ2a2pkXF9rf4+Zp6qnlXZQNysjKDdNeaHC0tjOup98W0Y9O0ZfhKjD1N3Yzrqef2FPPThASltxiZWfqKiflYl8cWtra2twdHZ2enpzfI2GfIqinoyVp56GdmpcVlZQTFx/j5CQkJiQjHZYR1BfYneTqLO5w8jDuaWJZ1VKQD1Na4qlvMnJvaJ0RywdFx0vVX+tzt3d1MKedlI9MjJGX4CnyNvj49jApIBfPiwmKzpNa4qqw8nGvauTd2VWTElHVmt2gZWcnKikjISPiW1rg4mDfISJhomDdG1/h3dqanN0fH1rZ3eJj5akqJ+bn6KblY+EfHFza2tweoSMmJ6elYFqTDsyMTVHaIaov8nGuZ+EalA9PkFSbo+nus7RyLyrlXZbSjs3QU9bbYmWnqSopJaPhnx2cXNqZWp0dnN/hn2EmZmMlrGulpOklnplW1VSW2FecI+koZmZkoqBdFZDTFxugZ+5w87PyLSehGdVTEdKTWWEn7fDxsOuilw1GhcZJj1onsje49jFpH1WOysoOkxlj7nX4+zgzrSTZT4vJig3TGqJqL3IzMCzn4RrW1BMUlZheY+Qm6SVh42DbXGEhnaBnqGThoR2amJZSklkeX2EipOZnI9xW1Ziamh6j5mls7OrraSQgHFlWFZYZ3qKmaiuqJV3VUAyLjVHZYquw8nIv66Tdl9JQEBKXHeZtszU2tjFro9uUD01MjtMYXmVrrnDxrqunH9hVU9DQUxbZXGJmZ+hqq2Ylp+ZfHGGhHZwdnZ2fXRnboCNhH+AgYB9eWdYYXaEjaSuq6qrqJ6Vj4R6dnNra3R9ipWbnpmSeltGNzE1RFZxlbbIxsO3mX9iSjc0QExliqrDz9fOv6qPc1JANzU1Q192iqSwtrezoZCDbV9bVlZYX2d0f4GQlpCWopmNmZ+Tg5Obinp2c2VhamVhcYmJg4mJgICEdFxfbnaEmKiusLSwqJaPhHNra2pqdICKmJ+hn5WDYko1LCwyRmWKrsPOy7+qimpNQD1BT2eHpcXV3t3Uw6WGZUMxKCs3R198k6W3uauopI93cGhcYmpla4CJg5OZjIyVj3+KnpuKkKKVgHZ0aFhbWU1Wa3RrcYOKio+Ndm13enyKmJWSmZuZkJCPg4SAgH98hIaGipCKfGtZQTUyOD1SeZazyNHJuqiPcVxJPkNQYX+fw9jj597PuZZ0UjssKCs3TGR2j6WztrmzopOAa19ZWFZfZ3R6gJOWkp+onpaorZaPmZmGenFnW1JTSkdbcHd8jJycpKSTg4aHgYCBhHx8h4+Zm6GopaSfloqEg3x0bWpfUklBPUBKW22GpLnDxb+wnH9lUDgxNUFbfKK/1ePk3s+3lnZQMiAUFyUySmuPqLrMy8O5pZB3ZFJKQUFKWWRzk6Kht7+0q7OwloaPiXBhX1ZQUFZWWXCAgYSPlZabnpCEhIR8fISBgIaTmZuipaSkoZyPiYR2a2diVlJVUE9SW2JxiZuutsK9sJmAblNBOj1HXHyZttLj5+PYxqqJYkYsGRodLENkf5axv8bGwLmiknpiVUpGRkpcdICQq7CwubmonqiefXF3bVhWXlxcZ25na3+BenyJiYaNiXpxeoB9hI+TkJCYlZCQlZiSk4yAeXZuYmVlYWFcVVVWWWF2ip6utrq2qJCAbllQTExWa4SfutLd3tjMsJV2UjcsKysyRlhxj6i0v8jDtKSPeWVVTE9PVmp0f4+kpKK0s6Gbn5J3dn1xa2tuZ2JqZV9idHd2fYSGipCShomTmZCNkoqBhIaEhJCQkJWWk5CQkoqEfHRiW1VHREpVYXGHmK20ubOlmYRrWExERlVngZ+2yM/Uzr+tkHlcQTEpLC5AUGeEm6q0urmrpJOAdGdWUE9MVWJnepOZm6quoaSon5CVmIZ2cGpiVlleVl9qbmt5iYyQpaiZlp6WiomHf3p/gH+AipOWm6SopJuThHluYVVMTExHSlVfcYmcqrm9s6GQemJVR0RGVmuBm7nO2ODj1cOqimhJNygjLjdMYXeQpbS6w8C2qpZ/allMQ0RHWWVthJabqrm5sLe3oo2QiXFhYV9VUlhQT1xrbnGDj4yPlY+BgYmEgISDdnaAgYSNnqSqrqukmY+AcWhcVUpEQUFKVV90ipyls7mwpJaBbWFVR0ZMW3CMrcjb4+Thz7qff2FHNSgmKzdMZ4OZsL/Fw7mtlYBuXFBJRkFHW2t6kLG8vMjIurCuoYF8gHBcXF9ZVmRnZWt6f3Z6hISBipKHhoqKgYGJhICGkJCQmJuen6Gim5WKfG5hW1ZVVVZbYWVweomVnqGkm5B/a2JbVVVcboCVrsPO0tXOv66ZeltBMSgmKzpPZX+QoqqztKukmYltXFBDREdMW25/kKSqucK5tLmxkIOEcFthZ19fanBqZ3BzZ2p0dHB2hIGEmaSeoa6upJ+flYaBg3x8hI2KjJOQioaEf3RqX1VQTE1MVWFreYSPmaSloZmPgHZrZGFlcYSbsMPLz8/Ov6qYfFxKNCYiJjVAUnCHk6SusLCtpZOEf3FlXlxcYWp6j5mltLawtryqnKSWd2tqW0dPWVJQWGJcVmFqZGd5gHyAkpmbqLOrpaWom4yKgHRtc3Bxf4mKio+Shn92bl9ST0dGR1VZYXaGlaGut7Szq5+PgHRlW1thanyVrsPS2tjSyLSZf2FGLCAcHSY0TGWBnrC6v8C8q5+MempcUExMVVxzgJiqtLnAw7e6s5uMhHNTTFNKRlBfYWVzeXl6hIR8fISHgIGNkJahqKWirq6flY+HfHZ2cXBxd3Z/hIF/d3lxamReYWFlZ2tzfIaKlZ6fn5+Zj4F6a19fYmpxh5uos7q/urmumYBrWEExLCwxPUpfdo2eqK60tK6klYl2Z19WVVVfaHGDlaGorrm6ubSzp5CKg2pWW15NSVhfW1xqdHF6hoSAiZOMiZCcm5uoqp+bnpWKioyAc3Z6cXSAiYaGjYR6dnBlXF5fX19lbnF2gIyTmaKemZWMf3FqZWFlbXqKnrC/yc/Szr+uln1cRjUrKyw4RlZugJOhrra2rqGTgG5bUk9JTFBWZXqPm6u/yczJyMKwn5WEaGFfUEFGTUxMWWFlanF0bXR2eXmAjZCTnqWkoaWln56ZkoaEgHx6fICEhoaBf3Zza2dlYmRhYWRlam15gIyTkpWWlZCMioqKjI2TmZ+kq7O0tLClmYp5Z1ZMR0pJT1JZYWtzeoSJio2Mj4qJiYqNjI+MjIqHiYaKioqKhoSEgYCAgIGBgHx9fHx8fH+AgIB/f3x9en+BgYSDhIGBgYGEhoqKhoaGhIGBhIOHhoSAf398eXl6f3x9d3Z5dnd2enx8end5dnZ2d3p8f3x8f31/fICBhoaDhISEhIaHhomJhoaDhISDiYqNiomGhoaDgYGBg4B/enp/fYCBhoaGhoF/fHx6d3p6eXl3enp/gYGEhoaBgIGBgH2DhISDgICAgICAgIGEgHx9fICAgISGiYqJhoqKh4qMjI2KiYaEgH99en16eXl2eXp6f4CEg4aDhISGh4aKioSAfHZ2dnZ2f4GGhoaGg4SAendxbmtqZ2twdoCKkJWbnJuZkIqEenNrZV9WWFZfZ3SDipOZm56hpaWlpZ+Zj4mGfXl2dGtqZWFhYWJla3R2fYCDiY+ZnKWoqqqlpJ+em5WPhoB0amRcWVlbXGFiYWVqa3SAiZObpKGelo+JgYB9f3+AgICEhoqKhoR8dGtnZWVqbXaDjJWbn6GlpaGck4R0Z1lMTExMVV9qeomToa62ur/AvbauoZaPhH90bmVbUk1PT1BVVl9lbnF2eoaTmaSusLCwrqqqqKGelo+AcWRWU0xKSklMTE9QVmJreomVoqWopaSflpOMg3lxcG1wdH+EhoqKiYaBgICAhIyTlp6hpaiqraWflod5YlBBOzc0NztBSlVld4+htMPLz8/JxcC8sKqhlYd2alZMTEZBPkA9QURHU19ugJChrrnAyM7Pz8zIvbCkk4N0Z19VTEdBQT1AQUpQW2VxgIyZn6WtqqiknJOMhICAhIqPjY+KhIB8end5eXd6fISGjJieop+elox/a1xSR0E9Ozg7QEpZa4CVpbS/yMnJyMC/ua6hlYd2aFZMRkNEQUA9QURHVWFwfIeYpK68w87P0s/Jw7aun5CEdmpcVUxGREFDRkxQVl5lcHqEk6Gus7S0rqSZj4qGhoOGhoSAgH96enx8enZ2dnZ/hJKZoaWlpZ+YjIB5a2JVT0pBREZKVmV2gZKbpa60ubq/v7mzpZmMgHZwal9ZUkxKQ0ZHTFVcZWt0fYaTnK22v8PFw7q0q6SelYl6cGVYUkxKSk9PTVVWW19qdICPmZ+koZmVj4qGhIB/f3x6en2AiY+Nj4qJhoaJjJOZn5+fn5uVkIqEfHRlW1BHRkZHUFtlbXqJkJykrrS8vbm3sKibkIqGhHxxZVtVTExMUllbXl9lam16hpWkq7O5vLq5tLCuqqSZj4N0amFfX1xZVlVQTE9SW2VweoGJj5WVlZaYmZWPioqKio2PlZWVk42Khn16d3p/gICAg4GBgHx/fXpxal9WVVJWW2FqcHZ6hI+Voquws7CupZ+bkIqGgHZrZFtVUlJSVllbX2Flamt0fI+epa62ubm6vLq8urSqn5OEenFramRfVlVPR0lHTFBWX2dudH+JkJmfpaWhn5ubm5uen6Kfm5mPiYR/enZ3dnZ2cXR2dneAgH99dnRta2trdHZ5enx/hI+QmZ+lpaKim5aTjImGg3p0bmdfXFxcYWJhZWVlanB2eoSSlp6kpaqwsbC0s6uonJOGgHlwbWdfVlJMR0ZHR01SWVxkanF9hI+Zn6ShnpuWlpaZm56blpWQj4qGhoF/enl2cXR2enyAhIF/enR0cXNwc3F0dHZ2d4CEjJWbn5+em5iZlZCQj4mBenFra2dlZ2dnZ2ViZWpwd3+EipCTlp6hp6iqraqooZmVj4mBf3lwamFbVlZWVllcYWFlZ2t0gIaPlZiVlZWVmZibm5mZlpOQkJCMioaEgHp3dnZ2enyAhIGAfHl2dnRwbmtra2hra3R6gYmMk5WVmJWVlZCQjIR8dGtnaGVoZ2tra2trcHR8hIaNj5CTkpWWm5ubm5aTjImJhoeGhoaBf3l0cXFwcHBwbm5tcHF2en2AgIOAgICAhIaKjIyPjY+Mj4+MjYqJhoaEgICBhoaGh4aGhoaJioqMjI+MiYF/enp5c3BrZWJeX1xhZGdrcHR2en+BipCZn6Woqqqrq66rqKWflo+JgX96eXRwbmdkYWFfXGJcWF9hX1xqbmt0gIaGhomKioyTkJCZn5mVkJWWmaSckJCShomJg4R8eXRwbmFfYVtbYV9cZWdra2t0eoSJio+QkJWWnKStq6uqpJ6bmZOQkJCKgXx8f3RtfHRrcGtbUl9oWFhzd3F2dnqAhI2Eg5ynmYaDk5ifqJaBipiQkJOTiYGKj4R/dnRtbnBrZGFkX1ZbYWpucHRxcXZ9fIGPmaSqqqqlpaGinJmcmZmbmY+DioRzf31qZ2tTTFZhXlNibmpland6fISEgIeclX12f4mWopmKgY+Tkp6ZkIqDiYl9f3ZwcXFuYVlWVVBVYmdzeXl2eoN8fZCWm7C5sK6qoZmZmY+Kg4GNgHyHh3Fzj3ZbcHdTSWp9Z1+NmISGnJ+VmKePepaYdmVlaGd0g4Brbo2VlqKop5aZpJuQjIR/cXBnW1JKSkxMVm1xeXp8fXB2hn2Kqry2tsK8oZuum4OPkImBipONdoaVZFNrXjIsU1w4T4qKfZu3tKq0upKEnopnUExKRFtxXE9wj5Kct7qwpbOznqGPd3lwXFxVPkFKVU9QfIBtd3ZwbmducHeTn6Wzs7CopbOupLO6tra/xaeWpIBWVUwfChwpFxxKaGuAqsW9xc65paurgFlWQThWZ01PdpikwODPyNjPxcO2pZB6alZKOCwsMTdBRlZqa2tua2pnbWtxg4+Wnp+hpaWrs7/Jztjd3dTJwp53blgfAggOAAUpOkRcg56rxs7AwMi6oo9xXFNQRDc7TF9zhqW0usXP1MvDuaqZhnRcTEZBRERMUl9qZ2pxcXF2f32Ej5CYm5OMj4R3fIqJh6rFt7/Rw6ehlWdHT0cdESs3NEZrjZu50s/J1djDpZN8ZVJGLBklO0pYgKSwvc/Y0sbDtKGVhGthX1hfZGd0eW5iZFVAUF9ebY+ipbm8q6Wbhm1hZF9fdpKfrcvOv7axjVlVVTccLENDTWuNn7bX1cvU2MKchHRcT0c6IyY7UFtznK6tus7MsaWolXZ5fGdhbWtncHxwa21hT0ZGSlJlhKW8y9fOvaWPdFhTTEdSa4ONqsC2sLecbWFkTCk3Vl9lepmorcPCpbDArYqAfFtSZFY0OFhbXHqYlqG8wLa8vKiVjYNxamJoanF5enp8dmRVVVBHUmd6kK7Iz8/Ft5iAZ1ZPTFVnfYabqJiZp5NraHdhO0NiaGJ3k6SuubqnqreumYZ6cGVbTDsvQVtlcI+rpau9v7SwqJmGd2FVUFJhcYCKkJiKdmRPODdDR1N2nrfA19vDsKSAXEpAN0ZhcYqosLG/qIl/fWhDQFBZU1t/lqW6w723w7aWfGtZTVVPODhVbXGBqLmwtr2woZuTgHZ/d15ldHR2hpKQkJJ/YVBJOkBSa4SlyNjd1MCtj2tWTEFDVWJ/lqG2tKWhmXRPVVxGPmSEhpCot7O2wKWKk41qWFlNSWRzYWJ5hIOJj5OVm56hqq6lm5aPfGtcVVVbZXB6iYyEem5cTU9SYXeVs8POz8OqkHZcVUxMVnB5gZiThJmcdl59gVNJanx2d4mSpK6un5yqqpN2bWhTW19KQWF8dnyWmYySpKinrq6klox2XFlWXGt8j5aen490X1VBOEpeZYO80tHd27qYhGI1N0xWXHelrp+quZVreodhPlZxYlx2iZClvLShrraZfXNhT1VfVT1MdoCAlauckp6eioynmYOTm3xobmpneYaDkJyQfGpVTExJWXCKqL/GxcW0lnplUD07TFtrjKuhobaicWR0Yjg+andod5ifm6q6m4CcqnpZbWpSa4BYRm6BaGuNk4aNpKqlqqufjIl9YVlcYmd5iZCZnpZ3YVlMQ0xhd5Wzxc/SxbCZemdbR0ZocGqPp5iYtqd2fJJuPlJ2Z1h2kpKevbmeqr+kd2tqVk1eWEBTfYNzhqGQf5OnnputqJKKgGdTWV9rf4yeqKGZiWpJREM4RmuNpczg2NLAnnNbSS83Um15kLSzoaiiemRzaD49YmtZao2ZnrO6pZ6rnHpkZFtTW2FWVmuDh4qQlYZ9ipmQjaWtk4qJcVhbYWFwh5WenpOAalJJTU1ef560ydLJva2Kak1HQUFWeYmWt7ecnJt3XGVtWFN2iYCAlZ6Vm66kjZulim1wbVhcaFJBWXNxdpKfnp+tsaeoqp6HfXReUFBWX3CDj5melX9iVUdBR1t2lrnP3d3Uw6SAYUw7N0pbZ4SkpKW2qId8f2VESWJiZXqSmaW3ua6rsKeGa2FWR0dKPT1Za3F9lpubn6WqqqSfmYl8dGphanF2eoSKhIN2YVJKQUFQZ4Gkw9jg3c60k3FeRz1KX2p9mZ6bp5+JfH9zU01cZGFtip+qusO5rbOqj3ZraFxZWVVMUmhwcYaYkoyfqqWoqqifk4RzZWFlanSAjI+Jf2tWSkFBTGGAm7fJ1NLIt5uAZVJKR1BleomYraWWlo92Z2pqXGJ5g3+MnqSksLahm5yMcWFbUk1VVlBQYXR8hJWin6GtqqWlpJmMh3ZlW1ZWXGVwdn9/d2pcUk1VXHGPrsbU2s/Is5BxXExBQUpbbnyQnJaWmYdwa3NiXHCEiZCkrrC0urahnpmHa1tTR0RGTExSaHmAiZukoaq0trm6tLClmYZ2YltWUlVWX2RiZF9ZVltfa4SbtMnY2M7Dq4x2YVZTVlxqdHaDiXx3gHRhZW5lYXeQlp+wvb26vbmlm5mJbV9VR0FBRD5DVmd3gI+Zn6Srubq6vbmum4x/a1tTVVBQVVtbW1ZWUlVcanaKpLrJz87IuqWMdGRcWVtqdHZ/h39zeXdnYWpqXmd9ho+csbm3v72om5mNcWRcVUxMTUdKWW55gJOfn5+lrrC0ubmzpZmEa1xZVVJZX2RkZWRcW19ndICVrbm/xs7AsKSMcWFZUlZka3eAgYSEenN2dGduf4R9ipyfpKqxsKqlm4RxbmVWUFBKR1BZVlx2ipalt7e2tLSzsLO0qp6Qf2JMPTc3O0RMVllcYV5hcHqEm669xc/Oxr+zm4FuXFBMTFNbYWdwcGtwdGtwf4aDjJ+opau6ura0s6eSindcT0xKQUBAQ0pQXmVxiqWzucPJwLm0tLGwrqSZinlhTDs3NTU3Q0pVW2FqcYCMmaq6yc/U2NTJuqiQeWVWTExQUlZbWF9cW2RrbnqNjIyerqqrvMO/vLaum4yAa1tTU0c9PUFBQ1BfZ3eQoqu2w8C9ur26trOup5mKeWJQQDUvKS81O0FQW2FqdoGQobfDztja1MW5pY96a2JbWVlWVlNWVlJWZWpndIB9gJCkoqvCxb+6ubGhlYx/amFeTDs7QDc4TVtha4eYnK65urq/vbazsK6onJOEdF9MQDIxNTtAT15hZ3N2g5CfsMPR1dTOw7Ohk4B2dGtqYV9cW1hWX15kamdqcX18hp6qqrC8urSzsKiblopxX1ZMQDc7QUZQX2VtgJWkrrbDv7Swq6WipKGhmY99ZVA9NTEyO0dVX2Fqa3B5hpmqvcnLycO8q5uPgHRrZVxYX1xbXGVqYmhramd0f32JnqikpLGwqqqwqpyZjHZfVk9BQURGSk1eZW2ElqSwvb20rqekn5+kpaSWinRbSj01NUBKTVtia3B2gIyesL/Iy9HLw7almYR0ZVlQUFVWXGVrbWtqbnZ2fI+VlZ+qpJunqqGkpaKVhn1rVkxKRkFBRklKWWpxhJ+3v8XJw7m0rqilqKWej4BuVkQ1KyssNTtGUl9qcX+Qnqq5xs7S1M7GuaiQeWFSRj5BRkxVVltfYWVweXyJmZmZpK6wrbS6ubCtn5CDdGVSR0ZAOjQ3N0FVYXGKpbnDzs/Sy8XDv7mupJmGeWdSPS4rIyYoMTtHWGV0g5CksMDS3ufp5tjMtJuEa1tPR0ZHTExMT1JZXGhxfISMk5aks7e9w8nJwLSnm4x6ZVJGOzEoJisuO0xfcIScsL/O1NfSz8vDua6nmY+AbV5HNygiIiMvOkZVX2pxgIyes8XX3uPh1ci0n4x6altVTEpGRkpMUFVWX2Voa3aAipmos7nAyMW/urSqm496aFVBOjI0NTpEUF5ndIabsLzGyMXDubOrqKWfmIp/a1ZGODU1O0FMVVxlanF/jJ6rvcnMzsW9s6WZjH9xamRcXlxiZGVoZ2pna2txeoGPlZunp6iqsLGrp56ThHZqWFJNSkZGSlJcanSAjJmlsLm6ua6kn5mTjImGf3RnXlNSTUxPUltia3N6hIaPlZukpa2rsK6kmY+DdGplYWRna25xdnZ0dHF0dnl5dnqBhoaMmZ+foaWlm5OKgHZzal9bWFVQUltlc3+GjJCZn6WqsLSrpJuTiX15c3FuZV9YWVZWW2JwfIaMkJCQkpWeqLC0tLOroZOEenFqZWFkZ2trcXl8f398enZ2dnR0gImPk56hn5ykpaGekIR2al9SUE1VVlZbYnB6hIqQnqqztrq5rqSZk4+JgHZwZ19VTExMUFVZZGt0eoCHjJOWnqSqrrS0sKukloR0al9VVVZfZGVqa25ta3BzeXx/fISPkJahq7CwsbCom5CDcWVcVUxHSUZGSlJhc4ePlZmkrrS6vb25q6KWj4mAeXFqZFZPR0ZGRk9banR/hIqSlp6otMPJzMnDuaqZhnlrYVlSUFJSVVZfZWpqa25wdHZ/iZakpa60trOws66knpB/a1xNQUBBRkZKUFhndoSMmaq5wsPDvbSqoZ6Wk4qAdGpfUENAOzs9QUpVX2p0gIyZoau0vcPFyMW9sZ+PempcUlBSVlZbXF5hXl9fZ25xeX+BjJmkqrS/w7+6t6uhlYZ5Z1tKPTg3NzdATFxugIyVobO/xcjIw7aqn5WPhoR8eXBhVUdEQUFGTVtlcHeAh5CeqrbDy9HPycC2qJaKem5kWFVSUlVWWVxhXlxfYWRqeYSPnKixtLrDwLq3tKiVh3ZqW0xEPTs9QUFHVWJ2ipynq7m6vb26tKefmY+HfHlxamVfWVBKQUFBR1BcanSAipKbpKu3v8jJxb+woo+AdGdhXFZWVllYW19hZWhrbnN0doOMlaSusLG3tK6qpJ6ViX9xZVZPSUdKUFVbZGt2gIyZn6iusLGwqJ6VkIyJhoB5cGphX1tbXF5hZ2tzdoCHkJabpKWnpaWlpaSbmIyEfXFraGtra25tcHBrbWt0dn+AgYaGhoaKj5CSkJCPiYR9f3x8enp6d3Z2c3Z8gISGhoaGg4GEhoeGhoaBf3Z2dnl5en18f3p2dnd/gYSEg4aBf3+AhIaHhoaGgX98gIGBg4CAgHx6d3+BhISBg4B/fHx/gISDhISBgHx9gIOGhoSBhIB8f4CEhoaGg4SAf3+Bh4aJhoaGgX9/gISGh4aGhoGAfYCEhoeGhoOAf32BhoeGhISBgH2AgYaGhoSBgH98en+DhIGAgH96eXl8g4GEgICAfHl6gISGhoOEgH99fICEhIOAg4B8enp/gYaGgYB/enp6f4CEgYCAf3p3en+DhIGDgH96en+BhoaEhIGDfX98gYaGhIGBgHx6fICEhoaDhIB8enyEhoaGgYB9f3p6gIOEgYGAf316fwA=";


    

    // Persistent audio element so we can "unlock" audio on a user gesture (button click),
    // then safely play later when the menu appears (Firefox autoplay rules).
    let warGamesAudio = null;
    let warGamesAudioUnlocked = false;
    let menuSoundPlayedThisOpen = false;

    function getWarGamesAudio() {
        if (!warGamesAudio) {
            warGamesAudio = new Audio(WARGAMES_VOICE_WAV);
            warGamesAudio.preload = "auto";
            warGamesAudio.volume = 0.9;
        }
        return warGamesAudio;
    }

    // Call this ONLY from a real user gesture (click/keypress).
    // It silently primes audio so later .play() won't be blocked.
    function unlockWarGamesAudio() {
        if (warGamesAudioUnlocked) return;
        warGamesAudioUnlocked = true;
        try {
            const a = getWarGamesAudio();
            const prevVol = a.volume;
            a.volume = 0.0;
            const p = a.play();
            // Immediately stop; this is just to satisfy autoplay gating.
            const stop = () => {
                try { a.pause(); a.currentTime = 0; } catch(_) {}
                a.volume = prevVol;
            };
            if (p && typeof p.then === "function") {
                p.then(stop).catch(() => { warGamesAudioUnlocked = false; });
            } else {
                stop();
            }
        } catch(e) {
            warGamesAudioUnlocked = false;
        }
    }
function ri(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; }
    function rnd(arr)    { return arr[Math.floor(Math.random() * arr.length)]; }
    function pr(str,w)   { str = String(str); return str.length >= w ? str.slice(0,w) : str + " ".repeat(w-str.length); }
    function pl(str,w)   { str = String(str); return str.length >= w ? str.slice(-w) : " ".repeat(w-str.length) + str; }
    function tr(str,w)   { str = String(str || ""); return str.length <= w ? str : str.slice(0, w - 3) + "..."; }

    function addStyles() {
        GM_addStyle(`
        
        #tdt-game-window{
            position:fixed;
            bottom:8px;
            left:8px;
            width:660px;
            height:460px;
            background:#bdbdbd; /* classic DOS UI frame */
            color:#000;
            font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
            font-size:14px;
            border:2px solid #1c1c1c;
            padding:6px;
            box-sizing:border-box;
            z-index:999999;
            display:none;
        }
        #tdt-game-main{
            height:410px;
            overflow:hidden;
            background:#bdbdbd;
            color:#000;
            box-sizing:border-box;
        }
        #tdt-game-help{
            display:none; /* keep the OG look; controls still work */
        }

        /* Top bar */
        .tdt-topbar{
            height:20px;
            display:flex;
            align-items:center;
            justify-content:space-between;
            padding:0 8px;
            background:#bdbdbd;
            color:#000;
            font-weight:600;
        }

        /* Blue panels */
        .tdt-panels{
            margin-top:6px;
            display:grid;
            grid-template-columns: 1fr 1fr 1fr;
            gap:6px;
        }
        .tdt-panel{
            background:#0000aa;
            color:#ffffff;
            border:2px solid #d0d0d0;
            height:160px;
            position:relative;
            box-sizing:border-box;
            padding:22px 12px 10px 12px;
        }
        .tdt-panel-title{
            position:absolute;
            top:0;
            left:0;
            right:0;
            height:20px;
            display:flex;
            align-items:center;
            justify-content:center;
            background:#0000aa;
            color:#ffffff;
            border-bottom:2px solid #d0d0d0;
            font-weight:700;
        }
        .tdt-statrow{
            display:flex;
            justify-content:space-between;
            padding:4px 0;
            white-space:nowrap;
        }
        .tdt-debt{
            background:#aa0000;
            color:#ffffff;
            padding:1px 3px;
        }

        /* Bottom grey area */
        .tdt-bottom{
            margin-top:6px;
            background:#bdbdbd;
            color:#000;
            border:2px solid #1c1c1c;
            padding:8px 10px;
            height:200px;
            box-sizing:border-box;
            overflow:hidden;
        }
        .tdt-bottom p{
            margin:0 0 6px 0;
        }
        .tdt-prices{
            display:grid;
            grid-template-columns: 1fr 1fr 1fr;
            gap:4px 18px;
            font-weight:600;
        }
        .tdt-item{
            display:flex;
            justify-content:space-between;
            white-space:nowrap;
        }
        .tdt-item .tdt-left{
            display:flex;
            gap:6px;
        }
        .tdt-item.sel{
            background:#000;
            color:#bdbdbd;
            padding:1px 3px;
        }
        .tdt-prompt{
            margin-top:8px;
            color:#b000b0; /* magenta prompt like OG */
            font-weight:800;
        }
        .tdt-msg{
            color:#000;
            font-weight:600;
        }

        #tdt-game-toggle{
            position:fixed;
            bottom:60px;
            right:8px;
            z-index:999999;
            font-size:11px;
            background:#0000aa;
            color:#ffffff;
            border:1px solid #d0d0d0;
            padding:3px 7px;
            cursor:pointer;
        }
        #tdt-boot-overlay{
            position:fixed;
            inset:0;
            z-index:1000000;
            display:none;
            align-items:center;
            justify-content:center;
            background:#0a0f2a;
            color:#d7dbe7;
            font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,"Liberation Mono",monospace;
        }
        #tdt-boot-frame{
            width:min(980px, calc(100vw - 40px));
            height:min(680px, calc(100vh - 40px));
            border:2px solid rgba(215,219,231,0.35);
            box-shadow:0 0 0 6px rgba(0,0,0,0.35);
            padding:18px 20px;
            box-sizing:border-box;
            overflow:hidden;
            position:relative;
        }
        #tdt-boot-titlebar{
            position:absolute;
            top:10px;
            left:14px;
            right:14px;
            display:flex;
            justify-content:space-between;
            opacity:0.9;
            pointer-events:none;
            font-size:12px;
        }
        #tdt-boot-text{
            margin:34px 0 0 0;
            white-space:pre-wrap;
            word-break:break-word;
            font-size:14px;
            line-height:1.25;
        }
        #tdt-boot-hint{
            position:absolute;
            bottom:10px;
            left:14px;
            right:14px;
            display:flex;
            justify-content:space-between;
            font-size:12px;
            opacity:0.8;
        }
        #tdt-boot-cursor{
            display:inline-block;
            width:9px;
            margin-left:2px;
            background:rgba(215,219,231,0.75);
            animation:tdtBootBlink 0.85s steps(1) infinite;
            transform:translateY(2px);
        }
        @keyframes tdtBootBlink{50%{opacity:0;}}
        #tdt-boot-overlay::before{
            content:"";
            position:absolute;
            inset:0;
            background:repeating-linear-gradient(
              to bottom,
              rgba(255,255,255,0.03),
              rgba(255,255,255,0.03) 1px,
              rgba(0,0,0,0.00) 3px,
              rgba(0,0,0,0.00) 6px
            );
            pointer-events:none;
            mix-blend-mode:overlay;
            opacity:0.45;
        }

        `);
    }

    function initUI() {
        if (ui.container) return;

        const body = document.body || document.documentElement;

        const toggle = document.createElement("button");
        toggle.id = "tdt-game-toggle";
        toggle.textContent = "dope";
        toggle.addEventListener("click", () => {
            // User gesture: unlock audio + play the WarGames clip right as the menu sequence begins
            unlockWarGamesAudio();
            if (mode === "idle") {
                if (!menuSoundPlayedThisOpen) {
                    menuSoundPlayedThisOpen = true;
                    playWargamesClip();
                }
                startBootThenIntro();
            }
            toggleWindow();
        });
        body.appendChild(toggle);

        const container = document.createElement("div");
        container.id = "tdt-game-window";
        container.tabIndex = 0;

        const main = document.createElement("div");
        main.id = "tdt-game-main";

        const help = document.createElement("div");
        help.id = "tdt-game-help";
        help.textContent = "Controls in game: ↑/↓ = select  |  B = Buy  S = Sell  N = Next day  L = Loan  R = Repay  K = Bank  Q = Quit";

        container.appendChild(main);
        container.appendChild(help);
        body.appendChild(container);

        container.addEventListener("keydown", handleKeys);
        container.addEventListener("click", () => container.focus());
        container.addEventListener("mousedown", dragStart);

        ui = { container, pre: main, help, toggleBtn: toggle };
    }

    function toggleWindow() {
        const c = ui.container;
        if (!c) return;
        c.style.display = (c.style.display === "none" || !c.style.display) ? "block" : "none";
        if (c.style.display === "block") c.focus();
    }

    function dragStart(e) {
        if (e.button !== 0 || !ui.container) return;
        const rect = ui.container.getBoundingClientRect();
        dragState.active  = true;
        dragState.offsetX = e.clientX - rect.left;
        dragState.offsetY = e.clientY - rect.top;
        ui.container.style.top = rect.top + "px";
        ui.container.style.left = rect.left + "px";
        ui.container.style.bottom = "auto";
        document.addEventListener("mousemove", dragMove);
        document.addEventListener("mouseup", dragEnd);
    }

    function dragMove(e) {
        if (!dragState.active || !ui.container) return;
        ui.container.style.left = (e.clientX - dragState.offsetX) + "px";
        ui.container.style.top  = (e.clientY - dragState.offsetY) + "px";
    }

    function dragEnd() {
        dragState.active = false;
        document.removeEventListener("mousemove", dragMove);
        document.removeEventListener("mouseup", dragEnd);
    }

    // ---------- INTRO / WARGAMES MODE ----------

    // ---------- BIOS/DOS BOOT INTRO (ESC to skip) ----------

    function detectContext() {
        // Best-effort selectors; Torn UI can vary. We fail gracefully.
        let player = "";
        let destination = "";

        const nameCandidates = [
            document.querySelector(".user-information .name"),
            document.querySelector(".user-information .info .name"),
            document.querySelector(".profile-mini .name"),
            document.querySelector('a[href*="profiles.php"] strong'),
            document.querySelector('a[href*="profiles.php"]')
        ];
        for (const el of nameCandidates) {
            const t = (el && el.textContent) ? el.textContent.trim() : "";
            if (t && t.length > 1 && t.length < 40) { player = t; break; }
        }

        // Destination candidates on travelagency page / widgets
        const destCandidates = [
            document.querySelector(".travel-agency .destination .title"),
            document.querySelector(".travel-agency .destination-title"),
            document.querySelector(".travel-agency .title"),
            document.querySelector(".countries-list .selected .title"),
            document.querySelector(".countries-list .selected"),
            document.querySelector('[class*="destination"] [class*="title"]')
        ];
        for (const el of destCandidates) {
            const t = (el && el.textContent) ? el.textContent.trim() : "";
            if (t && t.length > 2 && t.length < 60) { destination = t; break; }
        }

        return {
            player: player || "UNKNOWN_USER",
            destination: destination || "UNKNOWN_DESTINATION",
            url: location.href.replace(/^https?:\/\//, ""),
            time: new Date()
        };
    }

    function ensureBootOverlay() {
        let ov = document.getElementById("tdt-boot-overlay");
        if (ov) return ov;

        ov = document.createElement("div");
        ov.id = "tdt-boot-overlay";
        ov.innerHTML = `
          <div id="tdt-boot-frame" role="dialog" aria-label="Boot intro">
            <div id="tdt-boot-titlebar">
              <div>PhoenixBIOS Setup Utility — © 1993–2026</div>
              <div>TornBC TV / DopeWars Travel Edition</div>
            </div>
            <pre id="tdt-boot-text"></pre>
            <div id="tdt-boot-hint">
              <div><b>ESC</b> to skip</div>
              <div id="tdt-boot-subhint">Initializing…</div>
            </div>
          </div>
        `;
        (document.body || document.documentElement).appendChild(ov);
        return ov;
    }

    function sleep(ms) { return new Promise(r => setTimeout(r, ms)); }

    function formatDate(dt) {
        // Remove timezone suffix for a cleaner BIOS look
        return dt.toString().replace(/\sGMT.*$/, "");
    }

    function buildBootLines(ctx) {
        const t = formatDate(ctx.time);
        const bios = [
            "TornBC TV BIOS v3.26 (Travel Edition)",
            "Copyright (C) 1993-2026 TornBC Broadcasting Systems",
            "",
            `System Time: ${t}`,
            `User: ${ctx.player}`,
            `Route: ${ctx.destination}`,
            "",
            "CPU:  TORN/8086 Compatible @ 66MHz",
            "RAM:  65536KB OK",
            "VGA:  256-color adapter detected",
            "HDD:  TornCity://travelagency.php  [OK]",
            "NET:  torn.com uplink            [OK]",
            "",
            "Detecting IDE Primary Master ... OK",
            "Detecting IDE Primary Slave  ... None",
            "Detecting IDE Secondary Master... OK",
            "Detecting IDE Secondary Slave ... None",
            "",
            "Press DEL to enter SETUP",
            "Press ESC to skip boot",
            "",
            "Booting from TornCity:// …",
            ""
        ];

        const dos = [
            "Starting MS-DOS...",
            "",
            "HIMEM is testing extended memory...done.",
            "SMARTDrive disk cache initialized.",
            "",
            `C:\\>cd \\TBCTV\\DOPEWARS`,
            "C:\\TBCTV\\DOPEWARS>loadhigh dopewars.exe /TRAVEL",
            "",
            "TornBC TV Travel Edition v1.6",
            `Traveler: ${ctx.player}`,
            `Destination: ${ctx.destination}`,
            `Session: ${ctx.url}`,
            "",
            "Loading price tables.............OK",
            "Loading market volatility........OK",
            "Loading suspicious alley contacts.OK",
            "",
            "Launching game interface...",
            ""
        ];

        return { bios, dos };
    }

    async function showBootIntro() {
        if (bootRunning) return;
        bootRunning = true;

        const ctx = detectContext();
        const ov = ensureBootOverlay();
        const pre = ov.querySelector("#tdt-boot-text");
        const sub = ov.querySelector("#tdt-boot-subhint");

        ov.style.display = "flex";
        pre.textContent = "";
        sub.textContent = `POST… (${ctx.destination})`;

        const cursor = document.createElement("span");
        cursor.id = "tdt-boot-cursor";
        cursor.textContent = " ";
        pre.appendChild(cursor);

        let aborted = false;

        function appendChar(ch) {
            cursor.remove();
            pre.textContent += ch;
            pre.appendChild(cursor);
        }
        function appendLine(line) {
            for (let i = 0; i < line.length; i++) appendChar(line[i]);
            appendChar("\n");
        }

        function cleanup() {
            if (bootSkipHandler) window.removeEventListener("keydown", bootSkipHandler, true);
            ov.style.display = "none";
            bootRunning = false;
        }

        bootSkipHandler = (e) => {
            if (e.key === "Escape") {
                e.preventDefault();
                e.stopPropagation();
                aborted = true;
                cleanup();
            }
        };
        window.addEventListener("keydown", bootSkipHandler, true);

        const { bios, dos } = buildBootLines(ctx);

        // Dramatic pacing: slow-ish typing and pauses
        const charDelayBios = 8;
        const lineDelayBios = 120;
        const charDelayDos  = 6;
        const lineDelayDos  = 100;

        for (const line of bios) {
            if (aborted) return;
            // type
            for (let i = 0; i < line.length; i++) { appendChar(line[i]); await sleep(charDelayBios); }
            appendChar("\n");
            await sleep(lineDelayBios);
        }

        if (aborted) return;
        sub.textContent = "Boot loader…";
        await sleep(900);

        if (aborted) return;
        sub.textContent = "DOS…";

        for (const line of dos) {
            if (aborted) return;
            for (let i = 0; i < line.length; i++) { appendChar(line[i]); await sleep(charDelayDos); }
            appendChar("\n");
            await sleep(lineDelayDos);
        }

        if (aborted) return;
        sub.textContent = "Starting…";
        await sleep(700);

        cleanup();
    }

    async function startBootThenIntro() {
        // Only show once per flight start (or manual launch) until landing resets it.
        if (!bootPlayedThisFlight) {
            bootPlayedThisFlight = true;
            await showBootIntro();
        }
        startIntro();
    }


    function startIntro() {
        mode = "intro";
        gameActive = false;
        gameState = null;

        const width = 60;
        const lines = [];
        lines.push(tr("T.O.R.N.-NET ACCESS TERMINAL  300 BAUD", width));
        lines.push("");
        lines.push("LOGON: GUEST");
        lines.push("");
        lines.push("GAMES AVAILABLE:");
        lines.push("  1. CHESS");
        lines.push("  2. CHECKERS");
        lines.push("  3. GLOBAL STRATEGIC SIMULATION");
        lines.push("  4. TORN DOPEWARS");
        lines.push("");
        lines.push("TYPE 4 AND PRESS ENTER TO CONNECT");
        lines.push("Q TO ABORT CONNECTION");
        lines.push("");

        introFullText = lines.join("\n");
        introIndex = 0;
        introCursorOn = true;

        if (introTimer) clearInterval(introTimer);
        if (cursorTimer) clearInterval(cursorTimer);

        introTimer = setInterval(() => {
            if (mode !== "intro") { clearInterval(introTimer); introTimer = null; return; }
            introIndex++;
            if (introIndex >= introFullText.length) {
                introIndex = introFullText.length;
                clearInterval(introTimer);
                introTimer = null;
            }
            renderIntro();
        }, 20); // typing speed

        cursorTimer = setInterval(() => {
            if (mode !== "intro") { clearInterval(cursorTimer); cursorTimer = null; return; }
            introCursorOn = !introCursorOn;
            renderIntro();
        }, 400);

        renderIntro();
    }

    
    function playWargamesClip() {
        try {
            const a = getWarGamesAudio();
            a.volume = 0.9;
            a.currentTime = 0;
            const p = a.play();
            if (p && typeof p.catch === "function") p.catch(() => {});
        } catch(e) {
            // ignore audio failures
        }
    }

// ---------- GAME CORE ----------

    function startGame() {
        const items = COMMODITIES.map(c => ({
            id: c.id,
            name: c.name,
            baseMin: c.baseMin,
            baseMax: c.baseMax,
            price: ri(c.baseMin, c.baseMax),
            owned: 0
        }));

        gameState = {
            day: 1,
            locationIndex: 0,
            cash: START_CASH,
            bank: 0,
            debt: START_DEBT,
            guns: 0,
            health: 100,
            maxSpace: MAX_SPACE,
            cursor: 0,
            items,
            message: "Welcome to Torn Dopewars. What do you wish to buy or sell?"
        };

        rollPrices();
        maybeEvent();
        gameActive = true;
        mode = "game";
        renderGame();
    }

    function endGame(reason) {
        if (!gameState) return;
        const net = gameState.cash + gameState.bank + inventoryValue() - gameState.debt;
        gameState.message = `Game over (${reason}). Final net worth: $${net}. Press Q to close.`;
        renderGame();
        gameActive = false;
        mode = "game";
    }

    function totalInventory() {
        return gameState.items.reduce((sum, it) => sum + it.owned, 0);
    }

    function inventoryValue() {
        return gameState.items.reduce((sum, it) => sum + it.owned * it.price, 0);
    }

    function rollPrices() {
        gameState.items.forEach(it => {
            it.price = ri(it.baseMin, it.baseMax);
        });
    }

    function maybeEvent() {
        if (Math.random() < 0.35) rnd(RANDOM_EVENTS).apply(gameState);
        else gameState.message = `You're in ${LOCATIONS[gameState.locationIndex]}.`;
    }

    function nextLocation() {
        gameState.locationIndex = (gameState.locationIndex + 1) % LOCATIONS.length;
        gameState.day++;
        if (gameState.day > DAYS_TOTAL) {
            endGame("time up");
            return;
        }
        rollPrices();
        maybeEvent();
    }

    function doBuy() {
        const it = gameState.items[gameState.cursor];
        if (gameState.cash < it.price) {
            gameState.message = "You don't have enough cash.";
            return;
        }
        if (totalInventory() >= gameState.maxSpace) {
            gameState.message = "Your trenchcoat is full.";
            return;
        }
        it.owned++;
        gameState.cash -= it.price;
        gameState.message = `You bought 1 ${it.name}.`;
    }

    function doSell() {
        const it = gameState.items[gameState.cursor];
        if (it.owned <= 0) {
            gameState.message = "You don't own any of that.";
            return;
        }
        it.owned--;
        gameState.cash += it.price;
        gameState.message = `You sold 1 ${it.name}.`;
    }

    function doLoan() {
        const room = MAX_LOAN - gameState.debt;
        if (room <= 0) {
            gameState.message = "Loan shark: you're at your limit.";
            return;
        }
        const amt = Math.min(2000, room);
        gameState.debt += amt;
        gameState.cash += amt;
        gameState.message = `You borrow $${amt} from Duke's boys.`;
    }

    function doBank() {
        if (gameState.cash <= 0) {
            gameState.message = "No spare cash to bank.";
            return;
        }
        const amt = Math.min(gameState.cash, 2000);
        gameState.cash -= amt;
        gameState.bank += amt;
        gameState.message = `You deposit $${amt} in the bank.`;
    }

    function doRepay() {
        if (gameState.cash <= 0 || gameState.debt <= 0) {
            gameState.message = "Nothing to repay.";
            return;
        }
        const amt = Math.min(gameState.cash, gameState.debt, 2000);
        gameState.cash -= amt;
        gameState.debt -= amt;
        gameState.message = `You repay $${amt} of your debt.`;
    }

    // ---------- INPUT HANDLING ----------

    function handleKeys(e) {
        if (mode === "intro") {
            const key = e.key.toLowerCase();
            if (key === "enter" || key === "return") {
                e.preventDefault();
                introIndex = introFullText.length;
                renderIntro();
                setTimeout(() => startGame(), 50);
            } else if (key === "q") {
                e.preventDefault();
                ui.container.style.display = "none";
                mode = "idle";
            }
            return;
        }

        if (!gameActive && e.key.toLowerCase() !== "q") return;

        const k = e.key;
        if (k === "ArrowUp" || k === "ArrowDown") {
            e.preventDefault();
            if (k === "ArrowUp")   gameState.cursor = (gameState.cursor - 1 + gameState.items.length) % gameState.items.length;
            if (k === "ArrowDown") gameState.cursor = (gameState.cursor + 1) % gameState.items.length;
            renderGame();
            return;
        }

        const key = k.toLowerCase();
        if (key === "b") { e.preventDefault(); doBuy();   renderGame(); }
        else if (key === "s") { e.preventDefault(); doSell();  renderGame(); }
        else if (key === "n") { e.preventDefault(); nextLocation(); renderGame(); }
        else if (key === "l") { e.preventDefault(); doLoan();  renderGame(); }
        else if (key === "k") { e.preventDefault(); doBank();  renderGame(); }
        else if (key === "r") { e.preventDefault(); doRepay(); renderGame(); }
        else if (key === "q") {
            e.preventDefault();
            if (gameActive) endGame("quit");
            if (ui.container) ui.container.style.display = "none";
            mode = "idle";
        }
    }

    // ---------- RENDERING ----------

    function render() {
        if (!ui.pre) return;
        if (mode === "intro") { renderIntro(); return; }
        if (!gameState) return;
        renderGame();
    }

    function renderIntro() {
        if (!ui.pre) return;
        const width = 72;
        let visible = introFullText.slice(0, Math.max(0, introIndex));
        if (introCursorOn) visible += "_";

        // Escape for safe HTML
        const esc = (s) => String(s).replace(/[&<>]/g, ch => ({'&':'&amp;','<':'&lt;','>':'&gt;'}[ch]));
        const lines = visible.split("\n").map(l => tr(l, width));
        ui.pre.innerHTML = `
          <div class="tdt-topbar">
            <span>DOPEWARS.EXE</span>
            <span>Press ESC to skip boot</span>
          </div>
          <div class="tdt-bottom" style="background:#0000aa;color:#ffffff;height:384px;border:2px solid #d0d0d0;">
            <div style="white-space:pre-wrap;word-break:break-word;line-height:1.25;">${esc(lines.join("\n"))}</div>
          </div>
        `;
    }

    function renderGame() {
        if (!ui.pre || !gameState) return;

        const baseDate = new Date(1988, 0, 12);
        baseDate.setDate(baseDate.getDate() + (gameState.day - 1));
        const dateStr =
            String(baseDate.getMonth() + 1).padStart(2,"0") + "-" +
            String(baseDate.getDate()).padStart(2,"0") + "-" +
            baseDate.getFullYear();

        const locationName = LOCATIONS[gameState.locationIndex] || "Unknown";
        const totalInv = totalInventory();

        const itemLetters = ["A","B","C","D","E","F","G","H","I"];

        const itemsHtml = gameState.items.map((it, idx) => {
            const letter = itemLetters[idx] || "?";
            const sel = (idx === gameState.cursor) ? "sel" : "";
            return `
              <div class="tdt-item ${sel}">
                <div class="tdt-left"><span>${letter})</span><span>${it.name}</span></div>
                <div>$${it.price}</div>
              </div>
            `;
        }).join("");

        const msg = (gameState.message || "").slice(0, 140);

        ui.pre.innerHTML = `
          <div class="tdt-topbar">
            <span>${dateStr}</span>
            <span>Space&nbsp;&nbsp;${gameState.maxSpace}</span>
          </div>

          <div class="tdt-panels">
            <div class="tdt-panel">
              <div class="tdt-panel-title">Stats</div>

              <div class="tdt-statrow"><span>Cash</span><span>$${gameState.cash}</span></div>
              <div class="tdt-statrow"><span>Guns</span><span>${gameState.guns}</span></div>
              <div class="tdt-statrow"><span>Health</span><span>${gameState.health}</span></div>
              <div class="tdt-statrow"><span>Bank</span><span>$${gameState.bank}</span></div>
              <div class="tdt-statrow">
                <span>Debt</span>
                <span class="tdt-debt">$${gameState.debt}</span>
              </div>
            </div>

            <div class="tdt-panel">
              <div class="tdt-panel-title">${locationName}</div>
              <div style="opacity:0.9;line-height:1.25;">
                <div>Market is open.</div>
                <div style="margin-top:10px;">Use ↑/↓ to select.</div>
                <div>Press <b>B</b> to buy, <b>S</b> to sell.</div>
                <div>Press <b>N</b> for next day.</div>
              </div>
            </div>

            <div class="tdt-panel">
              <div class="tdt-panel-title">Trenchcoat</div>
              <div class="tdt-statrow"><span>Used</span><span>${totalInv}</span></div>
              <div class="tdt-statrow"><span>Max</span><span>${gameState.maxSpace}</span></div>
              <div style="margin-top:10px;opacity:0.9;line-height:1.25;">
                <div>Inventory shown</div>
                <div>in trade list.</div>
              </div>
            </div>
          </div>

          <div class="tdt-bottom">
            <p><b>Hey dude, the prices of goods here are:</b></p>
            <div class="tdt-prices">${itemsHtml}</div>
            <p class="tdt-prompt">What do you wish to buy?</p>
            <p class="tdt-msg">${msg}</p>
          </div>
        `;
    }

    // ---------- FLIGHT DETECTION ----------

    function inFlightText() {
        const t = (document.body.innerText || "").toLowerCase();
        return t.includes("time left until landing") ||
               t.includes("time left till landing") ||
               t.includes("you are currently flying");
    }

    function pollFlight() {
        const now = inFlightText();
        if (now && !inFlight) {
            inFlight = true;
            if (mode === "idle") startBootThenIntro();
            ui.container.style.display = "block";
            ui.container.focus();
        } else if (!now && inFlight) {
            inFlight = false;
            bootPlayedThisFlight = false;
            menuSoundPlayedThisOpen = false;
            if (gameActive) endGame("landing");
            ui.container.style.display = "none";
            mode = "idle";
        }
    }

    addStyles();

    function boot() {
        if (!document.body) {
            setTimeout(boot, 200);
            return;
        }
        initUI();
        setInterval(pollFlight, 5000);
    }

    boot();

})();