Greasy Fork

Greasy Fork is available in English.

steam价格转换

steam商店中的价格转换为人民币

当前为 2023-05-20 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         steam价格转换
// @namespace    https://github.com/marioplus/steam-price-converter
// @version      2.1.0
// @author       marioplus
// @description  steam商店中的价格转换为人民币
// @license      GPL-3.0-or-later
// @icon         https://vitejs.dev/logo.svg
// @homepage     https://github.com/marioplus
// @match        https://store.steampowered.com/*
// @match        https://steamcommunity.com/*
// @require      data:application/javascript,%3Bvar%20Reflect%3Dwindow.Reflect%3B
// @require      https://cdn.jsdelivr.net/npm/[email protected]/Reflect.min.js
// @connect      open.er-api.com
// @connect      store.steampowered.com
// @grant        unsafeWindow
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_deleteValue
// @grant        GM_xmlhttpRequest
// @grant        GM_cookie
// ==/UserScript==

(t=>{const e=document.createElement("style");e.dataset.source="vite-plugin-monkey",e.innerText=t,document.head.appendChild(e)})(".tab_item_discount{min-width:113px!important;width:unset}.discount_final_price{display:inline-block!important}.search_result_row .col.search_price{width:175px}.search_result_row .col.search_name{width:200px}.market_listing_their_price{width:160px}");

var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __publicField = (obj, key, value) => {
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  return value;
};
(function() {
  var _a, _b;
  "use strict";
  const style = "";
  class AbstractConverter {
    match(elementSnap) {
      if (!elementSnap || !elementSnap.element) {
        return false;
      }
      const content = elementSnap.textContext;
      if (!content) {
        return false;
      }
      if (content.match(/\d/) === null) {
        return false;
      }
      if (/^[,.\d\s]+$/.test(content)) {
        return false;
      }
      const parent = elementSnap.element.parentElement;
      if (!parent) {
        return false;
      }
      for (const selector of this.getCssSelectors()) {
        const element = parent.querySelector(selector);
        if (element && element === elementSnap.element) {
          elementSnap.selector = selector;
          return true;
        }
      }
      return false;
    }
    afterConvert(elementSnap) {
    }
  }
  const metadataKey = "Metadata:JsonProperty";
  function JsonProperty(config = {}) {
    return (target, property) => {
      config.alias = config.alias || property;
      Reflect.defineMetadata(metadataKey, config, target, property);
    };
  }
  function JsonAlias(alias) {
    return (target, property) => {
      const config = Reflect.getMetadata(metadataKey, target, property) || {};
      config.alias = alias || property;
      Reflect.defineMetadata(metadataKey, config, target, property);
    };
  }
  class Serializable {
    toJson() {
      const anyThis = this;
      const json = {};
      Object.keys(this).forEach((propKey) => {
        const config = Reflect.getMetadata(metadataKey, this, propKey);
        const prop = anyThis[propKey];
        if (!config || prop === void 0) {
          return;
        }
        if (config.typeAs || config.typeAs === Map) {
          json[config.alias] = {};
          prop.forEach((v, k) => {
            json[config.alias][k] = v;
          });
          return;
        }
        if (prop instanceof Serializable) {
          json[config.alias] = prop.toJson();
          return;
        }
        json[config.alias] = prop;
      });
      return json;
    }
    toJsonString() {
      return JSON.stringify(this.toJson());
    }
    readJson(json) {
      const anyThis = this;
      Object.keys(this).forEach((propKey) => {
        const config = Reflect.getMetadata(metadataKey, this, propKey);
        const prop = anyThis[propKey];
        const jsonNode = json[config.alias];
        if (!config || jsonNode === void 0) {
          return;
        }
        if (config.typeAs || config.typeAs === Map) {
          anyThis[propKey] = new Map(Object.entries(jsonNode));
          return;
        }
        if (prop instanceof Serializable) {
          prop.readJson(jsonNode);
          return;
        }
        anyThis[propKey] = jsonNode;
      });
      return this;
    }
    readJsonString(jsonString) {
      return this.readJson(JSON.parse(jsonString));
    }
  }
  var __defProp$2 = Object.defineProperty;
  var __getOwnPropDesc$2 = Object.getOwnPropertyDescriptor;
  var __decorateClass$2 = (decorators, target, key, kind) => {
    var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$2(target, key) : target;
    for (var i = decorators.length - 1, decorator; i >= 0; i--)
      if (decorator = decorators[i])
        result = (kind ? decorator(target, key, result) : decorator(result)) || result;
    if (kind && result)
      __defProp$2(target, key, result);
    return result;
  };
  class Setting extends Serializable {
    constructor() {
      super(...arguments);
      __publicField(this, "countyCode", "CN");
      __publicField(this, "currencySymbol", "\uFFE5");
      __publicField(this, "currencySymbolBeforeValue", true);
      __publicField(this, "rateCacheExpired", 1e3 * 60 * 60);
      __publicField(this, "useCustomRate", false);
      __publicField(this, "customRate", 1);
    }
  }
  __decorateClass$2([
    JsonProperty()
  ], Setting.prototype, "countyCode", 2);
  __decorateClass$2([
    JsonProperty()
  ], Setting.prototype, "currencySymbol", 2);
  __decorateClass$2([
    JsonProperty()
  ], Setting.prototype, "currencySymbolBeforeValue", 2);
  __decorateClass$2([
    JsonProperty()
  ], Setting.prototype, "rateCacheExpired", 2);
  __decorateClass$2([
    JsonProperty()
  ], Setting.prototype, "useCustomRate", 2);
  __decorateClass$2([
    JsonProperty()
  ], Setting.prototype, "customRate", 2);
  var r = (_a = Reflect.get(document, "__monkeyWindow")) != null ? _a : window;
  r.GM;
  r.unsafeWindow = (_b = r.unsafeWindow) != null ? _b : window;
  var n = r.unsafeWindow;
  r.GM_info;
  var M = r.GM_cookie, u = (...e) => r.GM_setValue(...e), G = (...e) => r.GM_deleteValue(...e), b = (...e) => r.GM_xmlhttpRequest(...e), h = (...e) => r.GM_getValue(...e);
  const STORAGE_KEY_PREFIX = "Storage:";
  const STORAGE_KEY_RATE_CACHES = STORAGE_KEY_PREFIX + "RateCache";
  const STORAGE_KEY_SETTING = STORAGE_KEY_PREFIX + "Setting";
  const countyCurrencyCodes = [
    {
      code: "AL",
      name: "\u963F\u5C14\u5DF4\u5C3C\u4E9A",
      nameEn: "Albania",
      currencyCode: "ALL"
    },
    {
      code: "DZ",
      name: "\u963F\u5C14\u53CA\u5229\u4E9A",
      nameEn: "Algeria",
      currencyCode: "DZD"
    },
    {
      code: "AF",
      name: "\u963F\u5BCC\u6C57",
      nameEn: "Afghanistan",
      currencyCode: "AFN"
    },
    {
      code: "AR",
      name: "\u963F\u6839\u5EF7",
      nameEn: "Argentina",
      currencyCode: "ARS"
    },
    {
      code: "AE",
      name: "\u963F\u8054\u914B",
      nameEn: "United Arab Emirates",
      currencyCode: "AED"
    },
    {
      code: "AW",
      name: "\u963F\u9C81\u5DF4",
      nameEn: "Aruba",
      currencyCode: "AWG"
    },
    {
      code: "OM",
      name: "\u963F\u66FC",
      nameEn: "Oman",
      currencyCode: "OMR"
    },
    {
      code: "AZ",
      name: "\u963F\u585E\u62DC\u7586",
      nameEn: "Azerbaijan",
      currencyCode: "AZN"
    },
    {
      code: "EG",
      name: "\u57C3\u53CA",
      nameEn: "Egypt",
      currencyCode: "EGP"
    },
    {
      code: "ET",
      name: "\u57C3\u585E\u4FC4\u6BD4\u4E9A",
      nameEn: "Ethiopia",
      currencyCode: "ETB"
    },
    {
      code: "IE",
      name: "\u7231\u5C14\u5170",
      nameEn: "Ireland",
      currencyCode: "EUR"
    },
    {
      code: "EE",
      name: "\u7231\u6C99\u5C3C\u4E9A",
      nameEn: "Estonia",
      currencyCode: "EUR"
    },
    {
      code: "AD",
      name: "\u5B89\u9053\u5C14",
      nameEn: "Andorra",
      currencyCode: "EUR"
    },
    {
      code: "AO",
      name: "\u5B89\u54E5\u62C9",
      nameEn: "Angola",
      currencyCode: "AOA"
    },
    {
      code: "AI",
      name: "\u5B89\u572D\u62C9",
      nameEn: "Anguilla",
      currencyCode: "XCD"
    },
    {
      code: "AG",
      name: "\u5B89\u63D0\u74DC\u548C\u5DF4\u5E03\u8FBE",
      nameEn: "Antigua and Barbuda",
      currencyCode: "XCD"
    },
    {
      code: "AT",
      name: "\u5965\u5730\u5229",
      nameEn: "Austria",
      currencyCode: "EUR"
    },
    {
      code: "AU",
      name: "\u6FB3\u5927\u5229\u4E9A",
      nameEn: "Australia",
      currencyCode: "AUD"
    },
    {
      code: "MO",
      name: "\u6FB3\u95E8",
      nameEn: "Macao",
      currencyCode: "MOP"
    },
    {
      code: "BB",
      name: "\u5DF4\u5DF4\u591A\u65AF",
      nameEn: "Barbados",
      currencyCode: "BBD"
    },
    {
      code: "PG",
      name: "\u5DF4\u5E03\u4E9A\u65B0\u51E0\u5185\u4E9A",
      nameEn: "Papua New Guinea",
      currencyCode: "PGK"
    },
    {
      code: "BS",
      name: "\u5DF4\u54C8\u9A6C",
      nameEn: "Bahamas",
      currencyCode: "BSD"
    },
    {
      code: "PK",
      name: "\u5DF4\u57FA\u65AF\u5766",
      nameEn: "Pakistan",
      currencyCode: "PKR"
    },
    {
      code: "PY",
      name: "\u5DF4\u62C9\u572D",
      nameEn: "Paraguay",
      currencyCode: "PYG"
    },
    {
      code: "PS",
      name: "\u5DF4\u52D2\u65AF\u5766",
      nameEn: "Palestine, State of",
      currencyCode: "ILS"
    },
    {
      code: "BH",
      name: "\u5DF4\u6797",
      nameEn: "Bahrain",
      currencyCode: "BHD"
    },
    {
      code: "PA",
      name: "\u5DF4\u62FF\u9A6C",
      nameEn: "Panama",
      currencyCode: "PAB"
    },
    {
      code: "BR",
      name: "\u5DF4\u897F",
      nameEn: "Brazil",
      currencyCode: "BRL"
    },
    {
      code: "BY",
      name: "\u767D\u4FC4\u7F57\u65AF",
      nameEn: "Belarus",
      currencyCode: "BYN"
    },
    {
      code: "BM",
      name: "\u767E\u6155\u5927",
      nameEn: "Bermuda",
      currencyCode: "BMD"
    },
    {
      code: "BG",
      name: "\u4FDD\u52A0\u5229\u4E9A",
      nameEn: "Bulgaria",
      currencyCode: "BGN"
    },
    {
      code: "MP",
      name: "\u5317\u9A6C\u91CC\u4E9A\u7EB3\u7FA4\u5C9B",
      nameEn: "Northern Mariana Islands",
      currencyCode: "USD"
    },
    {
      code: "BJ",
      name: "\u8D1D\u5B81",
      nameEn: "Benin",
      currencyCode: "XOF"
    },
    {
      code: "BE",
      name: "\u6BD4\u5229\u65F6",
      nameEn: "Belgium",
      currencyCode: "EUR"
    },
    {
      code: "IS",
      name: "\u51B0\u5C9B",
      nameEn: "Iceland",
      currencyCode: "ISK"
    },
    {
      code: "PR",
      name: "\u6CE2\u591A\u9ECE\u5404",
      nameEn: "Puerto Rico",
      currencyCode: "USD"
    },
    {
      code: "BA",
      name: "\u6CE2\u9ED1",
      nameEn: "Bosnia and Herzegovina",
      currencyCode: "BAM"
    },
    {
      code: "PL",
      name: "\u6CE2\u5170",
      nameEn: "Poland",
      currencyCode: "PLN"
    },
    {
      code: "BO",
      name: "\u73BB\u5229\u7EF4\u4E9A",
      nameEn: "Bolivia, Plurinational State of",
      currencyCode: "BOB"
    },
    {
      code: "BZ",
      name: "\u4F2F\u5229\u5179",
      nameEn: "Belize",
      currencyCode: "BZD"
    },
    {
      code: "BW",
      name: "\u535A\u8328\u74E6\u7EB3",
      nameEn: "Botswana",
      currencyCode: "BWP"
    },
    {
      code: "BT",
      name: "\u4E0D\u4E39",
      nameEn: "Bhutan",
      currencyCode: "BTN"
    },
    {
      code: "BF",
      name: "\u5E03\u57FA\u7EB3\u6CD5\u7D22",
      nameEn: "Burkina Faso",
      currencyCode: "XOF"
    },
    {
      code: "BI",
      name: "\u5E03\u9686\u8FEA",
      nameEn: "Burundi",
      currencyCode: "BIF"
    },
    {
      code: "BV",
      name: "\u5E03\u97E6\u5C9B",
      nameEn: "Bouvet Island",
      currencyCode: "NOK"
    },
    {
      code: "KP",
      name: "\u671D\u9C9C",
      nameEn: "Korea, Democratic People's Republic of",
      currencyCode: "KPW"
    },
    {
      code: "GQ",
      name: "\u8D64\u9053\u51E0\u5185\u4E9A",
      nameEn: "Equatorial Guinea",
      currencyCode: "XAF"
    },
    {
      code: "DK",
      name: "\u4E39\u9EA6",
      nameEn: "Denmark",
      currencyCode: "DKK"
    },
    {
      code: "DE",
      name: "\u5FB7\u56FD",
      nameEn: "Germany",
      currencyCode: "EUR"
    },
    {
      code: "TL",
      name: "\u4E1C\u5E1D\u6C76",
      nameEn: "Timor-Leste",
      currencyCode: "USD"
    },
    {
      code: "TG",
      name: "\u591A\u54E5",
      nameEn: "Togo",
      currencyCode: "XOF"
    },
    {
      code: "DO",
      name: "\u591A\u7C73\u5C3C\u52A0",
      nameEn: "Dominican Republic",
      currencyCode: "DOP"
    },
    {
      code: "DM",
      name: "\u591A\u7C73\u5C3C\u514B",
      nameEn: "Dominica",
      currencyCode: "XCD"
    },
    {
      code: "RU",
      name: "\u4FC4\u7F57\u65AF",
      nameEn: "Russian Federation",
      currencyCode: "RUB"
    },
    {
      code: "EC",
      name: "\u5384\u74DC\u591A\u5C14",
      nameEn: "Ecuador",
      currencyCode: "USD"
    },
    {
      code: "ER",
      name: "\u5384\u7ACB\u7279\u91CC\u4E9A",
      nameEn: "Eritrea",
      currencyCode: "ERN"
    },
    {
      code: "FR",
      name: "\u6CD5\u56FD",
      nameEn: "France",
      currencyCode: "EUR"
    },
    {
      code: "FO",
      name: "\u6CD5\u7F57\u7FA4\u5C9B",
      nameEn: "Faroe Islands",
      currencyCode: "DKK"
    },
    {
      code: "PF",
      name: "\u6CD5\u5C5E\u6CE2\u5229\u5C3C\u897F\u4E9A",
      nameEn: "French Polynesia",
      currencyCode: "XPF"
    },
    {
      code: "VA",
      name: "\u68B5\u8482\u5188",
      nameEn: "Holy See",
      currencyCode: "EUR"
    },
    {
      code: "PH",
      name: "\u83F2\u5F8B\u5BBE",
      nameEn: "Philippines",
      currencyCode: "PHP"
    },
    {
      code: "FJ",
      name: "\u6590\u6D4E",
      nameEn: "Fiji",
      currencyCode: "FJD"
    },
    {
      code: "FI",
      name: "\u82AC\u5170",
      nameEn: "Finland",
      currencyCode: "EUR"
    },
    {
      code: "CV",
      name: "\u4F5B\u5F97\u89D2",
      nameEn: "Cabo Verde",
      currencyCode: "CVE"
    },
    {
      code: "FK",
      name: "\u798F\u514B\u5170\u7FA4\u5C9B",
      nameEn: "Falkland Islands (Malvinas)",
      currencyCode: "FKP"
    },
    {
      code: "GM",
      name: "\u5188\u6BD4\u4E9A",
      nameEn: "Gambia",
      currencyCode: "GMD"
    },
    {
      code: "CG",
      name: "\u521A\u679C\u5171\u548C\u56FD",
      nameEn: "Congo",
      currencyCode: "XAF"
    },
    {
      code: "CD",
      name: "\u521A\u679C\u6C11\u4E3B\u5171\u548C\u56FD",
      nameEn: "Congo, the Democratic Republic of the",
      currencyCode: "CDF"
    },
    {
      code: "CO",
      name: "\u54E5\u4F26\u6BD4\u4E9A",
      nameEn: "Colombia",
      currencyCode: "COP"
    },
    {
      code: "CR",
      name: "\u54E5\u65AF\u8FBE\u9ECE\u52A0",
      nameEn: "Costa Rica",
      currencyCode: "CRC"
    },
    {
      code: "GD",
      name: "\u683C\u6797\u7EB3\u8FBE",
      nameEn: "Grenada",
      currencyCode: "XCD"
    },
    {
      code: "GL",
      name: "\u683C\u9675\u5170",
      nameEn: "Greenland",
      currencyCode: "DKK"
    },
    {
      code: "GE",
      name: "\u683C\u9C81\u5409\u4E9A",
      nameEn: "Georgia",
      currencyCode: "GEL"
    },
    {
      code: "GG",
      name: "\u6839\u897F",
      nameEn: "Guernsey",
      currencyCode: "GBP"
    },
    {
      code: "CU",
      name: "\u53E4\u5DF4",
      nameEn: "Cuba",
      currencyCode: "CUP"
    },
    {
      code: "GP",
      name: "\u74DC\u5FB7\u7F57\u666E",
      nameEn: "Guadeloupe",
      currencyCode: "EUR"
    },
    {
      code: "GU",
      name: "\u5173\u5C9B",
      nameEn: "Guam",
      currencyCode: "USD"
    },
    {
      code: "GY",
      name: "\u572D\u4E9A\u90A3",
      nameEn: "Guyana",
      currencyCode: "GYD"
    },
    {
      code: "KZ",
      name: "\u54C8\u8428\u514B\u65AF\u5766",
      nameEn: "Kazakhstan",
      currencyCode: "KZT"
    },
    {
      code: "HT",
      name: "\u6D77\u5730",
      nameEn: "Haiti",
      currencyCode: "HTG"
    },
    {
      code: "KR",
      name: "\u97E9\u56FD",
      nameEn: "Korea, Republic of",
      currencyCode: "KRW"
    },
    {
      code: "NL",
      name: "\u8377\u5170",
      nameEn: "Netherlands",
      currencyCode: "EUR"
    },
    {
      code: "SX",
      name: "\u8377\u5C5E\u5723\u9A6C\u4E01",
      nameEn: "Sint Maarten (Dutch part)",
      currencyCode: "ANG"
    },
    {
      code: "HM",
      name: "\u8D6B\u5FB7\u5C9B\u548C\u9EA6\u514B\u5510\u7EB3\u7FA4\u5C9B",
      nameEn: "Heard Island and McDonald Islands",
      currencyCode: "AUD"
    },
    {
      code: "ME",
      name: "\u9ED1\u5C71",
      nameEn: "Montenegro",
      currencyCode: "EUR"
    },
    {
      code: "HN",
      name: "\u6D2A\u90FD\u62C9\u65AF",
      nameEn: "Honduras",
      currencyCode: "HNL"
    },
    {
      code: "KI",
      name: "\u57FA\u91CC\u5DF4\u65AF",
      nameEn: "Kiribati",
      currencyCode: "AUD"
    },
    {
      code: "DJ",
      name: "\u5409\u5E03\u63D0",
      nameEn: "Djibouti",
      currencyCode: "DJF"
    },
    {
      code: "KG",
      name: "\u5409\u5C14\u5409\u65AF\u65AF\u5766",
      nameEn: "Kyrgyzstan",
      currencyCode: "KGS"
    },
    {
      code: "GN",
      name: "\u51E0\u5185\u4E9A",
      nameEn: "Guinea",
      currencyCode: "GNF"
    },
    {
      code: "GW",
      name: "\u51E0\u5185\u4E9A\u6BD4\u7ECD",
      nameEn: "Guinea-Bissau",
      currencyCode: "XOF"
    },
    {
      code: "CA",
      name: "\u52A0\u62FF\u5927",
      nameEn: "Canada",
      currencyCode: "CAD"
    },
    {
      code: "GH",
      name: "\u52A0\u7EB3",
      nameEn: "Ghana",
      currencyCode: "GHS"
    },
    {
      code: "GA",
      name: "\u52A0\u84EC",
      nameEn: "Gabon",
      currencyCode: "XAF"
    },
    {
      code: "KH",
      name: "\u67EC\u57D4\u5BE8",
      nameEn: "Cambodia",
      currencyCode: "KHR"
    },
    {
      code: "CZ",
      name: "\u6377\u514B",
      nameEn: "Czechia",
      currencyCode: "CZK"
    },
    {
      code: "ZW",
      name: "\u6D25\u5DF4\u5E03\u97E6",
      nameEn: "Zimbabwe",
      currencyCode: "ZWL"
    },
    {
      code: "CM",
      name: "\u5580\u9EA6\u9686",
      nameEn: "Cameroon",
      currencyCode: "XAF"
    },
    {
      code: "QA",
      name: "\u5361\u5854\u5C14",
      nameEn: "Qatar",
      currencyCode: "QAR"
    },
    {
      code: "KY",
      name: "\u5F00\u66FC\u7FA4\u5C9B",
      nameEn: "Cayman Islands",
      currencyCode: "KYD"
    },
    {
      code: "CC",
      name: "\u79D1\u79D1\u65AF\uFF08\u57FA\u6797\uFF09\u7FA4\u5C9B",
      nameEn: "Cocos (Keeling) Islands",
      currencyCode: "AUD"
    },
    {
      code: "KM",
      name: "\u79D1\u6469\u7F57",
      nameEn: "Comoros",
      currencyCode: "KMF"
    },
    {
      code: "CI",
      name: "\u79D1\u7279\u8FEA\u74E6",
      nameEn: "C\xF4te d'Ivoire",
      currencyCode: "XOF"
    },
    {
      code: "KW",
      name: "\u79D1\u5A01\u7279",
      nameEn: "Kuwait",
      currencyCode: "KWD"
    },
    {
      code: "HR",
      name: "\u514B\u7F57\u5730\u4E9A",
      nameEn: "Croatia",
      currencyCode: "HRK"
    },
    {
      code: "KE",
      name: "\u80AF\u5C3C\u4E9A",
      nameEn: "Kenya",
      currencyCode: "KES"
    },
    {
      code: "CK",
      name: "\u5E93\u514B\u7FA4\u5C9B",
      nameEn: "Cook Islands",
      currencyCode: "NZD"
    },
    {
      code: "CW",
      name: "\u5E93\u62C9\u7D22",
      nameEn: "Cura\xE7ao",
      currencyCode: "ANG"
    },
    {
      code: "LV",
      name: "\u62C9\u8131\u7EF4\u4E9A",
      nameEn: "Latvia",
      currencyCode: "EUR"
    },
    {
      code: "LS",
      name: "\u83B1\u7D22\u6258",
      nameEn: "Lesotho",
      currencyCode: "LSL"
    },
    {
      code: "LA",
      name: "\u8001\u631D",
      nameEn: "Lao People's Democratic Republic",
      currencyCode: "LAK"
    },
    {
      code: "LB",
      name: "\u9ECE\u5DF4\u5AE9",
      nameEn: "Lebanon",
      currencyCode: "LBP"
    },
    {
      code: "LT",
      name: "\u7ACB\u9676\u5B9B",
      nameEn: "Lithuania",
      currencyCode: "EUR"
    },
    {
      code: "LR",
      name: "\u5229\u6BD4\u91CC\u4E9A",
      nameEn: "Liberia",
      currencyCode: "LRD"
    },
    {
      code: "LY",
      name: "\u5229\u6BD4\u4E9A",
      nameEn: "Libya",
      currencyCode: "LYD"
    },
    {
      code: "LI",
      name: "\u5217\u652F\u6566\u58EB\u767B",
      nameEn: "Liechtenstein",
      currencyCode: "CHF"
    },
    {
      code: "RE",
      name: "\u7559\u5C3C\u6C6A",
      nameEn: "R\xE9union",
      currencyCode: "EUR"
    },
    {
      code: "LU",
      name: "\u5362\u68EE\u5821",
      nameEn: "Luxembourg",
      currencyCode: "EUR"
    },
    {
      code: "RW",
      name: "\u5362\u65FA\u8FBE",
      nameEn: "Rwanda",
      currencyCode: "RWF"
    },
    {
      code: "RO",
      name: "\u7F57\u9A6C\u5C3C\u4E9A",
      nameEn: "Romania",
      currencyCode: "RON"
    },
    {
      code: "MG",
      name: "\u9A6C\u8FBE\u52A0\u65AF\u52A0",
      nameEn: "Madagascar",
      currencyCode: "MGA"
    },
    {
      code: "IM",
      name: "\u9A6C\u6069\u5C9B",
      nameEn: "Isle of Man",
      currencyCode: "GBP"
    },
    {
      code: "MV",
      name: "\u9A6C\u5C14\u4EE3\u592B",
      nameEn: "Maldives",
      currencyCode: "MVR"
    },
    {
      code: "MT",
      name: "\u9A6C\u8033\u4ED6",
      nameEn: "Malta",
      currencyCode: "EUR"
    },
    {
      code: "MW",
      name: "\u9A6C\u62C9\u7EF4",
      nameEn: "Malawi",
      currencyCode: "MWK"
    },
    {
      code: "MY",
      name: "\u9A6C\u6765\u897F\u4E9A",
      nameEn: "Malaysia",
      currencyCode: "MYR"
    },
    {
      code: "ML",
      name: "\u9A6C\u91CC",
      nameEn: "Mali",
      currencyCode: "XOF"
    },
    {
      code: "MH",
      name: "\u9A6C\u7ECD\u5C14\u7FA4\u5C9B",
      nameEn: "Marshall Islands",
      currencyCode: "USD"
    },
    {
      code: "MQ",
      name: "\u9A6C\u63D0\u5C3C\u514B",
      nameEn: "Martinique",
      currencyCode: "EUR"
    },
    {
      code: "YT",
      name: "\u9A6C\u7EA6\u7279",
      nameEn: "Mayotte",
      currencyCode: "EUR"
    },
    {
      code: "MU",
      name: "\u6BDB\u91CC\u6C42\u65AF",
      nameEn: "Mauritius",
      currencyCode: "MUR"
    },
    {
      code: "MR",
      name: "\u6BDB\u91CC\u5854\u5C3C\u4E9A",
      nameEn: "Mauritania",
      currencyCode: "MRU"
    },
    {
      code: "US",
      name: "\u7F8E\u56FD",
      nameEn: "United States of America",
      currencyCode: "USD"
    },
    {
      code: "AS",
      name: "\u7F8E\u5C5E\u8428\u6469\u4E9A",
      nameEn: "American Samoa",
      currencyCode: "USD"
    },
    {
      code: "VI",
      name: "\u7F8E\u5C5E\u7EF4\u5C14\u4EAC\u7FA4\u5C9B",
      nameEn: "Virgin Islands, U.S.",
      currencyCode: "USD"
    },
    {
      code: "MN",
      name: "\u8499\u53E4",
      nameEn: "Mongolia",
      currencyCode: "MNT"
    },
    {
      code: "MS",
      name: "\u8499\u7279\u585E\u62C9\u7279",
      nameEn: "Montserrat",
      currencyCode: "XCD"
    },
    {
      code: "BD",
      name: "\u5B5F\u52A0\u62C9\u56FD",
      nameEn: "Bangladesh",
      currencyCode: "BDT"
    },
    {
      code: "PE",
      name: "\u79D8\u9C81",
      nameEn: "Peru",
      currencyCode: "PEN"
    },
    {
      code: "FM",
      name: "\u5BC6\u514B\u7F57\u5C3C\u897F\u4E9A\u8054\u90A6",
      nameEn: "Micronesia, Federated States of",
      currencyCode: "USD"
    },
    {
      code: "MM",
      name: "\u7F05\u7538",
      nameEn: "Myanmar",
      currencyCode: "MMK"
    },
    {
      code: "MD",
      name: "\u6469\u5C14\u591A\u74E6",
      nameEn: "Moldova, Republic of",
      currencyCode: "MDL"
    },
    {
      code: "MA",
      name: "\u6469\u6D1B\u54E5",
      nameEn: "Morocco",
      currencyCode: "MAD"
    },
    {
      code: "MC",
      name: "\u6469\u7EB3\u54E5",
      nameEn: "Monaco",
      currencyCode: "EUR"
    },
    {
      code: "MZ",
      name: "\u83AB\u6851\u6BD4\u514B",
      nameEn: "Mozambique",
      currencyCode: "MZN"
    },
    {
      code: "MX",
      name: "\u58A8\u897F\u54E5",
      nameEn: "Mexico",
      currencyCode: "MXN"
    },
    {
      code: "NA",
      name: "\u7EB3\u7C73\u6BD4\u4E9A",
      nameEn: "Namibia",
      currencyCode: "NAD"
    },
    {
      code: "ZA",
      name: "\u5357\u975E",
      nameEn: "South Africa",
      currencyCode: "ZAR"
    },
    {
      code: "GS",
      name: "\u5357\u4E54\u6CBB\u4E9A\u548C\u5357\u6851\u5A01\u5947\u7FA4\u5C9B",
      nameEn: "South Georgia and the South Sandwich Islands",
      currencyCode: "GBP"
    },
    {
      code: "SS",
      name: "\u5357\u82CF\u4E39",
      nameEn: "South Sudan",
      currencyCode: "SSP"
    },
    {
      code: "NR",
      name: "\u7459\u9C81",
      nameEn: "Nauru",
      currencyCode: "AUD"
    },
    {
      code: "NI",
      name: "\u5C3C\u52A0\u62C9\u74DC",
      nameEn: "Nicaragua",
      currencyCode: "NIO"
    },
    {
      code: "NP",
      name: "\u5C3C\u6CCA\u5C14",
      nameEn: "Nepal",
      currencyCode: "NPR"
    },
    {
      code: "NG",
      name: "\u5C3C\u65E5\u5229\u4E9A",
      nameEn: "Nigeria",
      currencyCode: "NGN"
    },
    {
      code: "NU",
      name: "\u7EBD\u57C3",
      nameEn: "Niue",
      currencyCode: "NZD"
    },
    {
      code: "NO",
      name: "\u632A\u5A01",
      nameEn: "Norway",
      currencyCode: "NOK"
    },
    {
      code: "NF",
      name: "\u8BFA\u798F\u514B\u5C9B",
      nameEn: "Norfolk Island",
      currencyCode: "AUD"
    },
    {
      code: "PW",
      name: "\u5E15\u52B3",
      nameEn: "Palau",
      currencyCode: "USD"
    },
    {
      code: "PN",
      name: "\u76AE\u7279\u51EF\u6069\u7FA4\u5C9B",
      nameEn: "Pitcairn",
      currencyCode: "NZD"
    },
    {
      code: "PT",
      name: "\u8461\u8404\u7259",
      nameEn: "Portugal",
      currencyCode: "EUR"
    },
    {
      code: "JP",
      name: "\u65E5\u672C",
      nameEn: "Japan",
      currencyCode: "JPY"
    },
    {
      code: "SE",
      name: "\u745E\u5178",
      nameEn: "Sweden",
      currencyCode: "SEK"
    },
    {
      code: "CH",
      name: "\u745E\u58EB",
      nameEn: "Switzerland",
      currencyCode: "CHF"
    },
    {
      code: "SV",
      name: "\u8428\u5C14\u74E6\u591A",
      nameEn: "El Salvador",
      currencyCode: "USD"
    },
    {
      code: "WS",
      name: "\u8428\u6469\u4E9A",
      nameEn: "Samoa",
      currencyCode: "WST"
    },
    {
      code: "RS",
      name: "\u585E\u5C14\u7EF4\u4E9A",
      nameEn: "Serbia",
      currencyCode: "RSD"
    },
    {
      code: "SL",
      name: "\u585E\u62C9\u5229\u6602",
      nameEn: "Sierra Leone",
      currencyCode: "SLL"
    },
    {
      code: "SN",
      name: "\u585E\u5185\u52A0\u5C14",
      nameEn: "Senegal",
      currencyCode: "XOF"
    },
    {
      code: "CY",
      name: "\u585E\u6D66\u8DEF\u65AF",
      nameEn: "Cyprus",
      currencyCode: "EUR"
    },
    {
      code: "SC",
      name: "\u585E\u820C\u5C14",
      nameEn: "Seychelles",
      currencyCode: "SCR"
    },
    {
      code: "SA",
      name: "\u6C99\u7279\u963F\u62C9\u4F2F",
      nameEn: "Saudi Arabia",
      currencyCode: "SAR"
    },
    {
      code: "BL",
      name: "\u5723\u5DF4\u6CF0\u52D2\u7C73",
      nameEn: "Saint Barth\xE9lemy",
      currencyCode: "EUR"
    },
    {
      code: "CX",
      name: "\u5723\u8BDE\u5C9B",
      nameEn: "Christmas Island",
      currencyCode: "AUD"
    },
    {
      code: "ST",
      name: "\u5723\u591A\u7F8E\u548C\u666E\u6797\u897F\u6BD4",
      nameEn: "Sao Tome and Principe",
      currencyCode: "STN"
    },
    {
      code: "SH",
      name: "\u5723\u8D6B\u52D2\u62FF\u3001\u963F\u68EE\u677E\u548C\u7279\u91CC\u65AF\u5766-\u8FBE\u5E93\u5C3C\u4E9A",
      nameEn: "Saint Helena, Ascension and Tristan da Cunha",
      currencyCode: "SHP"
    },
    {
      code: "KN",
      name: "\u5723\u57FA\u8328\u548C\u5C3C\u7EF4\u65AF",
      nameEn: "Saint Kitts and Nevis",
      currencyCode: "XCD"
    },
    {
      code: "LC",
      name: "\u5723\u5362\u897F\u4E9A",
      nameEn: "Saint Lucia",
      currencyCode: "XCD"
    },
    {
      code: "SM",
      name: "\u5723\u9A6C\u529B\u8BFA",
      nameEn: "San Marino",
      currencyCode: "EUR"
    },
    {
      code: "PM",
      name: "\u5723\u76AE\u57C3\u5C14\u548C\u5BC6\u514B\u9686",
      nameEn: "Saint Pierre and Miquelon",
      currencyCode: "EUR"
    },
    {
      code: "VC",
      name: "\u5723\u6587\u68EE\u7279\u548C\u683C\u6797\u7EB3\u4E01\u65AF",
      nameEn: "Saint Vincent and the Grenadines",
      currencyCode: "XCD"
    },
    {
      code: "LK",
      name: "\u65AF\u91CC\u5170\u5361",
      nameEn: "Sri Lanka",
      currencyCode: "LKR"
    },
    {
      code: "SK",
      name: "\u65AF\u6D1B\u4F10\u514B",
      nameEn: "Slovakia",
      currencyCode: "EUR"
    },
    {
      code: "SI",
      name: "\u65AF\u6D1B\u6587\u5C3C\u4E9A",
      nameEn: "Slovenia",
      currencyCode: "EUR"
    },
    {
      code: "SJ",
      name: "\u65AF\u74E6\u5C14\u5DF4\u548C\u626C\u9A6C\u5EF6",
      nameEn: "Svalbard and Jan Mayen",
      currencyCode: "NOK"
    },
    {
      code: "SZ",
      name: "\u65AF\u5A01\u58EB\u5170",
      nameEn: "Eswatini",
      currencyCode: "SZL"
    },
    {
      code: "SD",
      name: "\u82CF\u4E39",
      nameEn: "Sudan",
      currencyCode: "SDG"
    },
    {
      code: "SR",
      name: "\u82CF\u91CC\u5357",
      nameEn: "Suriname",
      currencyCode: "SRD"
    },
    {
      code: "SB",
      name: "\u6240\u7F57\u95E8\u7FA4\u5C9B",
      nameEn: "Solomon Islands",
      currencyCode: "SBD"
    },
    {
      code: "SO",
      name: "\u7D22\u9A6C\u91CC",
      nameEn: "Somalia",
      currencyCode: "SOS"
    },
    {
      code: "TJ",
      name: "\u5854\u5409\u514B\u65AF\u5766",
      nameEn: "Tajikistan",
      currencyCode: "TJS"
    },
    {
      code: "TH",
      name: "\u6CF0\u56FD",
      nameEn: "Thailand",
      currencyCode: "THB"
    },
    {
      code: "TZ",
      name: "\u5766\u6851\u5C3C\u4E9A",
      nameEn: "Tanzania, United Republic of",
      currencyCode: "TZS"
    },
    {
      code: "TO",
      name: "\u6C64\u52A0",
      nameEn: "Tonga",
      currencyCode: "TOP"
    },
    {
      code: "TC",
      name: "\u7279\u514B\u65AF\u548C\u51EF\u79D1\u65AF\u7FA4\u5C9B",
      nameEn: "Turks and Caicos Islands",
      currencyCode: "USD"
    },
    {
      code: "TT",
      name: "\u7279\u7ACB\u5C3C\u8FBE\u548C\u591A\u5DF4\u54E5",
      nameEn: "Trinidad and Tobago",
      currencyCode: "TTD"
    },
    {
      code: "TN",
      name: "\u7A81\u5C3C\u65AF",
      nameEn: "Tunisia",
      currencyCode: "TND"
    },
    {
      code: "TV",
      name: "\u56FE\u74E6\u5362",
      nameEn: "Tuvalu",
      currencyCode: "AUD"
    },
    {
      code: "TR",
      name: "\u571F\u8033\u5176",
      nameEn: "Turkey",
      currencyCode: "TRY"
    },
    {
      code: "TM",
      name: "\u571F\u5E93\u66FC\u65AF\u5766",
      nameEn: "Turkmenistan",
      currencyCode: "TMT"
    },
    {
      code: "TK",
      name: "\u6258\u514B\u52B3",
      nameEn: "Tokelau",
      currencyCode: "NZD"
    },
    {
      code: "WF",
      name: "\u74E6\u5229\u65AF\u548C\u5BCC\u56FE\u7EB3",
      nameEn: "Wallis and Futuna",
      currencyCode: "XPF"
    },
    {
      code: "VU",
      name: "\u74E6\u52AA\u963F\u56FE",
      nameEn: "Vanuatu",
      currencyCode: "VUV"
    },
    {
      code: "GT",
      name: "\u5371\u5730\u9A6C\u62C9",
      nameEn: "Guatemala",
      currencyCode: "GTQ"
    },
    {
      code: "VE",
      name: "\u59D4\u5185\u745E\u62C9",
      nameEn: "Venezuela, Bolivarian Republic of",
      currencyCode: "VES"
    },
    {
      code: "BN",
      name: "\u6587\u83B1",
      nameEn: "Brunei Darussalam",
      currencyCode: "BND"
    },
    {
      code: "UG",
      name: "\u4E4C\u5E72\u8FBE",
      nameEn: "Uganda",
      currencyCode: "UGX"
    },
    {
      code: "UA",
      name: "\u4E4C\u514B\u5170",
      nameEn: "Ukraine",
      currencyCode: "UAH"
    },
    {
      code: "UY",
      name: "\u4E4C\u62C9\u572D",
      nameEn: "Uruguay",
      currencyCode: "UYU"
    },
    {
      code: "UZ",
      name: "\u4E4C\u5179\u522B\u514B\u65AF\u5766",
      nameEn: "Uzbekistan",
      currencyCode: "UZS"
    },
    {
      code: "ES",
      name: "\u897F\u73ED\u7259",
      nameEn: "Spain",
      currencyCode: "EUR"
    },
    {
      code: "GR",
      name: "\u5E0C\u814A",
      nameEn: "Greece",
      currencyCode: "EUR"
    },
    {
      code: "SG",
      name: "\u65B0\u52A0\u5761",
      nameEn: "Singapore",
      currencyCode: "SGD"
    },
    {
      code: "NC",
      name: "\u65B0\u5580\u91CC\u591A\u5C3C\u4E9A",
      nameEn: "New Caledonia",
      currencyCode: "XPF"
    },
    {
      code: "NZ",
      name: "\u65B0\u897F\u5170",
      nameEn: "New Zealand",
      currencyCode: "NZD"
    },
    {
      code: "HU",
      name: "\u5308\u7259\u5229",
      nameEn: "Hungary",
      currencyCode: "HUF"
    },
    {
      code: "SY",
      name: "\u53D9\u5229\u4E9A",
      nameEn: "Syrian Arab Republic",
      currencyCode: "SYP"
    },
    {
      code: "JM",
      name: "\u7259\u4E70\u52A0",
      nameEn: "Jamaica",
      currencyCode: "JMD"
    },
    {
      code: "AM",
      name: "\u4E9A\u7F8E\u5C3C\u4E9A",
      nameEn: "Armenia",
      currencyCode: "AMD"
    },
    {
      code: "YE",
      name: "\u4E5F\u95E8",
      nameEn: "Yemen",
      currencyCode: "YER"
    },
    {
      code: "IQ",
      name: "\u4F0A\u62C9\u514B",
      nameEn: "Iraq",
      currencyCode: "IQD"
    },
    {
      code: "IR",
      name: "\u4F0A\u6717",
      nameEn: "Iran, Islamic Republic of",
      currencyCode: "IRR"
    },
    {
      code: "IL",
      name: "\u4EE5\u8272\u5217",
      nameEn: "Israel",
      currencyCode: "ILS"
    },
    {
      code: "IT",
      name: "\u610F\u5927\u5229",
      nameEn: "Italy",
      currencyCode: "EUR"
    },
    {
      code: "IN",
      name: "\u5370\u5EA6",
      nameEn: "India",
      currencyCode: "INR"
    },
    {
      code: "ID",
      name: "\u5370\u5EA6\u5C3C\u897F\u4E9A",
      nameEn: "Indonesia",
      currencyCode: "IDR"
    },
    {
      code: "GB",
      name: "\u82F1\u56FD",
      nameEn: "United Kingdom of Great Britain and Northern Ireland",
      currencyCode: "GBP"
    },
    {
      code: "VG",
      name: "\u82F1\u5C5E\u7EF4\u5C14\u4EAC\u7FA4\u5C9B",
      nameEn: "Virgin Islands, British",
      currencyCode: "USD"
    },
    {
      code: "IO",
      name: "\u82F1\u5C5E\u5370\u5EA6\u6D0B\u9886\u5730",
      nameEn: "British Indian Ocean Territory",
      currencyCode: "GBP"
    },
    {
      code: "IO",
      name: "\u82F1\u5C5E\u5370\u5EA6\u6D0B\u9886\u5730",
      nameEn: "British Indian Ocean Territory",
      currencyCode: "USD"
    },
    {
      code: "JO",
      name: "\u7EA6\u65E6",
      nameEn: "Jordan",
      currencyCode: "JOD"
    },
    {
      code: "VN",
      name: "\u8D8A\u5357",
      nameEn: "Viet Nam",
      currencyCode: "VND"
    },
    {
      code: "ZM",
      name: "\u8D5E\u6BD4\u4E9A",
      nameEn: "Zambia",
      currencyCode: "ZMW"
    },
    {
      code: "JE",
      name: "\u6CFD\u897F",
      nameEn: "Jersey",
      currencyCode: "GBP"
    },
    {
      code: "TD",
      name: "\u4E4D\u5F97",
      nameEn: "Chad",
      currencyCode: "XAF"
    },
    {
      code: "GI",
      name: "\u76F4\u5E03\u7F57\u9640",
      nameEn: "Gibraltar",
      currencyCode: "GIP"
    },
    {
      code: "CL",
      name: "\u667A\u5229",
      nameEn: "Chile",
      currencyCode: "CLF"
    },
    {
      code: "CL",
      name: "\u667A\u5229",
      nameEn: "Chile",
      currencyCode: "CLP"
    },
    {
      code: "CF",
      name: "\u4E2D\u975E",
      nameEn: "Central African Republic",
      currencyCode: "XAF"
    },
    {
      code: "CN",
      name: "\u4E2D\u56FD",
      nameEn: "China",
      currencyCode: "CNY"
    },
    {
      code: "TW",
      name: "\u4E2D\u56FD\u53F0\u6E7E",
      nameEn: "Taiwan, Province of China",
      currencyCode: "TWD"
    },
    {
      code: "HK",
      name: "\u4E2D\u56FD\u9999\u6E2F",
      nameEn: "Hong Kong",
      currencyCode: "HKD"
    }
  ];
  const CountyCode2CountyInfo = new Map(countyCurrencyCodes.map((v) => [v.code, v]));
  new Map(countyCurrencyCodes.map((v) => [v.currencyCode, v]));
  const title = `[steam-price-convertor ${new Date().getMilliseconds()}] `;
  function format(format2, ...args) {
    args = args || [];
    let message = format2;
    for (let arg of args) {
      message = message.replace("%s", arg);
    }
    return title + message;
  }
  const _SettingManager = class {
    constructor() {
      __publicField(this, "setting");
      this.setting = this.loadSetting();
    }
    loadSetting() {
      const json = h(STORAGE_KEY_SETTING, new Setting().toJsonString());
      const setting = new Setting().readJsonString(json);
      console.log(format("\u8BFB\u53D6\u8BBE\u7F6E"), setting);
      return setting;
    }
    saveSetting(setting) {
      console.log(format("\u4FDD\u5B58\u8BBE\u7F6E"), setting);
      u(STORAGE_KEY_SETTING, setting.toJsonString());
    }
    setCountyCode(countyCode) {
      const county = CountyCode2CountyInfo.get(countyCode);
      if (!county) {
        throw Error(`\u56FD\u5BB6\u4EE3\u7801\u4E0D\u5B58\u5728\uFF1A${countyCode}`);
      }
      this.setting.countyCode = countyCode;
      this.saveSetting(this.setting);
    }
    setCurrencySymbol(currencySymbol) {
      this.setting.currencySymbol = currencySymbol;
      this.saveSetting(this.setting);
    }
    setCurrencySymbolBeforeValue(isCurrencySymbolBeforeValue) {
      this.setting.currencySymbolBeforeValue = isCurrencySymbolBeforeValue;
      this.saveSetting(this.setting);
    }
    reset() {
      this.saveSetting(new Setting());
    }
    setRateCacheExpired(rateCacheExpired) {
      this.setting.rateCacheExpired = rateCacheExpired;
      this.saveSetting(this.setting);
    }
    setUseCustomRate(isUseCustomRate) {
      this.setting.useCustomRate = isUseCustomRate;
      this.saveSetting(this.setting);
    }
    setCustomRate(customRate) {
      this.setting.customRate = customRate;
      this.saveSetting(this.setting);
    }
  };
  let SettingManager = _SettingManager;
  __publicField(SettingManager, "instance", new _SettingManager());
  function parsePrice(content) {
    const matches = content.match(new RegExp("(?<=^\\D*)\\d+[\\d,.]*?(?=\\D*$)"));
    if (!matches) {
      throw Error("\u63D0\u53D6\u4EF7\u683C\u5931\u8D25\uFF1Acontent:" + content);
    }
    let priceStr = matches[0].replaceAll(/\D/g, "");
    let price = Number.parseInt(priceStr);
    if (matches[0].match(/\D\d\d$/)) {
      price = price / 100;
    }
    return price;
  }
  function convertPrice(price, rate) {
    return Number.parseFloat((price / rate).toFixed(2));
  }
  function convertPriceContent(originalContent, rate) {
    const safeContent = originalContent.trim().replaceAll(/\(.+$/g, "").trim();
    const price = parsePrice(safeContent);
    const convertedPrice = convertPrice(price, rate);
    const setting = SettingManager.instance.setting;
    let finalContent;
    if (setting.currencySymbolBeforeValue) {
      finalContent = `${safeContent}(${setting.currencySymbol}${convertedPrice})`;
    } else {
      finalContent = `${safeContent}(${convertedPrice}${setting.currencySymbol})`;
    }
    console.debug(format(
      "\u8F6C\u6362\u524D\u6587\u672C\uFF1A%s; \u63D0\u53D6\u5230\u7684\u4EF7\u683C\uFF1A%s; \u8F6C\u6362\u540E\u7684\u4EF7\u683C\uFF1A%s; \u8F6C\u6362\u540E\u6587\u672C\uFF1A%s",
      safeContent,
      price,
      convertedPrice,
      finalContent
    ));
    return finalContent;
  }
  class ElementConverter extends AbstractConverter {
    getCssSelectors() {
      return [
        ".discount_original_price",
        ".discount_final_price",
        ".col.search_price.responsive_secondrow strike",
        "#header_wallet_balance > span.tooltip",
        ".esi-wishlist-stat > .num",
        ".salepreviewwidgets_StoreOriginalPrice_1EKGZ",
        ".salepreviewwidgets_StoreSalePriceBox_Wh0L8",
        ".contenthubshared_OriginalPrice_3hBh3",
        ".contenthubshared_FinalPrice_F_tGv",
        ".salepreviewwidgets_StoreSalePriceBox_Wh0L8:not(.salepreviewwidgets_StoreSalePrepurchaseLabel_Wxeyn)",
        ".cart_item_price.with_discount > .original_price",
        ".cart_item_price.with_discount > div.price:not(.original_price)",
        "#cart_estimated_total",
        ".checkout_review_item_price > .price",
        "#review_subtotal_value.price",
        "#review_total_value.price",
        ".cart_item_price > .price",
        "#marketWalletBalanceAmount",
        "span.normal_price[data-price]",
        "span.sale_price",
        ".market_commodity_orders_header_promote:nth-child(even)",
        ".market_commodity_orders_table td:nth-child(odd)",
        ".market_table_value > span",
        ".jqplot-highlighter-tooltip",
        "tr.wallet_table_row > td.wht_total",
        "tr.wallet_table_row > td.wht_wallet_change.wallet_column",
        "tr.wallet_table_row > td.wht_wallet_balance.wallet_column",
        ".game_area_dlc_row > .game_area_dlc_price",
        ".package_totals_row > .price:not(.bundle_discount)",
        "#package_savings_bar > .savings.bundle_savings",
        ".home_page_content_title a.btn_small_tall > span"
      ];
    }
    convert(elementSnap, rate) {
      elementSnap.element.textContent = convertPriceContent(elementSnap.textContext, rate);
      return true;
    }
  }
  class TextNodeConverter extends AbstractConverter {
    constructor() {
      super(...arguments);
      __publicField(this, "parseFirstChildTextNodeFn", (el) => el.firstChild);
      __publicField(this, "targets", /* @__PURE__ */ new Map([
        [
          ".col.search_price.responsive_secondrow",
          [
            (el) => el.firstChild.nextSibling.nextSibling.nextSibling,
            this.parseFirstChildTextNodeFn
          ]
        ],
        ["#header_wallet_balance", [this.parseFirstChildTextNodeFn]],
        [".game_purchase_price.price", [this.parseFirstChildTextNodeFn]],
        [".home_page_content_title", [this.parseFirstChildTextNodeFn]]
      ]));
    }
    getCssSelectors() {
      return [...this.targets.keys()];
    }
    convert(elementSnap, rate) {
      const selector = elementSnap.selector;
      this.targets.get(selector);
      const parseNodeFns = this.targets.get(selector);
      if (!parseNodeFns) {
        return false;
      }
      const textNode = this.safeParseNode(selector, elementSnap.element, parseNodeFns);
      if (!textNode) {
        return false;
      }
      const content = textNode.nodeValue;
      if (!content || content.trim().length === 0) {
        return false;
      }
      textNode.nodeValue = convertPriceContent(content, rate);
      return true;
    }
    safeParseNode(selector, el, fns) {
      for (let fn of fns) {
        try {
          const node = fn(el);
          if (node.nodeName === "#text" && node.nodeValue && node.nodeValue.length > 0) {
            return node;
          }
        } catch (e) {
          console.debug("\u83B7\u53D6\u6587\u672C\u8282\u70B9\u5931\u8D25\uFF0C\u4F46\u4E0D\u786E\u5B9A\u8BE5\u8282\u70B9\u662F\u5426\u4E00\u5B9A\u4F1A\u51FA\u73B0\u3002selector\uFF1A" + selector);
        }
      }
      return null;
    }
  }
  const _ConverterManager = class {
    constructor() {
      __publicField(this, "converters");
      this.converters = [
        new ElementConverter(),
        new TextNodeConverter()
      ];
    }
    getSelector() {
      return this.converters.map((exchanger) => exchanger.getCssSelectors()).flat(1).join(", ");
    }
    convert(elements, rate) {
      if (!elements) {
        return;
      }
      elements.forEach((element) => {
        const elementSnap = {
          element,
          textContext: element.textContent,
          classList: element.classList,
          attributes: element.attributes
        };
        this.converters.filter((converter) => converter.match(elementSnap)).forEach((converter) => {
          try {
            const exchanged = converter.convert(elementSnap, rate);
            if (exchanged) {
              converter.afterConvert(elementSnap);
            }
          } catch (e) {
            console.group("\u8F6C\u6362\u5931\u8D25");
            console.error(e);
            console.error("\u8F6C\u6362\u5931\u8D25\u8BF7\u5C06\u4E0B\u5217\u5185\u5BB9\u53CD\u9988\u7ED9\u5F00\u53D1\u8005\uFF0C\u53F3\u952E > \u590D\u5236(copy) > \u590D\u5236\u5143\u7D20(copy element)");
            console.error("\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193\u2193");
            console.error(element);
            console.error("\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191\u2191");
            console.groupEnd();
          }
        });
      });
    }
  };
  let ConverterManager = _ConverterManager;
  __publicField(ConverterManager, "instance", new _ConverterManager());
  class Http {
    static get(url, respType, details) {
      if (!details) {
        details = { url };
      }
      details.method = "GET";
      return this.request(details, respType);
    }
    static post(url, respType, details) {
      if (!details) {
        details = { url };
      }
      details.method = "POST";
      return this.request(details, respType);
    }
    static parseResponse(response, respType) {
      const data = JSON.parse(response.response);
      const res = new respType();
      return res.readJson(data);
    }
    static request(details, respType) {
      return new Promise((resolve, reject) => {
        details.onload = (response) => resolve(this.parseResponse(response, respType));
        details.onerror = (error) => reject(error);
        b(details);
      });
    }
  }
  var __defProp$1 = Object.defineProperty;
  var __getOwnPropDesc$1 = Object.getOwnPropertyDescriptor;
  var __decorateClass$1 = (decorators, target, key, kind) => {
    var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$1(target, key) : target;
    for (var i = decorators.length - 1, decorator; i >= 0; i--)
      if (decorator = decorators[i])
        result = (kind ? decorator(target, key, result) : decorator(result)) || result;
    if (kind && result)
      __defProp$1(target, key, result);
    return result;
  };
  class RateRes extends Serializable {
    constructor() {
      super(...arguments);
      __publicField(this, "result");
      __publicField(this, "provider");
      __publicField(this, "documentation");
      __publicField(this, "termsOfUse");
      __publicField(this, "timeLastUpdateUnix");
      __publicField(this, "timeLastUpdateUtc");
      __publicField(this, "timeNextUpdateUnix");
      __publicField(this, "timeNextUpdateUtc");
      __publicField(this, "timeEolUnix");
      __publicField(this, "baseCode");
      __publicField(this, "rates");
    }
  }
  __decorateClass$1([
    JsonAlias("result")
  ], RateRes.prototype, "result", 2);
  __decorateClass$1([
    JsonAlias("provider")
  ], RateRes.prototype, "provider", 2);
  __decorateClass$1([
    JsonAlias("documentation")
  ], RateRes.prototype, "documentation", 2);
  __decorateClass$1([
    JsonAlias("terms_of_use")
  ], RateRes.prototype, "termsOfUse", 2);
  __decorateClass$1([
    JsonAlias("time_last_update_unix")
  ], RateRes.prototype, "timeLastUpdateUnix", 2);
  __decorateClass$1([
    JsonAlias("time_last_update_utc")
  ], RateRes.prototype, "timeLastUpdateUtc", 2);
  __decorateClass$1([
    JsonAlias("time_next_update_unix")
  ], RateRes.prototype, "timeNextUpdateUnix", 2);
  __decorateClass$1([
    JsonAlias("time_next_update_utc")
  ], RateRes.prototype, "timeNextUpdateUtc", 2);
  __decorateClass$1([
    JsonAlias("time_eol_unix")
  ], RateRes.prototype, "timeEolUnix", 2);
  __decorateClass$1([
    JsonAlias("base_code")
  ], RateRes.prototype, "baseCode", 2);
  __decorateClass$1([
    JsonProperty({
      alias: "rates",
      typeAs: Map
    })
  ], RateRes.prototype, "rates", 2);
  class ExchangeRateApi {
    async getRate(currCounty, targetCounty) {
      console.info(format(
        "\u901A\u8FC7 www.exchangerate-api.com \u83B7\u53D6\u6C47\u7387 %s(%s) -> %s(%s)...",
        currCounty.currencyCode,
        currCounty.name,
        targetCounty.currencyCode,
        targetCounty.name
      ));
      const url = `https://open.er-api.com/v6/latest/${targetCounty.currencyCode}`;
      let rate = await Http.get(url, RateRes).then((res) => {
        const rates = res.rates;
        return rates.get(currCounty.currencyCode);
      });
      if (rate) {
        console.info(format("\u901A\u8FC7 www.exchangerate-api.com \u83B7\u53D6\u6C47\u7387\u6210\u529F\uFF1A%s", rate));
        return rate;
      }
      throw new Error("\u901A\u8FC7 www.exchangerate-api.com \u83B7\u53D6\u6C47\u7387\u5931\u8D25\u3002");
    }
  }
  var __defProp2 = Object.defineProperty;
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
  var __decorateClass = (decorators, target, key, kind) => {
    var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
    for (var i = decorators.length - 1, decorator; i >= 0; i--)
      if (decorator = decorators[i])
        result = (kind ? decorator(target, key, result) : decorator(result)) || result;
    if (kind && result)
      __defProp2(target, key, result);
    return result;
  };
  class RateCache extends Serializable {
    constructor(from, to, rate, createdAt) {
      super();
      __publicField(this, "from");
      __publicField(this, "to");
      __publicField(this, "createdAt");
      __publicField(this, "rate");
      this.from = from;
      this.to = to;
      this.createdAt = createdAt || 0;
      this.rate = rate || 0;
    }
  }
  __decorateClass([
    JsonProperty()
  ], RateCache.prototype, "from", 2);
  __decorateClass([
    JsonProperty()
  ], RateCache.prototype, "to", 2);
  __decorateClass([
    JsonProperty()
  ], RateCache.prototype, "createdAt", 2);
  __decorateClass([
    JsonProperty()
  ], RateCache.prototype, "rate", 2);
  class RateCaches extends Serializable {
    constructor() {
      super(...arguments);
      __publicField(this, "caches", /* @__PURE__ */ new Map());
    }
    getCache(from, to) {
      return this.caches.get(this.buildCacheKey(from, to));
    }
    setCache(cache) {
      this.caches.set(this.buildCacheKey(cache.from, cache.to), cache);
    }
    buildCacheKey(from, to) {
      return `${from}:${to}`;
    }
  }
  __decorateClass([
    JsonProperty({ typeAs: Map })
  ], RateCaches.prototype, "caches", 2);
  const _RateManager = class {
    constructor() {
      __publicField(this, "rateApis");
      __publicField(this, "rateCaches");
      this.rateApis = [
        new ExchangeRateApi()
      ];
      this.rateCaches = this.loadRateCache();
    }
    async getRate4Remote(currCounty, targetCounty) {
      console.log(format("\u8FDC\u7A0B\u83B7\u53D6\u6C47\u7387..."));
      let rate;
      for (let rateApi of this.rateApis) {
        try {
          rate = await rateApi.getRate(currCounty, targetCounty);
        } catch (e) {
          console.error(`\u4F7F\u7528\u5B9E\u73B0(${typeof rateApi})\u83B7\u53D6\u6C47\u7387\u5931\u8D25`);
        }
        if (rate) {
          return rate;
        }
      }
      throw Error("\u6240\u6709\u6C47\u7387\u83B7\u53D6\u5B9E\u73B0\u83B7\u53D6\u6C47\u7387\u5747\u5931\u8D25");
    }
    async getRate(currCounty, targetCounty) {
      const setting = SettingManager.instance.setting;
      if (setting.useCustomRate) {
        console.log("\u4F7F\u7528\u81EA\u5B9A\u4E49\u6C47\u7387");
        return setting.customRate;
      }
      let cache = this.rateCaches.getCache(currCounty.code, targetCounty.code);
      const now = new Date().getTime();
      const expired = setting.rateCacheExpired;
      if (cache === void 0 || now > cache.createdAt + expired) {
        console.info(format(`\u672C\u5730\u7F13\u5B58\u5DF2\u8FC7\u671F`));
        cache = new RateCache(currCounty.code, targetCounty.code);
        cache.rate = await this.getRate4Remote(currCounty, targetCounty);
        cache.createdAt = new Date().getTime();
        this.rateCaches.setCache(cache);
        this.saveRateCache();
      }
      return cache.rate;
    }
    loadRateCache() {
      const jsonString = h(STORAGE_KEY_RATE_CACHES, "{}");
      const caches = new RateCaches();
      console.info(format(`\u8BFB\u53D6\u6C47\u7387\u7F13\u5B58`));
      return caches.readJsonString(jsonString);
    }
    saveRateCache() {
      console.info(format("\u4FDD\u5B58\u6C47\u7387\u7F13\u5B58"), this.rateCaches);
      u(STORAGE_KEY_RATE_CACHES, this.rateCaches.toJsonString());
    }
    clear() {
      G(STORAGE_KEY_RATE_CACHES);
    }
  };
  let RateManager = _RateManager;
  __publicField(RateManager, "instance", new _RateManager());
  class CookieCountyInfoGetter {
    match() {
      return true;
    }
    async getCountyCode() {
      console.info(format("\u901A\u8FC7 cookie \u83B7\u53D6\u533A\u57DF\u4EE3\u7801..."));
      let code;
      await new Promise((resolve) => M.list({ name: "steamCountry" }, (cookies) => {
        if (cookies && cookies.length > 0) {
          const match = cookies[0].value.match(/^[a-zA-Z][a-zA-Z]/);
          if (match) {
            code = match[0];
            resolve(code);
          }
        }
      })).then((res) => code = res);
      if (code) {
        console.info(format("\u901A\u8FC7 cookie \u83B7\u53D6\u533A\u57DF\u4EE3\u7801\u6210\u529F\uFF1A" + code));
        return code;
      }
      throw Error("\u901A\u8FC7 cookie \u83B7\u53D6\u533A\u57DF\u4EE3\u7801\u5931\u8D25\u3002");
    }
  }
  class RequestStorePageCountyCodeGetter {
    match() {
      return !window.location.href.includes("store.steampowered.com");
    }
    async getCountyCode() {
      console.info(format("\u901A\u8FC7 \u8BF7\u6C42\u5546\u5E97\u9875\u9762 \u83B7\u53D6\u533A\u57DF\u4EE3\u7801..."));
      let countyCode = void 0;
      await new Promise((resolve) => b({
        url: "https://store.steampowered.com/",
        onload: (response) => resolve(response.responseText)
      })).then((res) => {
        const match = res.match(new RegExp("(?<=GDynamicStore.Init\\(.+')[A-Z][A-Z](?=',)"));
        if (match) {
          countyCode = match[0];
          console.info(format("\u901A\u8FC7 \u8BF7\u6C42\u5546\u5E97\u9875\u9762 \u83B7\u53D6\u533A\u57DF\u4EE3\u7801\u6210\u529F\uFF1A" + countyCode));
        }
      });
      if (countyCode) {
        return countyCode;
      }
      throw Error("\u901A\u8FC7 \u8BF7\u6C42\u5546\u5E97\u9875\u9762 \u83B7\u53D6\u533A\u57DF\u4EE3\u7801\u5931\u8D25\u3002");
    }
  }
  class StorePageCountyCodeGetter {
    match() {
      return window.location.href.includes("store.steampowered.com");
    }
    getCountyCode() {
      console.info(format("\u901A\u8FC7 \u5546\u5E97\u9875\u9762 \u83B7\u53D6\u533A\u57DF\u4EE3\u7801..."));
      return new Promise((resolve) => {
        document.querySelectorAll("script").forEach((scriptEl) => {
          const scriptInnerText = scriptEl.innerText;
          if (scriptInnerText.includes("$J( InitMiniprofileHovers );") || scriptInnerText.includes(`$J( InitMiniprofileHovers( 'https%3A%2F%2Fstore.steampowered.com%2F' ) );`)) {
            const matcher = new RegExp("(?<=')[A-Z]{2}(?!=')", "g");
            const match = scriptInnerText.match(matcher);
            if (match) {
              const countyCode = match.toString();
              console.info(format("\u901A\u8FC7 \u5546\u5E97\u9875\u9762 \u83B7\u53D6\u533A\u57DF\u4EE3\u7801\u6210\u529F\uFF1A" + countyCode));
              resolve(countyCode);
            }
          }
        });
        throw Error(format("\u901A\u8FC7 \u5546\u5E97\u9875\u9762 \u83B7\u53D6\u533A\u57DF\u4EE3\u7801\u5931\u8D25\u3002"));
      });
    }
  }
  class MarketPageCountyCodeGetter {
    match() {
      return window.location.href.includes("steamcommunity.com");
    }
    getCountyCode() {
      console.info(format("\u901A\u8FC7 \u5E02\u573A\u9875\u9762 \u83B7\u53D6\u533A\u57DF\u4EE3\u7801..."));
      const code = g_strCountryCode;
      if (code) {
        return new Promise((resolve) => resolve(code));
      }
      throw Error(format("\u901A\u8FC7 \u5E02\u573A\u9875\u9762 \u83B7\u53D6\u533A\u57DF\u4EE3\u7801\u5931\u8D25\u3002"));
    }
  }
  const _CountyCodeGetterManager = class {
    constructor() {
      __publicField(this, "getters");
      this.getters = [
        new StorePageCountyCodeGetter(),
        new MarketPageCountyCodeGetter(),
        new RequestStorePageCountyCodeGetter(),
        new CookieCountyInfoGetter()
      ];
    }
    match() {
      return true;
    }
    async getCountyCode() {
      console.info(format("\u83B7\u53D6\u533A\u57DF\u4EE3\u7801..."));
      let code;
      for (let getter of this.getters) {
        if (getter.match()) {
          try {
            code = await getter.getCountyCode();
          } catch (e) {
            console.error(e);
          }
        }
        if (code) {
          return code;
        }
      }
      throw new Error(format("\u83B7\u53D6\u533A\u57DF\u4EE3\u7801\u5931\u8D25\u3002"));
    }
  };
  let CountyCodeGetterManager = _CountyCodeGetterManager;
  __publicField(CountyCodeGetterManager, "instance", new _CountyCodeGetterManager());
  const _SpcManager = class {
    constructor() {
    }
    setCountyCode(code) {
      SettingManager.instance.setCountyCode(code);
    }
    setCurrencySymbol(symbol) {
      SettingManager.instance.setCurrencySymbol(symbol);
    }
    setCurrencySymbolBeforeValue(isCurrencySymbolBeforeValue) {
      SettingManager.instance.setCurrencySymbolBeforeValue(isCurrencySymbolBeforeValue);
    }
    setRateCacheExpired(expired) {
      SettingManager.instance.setRateCacheExpired(expired);
    }
    resetSetting() {
      SettingManager.instance.reset();
    }
    clearCache() {
      RateManager.instance.clear();
    }
    setUseCustomRate(isUseCustomRate) {
      SettingManager.instance.setUseCustomRate(isUseCustomRate);
    }
    setCustomRate(customRate) {
      SettingManager.instance.setCustomRate(customRate);
    }
  };
  let SpcManager = _SpcManager;
  __publicField(SpcManager, "instance", new _SpcManager());
  async function main(targetCounty) {
    n.SpcManager = SpcManager.instance;
    let countyCode = await CountyCodeGetterManager.instance.getCountyCode();
    if (targetCounty.code === countyCode) {
      console.info(format(`${targetCounty.name}\u65E0\u9700\u8F6C\u6362`));
      return;
    }
    const currCounty = CountyCode2CountyInfo.get(countyCode);
    if (!currCounty) {
      throw Error("\u83B7\u53D6\u8D27\u5E01\u4EE3\u7801\u5931\u8D25");
    }
    console.info(format("\u83B7\u53D6\u533A\u57DF\u5BF9\u5E94\u4FE1\u606F\uFF1A"), currCounty);
    const rate = await RateManager.instance.getRate(currCounty, targetCounty);
    if (!rate) {
      throw Error("\u83B7\u53D6\u6C47\u7387\u5931\u8D25");
    }
    console.info(format(`\u6C47\u7387 ${currCounty.currencyCode} -> ${targetCounty.currencyCode}\uFF1A${rate}`));
    await convert(rate);
  }
  async function convert(rate) {
    const exchangerManager = ConverterManager.instance;
    const elements = document.querySelectorAll(exchangerManager.getSelector());
    exchangerManager.convert(elements, rate);
    const selector = exchangerManager.getSelector();
    const priceObserver = new MutationObserver((mutations) => {
      mutations.forEach((mutation) => {
        const target = mutation.target;
        const priceEls = target.querySelectorAll(selector);
        if (!priceEls || priceEls.length === 0) {
          return;
        }
        exchangerManager.convert(priceEls, rate);
      });
    });
    priceObserver.observe(document.body, {
      childList: true,
      subtree: true
    });
  }
  (async () => {
    const countyCode = SettingManager.instance.setting.countyCode;
    const county = CountyCode2CountyInfo.get(countyCode);
    if (!county) {
      throw Error("\u83B7\u53D6\u8F6C\u6362\u540E\u7684\u56FD\u5BB6\u4FE1\u606F\u5931\u8D25\uFF0C\u56FD\u5BB6\u4EE3\u7801\uFF1A" + countyCode);
    }
    await main(county);
  })();
})();