From 27ab70333c858298afefd3f94fb6711cb833de43 Mon Sep 17 00:00:00 2001 From: Rusk85 Date: Wed, 5 Apr 2017 20:44:05 +0200 Subject: [PATCH] Cleanup on mapping logic. Movies with up to 4500 parts are now supported! --- README.md | 2 +- .../Files/ArabicRomanNumeralDictionary.JSON | 4502 +++++++++++++++++ .../NzbDrone.Core.Test.csproj | 4 + .../RomanNumeralConversionFixture.cs | 54 + .../DecisionEngine/DownloadDecisionMaker.cs | 2 +- src/NzbDrone.Core/NzbDrone.Core.csproj | 6 + src/NzbDrone.Core/Parser/ParsingService.cs | 166 +- .../RomanNumerals/ArabicRomanNumeral.cs | 18 + .../Parser/RomanNumerals/IRomanNumeral.cs | 12 + .../Parser/RomanNumerals/RomanNumeral.cs | 357 ++ .../RomanNumerals/RomanNumeralParser.cs | 146 + .../RomanNumerals/SimpleArabicNumeral.cs | 15 + .../RomanNumerals/SimpleRomanNumeral.cs | 13 + src/NzbDrone.Core/Tv/MovieRepository.cs | 143 +- 14 files changed, 5264 insertions(+), 176 deletions(-) create mode 100644 src/NzbDrone.Core.Test/Files/ArabicRomanNumeralDictionary.JSON create mode 100644 src/NzbDrone.Core.Test/ParserTests/RomanNumeralTests/RomanNumeralConversionFixture.cs create mode 100644 src/NzbDrone.Core/Parser/RomanNumerals/ArabicRomanNumeral.cs create mode 100644 src/NzbDrone.Core/Parser/RomanNumerals/IRomanNumeral.cs create mode 100644 src/NzbDrone.Core/Parser/RomanNumerals/RomanNumeral.cs create mode 100644 src/NzbDrone.Core/Parser/RomanNumerals/RomanNumeralParser.cs create mode 100644 src/NzbDrone.Core/Parser/RomanNumerals/SimpleArabicNumeral.cs create mode 100644 src/NzbDrone.Core/Parser/RomanNumerals/SimpleRomanNumeral.cs diff --git a/README.md b/README.md index 0ceba48fb..d59d66078 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- Radarr +Radarr

Radarr is an __independent__ fork of [Sonarr](https://github.com/Sonarr/Sonarr) reworked for automatically downloading movies via Usenet and BitTorrent. diff --git a/src/NzbDrone.Core.Test/Files/ArabicRomanNumeralDictionary.JSON b/src/NzbDrone.Core.Test/Files/ArabicRomanNumeralDictionary.JSON new file mode 100644 index 000000000..d5fc84bd3 --- /dev/null +++ b/src/NzbDrone.Core.Test/Files/ArabicRomanNumeralDictionary.JSON @@ -0,0 +1,4502 @@ +{ + "1": "I", + "2": "II", + "3": "III", + "4": "IV", + "5": "V", + "6": "VI", + "7": "VII", + "8": "VIII", + "9": "IX", + "10": "X", + "11": "XI", + "12": "XII", + "13": "XIII", + "14": "XIV", + "15": "XV", + "16": "XVI", + "17": "XVII", + "18": "XVIII", + "19": "XIX", + "20": "XX", + "21": "XXI", + "22": "XXII", + "23": "XXIII", + "24": "XXIV", + "25": "XXV", + "26": "XXVI", + "27": "XXVII", + "28": "XXVIII", + "29": "XXIX", + "30": "XXX", + "31": "XXXI", + "32": "XXXII", + "33": "XXXIII", + "34": "XXXIV", + "35": "XXXV", + "36": "XXXVI", + "37": "XXXVII", + "38": "XXXVIII", + "39": "XXXIX", + "40": "XL", + "41": "XLI", + "42": "XLII", + "43": "XLIII", + "44": "XLIV", + "45": "XLV", + "46": "XLVI", + "47": "XLVII", + "48": "XLVIII", + "49": "XLIX", + "50": "L", + "51": "LI", + "52": "LII", + "53": "LIII", + "54": "LIV", + "55": "LV", + "56": "LVI", + "57": "LVII", + "58": "LVIII", + "59": "LIX", + "60": "LX", + "61": "LXI", + "62": "LXII", + "63": "LXIII", + "64": "LXIV", + "65": "LXV", + "66": "LXVI", + "67": "LXVII", + "68": "LXVIII", + "69": "LXIX", + "70": "LXX", + "71": "LXXI", + "72": "LXXII", + "73": "LXXIII", + "74": "LXXIV", + "75": "LXXV", + "76": "LXXVI", + "77": "LXXVII", + "78": "LXXVIII", + "79": "LXXIX", + "80": "LXXX", + "81": "LXXXI", + "82": "LXXXII", + "83": "LXXXIII", + "84": "LXXXIV", + "85": "LXXXV", + "86": "LXXXVI", + "87": "LXXXVII", + "88": "LXXXVIII", + "89": "LXXXIX", + "90": "XC", + "91": "XCI", + "92": "XCII", + "93": "XCIII", + "94": "XCIV", + "95": "XCV", + "96": "XCVI", + "97": "XCVII", + "98": "XCVIII", + "99": "XCIX", + "100": "C", + "101": "CI", + "102": "CII", + "103": "CIII", + "104": "CIV", + "105": "CV", + "106": "CVI", + "107": "CVII", + "108": "CVIII", + "109": "CIX", + "110": "CX", + "111": "CXI", + "112": "CXII", + "113": "CXIII", + "114": "CXIV", + "115": "CXV", + "116": "CXVI", + "117": "CXVII", + "118": "CXVIII", + "119": "CXIX", + "120": "CXX", + "121": "CXXI", + "122": "CXXII", + "123": "CXXIII", + "124": "CXXIV", + "125": "CXXV", + "126": "CXXVI", + "127": "CXXVII", + "128": "CXXVIII", + "129": "CXXIX", + "130": "CXXX", + "131": "CXXXI", + "132": "CXXXII", + "133": "CXXXIII", + "134": "CXXXIV", + "135": "CXXXV", + "136": "CXXXVI", + "137": "CXXXVII", + "138": "CXXXVIII", + "139": "CXXXIX", + "140": "CXL", + "141": "CXLI", + "142": "CXLII", + "143": "CXLIII", + "144": "CXLIV", + "145": "CXLV", + "146": "CXLVI", + "147": "CXLVII", + "148": "CXLVIII", + "149": "CXLIX", + "150": "CL", + "151": "CLI", + "152": "CLII", + "153": "CLIII", + "154": "CLIV", + "155": "CLV", + "156": "CLVI", + "157": "CLVII", + "158": "CLVIII", + "159": "CLIX", + "160": "CLX", + "161": "CLXI", + "162": "CLXII", + "163": "CLXIII", + "164": "CLXIV", + "165": "CLXV", + "166": "CLXVI", + "167": "CLXVII", + "168": "CLXVIII", + "169": "CLXIX", + "170": "CLXX", + "171": "CLXXI", + "172": "CLXXII", + "173": "CLXXIII", + "174": "CLXXIV", + "175": "CLXXV", + "176": "CLXXVI", + "177": "CLXXVII", + "178": "CLXXVIII", + "179": "CLXXIX", + "180": "CLXXX", + "181": "CLXXXI", + "182": "CLXXXII", + "183": "CLXXXIII", + "184": "CLXXXIV", + "185": "CLXXXV", + "186": "CLXXXVI", + "187": "CLXXXVII", + "188": "CLXXXVIII", + "189": "CLXXXIX", + "190": "CXC", + "191": "CXCI", + "192": "CXCII", + "193": "CXCIII", + "194": "CXCIV", + "195": "CXCV", + "196": "CXCVI", + "197": "CXCVII", + "198": "CXCVIII", + "199": "CXCIX", + "200": "CC", + "201": "CCI", + "202": "CCII", + "203": "CCIII", + "204": "CCIV", + "205": "CCV", + "206": "CCVI", + "207": "CCVII", + "208": "CCVIII", + "209": "CCIX", + "210": "CCX", + "211": "CCXI", + "212": "CCXII", + "213": "CCXIII", + "214": "CCXIV", + "215": "CCXV", + "216": "CCXVI", + "217": "CCXVII", + "218": "CCXVIII", + "219": "CCXIX", + "220": "CCXX", + "221": "CCXXI", + "222": "CCXXII", + "223": "CCXXIII", + "224": "CCXXIV", + "225": "CCXXV", + "226": "CCXXVI", + "227": "CCXXVII", + "228": "CCXXVIII", + "229": "CCXXIX", + "230": "CCXXX", + "231": "CCXXXI", + "232": "CCXXXII", + "233": "CCXXXIII", + "234": "CCXXXIV", + "235": "CCXXXV", + "236": "CCXXXVI", + "237": "CCXXXVII", + "238": "CCXXXVIII", + "239": "CCXXXIX", + "240": "CCXL", + "241": "CCXLI", + "242": "CCXLII", + "243": "CCXLIII", + "244": "CCXLIV", + "245": "CCXLV", + "246": "CCXLVI", + "247": "CCXLVII", + "248": "CCXLVIII", + "249": "CCXLIX", + "250": "CCL", + "251": "CCLI", + "252": "CCLII", + "253": "CCLIII", + "254": "CCLIV", + "255": "CCLV", + "256": "CCLVI", + "257": "CCLVII", + "258": "CCLVIII", + "259": "CCLIX", + "260": "CCLX", + "261": "CCLXI", + "262": "CCLXII", + "263": "CCLXIII", + "264": "CCLXIV", + "265": "CCLXV", + "266": "CCLXVI", + "267": "CCLXVII", + "268": "CCLXVIII", + "269": "CCLXIX", + "270": "CCLXX", + "271": "CCLXXI", + "272": "CCLXXII", + "273": "CCLXXIII", + "274": "CCLXXIV", + "275": "CCLXXV", + "276": "CCLXXVI", + "277": "CCLXXVII", + "278": "CCLXXVIII", + "279": "CCLXXIX", + "280": "CCLXXX", + "281": "CCLXXXI", + "282": "CCLXXXII", + "283": "CCLXXXIII", + "284": "CCLXXXIV", + "285": "CCLXXXV", + "286": "CCLXXXVI", + "287": "CCLXXXVII", + "288": "CCLXXXVIII", + "289": "CCLXXXIX", + "290": "CCXC", + "291": "CCXCI", + "292": "CCXCII", + "293": "CCXCIII", + "294": "CCXCIV", + "295": "CCXCV", + "296": "CCXCVI", + "297": "CCXCVII", + "298": "CCXCVIII", + "299": "CCXCIX", + "300": "CCC", + "301": "CCCI", + "302": "CCCII", + "303": "CCCIII", + "304": "CCCIV", + "305": "CCCV", + "306": "CCCVI", + "307": "CCCVII", + "308": "CCCVIII", + "309": "CCCIX", + "310": "CCCX", + "311": "CCCXI", + "312": "CCCXII", + "313": "CCCXIII", + "314": "CCCXIV", + "315": "CCCXV", + "316": "CCCXVI", + "317": "CCCXVII", + "318": "CCCXVIII", + "319": "CCCXIX", + "320": "CCCXX", + "321": "CCCXXI", + "322": "CCCXXII", + "323": "CCCXXIII", + "324": "CCCXXIV", + "325": "CCCXXV", + "326": "CCCXXVI", + "327": "CCCXXVII", + "328": "CCCXXVIII", + "329": "CCCXXIX", + "330": "CCCXXX", + "331": "CCCXXXI", + "332": "CCCXXXII", + "333": "CCCXXXIII", + "334": "CCCXXXIV", + "335": "CCCXXXV", + "336": "CCCXXXVI", + "337": "CCCXXXVII", + "338": "CCCXXXVIII", + "339": "CCCXXXIX", + "340": "CCCXL", + "341": "CCCXLI", + "342": "CCCXLII", + "343": "CCCXLIII", + "344": "CCCXLIV", + "345": "CCCXLV", + "346": "CCCXLVI", + "347": "CCCXLVII", + "348": "CCCXLVIII", + "349": "CCCXLIX", + "350": "CCCL", + "351": "CCCLI", + "352": "CCCLII", + "353": "CCCLIII", + "354": "CCCLIV", + "355": "CCCLV", + "356": "CCCLVI", + "357": "CCCLVII", + "358": "CCCLVIII", + "359": "CCCLIX", + "360": "CCCLX", + "361": "CCCLXI", + "362": "CCCLXII", + "363": "CCCLXIII", + "364": "CCCLXIV", + "365": "CCCLXV", + "366": "CCCLXVI", + "367": "CCCLXVII", + "368": "CCCLXVIII", + "369": "CCCLXIX", + "370": "CCCLXX", + "371": "CCCLXXI", + "372": "CCCLXXII", + "373": "CCCLXXIII", + "374": "CCCLXXIV", + "375": "CCCLXXV", + "376": "CCCLXXVI", + "377": "CCCLXXVII", + "378": "CCCLXXVIII", + "379": "CCCLXXIX", + "380": "CCCLXXX", + "381": "CCCLXXXI", + "382": "CCCLXXXII", + "383": "CCCLXXXIII", + "384": "CCCLXXXIV", + "385": "CCCLXXXV", + "386": "CCCLXXXVI", + "387": "CCCLXXXVII", + "388": "CCCLXXXVIII", + "389": "CCCLXXXIX", + "390": "CCCXC", + "391": "CCCXCI", + "392": "CCCXCII", + "393": "CCCXCIII", + "394": "CCCXCIV", + "395": "CCCXCV", + "396": "CCCXCVI", + "397": "CCCXCVII", + "398": "CCCXCVIII", + "399": "CCCXCIX", + "400": "CD", + "401": "CDI", + "402": "CDII", + "403": "CDIII", + "404": "CDIV", + "405": "CDV", + "406": "CDVI", + "407": "CDVII", + "408": "CDVIII", + "409": "CDIX", + "410": "CDX", + "411": "CDXI", + "412": "CDXII", + "413": "CDXIII", + "414": "CDXIV", + "415": "CDXV", + "416": "CDXVI", + "417": "CDXVII", + "418": "CDXVIII", + "419": "CDXIX", + "420": "CDXX", + "421": "CDXXI", + "422": "CDXXII", + "423": "CDXXIII", + "424": "CDXXIV", + "425": "CDXXV", + "426": "CDXXVI", + "427": "CDXXVII", + "428": "CDXXVIII", + "429": "CDXXIX", + "430": "CDXXX", + "431": "CDXXXI", + "432": "CDXXXII", + "433": "CDXXXIII", + "434": "CDXXXIV", + "435": "CDXXXV", + "436": "CDXXXVI", + "437": "CDXXXVII", + "438": "CDXXXVIII", + "439": "CDXXXIX", + "440": "CDXL", + "441": "CDXLI", + "442": "CDXLII", + "443": "CDXLIII", + "444": "CDXLIV", + "445": "CDXLV", + "446": "CDXLVI", + "447": "CDXLVII", + "448": "CDXLVIII", + "449": "CDXLIX", + "450": "CDL", + "451": "CDLI", + "452": "CDLII", + "453": "CDLIII", + "454": "CDLIV", + "455": "CDLV", + "456": "CDLVI", + "457": "CDLVII", + "458": "CDLVIII", + "459": "CDLIX", + "460": "CDLX", + "461": "CDLXI", + "462": "CDLXII", + "463": "CDLXIII", + "464": "CDLXIV", + "465": "CDLXV", + "466": "CDLXVI", + "467": "CDLXVII", + "468": "CDLXVIII", + "469": "CDLXIX", + "470": "CDLXX", + "471": "CDLXXI", + "472": "CDLXXII", + "473": "CDLXXIII", + "474": "CDLXXIV", + "475": "CDLXXV", + "476": "CDLXXVI", + "477": "CDLXXVII", + "478": "CDLXXVIII", + "479": "CDLXXIX", + "480": "CDLXXX", + "481": "CDLXXXI", + "482": "CDLXXXII", + "483": "CDLXXXIII", + "484": "CDLXXXIV", + "485": "CDLXXXV", + "486": "CDLXXXVI", + "487": "CDLXXXVII", + "488": "CDLXXXVIII", + "489": "CDLXXXIX", + "490": "CDXC", + "491": "CDXCI", + "492": "CDXCII", + "493": "CDXCIII", + "494": "CDXCIV", + "495": "CDXCV", + "496": "CDXCVI", + "497": "CDXCVII", + "498": "CDXCVIII", + "499": "CDXCIX", + "500": "D", + "501": "DI", + "502": "DII", + "503": "DIII", + "504": "DIV", + "505": "DV", + "506": "DVI", + "507": "DVII", + "508": "DVIII", + "509": "DIX", + "510": "DX", + "511": "DXI", + "512": "DXII", + "513": "DXIII", + "514": "DXIV", + "515": "DXV", + "516": "DXVI", + "517": "DXVII", + "518": "DXVIII", + "519": "DXIX", + "520": "DXX", + "521": "DXXI", + "522": "DXXII", + "523": "DXXIII", + "524": "DXXIV", + "525": "DXXV", + "526": "DXXVI", + "527": "DXXVII", + "528": "DXXVIII", + "529": "DXXIX", + "530": "DXXX", + "531": "DXXXI", + "532": "DXXXII", + "533": "DXXXIII", + "534": "DXXXIV", + "535": "DXXXV", + "536": "DXXXVI", + "537": "DXXXVII", + "538": "DXXXVIII", + "539": "DXXXIX", + "540": "DXL", + "541": "DXLI", + "542": "DXLII", + "543": "DXLIII", + "544": "DXLIV", + "545": "DXLV", + "546": "DXLVI", + "547": "DXLVII", + "548": "DXLVIII", + "549": "DXLIX", + "550": "DL", + "551": "DLI", + "552": "DLII", + "553": "DLIII", + "554": "DLIV", + "555": "DLV", + "556": "DLVI", + "557": "DLVII", + "558": "DLVIII", + "559": "DLIX", + "560": "DLX", + "561": "DLXI", + "562": "DLXII", + "563": "DLXIII", + "564": "DLXIV", + "565": "DLXV", + "566": "DLXVI", + "567": "DLXVII", + "568": "DLXVIII", + "569": "DLXIX", + "570": "DLXX", + "571": "DLXXI", + "572": "DLXXII", + "573": "DLXXIII", + "574": "DLXXIV", + "575": "DLXXV", + "576": "DLXXVI", + "577": "DLXXVII", + "578": "DLXXVIII", + "579": "DLXXIX", + "580": "DLXXX", + "581": "DLXXXI", + "582": "DLXXXII", + "583": "DLXXXIII", + "584": "DLXXXIV", + "585": "DLXXXV", + "586": "DLXXXVI", + "587": "DLXXXVII", + "588": "DLXXXVIII", + "589": "DLXXXIX", + "590": "DXC", + "591": "DXCI", + "592": "DXCII", + "593": "DXCIII", + "594": "DXCIV", + "595": "DXCV", + "596": "DXCVI", + "597": "DXCVII", + "598": "DXCVIII", + "599": "DXCIX", + "600": "DC", + "601": "DCI", + "602": "DCII", + "603": "DCIII", + "604": "DCIV", + "605": "DCV", + "606": "DCVI", + "607": "DCVII", + "608": "DCVIII", + "609": "DCIX", + "610": "DCX", + "611": "DCXI", + "612": "DCXII", + "613": "DCXIII", + "614": "DCXIV", + "615": "DCXV", + "616": "DCXVI", + "617": "DCXVII", + "618": "DCXVIII", + "619": "DCXIX", + "620": "DCXX", + "621": "DCXXI", + "622": "DCXXII", + "623": "DCXXIII", + "624": "DCXXIV", + "625": "DCXXV", + "626": "DCXXVI", + "627": "DCXXVII", + "628": "DCXXVIII", + "629": "DCXXIX", + "630": "DCXXX", + "631": "DCXXXI", + "632": "DCXXXII", + "633": "DCXXXIII", + "634": "DCXXXIV", + "635": "DCXXXV", + "636": "DCXXXVI", + "637": "DCXXXVII", + "638": "DCXXXVIII", + "639": "DCXXXIX", + "640": "DCXL", + "641": "DCXLI", + "642": "DCXLII", + "643": "DCXLIII", + "644": "DCXLIV", + "645": "DCXLV", + "646": "DCXLVI", + "647": "DCXLVII", + "648": "DCXLVIII", + "649": "DCXLIX", + "650": "DCL", + "651": "DCLI", + "652": "DCLII", + "653": "DCLIII", + "654": "DCLIV", + "655": "DCLV", + "656": "DCLVI", + "657": "DCLVII", + "658": "DCLVIII", + "659": "DCLIX", + "660": "DCLX", + "661": "DCLXI", + "662": "DCLXII", + "663": "DCLXIII", + "664": "DCLXIV", + "665": "DCLXV", + "666": "DCLXVI", + "667": "DCLXVII", + "668": "DCLXVIII", + "669": "DCLXIX", + "670": "DCLXX", + "671": "DCLXXI", + "672": "DCLXXII", + "673": "DCLXXIII", + "674": "DCLXXIV", + "675": "DCLXXV", + "676": "DCLXXVI", + "677": "DCLXXVII", + "678": "DCLXXVIII", + "679": "DCLXXIX", + "680": "DCLXXX", + "681": "DCLXXXI", + "682": "DCLXXXII", + "683": "DCLXXXIII", + "684": "DCLXXXIV", + "685": "DCLXXXV", + "686": "DCLXXXVI", + "687": "DCLXXXVII", + "688": "DCLXXXVIII", + "689": "DCLXXXIX", + "690": "DCXC", + "691": "DCXCI", + "692": "DCXCII", + "693": "DCXCIII", + "694": "DCXCIV", + "695": "DCXCV", + "696": "DCXCVI", + "697": "DCXCVII", + "698": "DCXCVIII", + "699": "DCXCIX", + "700": "DCC", + "701": "DCCI", + "702": "DCCII", + "703": "DCCIII", + "704": "DCCIV", + "705": "DCCV", + "706": "DCCVI", + "707": "DCCVII", + "708": "DCCVIII", + "709": "DCCIX", + "710": "DCCX", + "711": "DCCXI", + "712": "DCCXII", + "713": "DCCXIII", + "714": "DCCXIV", + "715": "DCCXV", + "716": "DCCXVI", + "717": "DCCXVII", + "718": "DCCXVIII", + "719": "DCCXIX", + "720": "DCCXX", + "721": "DCCXXI", + "722": "DCCXXII", + "723": "DCCXXIII", + "724": "DCCXXIV", + "725": "DCCXXV", + "726": "DCCXXVI", + "727": "DCCXXVII", + "728": "DCCXXVIII", + "729": "DCCXXIX", + "730": "DCCXXX", + "731": "DCCXXXI", + "732": "DCCXXXII", + "733": "DCCXXXIII", + "734": "DCCXXXIV", + "735": "DCCXXXV", + "736": "DCCXXXVI", + "737": "DCCXXXVII", + "738": "DCCXXXVIII", + "739": "DCCXXXIX", + "740": "DCCXL", + "741": "DCCXLI", + "742": "DCCXLII", + "743": "DCCXLIII", + "744": "DCCXLIV", + "745": "DCCXLV", + "746": "DCCXLVI", + "747": "DCCXLVII", + "748": "DCCXLVIII", + "749": "DCCXLIX", + "750": "DCCL", + "751": "DCCLI", + "752": "DCCLII", + "753": "DCCLIII", + "754": "DCCLIV", + "755": "DCCLV", + "756": "DCCLVI", + "757": "DCCLVII", + "758": "DCCLVIII", + "759": "DCCLIX", + "760": "DCCLX", + "761": "DCCLXI", + "762": "DCCLXII", + "763": "DCCLXIII", + "764": "DCCLXIV", + "765": "DCCLXV", + "766": "DCCLXVI", + "767": "DCCLXVII", + "768": "DCCLXVIII", + "769": "DCCLXIX", + "770": "DCCLXX", + "771": "DCCLXXI", + "772": "DCCLXXII", + "773": "DCCLXXIII", + "774": "DCCLXXIV", + "775": "DCCLXXV", + "776": "DCCLXXVI", + "777": "DCCLXXVII", + "778": "DCCLXXVIII", + "779": "DCCLXXIX", + "780": "DCCLXXX", + "781": "DCCLXXXI", + "782": "DCCLXXXII", + "783": "DCCLXXXIII", + "784": "DCCLXXXIV", + "785": "DCCLXXXV", + "786": "DCCLXXXVI", + "787": "DCCLXXXVII", + "788": "DCCLXXXVIII", + "789": "DCCLXXXIX", + "790": "DCCXC", + "791": "DCCXCI", + "792": "DCCXCII", + "793": "DCCXCIII", + "794": "DCCXCIV", + "795": "DCCXCV", + "796": "DCCXCVI", + "797": "DCCXCVII", + "798": "DCCXCVIII", + "799": "DCCXCIX", + "800": "DCCC", + "801": "DCCCI", + "802": "DCCCII", + "803": "DCCCIII", + "804": "DCCCIV", + "805": "DCCCV", + "806": "DCCCVI", + "807": "DCCCVII", + "808": "DCCCVIII", + "809": "DCCCIX", + "810": "DCCCX", + "811": "DCCCXI", + "812": "DCCCXII", + "813": "DCCCXIII", + "814": "DCCCXIV", + "815": "DCCCXV", + "816": "DCCCXVI", + "817": "DCCCXVII", + "818": "DCCCXVIII", + "819": "DCCCXIX", + "820": "DCCCXX", + "821": "DCCCXXI", + "822": "DCCCXXII", + "823": "DCCCXXIII", + "824": "DCCCXXIV", + "825": "DCCCXXV", + "826": "DCCCXXVI", + "827": "DCCCXXVII", + "828": "DCCCXXVIII", + "829": "DCCCXXIX", + "830": "DCCCXXX", + "831": "DCCCXXXI", + "832": "DCCCXXXII", + "833": "DCCCXXXIII", + "834": "DCCCXXXIV", + "835": "DCCCXXXV", + "836": "DCCCXXXVI", + "837": "DCCCXXXVII", + "838": "DCCCXXXVIII", + "839": "DCCCXXXIX", + "840": "DCCCXL", + "841": "DCCCXLI", + "842": "DCCCXLII", + "843": "DCCCXLIII", + "844": "DCCCXLIV", + "845": "DCCCXLV", + "846": "DCCCXLVI", + "847": "DCCCXLVII", + "848": "DCCCXLVIII", + "849": "DCCCXLIX", + "850": "DCCCL", + "851": "DCCCLI", + "852": "DCCCLII", + "853": "DCCCLIII", + "854": "DCCCLIV", + "855": "DCCCLV", + "856": "DCCCLVI", + "857": "DCCCLVII", + "858": "DCCCLVIII", + "859": "DCCCLIX", + "860": "DCCCLX", + "861": "DCCCLXI", + "862": "DCCCLXII", + "863": "DCCCLXIII", + "864": "DCCCLXIV", + "865": "DCCCLXV", + "866": "DCCCLXVI", + "867": "DCCCLXVII", + "868": "DCCCLXVIII", + "869": "DCCCLXIX", + "870": "DCCCLXX", + "871": "DCCCLXXI", + "872": "DCCCLXXII", + "873": "DCCCLXXIII", + "874": "DCCCLXXIV", + "875": "DCCCLXXV", + "876": "DCCCLXXVI", + "877": "DCCCLXXVII", + "878": "DCCCLXXVIII", + "879": "DCCCLXXIX", + "880": "DCCCLXXX", + "881": "DCCCLXXXI", + "882": "DCCCLXXXII", + "883": "DCCCLXXXIII", + "884": "DCCCLXXXIV", + "885": "DCCCLXXXV", + "886": "DCCCLXXXVI", + "887": "DCCCLXXXVII", + "888": "DCCCLXXXVIII", + "889": "DCCCLXXXIX", + "890": "DCCCXC", + "891": "DCCCXCI", + "892": "DCCCXCII", + "893": "DCCCXCIII", + "894": "DCCCXCIV", + "895": "DCCCXCV", + "896": "DCCCXCVI", + "897": "DCCCXCVII", + "898": "DCCCXCVIII", + "899": "DCCCXCIX", + "900": "CM", + "901": "CMI", + "902": "CMII", + "903": "CMIII", + "904": "CMIV", + "905": "CMV", + "906": "CMVI", + "907": "CMVII", + "908": "CMVIII", + "909": "CMIX", + "910": "CMX", + "911": "CMXI", + "912": "CMXII", + "913": "CMXIII", + "914": "CMXIV", + "915": "CMXV", + "916": "CMXVI", + "917": "CMXVII", + "918": "CMXVIII", + "919": "CMXIX", + "920": "CMXX", + "921": "CMXXI", + "922": "CMXXII", + "923": "CMXXIII", + "924": "CMXXIV", + "925": "CMXXV", + "926": "CMXXVI", + "927": "CMXXVII", + "928": "CMXXVIII", + "929": "CMXXIX", + "930": "CMXXX", + "931": "CMXXXI", + "932": "CMXXXII", + "933": "CMXXXIII", + "934": "CMXXXIV", + "935": "CMXXXV", + "936": "CMXXXVI", + "937": "CMXXXVII", + "938": "CMXXXVIII", + "939": "CMXXXIX", + "940": "CMXL", + "941": "CMXLI", + "942": "CMXLII", + "943": "CMXLIII", + "944": "CMXLIV", + "945": "CMXLV", + "946": "CMXLVI", + "947": "CMXLVII", + "948": "CMXLVIII", + "949": "CMXLIX", + "950": "CML", + "951": "CMLI", + "952": "CMLII", + "953": "CMLIII", + "954": "CMLIV", + "955": "CMLV", + "956": "CMLVI", + "957": "CMLVII", + "958": "CMLVIII", + "959": "CMLIX", + "960": "CMLX", + "961": "CMLXI", + "962": "CMLXII", + "963": "CMLXIII", + "964": "CMLXIV", + "965": "CMLXV", + "966": "CMLXVI", + "967": "CMLXVII", + "968": "CMLXVIII", + "969": "CMLXIX", + "970": "CMLXX", + "971": "CMLXXI", + "972": "CMLXXII", + "973": "CMLXXIII", + "974": "CMLXXIV", + "975": "CMLXXV", + "976": "CMLXXVI", + "977": "CMLXXVII", + "978": "CMLXXVIII", + "979": "CMLXXIX", + "980": "CMLXXX", + "981": "CMLXXXI", + "982": "CMLXXXII", + "983": "CMLXXXIII", + "984": "CMLXXXIV", + "985": "CMLXXXV", + "986": "CMLXXXVI", + "987": "CMLXXXVII", + "988": "CMLXXXVIII", + "989": "CMLXXXIX", + "990": "CMXC", + "991": "CMXCI", + "992": "CMXCII", + "993": "CMXCIII", + "994": "CMXCIV", + "995": "CMXCV", + "996": "CMXCVI", + "997": "CMXCVII", + "998": "CMXCVIII", + "999": "CMXCIX", + "1000": "M", + "1001": "MI", + "1002": "MII", + "1003": "MIII", + "1004": "MIV", + "1005": "MV", + "1006": "MVI", + "1007": "MVII", + "1008": "MVIII", + "1009": "MIX", + "1010": "MX", + "1011": "MXI", + "1012": "MXII", + "1013": "MXIII", + "1014": "MXIV", + "1015": "MXV", + "1016": "MXVI", + "1017": "MXVII", + "1018": "MXVIII", + "1019": "MXIX", + "1020": "MXX", + "1021": "MXXI", + "1022": "MXXII", + "1023": "MXXIII", + "1024": "MXXIV", + "1025": "MXXV", + "1026": "MXXVI", + "1027": "MXXVII", + "1028": "MXXVIII", + "1029": "MXXIX", + "1030": "MXXX", + "1031": "MXXXI", + "1032": "MXXXII", + "1033": "MXXXIII", + "1034": "MXXXIV", + "1035": "MXXXV", + "1036": "MXXXVI", + "1037": "MXXXVII", + "1038": "MXXXVIII", + "1039": "MXXXIX", + "1040": "MXL", + "1041": "MXLI", + "1042": "MXLII", + "1043": "MXLIII", + "1044": "MXLIV", + "1045": "MXLV", + "1046": "MXLVI", + "1047": "MXLVII", + "1048": "MXLVIII", + "1049": "MXLIX", + "1050": "ML", + "1051": "MLI", + "1052": "MLII", + "1053": "MLIII", + "1054": "MLIV", + "1055": "MLV", + "1056": "MLVI", + "1057": "MLVII", + "1058": "MLVIII", + "1059": "MLIX", + "1060": "MLX", + "1061": "MLXI", + "1062": "MLXII", + "1063": "MLXIII", + "1064": "MLXIV", + "1065": "MLXV", + "1066": "MLXVI", + "1067": "MLXVII", + "1068": "MLXVIII", + "1069": "MLXIX", + "1070": "MLXX", + "1071": "MLXXI", + "1072": "MLXXII", + "1073": "MLXXIII", + "1074": "MLXXIV", + "1075": "MLXXV", + "1076": "MLXXVI", + "1077": "MLXXVII", + "1078": "MLXXVIII", + "1079": "MLXXIX", + "1080": "MLXXX", + "1081": "MLXXXI", + "1082": "MLXXXII", + "1083": "MLXXXIII", + "1084": "MLXXXIV", + "1085": "MLXXXV", + "1086": "MLXXXVI", + "1087": "MLXXXVII", + "1088": "MLXXXVIII", + "1089": "MLXXXIX", + "1090": "MXC", + "1091": "MXCI", + "1092": "MXCII", + "1093": "MXCIII", + "1094": "MXCIV", + "1095": "MXCV", + "1096": "MXCVI", + "1097": "MXCVII", + "1098": "MXCVIII", + "1099": "MXCIX", + "1100": "MC", + "1101": "MCI", + "1102": "MCII", + "1103": "MCIII", + "1104": "MCIV", + "1105": "MCV", + "1106": "MCVI", + "1107": "MCVII", + "1108": "MCVIII", + "1109": "MCIX", + "1110": "MCX", + "1111": "MCXI", + "1112": "MCXII", + "1113": "MCXIII", + "1114": "MCXIV", + "1115": "MCXV", + "1116": "MCXVI", + "1117": "MCXVII", + "1118": "MCXVIII", + "1119": "MCXIX", + "1120": "MCXX", + "1121": "MCXXI", + "1122": "MCXXII", + "1123": "MCXXIII", + "1124": "MCXXIV", + "1125": "MCXXV", + "1126": "MCXXVI", + "1127": "MCXXVII", + "1128": "MCXXVIII", + "1129": "MCXXIX", + "1130": "MCXXX", + "1131": "MCXXXI", + "1132": "MCXXXII", + "1133": "MCXXXIII", + "1134": "MCXXXIV", + "1135": "MCXXXV", + "1136": "MCXXXVI", + "1137": "MCXXXVII", + "1138": "MCXXXVIII", + "1139": "MCXXXIX", + "1140": "MCXL", + "1141": "MCXLI", + "1142": "MCXLII", + "1143": "MCXLIII", + "1144": "MCXLIV", + "1145": "MCXLV", + "1146": "MCXLVI", + "1147": "MCXLVII", + "1148": "MCXLVIII", + "1149": "MCXLIX", + "1150": "MCL", + "1151": "MCLI", + "1152": "MCLII", + "1153": "MCLIII", + "1154": "MCLIV", + "1155": "MCLV", + "1156": "MCLVI", + "1157": "MCLVII", + "1158": "MCLVIII", + "1159": "MCLIX", + "1160": "MCLX", + "1161": "MCLXI", + "1162": "MCLXII", + "1163": "MCLXIII", + "1164": "MCLXIV", + "1165": "MCLXV", + "1166": "MCLXVI", + "1167": "MCLXVII", + "1168": "MCLXVIII", + "1169": "MCLXIX", + "1170": "MCLXX", + "1171": "MCLXXI", + "1172": "MCLXXII", + "1173": "MCLXXIII", + "1174": "MCLXXIV", + "1175": "MCLXXV", + "1176": "MCLXXVI", + "1177": "MCLXXVII", + "1178": "MCLXXVIII", + "1179": "MCLXXIX", + "1180": "MCLXXX", + "1181": "MCLXXXI", + "1182": "MCLXXXII", + "1183": "MCLXXXIII", + "1184": "MCLXXXIV", + "1185": "MCLXXXV", + "1186": "MCLXXXVI", + "1187": "MCLXXXVII", + "1188": "MCLXXXVIII", + "1189": "MCLXXXIX", + "1190": "MCXC", + "1191": "MCXCI", + "1192": "MCXCII", + "1193": "MCXCIII", + "1194": "MCXCIV", + "1195": "MCXCV", + "1196": "MCXCVI", + "1197": "MCXCVII", + "1198": "MCXCVIII", + "1199": "MCXCIX", + "1200": "MCC", + "1201": "MCCI", + "1202": "MCCII", + "1203": "MCCIII", + "1204": "MCCIV", + "1205": "MCCV", + "1206": "MCCVI", + "1207": "MCCVII", + "1208": "MCCVIII", + "1209": "MCCIX", + "1210": "MCCX", + "1211": "MCCXI", + "1212": "MCCXII", + "1213": "MCCXIII", + "1214": "MCCXIV", + "1215": "MCCXV", + "1216": "MCCXVI", + "1217": "MCCXVII", + "1218": "MCCXVIII", + "1219": "MCCXIX", + "1220": "MCCXX", + "1221": "MCCXXI", + "1222": "MCCXXII", + "1223": "MCCXXIII", + "1224": "MCCXXIV", + "1225": "MCCXXV", + "1226": "MCCXXVI", + "1227": "MCCXXVII", + "1228": "MCCXXVIII", + "1229": "MCCXXIX", + "1230": "MCCXXX", + "1231": "MCCXXXI", + "1232": "MCCXXXII", + "1233": "MCCXXXIII", + "1234": "MCCXXXIV", + "1235": "MCCXXXV", + "1236": "MCCXXXVI", + "1237": "MCCXXXVII", + "1238": "MCCXXXVIII", + "1239": "MCCXXXIX", + "1240": "MCCXL", + "1241": "MCCXLI", + "1242": "MCCXLII", + "1243": "MCCXLIII", + "1244": "MCCXLIV", + "1245": "MCCXLV", + "1246": "MCCXLVI", + "1247": "MCCXLVII", + "1248": "MCCXLVIII", + "1249": "MCCXLIX", + "1250": "MCCL", + "1251": "MCCLI", + "1252": "MCCLII", + "1253": "MCCLIII", + "1254": "MCCLIV", + "1255": "MCCLV", + "1256": "MCCLVI", + "1257": "MCCLVII", + "1258": "MCCLVIII", + "1259": "MCCLIX", + "1260": "MCCLX", + "1261": "MCCLXI", + "1262": "MCCLXII", + "1263": "MCCLXIII", + "1264": "MCCLXIV", + "1265": "MCCLXV", + "1266": "MCCLXVI", + "1267": "MCCLXVII", + "1268": "MCCLXVIII", + "1269": "MCCLXIX", + "1270": "MCCLXX", + "1271": "MCCLXXI", + "1272": "MCCLXXII", + "1273": "MCCLXXIII", + "1274": "MCCLXXIV", + "1275": "MCCLXXV", + "1276": "MCCLXXVI", + "1277": "MCCLXXVII", + "1278": "MCCLXXVIII", + "1279": "MCCLXXIX", + "1280": "MCCLXXX", + "1281": "MCCLXXXI", + "1282": "MCCLXXXII", + "1283": "MCCLXXXIII", + "1284": "MCCLXXXIV", + "1285": "MCCLXXXV", + "1286": "MCCLXXXVI", + "1287": "MCCLXXXVII", + "1288": "MCCLXXXVIII", + "1289": "MCCLXXXIX", + "1290": "MCCXC", + "1291": "MCCXCI", + "1292": "MCCXCII", + "1293": "MCCXCIII", + "1294": "MCCXCIV", + "1295": "MCCXCV", + "1296": "MCCXCVI", + "1297": "MCCXCVII", + "1298": "MCCXCVIII", + "1299": "MCCXCIX", + "1300": "MCCC", + "1301": "MCCCI", + "1302": "MCCCII", + "1303": "MCCCIII", + "1304": "MCCCIV", + "1305": "MCCCV", + "1306": "MCCCVI", + "1307": "MCCCVII", + "1308": "MCCCVIII", + "1309": "MCCCIX", + "1310": "MCCCX", + "1311": "MCCCXI", + "1312": "MCCCXII", + "1313": "MCCCXIII", + "1314": "MCCCXIV", + "1315": "MCCCXV", + "1316": "MCCCXVI", + "1317": "MCCCXVII", + "1318": "MCCCXVIII", + "1319": "MCCCXIX", + "1320": "MCCCXX", + "1321": "MCCCXXI", + "1322": "MCCCXXII", + "1323": "MCCCXXIII", + "1324": "MCCCXXIV", + "1325": "MCCCXXV", + "1326": "MCCCXXVI", + "1327": "MCCCXXVII", + "1328": "MCCCXXVIII", + "1329": "MCCCXXIX", + "1330": "MCCCXXX", + "1331": "MCCCXXXI", + "1332": "MCCCXXXII", + "1333": "MCCCXXXIII", + "1334": "MCCCXXXIV", + "1335": "MCCCXXXV", + "1336": "MCCCXXXVI", + "1337": "MCCCXXXVII", + "1338": "MCCCXXXVIII", + "1339": "MCCCXXXIX", + "1340": "MCCCXL", + "1341": "MCCCXLI", + "1342": "MCCCXLII", + "1343": "MCCCXLIII", + "1344": "MCCCXLIV", + "1345": "MCCCXLV", + "1346": "MCCCXLVI", + "1347": "MCCCXLVII", + "1348": "MCCCXLVIII", + "1349": "MCCCXLIX", + "1350": "MCCCL", + "1351": "MCCCLI", + "1352": "MCCCLII", + "1353": "MCCCLIII", + "1354": "MCCCLIV", + "1355": "MCCCLV", + "1356": "MCCCLVI", + "1357": "MCCCLVII", + "1358": "MCCCLVIII", + "1359": "MCCCLIX", + "1360": "MCCCLX", + "1361": "MCCCLXI", + "1362": "MCCCLXII", + "1363": "MCCCLXIII", + "1364": "MCCCLXIV", + "1365": "MCCCLXV", + "1366": "MCCCLXVI", + "1367": "MCCCLXVII", + "1368": "MCCCLXVIII", + "1369": "MCCCLXIX", + "1370": "MCCCLXX", + "1371": "MCCCLXXI", + "1372": "MCCCLXXII", + "1373": "MCCCLXXIII", + "1374": "MCCCLXXIV", + "1375": "MCCCLXXV", + "1376": "MCCCLXXVI", + "1377": "MCCCLXXVII", + "1378": "MCCCLXXVIII", + "1379": "MCCCLXXIX", + "1380": "MCCCLXXX", + "1381": "MCCCLXXXI", + "1382": "MCCCLXXXII", + "1383": "MCCCLXXXIII", + "1384": "MCCCLXXXIV", + "1385": "MCCCLXXXV", + "1386": "MCCCLXXXVI", + "1387": "MCCCLXXXVII", + "1388": "MCCCLXXXVIII", + "1389": "MCCCLXXXIX", + "1390": "MCCCXC", + "1391": "MCCCXCI", + "1392": "MCCCXCII", + "1393": "MCCCXCIII", + "1394": "MCCCXCIV", + "1395": "MCCCXCV", + "1396": "MCCCXCVI", + "1397": "MCCCXCVII", + "1398": "MCCCXCVIII", + "1399": "MCCCXCIX", + "1400": "MCD", + "1401": "MCDI", + "1402": "MCDII", + "1403": "MCDIII", + "1404": "MCDIV", + "1405": "MCDV", + "1406": "MCDVI", + "1407": "MCDVII", + "1408": "MCDVIII", + "1409": "MCDIX", + "1410": "MCDX", + "1411": "MCDXI", + "1412": "MCDXII", + "1413": "MCDXIII", + "1414": "MCDXIV", + "1415": "MCDXV", + "1416": "MCDXVI", + "1417": "MCDXVII", + "1418": "MCDXVIII", + "1419": "MCDXIX", + "1420": "MCDXX", + "1421": "MCDXXI", + "1422": "MCDXXII", + "1423": "MCDXXIII", + "1424": "MCDXXIV", + "1425": "MCDXXV", + "1426": "MCDXXVI", + "1427": "MCDXXVII", + "1428": "MCDXXVIII", + "1429": "MCDXXIX", + "1430": "MCDXXX", + "1431": "MCDXXXI", + "1432": "MCDXXXII", + "1433": "MCDXXXIII", + "1434": "MCDXXXIV", + "1435": "MCDXXXV", + "1436": "MCDXXXVI", + "1437": "MCDXXXVII", + "1438": "MCDXXXVIII", + "1439": "MCDXXXIX", + "1440": "MCDXL", + "1441": "MCDXLI", + "1442": "MCDXLII", + "1443": "MCDXLIII", + "1444": "MCDXLIV", + "1445": "MCDXLV", + "1446": "MCDXLVI", + "1447": "MCDXLVII", + "1448": "MCDXLVIII", + "1449": "MCDXLIX", + "1450": "MCDL", + "1451": "MCDLI", + "1452": "MCDLII", + "1453": "MCDLIII", + "1454": "MCDLIV", + "1455": "MCDLV", + "1456": "MCDLVI", + "1457": "MCDLVII", + "1458": "MCDLVIII", + "1459": "MCDLIX", + "1460": "MCDLX", + "1461": "MCDLXI", + "1462": "MCDLXII", + "1463": "MCDLXIII", + "1464": "MCDLXIV", + "1465": "MCDLXV", + "1466": "MCDLXVI", + "1467": "MCDLXVII", + "1468": "MCDLXVIII", + "1469": "MCDLXIX", + "1470": "MCDLXX", + "1471": "MCDLXXI", + "1472": "MCDLXXII", + "1473": "MCDLXXIII", + "1474": "MCDLXXIV", + "1475": "MCDLXXV", + "1476": "MCDLXXVI", + "1477": "MCDLXXVII", + "1478": "MCDLXXVIII", + "1479": "MCDLXXIX", + "1480": "MCDLXXX", + "1481": "MCDLXXXI", + "1482": "MCDLXXXII", + "1483": "MCDLXXXIII", + "1484": "MCDLXXXIV", + "1485": "MCDLXXXV", + "1486": "MCDLXXXVI", + "1487": "MCDLXXXVII", + "1488": "MCDLXXXVIII", + "1489": "MCDLXXXIX", + "1490": "MCDXC", + "1491": "MCDXCI", + "1492": "MCDXCII", + "1493": "MCDXCIII", + "1494": "MCDXCIV", + "1495": "MCDXCV", + "1496": "MCDXCVI", + "1497": "MCDXCVII", + "1498": "MCDXCVIII", + "1499": "MCDXCIX", + "1500": "MD", + "1501": "MDI", + "1502": "MDII", + "1503": "MDIII", + "1504": "MDIV", + "1505": "MDV", + "1506": "MDVI", + "1507": "MDVII", + "1508": "MDVIII", + "1509": "MDIX", + "1510": "MDX", + "1511": "MDXI", + "1512": "MDXII", + "1513": "MDXIII", + "1514": "MDXIV", + "1515": "MDXV", + "1516": "MDXVI", + "1517": "MDXVII", + "1518": "MDXVIII", + "1519": "MDXIX", + "1520": "MDXX", + "1521": "MDXXI", + "1522": "MDXXII", + "1523": "MDXXIII", + "1524": "MDXXIV", + "1525": "MDXXV", + "1526": "MDXXVI", + "1527": "MDXXVII", + "1528": "MDXXVIII", + "1529": "MDXXIX", + "1530": "MDXXX", + "1531": "MDXXXI", + "1532": "MDXXXII", + "1533": "MDXXXIII", + "1534": "MDXXXIV", + "1535": "MDXXXV", + "1536": "MDXXXVI", + "1537": "MDXXXVII", + "1538": "MDXXXVIII", + "1539": "MDXXXIX", + "1540": "MDXL", + "1541": "MDXLI", + "1542": "MDXLII", + "1543": "MDXLIII", + "1544": "MDXLIV", + "1545": "MDXLV", + "1546": "MDXLVI", + "1547": "MDXLVII", + "1548": "MDXLVIII", + "1549": "MDXLIX", + "1550": "MDL", + "1551": "MDLI", + "1552": "MDLII", + "1553": "MDLIII", + "1554": "MDLIV", + "1555": "MDLV", + "1556": "MDLVI", + "1557": "MDLVII", + "1558": "MDLVIII", + "1559": "MDLIX", + "1560": "MDLX", + "1561": "MDLXI", + "1562": "MDLXII", + "1563": "MDLXIII", + "1564": "MDLXIV", + "1565": "MDLXV", + "1566": "MDLXVI", + "1567": "MDLXVII", + "1568": "MDLXVIII", + "1569": "MDLXIX", + "1570": "MDLXX", + "1571": "MDLXXI", + "1572": "MDLXXII", + "1573": "MDLXXIII", + "1574": "MDLXXIV", + "1575": "MDLXXV", + "1576": "MDLXXVI", + "1577": "MDLXXVII", + "1578": "MDLXXVIII", + "1579": "MDLXXIX", + "1580": "MDLXXX", + "1581": "MDLXXXI", + "1582": "MDLXXXII", + "1583": "MDLXXXIII", + "1584": "MDLXXXIV", + "1585": "MDLXXXV", + "1586": "MDLXXXVI", + "1587": "MDLXXXVII", + "1588": "MDLXXXVIII", + "1589": "MDLXXXIX", + "1590": "MDXC", + "1591": "MDXCI", + "1592": "MDXCII", + "1593": "MDXCIII", + "1594": "MDXCIV", + "1595": "MDXCV", + "1596": "MDXCVI", + "1597": "MDXCVII", + "1598": "MDXCVIII", + "1599": "MDXCIX", + "1600": "MDC", + "1601": "MDCI", + "1602": "MDCII", + "1603": "MDCIII", + "1604": "MDCIV", + "1605": "MDCV", + "1606": "MDCVI", + "1607": "MDCVII", + "1608": "MDCVIII", + "1609": "MDCIX", + "1610": "MDCX", + "1611": "MDCXI", + "1612": "MDCXII", + "1613": "MDCXIII", + "1614": "MDCXIV", + "1615": "MDCXV", + "1616": "MDCXVI", + "1617": "MDCXVII", + "1618": "MDCXVIII", + "1619": "MDCXIX", + "1620": "MDCXX", + "1621": "MDCXXI", + "1622": "MDCXXII", + "1623": "MDCXXIII", + "1624": "MDCXXIV", + "1625": "MDCXXV", + "1626": "MDCXXVI", + "1627": "MDCXXVII", + "1628": "MDCXXVIII", + "1629": "MDCXXIX", + "1630": "MDCXXX", + "1631": "MDCXXXI", + "1632": "MDCXXXII", + "1633": "MDCXXXIII", + "1634": "MDCXXXIV", + "1635": "MDCXXXV", + "1636": "MDCXXXVI", + "1637": "MDCXXXVII", + "1638": "MDCXXXVIII", + "1639": "MDCXXXIX", + "1640": "MDCXL", + "1641": "MDCXLI", + "1642": "MDCXLII", + "1643": "MDCXLIII", + "1644": "MDCXLIV", + "1645": "MDCXLV", + "1646": "MDCXLVI", + "1647": "MDCXLVII", + "1648": "MDCXLVIII", + "1649": "MDCXLIX", + "1650": "MDCL", + "1651": "MDCLI", + "1652": "MDCLII", + "1653": "MDCLIII", + "1654": "MDCLIV", + "1655": "MDCLV", + "1656": "MDCLVI", + "1657": "MDCLVII", + "1658": "MDCLVIII", + "1659": "MDCLIX", + "1660": "MDCLX", + "1661": "MDCLXI", + "1662": "MDCLXII", + "1663": "MDCLXIII", + "1664": "MDCLXIV", + "1665": "MDCLXV", + "1666": "MDCLXVI", + "1667": "MDCLXVII", + "1668": "MDCLXVIII", + "1669": "MDCLXIX", + "1670": "MDCLXX", + "1671": "MDCLXXI", + "1672": "MDCLXXII", + "1673": "MDCLXXIII", + "1674": "MDCLXXIV", + "1675": "MDCLXXV", + "1676": "MDCLXXVI", + "1677": "MDCLXXVII", + "1678": "MDCLXXVIII", + "1679": "MDCLXXIX", + "1680": "MDCLXXX", + "1681": "MDCLXXXI", + "1682": "MDCLXXXII", + "1683": "MDCLXXXIII", + "1684": "MDCLXXXIV", + "1685": "MDCLXXXV", + "1686": "MDCLXXXVI", + "1687": "MDCLXXXVII", + "1688": "MDCLXXXVIII", + "1689": "MDCLXXXIX", + "1690": "MDCXC", + "1691": "MDCXCI", + "1692": "MDCXCII", + "1693": "MDCXCIII", + "1694": "MDCXCIV", + "1695": "MDCXCV", + "1696": "MDCXCVI", + "1697": "MDCXCVII", + "1698": "MDCXCVIII", + "1699": "MDCXCIX", + "1700": "MDCC", + "1701": "MDCCI", + "1702": "MDCCII", + "1703": "MDCCIII", + "1704": "MDCCIV", + "1705": "MDCCV", + "1706": "MDCCVI", + "1707": "MDCCVII", + "1708": "MDCCVIII", + "1709": "MDCCIX", + "1710": "MDCCX", + "1711": "MDCCXI", + "1712": "MDCCXII", + "1713": "MDCCXIII", + "1714": "MDCCXIV", + "1715": "MDCCXV", + "1716": "MDCCXVI", + "1717": "MDCCXVII", + "1718": "MDCCXVIII", + "1719": "MDCCXIX", + "1720": "MDCCXX", + "1721": "MDCCXXI", + "1722": "MDCCXXII", + "1723": "MDCCXXIII", + "1724": "MDCCXXIV", + "1725": "MDCCXXV", + "1726": "MDCCXXVI", + "1727": "MDCCXXVII", + "1728": "MDCCXXVIII", + "1729": "MDCCXXIX", + "1730": "MDCCXXX", + "1731": "MDCCXXXI", + "1732": "MDCCXXXII", + "1733": "MDCCXXXIII", + "1734": "MDCCXXXIV", + "1735": "MDCCXXXV", + "1736": "MDCCXXXVI", + "1737": "MDCCXXXVII", + "1738": "MDCCXXXVIII", + "1739": "MDCCXXXIX", + "1740": "MDCCXL", + "1741": "MDCCXLI", + "1742": "MDCCXLII", + "1743": "MDCCXLIII", + "1744": "MDCCXLIV", + "1745": "MDCCXLV", + "1746": "MDCCXLVI", + "1747": "MDCCXLVII", + "1748": "MDCCXLVIII", + "1749": "MDCCXLIX", + "1750": "MDCCL", + "1751": "MDCCLI", + "1752": "MDCCLII", + "1753": "MDCCLIII", + "1754": "MDCCLIV", + "1755": "MDCCLV", + "1756": "MDCCLVI", + "1757": "MDCCLVII", + "1758": "MDCCLVIII", + "1759": "MDCCLIX", + "1760": "MDCCLX", + "1761": "MDCCLXI", + "1762": "MDCCLXII", + "1763": "MDCCLXIII", + "1764": "MDCCLXIV", + "1765": "MDCCLXV", + "1766": "MDCCLXVI", + "1767": "MDCCLXVII", + "1768": "MDCCLXVIII", + "1769": "MDCCLXIX", + "1770": "MDCCLXX", + "1771": "MDCCLXXI", + "1772": "MDCCLXXII", + "1773": "MDCCLXXIII", + "1774": "MDCCLXXIV", + "1775": "MDCCLXXV", + "1776": "MDCCLXXVI", + "1777": "MDCCLXXVII", + "1778": "MDCCLXXVIII", + "1779": "MDCCLXXIX", + "1780": "MDCCLXXX", + "1781": "MDCCLXXXI", + "1782": "MDCCLXXXII", + "1783": "MDCCLXXXIII", + "1784": "MDCCLXXXIV", + "1785": "MDCCLXXXV", + "1786": "MDCCLXXXVI", + "1787": "MDCCLXXXVII", + "1788": "MDCCLXXXVIII", + "1789": "MDCCLXXXIX", + "1790": "MDCCXC", + "1791": "MDCCXCI", + "1792": "MDCCXCII", + "1793": "MDCCXCIII", + "1794": "MDCCXCIV", + "1795": "MDCCXCV", + "1796": "MDCCXCVI", + "1797": "MDCCXCVII", + "1798": "MDCCXCVIII", + "1799": "MDCCXCIX", + "1800": "MDCCC", + "1801": "MDCCCI", + "1802": "MDCCCII", + "1803": "MDCCCIII", + "1804": "MDCCCIV", + "1805": "MDCCCV", + "1806": "MDCCCVI", + "1807": "MDCCCVII", + "1808": "MDCCCVIII", + "1809": "MDCCCIX", + "1810": "MDCCCX", + "1811": "MDCCCXI", + "1812": "MDCCCXII", + "1813": "MDCCCXIII", + "1814": "MDCCCXIV", + "1815": "MDCCCXV", + "1816": "MDCCCXVI", + "1817": "MDCCCXVII", + "1818": "MDCCCXVIII", + "1819": "MDCCCXIX", + "1820": "MDCCCXX", + "1821": "MDCCCXXI", + "1822": "MDCCCXXII", + "1823": "MDCCCXXIII", + "1824": "MDCCCXXIV", + "1825": "MDCCCXXV", + "1826": "MDCCCXXVI", + "1827": "MDCCCXXVII", + "1828": "MDCCCXXVIII", + "1829": "MDCCCXXIX", + "1830": "MDCCCXXX", + "1831": "MDCCCXXXI", + "1832": "MDCCCXXXII", + "1833": "MDCCCXXXIII", + "1834": "MDCCCXXXIV", + "1835": "MDCCCXXXV", + "1836": "MDCCCXXXVI", + "1837": "MDCCCXXXVII", + "1838": "MDCCCXXXVIII", + "1839": "MDCCCXXXIX", + "1840": "MDCCCXL", + "1841": "MDCCCXLI", + "1842": "MDCCCXLII", + "1843": "MDCCCXLIII", + "1844": "MDCCCXLIV", + "1845": "MDCCCXLV", + "1846": "MDCCCXLVI", + "1847": "MDCCCXLVII", + "1848": "MDCCCXLVIII", + "1849": "MDCCCXLIX", + "1850": "MDCCCL", + "1851": "MDCCCLI", + "1852": "MDCCCLII", + "1853": "MDCCCLIII", + "1854": "MDCCCLIV", + "1855": "MDCCCLV", + "1856": "MDCCCLVI", + "1857": "MDCCCLVII", + "1858": "MDCCCLVIII", + "1859": "MDCCCLIX", + "1860": "MDCCCLX", + "1861": "MDCCCLXI", + "1862": "MDCCCLXII", + "1863": "MDCCCLXIII", + "1864": "MDCCCLXIV", + "1865": "MDCCCLXV", + "1866": "MDCCCLXVI", + "1867": "MDCCCLXVII", + "1868": "MDCCCLXVIII", + "1869": "MDCCCLXIX", + "1870": "MDCCCLXX", + "1871": "MDCCCLXXI", + "1872": "MDCCCLXXII", + "1873": "MDCCCLXXIII", + "1874": "MDCCCLXXIV", + "1875": "MDCCCLXXV", + "1876": "MDCCCLXXVI", + "1877": "MDCCCLXXVII", + "1878": "MDCCCLXXVIII", + "1879": "MDCCCLXXIX", + "1880": "MDCCCLXXX", + "1881": "MDCCCLXXXI", + "1882": "MDCCCLXXXII", + "1883": "MDCCCLXXXIII", + "1884": "MDCCCLXXXIV", + "1885": "MDCCCLXXXV", + "1886": "MDCCCLXXXVI", + "1887": "MDCCCLXXXVII", + "1888": "MDCCCLXXXVIII", + "1889": "MDCCCLXXXIX", + "1890": "MDCCCXC", + "1891": "MDCCCXCI", + "1892": "MDCCCXCII", + "1893": "MDCCCXCIII", + "1894": "MDCCCXCIV", + "1895": "MDCCCXCV", + "1896": "MDCCCXCVI", + "1897": "MDCCCXCVII", + "1898": "MDCCCXCVIII", + "1899": "MDCCCXCIX", + "1900": "MCM", + "1901": "MCMI", + "1902": "MCMII", + "1903": "MCMIII", + "1904": "MCMIV", + "1905": "MCMV", + "1906": "MCMVI", + "1907": "MCMVII", + "1908": "MCMVIII", + "1909": "MCMIX", + "1910": "MCMX", + "1911": "MCMXI", + "1912": "MCMXII", + "1913": "MCMXIII", + "1914": "MCMXIV", + "1915": "MCMXV", + "1916": "MCMXVI", + "1917": "MCMXVII", + "1918": "MCMXVIII", + "1919": "MCMXIX", + "1920": "MCMXX", + "1921": "MCMXXI", + "1922": "MCMXXII", + "1923": "MCMXXIII", + "1924": "MCMXXIV", + "1925": "MCMXXV", + "1926": "MCMXXVI", + "1927": "MCMXXVII", + "1928": "MCMXXVIII", + "1929": "MCMXXIX", + "1930": "MCMXXX", + "1931": "MCMXXXI", + "1932": "MCMXXXII", + "1933": "MCMXXXIII", + "1934": "MCMXXXIV", + "1935": "MCMXXXV", + "1936": "MCMXXXVI", + "1937": "MCMXXXVII", + "1938": "MCMXXXVIII", + "1939": "MCMXXXIX", + "1940": "MCMXL", + "1941": "MCMXLI", + "1942": "MCMXLII", + "1943": "MCMXLIII", + "1944": "MCMXLIV", + "1945": "MCMXLV", + "1946": "MCMXLVI", + "1947": "MCMXLVII", + "1948": "MCMXLVIII", + "1949": "MCMXLIX", + "1950": "MCML", + "1951": "MCMLI", + "1952": "MCMLII", + "1953": "MCMLIII", + "1954": "MCMLIV", + "1955": "MCMLV", + "1956": "MCMLVI", + "1957": "MCMLVII", + "1958": "MCMLVIII", + "1959": "MCMLIX", + "1960": "MCMLX", + "1961": "MCMLXI", + "1962": "MCMLXII", + "1963": "MCMLXIII", + "1964": "MCMLXIV", + "1965": "MCMLXV", + "1966": "MCMLXVI", + "1967": "MCMLXVII", + "1968": "MCMLXVIII", + "1969": "MCMLXIX", + "1970": "MCMLXX", + "1971": "MCMLXXI", + "1972": "MCMLXXII", + "1973": "MCMLXXIII", + "1974": "MCMLXXIV", + "1975": "MCMLXXV", + "1976": "MCMLXXVI", + "1977": "MCMLXXVII", + "1978": "MCMLXXVIII", + "1979": "MCMLXXIX", + "1980": "MCMLXXX", + "1981": "MCMLXXXI", + "1982": "MCMLXXXII", + "1983": "MCMLXXXIII", + "1984": "MCMLXXXIV", + "1985": "MCMLXXXV", + "1986": "MCMLXXXVI", + "1987": "MCMLXXXVII", + "1988": "MCMLXXXVIII", + "1989": "MCMLXXXIX", + "1990": "MCMXC", + "1991": "MCMXCI", + "1992": "MCMXCII", + "1993": "MCMXCIII", + "1994": "MCMXCIV", + "1995": "MCMXCV", + "1996": "MCMXCVI", + "1997": "MCMXCVII", + "1998": "MCMXCVIII", + "1999": "MCMXCIX", + "2000": "MM", + "2001": "MMI", + "2002": "MMII", + "2003": "MMIII", + "2004": "MMIV", + "2005": "MMV", + "2006": "MMVI", + "2007": "MMVII", + "2008": "MMVIII", + "2009": "MMIX", + "2010": "MMX", + "2011": "MMXI", + "2012": "MMXII", + "2013": "MMXIII", + "2014": "MMXIV", + "2015": "MMXV", + "2016": "MMXVI", + "2017": "MMXVII", + "2018": "MMXVIII", + "2019": "MMXIX", + "2020": "MMXX", + "2021": "MMXXI", + "2022": "MMXXII", + "2023": "MMXXIII", + "2024": "MMXXIV", + "2025": "MMXXV", + "2026": "MMXXVI", + "2027": "MMXXVII", + "2028": "MMXXVIII", + "2029": "MMXXIX", + "2030": "MMXXX", + "2031": "MMXXXI", + "2032": "MMXXXII", + "2033": "MMXXXIII", + "2034": "MMXXXIV", + "2035": "MMXXXV", + "2036": "MMXXXVI", + "2037": "MMXXXVII", + "2038": "MMXXXVIII", + "2039": "MMXXXIX", + "2040": "MMXL", + "2041": "MMXLI", + "2042": "MMXLII", + "2043": "MMXLIII", + "2044": "MMXLIV", + "2045": "MMXLV", + "2046": "MMXLVI", + "2047": "MMXLVII", + "2048": "MMXLVIII", + "2049": "MMXLIX", + "2050": "MML", + "2051": "MMLI", + "2052": "MMLII", + "2053": "MMLIII", + "2054": "MMLIV", + "2055": "MMLV", + "2056": "MMLVI", + "2057": "MMLVII", + "2058": "MMLVIII", + "2059": "MMLIX", + "2060": "MMLX", + "2061": "MMLXI", + "2062": "MMLXII", + "2063": "MMLXIII", + "2064": "MMLXIV", + "2065": "MMLXV", + "2066": "MMLXVI", + "2067": "MMLXVII", + "2068": "MMLXVIII", + "2069": "MMLXIX", + "2070": "MMLXX", + "2071": "MMLXXI", + "2072": "MMLXXII", + "2073": "MMLXXIII", + "2074": "MMLXXIV", + "2075": "MMLXXV", + "2076": "MMLXXVI", + "2077": "MMLXXVII", + "2078": "MMLXXVIII", + "2079": "MMLXXIX", + "2080": "MMLXXX", + "2081": "MMLXXXI", + "2082": "MMLXXXII", + "2083": "MMLXXXIII", + "2084": "MMLXXXIV", + "2085": "MMLXXXV", + "2086": "MMLXXXVI", + "2087": "MMLXXXVII", + "2088": "MMLXXXVIII", + "2089": "MMLXXXIX", + "2090": "MMXC", + "2091": "MMXCI", + "2092": "MMXCII", + "2093": "MMXCIII", + "2094": "MMXCIV", + "2095": "MMXCV", + "2096": "MMXCVI", + "2097": "MMXCVII", + "2098": "MMXCVIII", + "2099": "MMXCIX", + "2100": "MMC", + "2101": "MMCI", + "2102": "MMCII", + "2103": "MMCIII", + "2104": "MMCIV", + "2105": "MMCV", + "2106": "MMCVI", + "2107": "MMCVII", + "2108": "MMCVIII", + "2109": "MMCIX", + "2110": "MMCX", + "2111": "MMCXI", + "2112": "MMCXII", + "2113": "MMCXIII", + "2114": "MMCXIV", + "2115": "MMCXV", + "2116": "MMCXVI", + "2117": "MMCXVII", + "2118": "MMCXVIII", + "2119": "MMCXIX", + "2120": "MMCXX", + "2121": "MMCXXI", + "2122": "MMCXXII", + "2123": "MMCXXIII", + "2124": "MMCXXIV", + "2125": "MMCXXV", + "2126": "MMCXXVI", + "2127": "MMCXXVII", + "2128": "MMCXXVIII", + "2129": "MMCXXIX", + "2130": "MMCXXX", + "2131": "MMCXXXI", + "2132": "MMCXXXII", + "2133": "MMCXXXIII", + "2134": "MMCXXXIV", + "2135": "MMCXXXV", + "2136": "MMCXXXVI", + "2137": "MMCXXXVII", + "2138": "MMCXXXVIII", + "2139": "MMCXXXIX", + "2140": "MMCXL", + "2141": "MMCXLI", + "2142": "MMCXLII", + "2143": "MMCXLIII", + "2144": "MMCXLIV", + "2145": "MMCXLV", + "2146": "MMCXLVI", + "2147": "MMCXLVII", + "2148": "MMCXLVIII", + "2149": "MMCXLIX", + "2150": "MMCL", + "2151": "MMCLI", + "2152": "MMCLII", + "2153": "MMCLIII", + "2154": "MMCLIV", + "2155": "MMCLV", + "2156": "MMCLVI", + "2157": "MMCLVII", + "2158": "MMCLVIII", + "2159": "MMCLIX", + "2160": "MMCLX", + "2161": "MMCLXI", + "2162": "MMCLXII", + "2163": "MMCLXIII", + "2164": "MMCLXIV", + "2165": "MMCLXV", + "2166": "MMCLXVI", + "2167": "MMCLXVII", + "2168": "MMCLXVIII", + "2169": "MMCLXIX", + "2170": "MMCLXX", + "2171": "MMCLXXI", + "2172": "MMCLXXII", + "2173": "MMCLXXIII", + "2174": "MMCLXXIV", + "2175": "MMCLXXV", + "2176": "MMCLXXVI", + "2177": "MMCLXXVII", + "2178": "MMCLXXVIII", + "2179": "MMCLXXIX", + "2180": "MMCLXXX", + "2181": "MMCLXXXI", + "2182": "MMCLXXXII", + "2183": "MMCLXXXIII", + "2184": "MMCLXXXIV", + "2185": "MMCLXXXV", + "2186": "MMCLXXXVI", + "2187": "MMCLXXXVII", + "2188": "MMCLXXXVIII", + "2189": "MMCLXXXIX", + "2190": "MMCXC", + "2191": "MMCXCI", + "2192": "MMCXCII", + "2193": "MMCXCIII", + "2194": "MMCXCIV", + "2195": "MMCXCV", + "2196": "MMCXCVI", + "2197": "MMCXCVII", + "2198": "MMCXCVIII", + "2199": "MMCXCIX", + "2200": "MMCC", + "2201": "MMCCI", + "2202": "MMCCII", + "2203": "MMCCIII", + "2204": "MMCCIV", + "2205": "MMCCV", + "2206": "MMCCVI", + "2207": "MMCCVII", + "2208": "MMCCVIII", + "2209": "MMCCIX", + "2210": "MMCCX", + "2211": "MMCCXI", + "2212": "MMCCXII", + "2213": "MMCCXIII", + "2214": "MMCCXIV", + "2215": "MMCCXV", + "2216": "MMCCXVI", + "2217": "MMCCXVII", + "2218": "MMCCXVIII", + "2219": "MMCCXIX", + "2220": "MMCCXX", + "2221": "MMCCXXI", + "2222": "MMCCXXII", + "2223": "MMCCXXIII", + "2224": "MMCCXXIV", + "2225": "MMCCXXV", + "2226": "MMCCXXVI", + "2227": "MMCCXXVII", + "2228": "MMCCXXVIII", + "2229": "MMCCXXIX", + "2230": "MMCCXXX", + "2231": "MMCCXXXI", + "2232": "MMCCXXXII", + "2233": "MMCCXXXIII", + "2234": "MMCCXXXIV", + "2235": "MMCCXXXV", + "2236": "MMCCXXXVI", + "2237": "MMCCXXXVII", + "2238": "MMCCXXXVIII", + "2239": "MMCCXXXIX", + "2240": "MMCCXL", + "2241": "MMCCXLI", + "2242": "MMCCXLII", + "2243": "MMCCXLIII", + "2244": "MMCCXLIV", + "2245": "MMCCXLV", + "2246": "MMCCXLVI", + "2247": "MMCCXLVII", + "2248": "MMCCXLVIII", + "2249": "MMCCXLIX", + "2250": "MMCCL", + "2251": "MMCCLI", + "2252": "MMCCLII", + "2253": "MMCCLIII", + "2254": "MMCCLIV", + "2255": "MMCCLV", + "2256": "MMCCLVI", + "2257": "MMCCLVII", + "2258": "MMCCLVIII", + "2259": "MMCCLIX", + "2260": "MMCCLX", + "2261": "MMCCLXI", + "2262": "MMCCLXII", + "2263": "MMCCLXIII", + "2264": "MMCCLXIV", + "2265": "MMCCLXV", + "2266": "MMCCLXVI", + "2267": "MMCCLXVII", + "2268": "MMCCLXVIII", + "2269": "MMCCLXIX", + "2270": "MMCCLXX", + "2271": "MMCCLXXI", + "2272": "MMCCLXXII", + "2273": "MMCCLXXIII", + "2274": "MMCCLXXIV", + "2275": "MMCCLXXV", + "2276": "MMCCLXXVI", + "2277": "MMCCLXXVII", + "2278": "MMCCLXXVIII", + "2279": "MMCCLXXIX", + "2280": "MMCCLXXX", + "2281": "MMCCLXXXI", + "2282": "MMCCLXXXII", + "2283": "MMCCLXXXIII", + "2284": "MMCCLXXXIV", + "2285": "MMCCLXXXV", + "2286": "MMCCLXXXVI", + "2287": "MMCCLXXXVII", + "2288": "MMCCLXXXVIII", + "2289": "MMCCLXXXIX", + "2290": "MMCCXC", + "2291": "MMCCXCI", + "2292": "MMCCXCII", + "2293": "MMCCXCIII", + "2294": "MMCCXCIV", + "2295": "MMCCXCV", + "2296": "MMCCXCVI", + "2297": "MMCCXCVII", + "2298": "MMCCXCVIII", + "2299": "MMCCXCIX", + "2300": "MMCCC", + "2301": "MMCCCI", + "2302": "MMCCCII", + "2303": "MMCCCIII", + "2304": "MMCCCIV", + "2305": "MMCCCV", + "2306": "MMCCCVI", + "2307": "MMCCCVII", + "2308": "MMCCCVIII", + "2309": "MMCCCIX", + "2310": "MMCCCX", + "2311": "MMCCCXI", + "2312": "MMCCCXII", + "2313": "MMCCCXIII", + "2314": "MMCCCXIV", + "2315": "MMCCCXV", + "2316": "MMCCCXVI", + "2317": "MMCCCXVII", + "2318": "MMCCCXVIII", + "2319": "MMCCCXIX", + "2320": "MMCCCXX", + "2321": "MMCCCXXI", + "2322": "MMCCCXXII", + "2323": "MMCCCXXIII", + "2324": "MMCCCXXIV", + "2325": "MMCCCXXV", + "2326": "MMCCCXXVI", + "2327": "MMCCCXXVII", + "2328": "MMCCCXXVIII", + "2329": "MMCCCXXIX", + "2330": "MMCCCXXX", + "2331": "MMCCCXXXI", + "2332": "MMCCCXXXII", + "2333": "MMCCCXXXIII", + "2334": "MMCCCXXXIV", + "2335": "MMCCCXXXV", + "2336": "MMCCCXXXVI", + "2337": "MMCCCXXXVII", + "2338": "MMCCCXXXVIII", + "2339": "MMCCCXXXIX", + "2340": "MMCCCXL", + "2341": "MMCCCXLI", + "2342": "MMCCCXLII", + "2343": "MMCCCXLIII", + "2344": "MMCCCXLIV", + "2345": "MMCCCXLV", + "2346": "MMCCCXLVI", + "2347": "MMCCCXLVII", + "2348": "MMCCCXLVIII", + "2349": "MMCCCXLIX", + "2350": "MMCCCL", + "2351": "MMCCCLI", + "2352": "MMCCCLII", + "2353": "MMCCCLIII", + "2354": "MMCCCLIV", + "2355": "MMCCCLV", + "2356": "MMCCCLVI", + "2357": "MMCCCLVII", + "2358": "MMCCCLVIII", + "2359": "MMCCCLIX", + "2360": "MMCCCLX", + "2361": "MMCCCLXI", + "2362": "MMCCCLXII", + "2363": "MMCCCLXIII", + "2364": "MMCCCLXIV", + "2365": "MMCCCLXV", + "2366": "MMCCCLXVI", + "2367": "MMCCCLXVII", + "2368": "MMCCCLXVIII", + "2369": "MMCCCLXIX", + "2370": "MMCCCLXX", + "2371": "MMCCCLXXI", + "2372": "MMCCCLXXII", + "2373": "MMCCCLXXIII", + "2374": "MMCCCLXXIV", + "2375": "MMCCCLXXV", + "2376": "MMCCCLXXVI", + "2377": "MMCCCLXXVII", + "2378": "MMCCCLXXVIII", + "2379": "MMCCCLXXIX", + "2380": "MMCCCLXXX", + "2381": "MMCCCLXXXI", + "2382": "MMCCCLXXXII", + "2383": "MMCCCLXXXIII", + "2384": "MMCCCLXXXIV", + "2385": "MMCCCLXXXV", + "2386": "MMCCCLXXXVI", + "2387": "MMCCCLXXXVII", + "2388": "MMCCCLXXXVIII", + "2389": "MMCCCLXXXIX", + "2390": "MMCCCXC", + "2391": "MMCCCXCI", + "2392": "MMCCCXCII", + "2393": "MMCCCXCIII", + "2394": "MMCCCXCIV", + "2395": "MMCCCXCV", + "2396": "MMCCCXCVI", + "2397": "MMCCCXCVII", + "2398": "MMCCCXCVIII", + "2399": "MMCCCXCIX", + "2400": "MMCD", + "2401": "MMCDI", + "2402": "MMCDII", + "2403": "MMCDIII", + "2404": "MMCDIV", + "2405": "MMCDV", + "2406": "MMCDVI", + "2407": "MMCDVII", + "2408": "MMCDVIII", + "2409": "MMCDIX", + "2410": "MMCDX", + "2411": "MMCDXI", + "2412": "MMCDXII", + "2413": "MMCDXIII", + "2414": "MMCDXIV", + "2415": "MMCDXV", + "2416": "MMCDXVI", + "2417": "MMCDXVII", + "2418": "MMCDXVIII", + "2419": "MMCDXIX", + "2420": "MMCDXX", + "2421": "MMCDXXI", + "2422": "MMCDXXII", + "2423": "MMCDXXIII", + "2424": "MMCDXXIV", + "2425": "MMCDXXV", + "2426": "MMCDXXVI", + "2427": "MMCDXXVII", + "2428": "MMCDXXVIII", + "2429": "MMCDXXIX", + "2430": "MMCDXXX", + "2431": "MMCDXXXI", + "2432": "MMCDXXXII", + "2433": "MMCDXXXIII", + "2434": "MMCDXXXIV", + "2435": "MMCDXXXV", + "2436": "MMCDXXXVI", + "2437": "MMCDXXXVII", + "2438": "MMCDXXXVIII", + "2439": "MMCDXXXIX", + "2440": "MMCDXL", + "2441": "MMCDXLI", + "2442": "MMCDXLII", + "2443": "MMCDXLIII", + "2444": "MMCDXLIV", + "2445": "MMCDXLV", + "2446": "MMCDXLVI", + "2447": "MMCDXLVII", + "2448": "MMCDXLVIII", + "2449": "MMCDXLIX", + "2450": "MMCDL", + "2451": "MMCDLI", + "2452": "MMCDLII", + "2453": "MMCDLIII", + "2454": "MMCDLIV", + "2455": "MMCDLV", + "2456": "MMCDLVI", + "2457": "MMCDLVII", + "2458": "MMCDLVIII", + "2459": "MMCDLIX", + "2460": "MMCDLX", + "2461": "MMCDLXI", + "2462": "MMCDLXII", + "2463": "MMCDLXIII", + "2464": "MMCDLXIV", + "2465": "MMCDLXV", + "2466": "MMCDLXVI", + "2467": "MMCDLXVII", + "2468": "MMCDLXVIII", + "2469": "MMCDLXIX", + "2470": "MMCDLXX", + "2471": "MMCDLXXI", + "2472": "MMCDLXXII", + "2473": "MMCDLXXIII", + "2474": "MMCDLXXIV", + "2475": "MMCDLXXV", + "2476": "MMCDLXXVI", + "2477": "MMCDLXXVII", + "2478": "MMCDLXXVIII", + "2479": "MMCDLXXIX", + "2480": "MMCDLXXX", + "2481": "MMCDLXXXI", + "2482": "MMCDLXXXII", + "2483": "MMCDLXXXIII", + "2484": "MMCDLXXXIV", + "2485": "MMCDLXXXV", + "2486": "MMCDLXXXVI", + "2487": "MMCDLXXXVII", + "2488": "MMCDLXXXVIII", + "2489": "MMCDLXXXIX", + "2490": "MMCDXC", + "2491": "MMCDXCI", + "2492": "MMCDXCII", + "2493": "MMCDXCIII", + "2494": "MMCDXCIV", + "2495": "MMCDXCV", + "2496": "MMCDXCVI", + "2497": "MMCDXCVII", + "2498": "MMCDXCVIII", + "2499": "MMCDXCIX", + "2500": "MMD", + "2501": "MMDI", + "2502": "MMDII", + "2503": "MMDIII", + "2504": "MMDIV", + "2505": "MMDV", + "2506": "MMDVI", + "2507": "MMDVII", + "2508": "MMDVIII", + "2509": "MMDIX", + "2510": "MMDX", + "2511": "MMDXI", + "2512": "MMDXII", + "2513": "MMDXIII", + "2514": "MMDXIV", + "2515": "MMDXV", + "2516": "MMDXVI", + "2517": "MMDXVII", + "2518": "MMDXVIII", + "2519": "MMDXIX", + "2520": "MMDXX", + "2521": "MMDXXI", + "2522": "MMDXXII", + "2523": "MMDXXIII", + "2524": "MMDXXIV", + "2525": "MMDXXV", + "2526": "MMDXXVI", + "2527": "MMDXXVII", + "2528": "MMDXXVIII", + "2529": "MMDXXIX", + "2530": "MMDXXX", + "2531": "MMDXXXI", + "2532": "MMDXXXII", + "2533": "MMDXXXIII", + "2534": "MMDXXXIV", + "2535": "MMDXXXV", + "2536": "MMDXXXVI", + "2537": "MMDXXXVII", + "2538": "MMDXXXVIII", + "2539": "MMDXXXIX", + "2540": "MMDXL", + "2541": "MMDXLI", + "2542": "MMDXLII", + "2543": "MMDXLIII", + "2544": "MMDXLIV", + "2545": "MMDXLV", + "2546": "MMDXLVI", + "2547": "MMDXLVII", + "2548": "MMDXLVIII", + "2549": "MMDXLIX", + "2550": "MMDL", + "2551": "MMDLI", + "2552": "MMDLII", + "2553": "MMDLIII", + "2554": "MMDLIV", + "2555": "MMDLV", + "2556": "MMDLVI", + "2557": "MMDLVII", + "2558": "MMDLVIII", + "2559": "MMDLIX", + "2560": "MMDLX", + "2561": "MMDLXI", + "2562": "MMDLXII", + "2563": "MMDLXIII", + "2564": "MMDLXIV", + "2565": "MMDLXV", + "2566": "MMDLXVI", + "2567": "MMDLXVII", + "2568": "MMDLXVIII", + "2569": "MMDLXIX", + "2570": "MMDLXX", + "2571": "MMDLXXI", + "2572": "MMDLXXII", + "2573": "MMDLXXIII", + "2574": "MMDLXXIV", + "2575": "MMDLXXV", + "2576": "MMDLXXVI", + "2577": "MMDLXXVII", + "2578": "MMDLXXVIII", + "2579": "MMDLXXIX", + "2580": "MMDLXXX", + "2581": "MMDLXXXI", + "2582": "MMDLXXXII", + "2583": "MMDLXXXIII", + "2584": "MMDLXXXIV", + "2585": "MMDLXXXV", + "2586": "MMDLXXXVI", + "2587": "MMDLXXXVII", + "2588": "MMDLXXXVIII", + "2589": "MMDLXXXIX", + "2590": "MMDXC", + "2591": "MMDXCI", + "2592": "MMDXCII", + "2593": "MMDXCIII", + "2594": "MMDXCIV", + "2595": "MMDXCV", + "2596": "MMDXCVI", + "2597": "MMDXCVII", + "2598": "MMDXCVIII", + "2599": "MMDXCIX", + "2600": "MMDC", + "2601": "MMDCI", + "2602": "MMDCII", + "2603": "MMDCIII", + "2604": "MMDCIV", + "2605": "MMDCV", + "2606": "MMDCVI", + "2607": "MMDCVII", + "2608": "MMDCVIII", + "2609": "MMDCIX", + "2610": "MMDCX", + "2611": "MMDCXI", + "2612": "MMDCXII", + "2613": "MMDCXIII", + "2614": "MMDCXIV", + "2615": "MMDCXV", + "2616": "MMDCXVI", + "2617": "MMDCXVII", + "2618": "MMDCXVIII", + "2619": "MMDCXIX", + "2620": "MMDCXX", + "2621": "MMDCXXI", + "2622": "MMDCXXII", + "2623": "MMDCXXIII", + "2624": "MMDCXXIV", + "2625": "MMDCXXV", + "2626": "MMDCXXVI", + "2627": "MMDCXXVII", + "2628": "MMDCXXVIII", + "2629": "MMDCXXIX", + "2630": "MMDCXXX", + "2631": "MMDCXXXI", + "2632": "MMDCXXXII", + "2633": "MMDCXXXIII", + "2634": "MMDCXXXIV", + "2635": "MMDCXXXV", + "2636": "MMDCXXXVI", + "2637": "MMDCXXXVII", + "2638": "MMDCXXXVIII", + "2639": "MMDCXXXIX", + "2640": "MMDCXL", + "2641": "MMDCXLI", + "2642": "MMDCXLII", + "2643": "MMDCXLIII", + "2644": "MMDCXLIV", + "2645": "MMDCXLV", + "2646": "MMDCXLVI", + "2647": "MMDCXLVII", + "2648": "MMDCXLVIII", + "2649": "MMDCXLIX", + "2650": "MMDCL", + "2651": "MMDCLI", + "2652": "MMDCLII", + "2653": "MMDCLIII", + "2654": "MMDCLIV", + "2655": "MMDCLV", + "2656": "MMDCLVI", + "2657": "MMDCLVII", + "2658": "MMDCLVIII", + "2659": "MMDCLIX", + "2660": "MMDCLX", + "2661": "MMDCLXI", + "2662": "MMDCLXII", + "2663": "MMDCLXIII", + "2664": "MMDCLXIV", + "2665": "MMDCLXV", + "2666": "MMDCLXVI", + "2667": "MMDCLXVII", + "2668": "MMDCLXVIII", + "2669": "MMDCLXIX", + "2670": "MMDCLXX", + "2671": "MMDCLXXI", + "2672": "MMDCLXXII", + "2673": "MMDCLXXIII", + "2674": "MMDCLXXIV", + "2675": "MMDCLXXV", + "2676": "MMDCLXXVI", + "2677": "MMDCLXXVII", + "2678": "MMDCLXXVIII", + "2679": "MMDCLXXIX", + "2680": "MMDCLXXX", + "2681": "MMDCLXXXI", + "2682": "MMDCLXXXII", + "2683": "MMDCLXXXIII", + "2684": "MMDCLXXXIV", + "2685": "MMDCLXXXV", + "2686": "MMDCLXXXVI", + "2687": "MMDCLXXXVII", + "2688": "MMDCLXXXVIII", + "2689": "MMDCLXXXIX", + "2690": "MMDCXC", + "2691": "MMDCXCI", + "2692": "MMDCXCII", + "2693": "MMDCXCIII", + "2694": "MMDCXCIV", + "2695": "MMDCXCV", + "2696": "MMDCXCVI", + "2697": "MMDCXCVII", + "2698": "MMDCXCVIII", + "2699": "MMDCXCIX", + "2700": "MMDCC", + "2701": "MMDCCI", + "2702": "MMDCCII", + "2703": "MMDCCIII", + "2704": "MMDCCIV", + "2705": "MMDCCV", + "2706": "MMDCCVI", + "2707": "MMDCCVII", + "2708": "MMDCCVIII", + "2709": "MMDCCIX", + "2710": "MMDCCX", + "2711": "MMDCCXI", + "2712": "MMDCCXII", + "2713": "MMDCCXIII", + "2714": "MMDCCXIV", + "2715": "MMDCCXV", + "2716": "MMDCCXVI", + "2717": "MMDCCXVII", + "2718": "MMDCCXVIII", + "2719": "MMDCCXIX", + "2720": "MMDCCXX", + "2721": "MMDCCXXI", + "2722": "MMDCCXXII", + "2723": "MMDCCXXIII", + "2724": "MMDCCXXIV", + "2725": "MMDCCXXV", + "2726": "MMDCCXXVI", + "2727": "MMDCCXXVII", + "2728": "MMDCCXXVIII", + "2729": "MMDCCXXIX", + "2730": "MMDCCXXX", + "2731": "MMDCCXXXI", + "2732": "MMDCCXXXII", + "2733": "MMDCCXXXIII", + "2734": "MMDCCXXXIV", + "2735": "MMDCCXXXV", + "2736": "MMDCCXXXVI", + "2737": "MMDCCXXXVII", + "2738": "MMDCCXXXVIII", + "2739": "MMDCCXXXIX", + "2740": "MMDCCXL", + "2741": "MMDCCXLI", + "2742": "MMDCCXLII", + "2743": "MMDCCXLIII", + "2744": "MMDCCXLIV", + "2745": "MMDCCXLV", + "2746": "MMDCCXLVI", + "2747": "MMDCCXLVII", + "2748": "MMDCCXLVIII", + "2749": "MMDCCXLIX", + "2750": "MMDCCL", + "2751": "MMDCCLI", + "2752": "MMDCCLII", + "2753": "MMDCCLIII", + "2754": "MMDCCLIV", + "2755": "MMDCCLV", + "2756": "MMDCCLVI", + "2757": "MMDCCLVII", + "2758": "MMDCCLVIII", + "2759": "MMDCCLIX", + "2760": "MMDCCLX", + "2761": "MMDCCLXI", + "2762": "MMDCCLXII", + "2763": "MMDCCLXIII", + "2764": "MMDCCLXIV", + "2765": "MMDCCLXV", + "2766": "MMDCCLXVI", + "2767": "MMDCCLXVII", + "2768": "MMDCCLXVIII", + "2769": "MMDCCLXIX", + "2770": "MMDCCLXX", + "2771": "MMDCCLXXI", + "2772": "MMDCCLXXII", + "2773": "MMDCCLXXIII", + "2774": "MMDCCLXXIV", + "2775": "MMDCCLXXV", + "2776": "MMDCCLXXVI", + "2777": "MMDCCLXXVII", + "2778": "MMDCCLXXVIII", + "2779": "MMDCCLXXIX", + "2780": "MMDCCLXXX", + "2781": "MMDCCLXXXI", + "2782": "MMDCCLXXXII", + "2783": "MMDCCLXXXIII", + "2784": "MMDCCLXXXIV", + "2785": "MMDCCLXXXV", + "2786": "MMDCCLXXXVI", + "2787": "MMDCCLXXXVII", + "2788": "MMDCCLXXXVIII", + "2789": "MMDCCLXXXIX", + "2790": "MMDCCXC", + "2791": "MMDCCXCI", + "2792": "MMDCCXCII", + "2793": "MMDCCXCIII", + "2794": "MMDCCXCIV", + "2795": "MMDCCXCV", + "2796": "MMDCCXCVI", + "2797": "MMDCCXCVII", + "2798": "MMDCCXCVIII", + "2799": "MMDCCXCIX", + "2800": "MMDCCC", + "2801": "MMDCCCI", + "2802": "MMDCCCII", + "2803": "MMDCCCIII", + "2804": "MMDCCCIV", + "2805": "MMDCCCV", + "2806": "MMDCCCVI", + "2807": "MMDCCCVII", + "2808": "MMDCCCVIII", + "2809": "MMDCCCIX", + "2810": "MMDCCCX", + "2811": "MMDCCCXI", + "2812": "MMDCCCXII", + "2813": "MMDCCCXIII", + "2814": "MMDCCCXIV", + "2815": "MMDCCCXV", + "2816": "MMDCCCXVI", + "2817": "MMDCCCXVII", + "2818": "MMDCCCXVIII", + "2819": "MMDCCCXIX", + "2820": "MMDCCCXX", + "2821": "MMDCCCXXI", + "2822": "MMDCCCXXII", + "2823": "MMDCCCXXIII", + "2824": "MMDCCCXXIV", + "2825": "MMDCCCXXV", + "2826": "MMDCCCXXVI", + "2827": "MMDCCCXXVII", + "2828": "MMDCCCXXVIII", + "2829": "MMDCCCXXIX", + "2830": "MMDCCCXXX", + "2831": "MMDCCCXXXI", + "2832": "MMDCCCXXXII", + "2833": "MMDCCCXXXIII", + "2834": "MMDCCCXXXIV", + "2835": "MMDCCCXXXV", + "2836": "MMDCCCXXXVI", + "2837": "MMDCCCXXXVII", + "2838": "MMDCCCXXXVIII", + "2839": "MMDCCCXXXIX", + "2840": "MMDCCCXL", + "2841": "MMDCCCXLI", + "2842": "MMDCCCXLII", + "2843": "MMDCCCXLIII", + "2844": "MMDCCCXLIV", + "2845": "MMDCCCXLV", + "2846": "MMDCCCXLVI", + "2847": "MMDCCCXLVII", + "2848": "MMDCCCXLVIII", + "2849": "MMDCCCXLIX", + "2850": "MMDCCCL", + "2851": "MMDCCCLI", + "2852": "MMDCCCLII", + "2853": "MMDCCCLIII", + "2854": "MMDCCCLIV", + "2855": "MMDCCCLV", + "2856": "MMDCCCLVI", + "2857": "MMDCCCLVII", + "2858": "MMDCCCLVIII", + "2859": "MMDCCCLIX", + "2860": "MMDCCCLX", + "2861": "MMDCCCLXI", + "2862": "MMDCCCLXII", + "2863": "MMDCCCLXIII", + "2864": "MMDCCCLXIV", + "2865": "MMDCCCLXV", + "2866": "MMDCCCLXVI", + "2867": "MMDCCCLXVII", + "2868": "MMDCCCLXVIII", + "2869": "MMDCCCLXIX", + "2870": "MMDCCCLXX", + "2871": "MMDCCCLXXI", + "2872": "MMDCCCLXXII", + "2873": "MMDCCCLXXIII", + "2874": "MMDCCCLXXIV", + "2875": "MMDCCCLXXV", + "2876": "MMDCCCLXXVI", + "2877": "MMDCCCLXXVII", + "2878": "MMDCCCLXXVIII", + "2879": "MMDCCCLXXIX", + "2880": "MMDCCCLXXX", + "2881": "MMDCCCLXXXI", + "2882": "MMDCCCLXXXII", + "2883": "MMDCCCLXXXIII", + "2884": "MMDCCCLXXXIV", + "2885": "MMDCCCLXXXV", + "2886": "MMDCCCLXXXVI", + "2887": "MMDCCCLXXXVII", + "2888": "MMDCCCLXXXVIII", + "2889": "MMDCCCLXXXIX", + "2890": "MMDCCCXC", + "2891": "MMDCCCXCI", + "2892": "MMDCCCXCII", + "2893": "MMDCCCXCIII", + "2894": "MMDCCCXCIV", + "2895": "MMDCCCXCV", + "2896": "MMDCCCXCVI", + "2897": "MMDCCCXCVII", + "2898": "MMDCCCXCVIII", + "2899": "MMDCCCXCIX", + "2900": "MMCM", + "2901": "MMCMI", + "2902": "MMCMII", + "2903": "MMCMIII", + "2904": "MMCMIV", + "2905": "MMCMV", + "2906": "MMCMVI", + "2907": "MMCMVII", + "2908": "MMCMVIII", + "2909": "MMCMIX", + "2910": "MMCMX", + "2911": "MMCMXI", + "2912": "MMCMXII", + "2913": "MMCMXIII", + "2914": "MMCMXIV", + "2915": "MMCMXV", + "2916": "MMCMXVI", + "2917": "MMCMXVII", + "2918": "MMCMXVIII", + "2919": "MMCMXIX", + "2920": "MMCMXX", + "2921": "MMCMXXI", + "2922": "MMCMXXII", + "2923": "MMCMXXIII", + "2924": "MMCMXXIV", + "2925": "MMCMXXV", + "2926": "MMCMXXVI", + "2927": "MMCMXXVII", + "2928": "MMCMXXVIII", + "2929": "MMCMXXIX", + "2930": "MMCMXXX", + "2931": "MMCMXXXI", + "2932": "MMCMXXXII", + "2933": "MMCMXXXIII", + "2934": "MMCMXXXIV", + "2935": "MMCMXXXV", + "2936": "MMCMXXXVI", + "2937": "MMCMXXXVII", + "2938": "MMCMXXXVIII", + "2939": "MMCMXXXIX", + "2940": "MMCMXL", + "2941": "MMCMXLI", + "2942": "MMCMXLII", + "2943": "MMCMXLIII", + "2944": "MMCMXLIV", + "2945": "MMCMXLV", + "2946": "MMCMXLVI", + "2947": "MMCMXLVII", + "2948": "MMCMXLVIII", + "2949": "MMCMXLIX", + "2950": "MMCML", + "2951": "MMCMLI", + "2952": "MMCMLII", + "2953": "MMCMLIII", + "2954": "MMCMLIV", + "2955": "MMCMLV", + "2956": "MMCMLVI", + "2957": "MMCMLVII", + "2958": "MMCMLVIII", + "2959": "MMCMLIX", + "2960": "MMCMLX", + "2961": "MMCMLXI", + "2962": "MMCMLXII", + "2963": "MMCMLXIII", + "2964": "MMCMLXIV", + "2965": "MMCMLXV", + "2966": "MMCMLXVI", + "2967": "MMCMLXVII", + "2968": "MMCMLXVIII", + "2969": "MMCMLXIX", + "2970": "MMCMLXX", + "2971": "MMCMLXXI", + "2972": "MMCMLXXII", + "2973": "MMCMLXXIII", + "2974": "MMCMLXXIV", + "2975": "MMCMLXXV", + "2976": "MMCMLXXVI", + "2977": "MMCMLXXVII", + "2978": "MMCMLXXVIII", + "2979": "MMCMLXXIX", + "2980": "MMCMLXXX", + "2981": "MMCMLXXXI", + "2982": "MMCMLXXXII", + "2983": "MMCMLXXXIII", + "2984": "MMCMLXXXIV", + "2985": "MMCMLXXXV", + "2986": "MMCMLXXXVI", + "2987": "MMCMLXXXVII", + "2988": "MMCMLXXXVIII", + "2989": "MMCMLXXXIX", + "2990": "MMCMXC", + "2991": "MMCMXCI", + "2992": "MMCMXCII", + "2993": "MMCMXCIII", + "2994": "MMCMXCIV", + "2995": "MMCMXCV", + "2996": "MMCMXCVI", + "2997": "MMCMXCVII", + "2998": "MMCMXCVIII", + "2999": "MMCMXCIX", + "3000": "MMM", + "3001": "MMMI", + "3002": "MMMII", + "3003": "MMMIII", + "3004": "MMMIV", + "3005": "MMMV", + "3006": "MMMVI", + "3007": "MMMVII", + "3008": "MMMVIII", + "3009": "MMMIX", + "3010": "MMMX", + "3011": "MMMXI", + "3012": "MMMXII", + "3013": "MMMXIII", + "3014": "MMMXIV", + "3015": "MMMXV", + "3016": "MMMXVI", + "3017": "MMMXVII", + "3018": "MMMXVIII", + "3019": "MMMXIX", + "3020": "MMMXX", + "3021": "MMMXXI", + "3022": "MMMXXII", + "3023": "MMMXXIII", + "3024": "MMMXXIV", + "3025": "MMMXXV", + "3026": "MMMXXVI", + "3027": "MMMXXVII", + "3028": "MMMXXVIII", + "3029": "MMMXXIX", + "3030": "MMMXXX", + "3031": "MMMXXXI", + "3032": "MMMXXXII", + "3033": "MMMXXXIII", + "3034": "MMMXXXIV", + "3035": "MMMXXXV", + "3036": "MMMXXXVI", + "3037": "MMMXXXVII", + "3038": "MMMXXXVIII", + "3039": "MMMXXXIX", + "3040": "MMMXL", + "3041": "MMMXLI", + "3042": "MMMXLII", + "3043": "MMMXLIII", + "3044": "MMMXLIV", + "3045": "MMMXLV", + "3046": "MMMXLVI", + "3047": "MMMXLVII", + "3048": "MMMXLVIII", + "3049": "MMMXLIX", + "3050": "MMML", + "3051": "MMMLI", + "3052": "MMMLII", + "3053": "MMMLIII", + "3054": "MMMLIV", + "3055": "MMMLV", + "3056": "MMMLVI", + "3057": "MMMLVII", + "3058": "MMMLVIII", + "3059": "MMMLIX", + "3060": "MMMLX", + "3061": "MMMLXI", + "3062": "MMMLXII", + "3063": "MMMLXIII", + "3064": "MMMLXIV", + "3065": "MMMLXV", + "3066": "MMMLXVI", + "3067": "MMMLXVII", + "3068": "MMMLXVIII", + "3069": "MMMLXIX", + "3070": "MMMLXX", + "3071": "MMMLXXI", + "3072": "MMMLXXII", + "3073": "MMMLXXIII", + "3074": "MMMLXXIV", + "3075": "MMMLXXV", + "3076": "MMMLXXVI", + "3077": "MMMLXXVII", + "3078": "MMMLXXVIII", + "3079": "MMMLXXIX", + "3080": "MMMLXXX", + "3081": "MMMLXXXI", + "3082": "MMMLXXXII", + "3083": "MMMLXXXIII", + "3084": "MMMLXXXIV", + "3085": "MMMLXXXV", + "3086": "MMMLXXXVI", + "3087": "MMMLXXXVII", + "3088": "MMMLXXXVIII", + "3089": "MMMLXXXIX", + "3090": "MMMXC", + "3091": "MMMXCI", + "3092": "MMMXCII", + "3093": "MMMXCIII", + "3094": "MMMXCIV", + "3095": "MMMXCV", + "3096": "MMMXCVI", + "3097": "MMMXCVII", + "3098": "MMMXCVIII", + "3099": "MMMXCIX", + "3100": "MMMC", + "3101": "MMMCI", + "3102": "MMMCII", + "3103": "MMMCIII", + "3104": "MMMCIV", + "3105": "MMMCV", + "3106": "MMMCVI", + "3107": "MMMCVII", + "3108": "MMMCVIII", + "3109": "MMMCIX", + "3110": "MMMCX", + "3111": "MMMCXI", + "3112": "MMMCXII", + "3113": "MMMCXIII", + "3114": "MMMCXIV", + "3115": "MMMCXV", + "3116": "MMMCXVI", + "3117": "MMMCXVII", + "3118": "MMMCXVIII", + "3119": "MMMCXIX", + "3120": "MMMCXX", + "3121": "MMMCXXI", + "3122": "MMMCXXII", + "3123": "MMMCXXIII", + "3124": "MMMCXXIV", + "3125": "MMMCXXV", + "3126": "MMMCXXVI", + "3127": "MMMCXXVII", + "3128": "MMMCXXVIII", + "3129": "MMMCXXIX", + "3130": "MMMCXXX", + "3131": "MMMCXXXI", + "3132": "MMMCXXXII", + "3133": "MMMCXXXIII", + "3134": "MMMCXXXIV", + "3135": "MMMCXXXV", + "3136": "MMMCXXXVI", + "3137": "MMMCXXXVII", + "3138": "MMMCXXXVIII", + "3139": "MMMCXXXIX", + "3140": "MMMCXL", + "3141": "MMMCXLI", + "3142": "MMMCXLII", + "3143": "MMMCXLIII", + "3144": "MMMCXLIV", + "3145": "MMMCXLV", + "3146": "MMMCXLVI", + "3147": "MMMCXLVII", + "3148": "MMMCXLVIII", + "3149": "MMMCXLIX", + "3150": "MMMCL", + "3151": "MMMCLI", + "3152": "MMMCLII", + "3153": "MMMCLIII", + "3154": "MMMCLIV", + "3155": "MMMCLV", + "3156": "MMMCLVI", + "3157": "MMMCLVII", + "3158": "MMMCLVIII", + "3159": "MMMCLIX", + "3160": "MMMCLX", + "3161": "MMMCLXI", + "3162": "MMMCLXII", + "3163": "MMMCLXIII", + "3164": "MMMCLXIV", + "3165": "MMMCLXV", + "3166": "MMMCLXVI", + "3167": "MMMCLXVII", + "3168": "MMMCLXVIII", + "3169": "MMMCLXIX", + "3170": "MMMCLXX", + "3171": "MMMCLXXI", + "3172": "MMMCLXXII", + "3173": "MMMCLXXIII", + "3174": "MMMCLXXIV", + "3175": "MMMCLXXV", + "3176": "MMMCLXXVI", + "3177": "MMMCLXXVII", + "3178": "MMMCLXXVIII", + "3179": "MMMCLXXIX", + "3180": "MMMCLXXX", + "3181": "MMMCLXXXI", + "3182": "MMMCLXXXII", + "3183": "MMMCLXXXIII", + "3184": "MMMCLXXXIV", + "3185": "MMMCLXXXV", + "3186": "MMMCLXXXVI", + "3187": "MMMCLXXXVII", + "3188": "MMMCLXXXVIII", + "3189": "MMMCLXXXIX", + "3190": "MMMCXC", + "3191": "MMMCXCI", + "3192": "MMMCXCII", + "3193": "MMMCXCIII", + "3194": "MMMCXCIV", + "3195": "MMMCXCV", + "3196": "MMMCXCVI", + "3197": "MMMCXCVII", + "3198": "MMMCXCVIII", + "3199": "MMMCXCIX", + "3200": "MMMCC", + "3201": "MMMCCI", + "3202": "MMMCCII", + "3203": "MMMCCIII", + "3204": "MMMCCIV", + "3205": "MMMCCV", + "3206": "MMMCCVI", + "3207": "MMMCCVII", + "3208": "MMMCCVIII", + "3209": "MMMCCIX", + "3210": "MMMCCX", + "3211": "MMMCCXI", + "3212": "MMMCCXII", + "3213": "MMMCCXIII", + "3214": "MMMCCXIV", + "3215": "MMMCCXV", + "3216": "MMMCCXVI", + "3217": "MMMCCXVII", + "3218": "MMMCCXVIII", + "3219": "MMMCCXIX", + "3220": "MMMCCXX", + "3221": "MMMCCXXI", + "3222": "MMMCCXXII", + "3223": "MMMCCXXIII", + "3224": "MMMCCXXIV", + "3225": "MMMCCXXV", + "3226": "MMMCCXXVI", + "3227": "MMMCCXXVII", + "3228": "MMMCCXXVIII", + "3229": "MMMCCXXIX", + "3230": "MMMCCXXX", + "3231": "MMMCCXXXI", + "3232": "MMMCCXXXII", + "3233": "MMMCCXXXIII", + "3234": "MMMCCXXXIV", + "3235": "MMMCCXXXV", + "3236": "MMMCCXXXVI", + "3237": "MMMCCXXXVII", + "3238": "MMMCCXXXVIII", + "3239": "MMMCCXXXIX", + "3240": "MMMCCXL", + "3241": "MMMCCXLI", + "3242": "MMMCCXLII", + "3243": "MMMCCXLIII", + "3244": "MMMCCXLIV", + "3245": "MMMCCXLV", + "3246": "MMMCCXLVI", + "3247": "MMMCCXLVII", + "3248": "MMMCCXLVIII", + "3249": "MMMCCXLIX", + "3250": "MMMCCL", + "3251": "MMMCCLI", + "3252": "MMMCCLII", + "3253": "MMMCCLIII", + "3254": "MMMCCLIV", + "3255": "MMMCCLV", + "3256": "MMMCCLVI", + "3257": "MMMCCLVII", + "3258": "MMMCCLVIII", + "3259": "MMMCCLIX", + "3260": "MMMCCLX", + "3261": "MMMCCLXI", + "3262": "MMMCCLXII", + "3263": "MMMCCLXIII", + "3264": "MMMCCLXIV", + "3265": "MMMCCLXV", + "3266": "MMMCCLXVI", + "3267": "MMMCCLXVII", + "3268": "MMMCCLXVIII", + "3269": "MMMCCLXIX", + "3270": "MMMCCLXX", + "3271": "MMMCCLXXI", + "3272": "MMMCCLXXII", + "3273": "MMMCCLXXIII", + "3274": "MMMCCLXXIV", + "3275": "MMMCCLXXV", + "3276": "MMMCCLXXVI", + "3277": "MMMCCLXXVII", + "3278": "MMMCCLXXVIII", + "3279": "MMMCCLXXIX", + "3280": "MMMCCLXXX", + "3281": "MMMCCLXXXI", + "3282": "MMMCCLXXXII", + "3283": "MMMCCLXXXIII", + "3284": "MMMCCLXXXIV", + "3285": "MMMCCLXXXV", + "3286": "MMMCCLXXXVI", + "3287": "MMMCCLXXXVII", + "3288": "MMMCCLXXXVIII", + "3289": "MMMCCLXXXIX", + "3290": "MMMCCXC", + "3291": "MMMCCXCI", + "3292": "MMMCCXCII", + "3293": "MMMCCXCIII", + "3294": "MMMCCXCIV", + "3295": "MMMCCXCV", + "3296": "MMMCCXCVI", + "3297": "MMMCCXCVII", + "3298": "MMMCCXCVIII", + "3299": "MMMCCXCIX", + "3300": "MMMCCC", + "3301": "MMMCCCI", + "3302": "MMMCCCII", + "3303": "MMMCCCIII", + "3304": "MMMCCCIV", + "3305": "MMMCCCV", + "3306": "MMMCCCVI", + "3307": "MMMCCCVII", + "3308": "MMMCCCVIII", + "3309": "MMMCCCIX", + "3310": "MMMCCCX", + "3311": "MMMCCCXI", + "3312": "MMMCCCXII", + "3313": "MMMCCCXIII", + "3314": "MMMCCCXIV", + "3315": "MMMCCCXV", + "3316": "MMMCCCXVI", + "3317": "MMMCCCXVII", + "3318": "MMMCCCXVIII", + "3319": "MMMCCCXIX", + "3320": "MMMCCCXX", + "3321": "MMMCCCXXI", + "3322": "MMMCCCXXII", + "3323": "MMMCCCXXIII", + "3324": "MMMCCCXXIV", + "3325": "MMMCCCXXV", + "3326": "MMMCCCXXVI", + "3327": "MMMCCCXXVII", + "3328": "MMMCCCXXVIII", + "3329": "MMMCCCXXIX", + "3330": "MMMCCCXXX", + "3331": "MMMCCCXXXI", + "3332": "MMMCCCXXXII", + "3333": "MMMCCCXXXIII", + "3334": "MMMCCCXXXIV", + "3335": "MMMCCCXXXV", + "3336": "MMMCCCXXXVI", + "3337": "MMMCCCXXXVII", + "3338": "MMMCCCXXXVIII", + "3339": "MMMCCCXXXIX", + "3340": "MMMCCCXL", + "3341": "MMMCCCXLI", + "3342": "MMMCCCXLII", + "3343": "MMMCCCXLIII", + "3344": "MMMCCCXLIV", + "3345": "MMMCCCXLV", + "3346": "MMMCCCXLVI", + "3347": "MMMCCCXLVII", + "3348": "MMMCCCXLVIII", + "3349": "MMMCCCXLIX", + "3350": "MMMCCCL", + "3351": "MMMCCCLI", + "3352": "MMMCCCLII", + "3353": "MMMCCCLIII", + "3354": "MMMCCCLIV", + "3355": "MMMCCCLV", + "3356": "MMMCCCLVI", + "3357": "MMMCCCLVII", + "3358": "MMMCCCLVIII", + "3359": "MMMCCCLIX", + "3360": "MMMCCCLX", + "3361": "MMMCCCLXI", + "3362": "MMMCCCLXII", + "3363": "MMMCCCLXIII", + "3364": "MMMCCCLXIV", + "3365": "MMMCCCLXV", + "3366": "MMMCCCLXVI", + "3367": "MMMCCCLXVII", + "3368": "MMMCCCLXVIII", + "3369": "MMMCCCLXIX", + "3370": "MMMCCCLXX", + "3371": "MMMCCCLXXI", + "3372": "MMMCCCLXXII", + "3373": "MMMCCCLXXIII", + "3374": "MMMCCCLXXIV", + "3375": "MMMCCCLXXV", + "3376": "MMMCCCLXXVI", + "3377": "MMMCCCLXXVII", + "3378": "MMMCCCLXXVIII", + "3379": "MMMCCCLXXIX", + "3380": "MMMCCCLXXX", + "3381": "MMMCCCLXXXI", + "3382": "MMMCCCLXXXII", + "3383": "MMMCCCLXXXIII", + "3384": "MMMCCCLXXXIV", + "3385": "MMMCCCLXXXV", + "3386": "MMMCCCLXXXVI", + "3387": "MMMCCCLXXXVII", + "3388": "MMMCCCLXXXVIII", + "3389": "MMMCCCLXXXIX", + "3390": "MMMCCCXC", + "3391": "MMMCCCXCI", + "3392": "MMMCCCXCII", + "3393": "MMMCCCXCIII", + "3394": "MMMCCCXCIV", + "3395": "MMMCCCXCV", + "3396": "MMMCCCXCVI", + "3397": "MMMCCCXCVII", + "3398": "MMMCCCXCVIII", + "3399": "MMMCCCXCIX", + "3400": "MMMCD", + "3401": "MMMCDI", + "3402": "MMMCDII", + "3403": "MMMCDIII", + "3404": "MMMCDIV", + "3405": "MMMCDV", + "3406": "MMMCDVI", + "3407": "MMMCDVII", + "3408": "MMMCDVIII", + "3409": "MMMCDIX", + "3410": "MMMCDX", + "3411": "MMMCDXI", + "3412": "MMMCDXII", + "3413": "MMMCDXIII", + "3414": "MMMCDXIV", + "3415": "MMMCDXV", + "3416": "MMMCDXVI", + "3417": "MMMCDXVII", + "3418": "MMMCDXVIII", + "3419": "MMMCDXIX", + "3420": "MMMCDXX", + "3421": "MMMCDXXI", + "3422": "MMMCDXXII", + "3423": "MMMCDXXIII", + "3424": "MMMCDXXIV", + "3425": "MMMCDXXV", + "3426": "MMMCDXXVI", + "3427": "MMMCDXXVII", + "3428": "MMMCDXXVIII", + "3429": "MMMCDXXIX", + "3430": "MMMCDXXX", + "3431": "MMMCDXXXI", + "3432": "MMMCDXXXII", + "3433": "MMMCDXXXIII", + "3434": "MMMCDXXXIV", + "3435": "MMMCDXXXV", + "3436": "MMMCDXXXVI", + "3437": "MMMCDXXXVII", + "3438": "MMMCDXXXVIII", + "3439": "MMMCDXXXIX", + "3440": "MMMCDXL", + "3441": "MMMCDXLI", + "3442": "MMMCDXLII", + "3443": "MMMCDXLIII", + "3444": "MMMCDXLIV", + "3445": "MMMCDXLV", + "3446": "MMMCDXLVI", + "3447": "MMMCDXLVII", + "3448": "MMMCDXLVIII", + "3449": "MMMCDXLIX", + "3450": "MMMCDL", + "3451": "MMMCDLI", + "3452": "MMMCDLII", + "3453": "MMMCDLIII", + "3454": "MMMCDLIV", + "3455": "MMMCDLV", + "3456": "MMMCDLVI", + "3457": "MMMCDLVII", + "3458": "MMMCDLVIII", + "3459": "MMMCDLIX", + "3460": "MMMCDLX", + "3461": "MMMCDLXI", + "3462": "MMMCDLXII", + "3463": "MMMCDLXIII", + "3464": "MMMCDLXIV", + "3465": "MMMCDLXV", + "3466": "MMMCDLXVI", + "3467": "MMMCDLXVII", + "3468": "MMMCDLXVIII", + "3469": "MMMCDLXIX", + "3470": "MMMCDLXX", + "3471": "MMMCDLXXI", + "3472": "MMMCDLXXII", + "3473": "MMMCDLXXIII", + "3474": "MMMCDLXXIV", + "3475": "MMMCDLXXV", + "3476": "MMMCDLXXVI", + "3477": "MMMCDLXXVII", + "3478": "MMMCDLXXVIII", + "3479": "MMMCDLXXIX", + "3480": "MMMCDLXXX", + "3481": "MMMCDLXXXI", + "3482": "MMMCDLXXXII", + "3483": "MMMCDLXXXIII", + "3484": "MMMCDLXXXIV", + "3485": "MMMCDLXXXV", + "3486": "MMMCDLXXXVI", + "3487": "MMMCDLXXXVII", + "3488": "MMMCDLXXXVIII", + "3489": "MMMCDLXXXIX", + "3490": "MMMCDXC", + "3491": "MMMCDXCI", + "3492": "MMMCDXCII", + "3493": "MMMCDXCIII", + "3494": "MMMCDXCIV", + "3495": "MMMCDXCV", + "3496": "MMMCDXCVI", + "3497": "MMMCDXCVII", + "3498": "MMMCDXCVIII", + "3499": "MMMCDXCIX", + "3500": "MMMD", + "3501": "MMMDI", + "3502": "MMMDII", + "3503": "MMMDIII", + "3504": "MMMDIV", + "3505": "MMMDV", + "3506": "MMMDVI", + "3507": "MMMDVII", + "3508": "MMMDVIII", + "3509": "MMMDIX", + "3510": "MMMDX", + "3511": "MMMDXI", + "3512": "MMMDXII", + "3513": "MMMDXIII", + "3514": "MMMDXIV", + "3515": "MMMDXV", + "3516": "MMMDXVI", + "3517": "MMMDXVII", + "3518": "MMMDXVIII", + "3519": "MMMDXIX", + "3520": "MMMDXX", + "3521": "MMMDXXI", + "3522": "MMMDXXII", + "3523": "MMMDXXIII", + "3524": "MMMDXXIV", + "3525": "MMMDXXV", + "3526": "MMMDXXVI", + "3527": "MMMDXXVII", + "3528": "MMMDXXVIII", + "3529": "MMMDXXIX", + "3530": "MMMDXXX", + "3531": "MMMDXXXI", + "3532": "MMMDXXXII", + "3533": "MMMDXXXIII", + "3534": "MMMDXXXIV", + "3535": "MMMDXXXV", + "3536": "MMMDXXXVI", + "3537": "MMMDXXXVII", + "3538": "MMMDXXXVIII", + "3539": "MMMDXXXIX", + "3540": "MMMDXL", + "3541": "MMMDXLI", + "3542": "MMMDXLII", + "3543": "MMMDXLIII", + "3544": "MMMDXLIV", + "3545": "MMMDXLV", + "3546": "MMMDXLVI", + "3547": "MMMDXLVII", + "3548": "MMMDXLVIII", + "3549": "MMMDXLIX", + "3550": "MMMDL", + "3551": "MMMDLI", + "3552": "MMMDLII", + "3553": "MMMDLIII", + "3554": "MMMDLIV", + "3555": "MMMDLV", + "3556": "MMMDLVI", + "3557": "MMMDLVII", + "3558": "MMMDLVIII", + "3559": "MMMDLIX", + "3560": "MMMDLX", + "3561": "MMMDLXI", + "3562": "MMMDLXII", + "3563": "MMMDLXIII", + "3564": "MMMDLXIV", + "3565": "MMMDLXV", + "3566": "MMMDLXVI", + "3567": "MMMDLXVII", + "3568": "MMMDLXVIII", + "3569": "MMMDLXIX", + "3570": "MMMDLXX", + "3571": "MMMDLXXI", + "3572": "MMMDLXXII", + "3573": "MMMDLXXIII", + "3574": "MMMDLXXIV", + "3575": "MMMDLXXV", + "3576": "MMMDLXXVI", + "3577": "MMMDLXXVII", + "3578": "MMMDLXXVIII", + "3579": "MMMDLXXIX", + "3580": "MMMDLXXX", + "3581": "MMMDLXXXI", + "3582": "MMMDLXXXII", + "3583": "MMMDLXXXIII", + "3584": "MMMDLXXXIV", + "3585": "MMMDLXXXV", + "3586": "MMMDLXXXVI", + "3587": "MMMDLXXXVII", + "3588": "MMMDLXXXVIII", + "3589": "MMMDLXXXIX", + "3590": "MMMDXC", + "3591": "MMMDXCI", + "3592": "MMMDXCII", + "3593": "MMMDXCIII", + "3594": "MMMDXCIV", + "3595": "MMMDXCV", + "3596": "MMMDXCVI", + "3597": "MMMDXCVII", + "3598": "MMMDXCVIII", + "3599": "MMMDXCIX", + "3600": "MMMDC", + "3601": "MMMDCI", + "3602": "MMMDCII", + "3603": "MMMDCIII", + "3604": "MMMDCIV", + "3605": "MMMDCV", + "3606": "MMMDCVI", + "3607": "MMMDCVII", + "3608": "MMMDCVIII", + "3609": "MMMDCIX", + "3610": "MMMDCX", + "3611": "MMMDCXI", + "3612": "MMMDCXII", + "3613": "MMMDCXIII", + "3614": "MMMDCXIV", + "3615": "MMMDCXV", + "3616": "MMMDCXVI", + "3617": "MMMDCXVII", + "3618": "MMMDCXVIII", + "3619": "MMMDCXIX", + "3620": "MMMDCXX", + "3621": "MMMDCXXI", + "3622": "MMMDCXXII", + "3623": "MMMDCXXIII", + "3624": "MMMDCXXIV", + "3625": "MMMDCXXV", + "3626": "MMMDCXXVI", + "3627": "MMMDCXXVII", + "3628": "MMMDCXXVIII", + "3629": "MMMDCXXIX", + "3630": "MMMDCXXX", + "3631": "MMMDCXXXI", + "3632": "MMMDCXXXII", + "3633": "MMMDCXXXIII", + "3634": "MMMDCXXXIV", + "3635": "MMMDCXXXV", + "3636": "MMMDCXXXVI", + "3637": "MMMDCXXXVII", + "3638": "MMMDCXXXVIII", + "3639": "MMMDCXXXIX", + "3640": "MMMDCXL", + "3641": "MMMDCXLI", + "3642": "MMMDCXLII", + "3643": "MMMDCXLIII", + "3644": "MMMDCXLIV", + "3645": "MMMDCXLV", + "3646": "MMMDCXLVI", + "3647": "MMMDCXLVII", + "3648": "MMMDCXLVIII", + "3649": "MMMDCXLIX", + "3650": "MMMDCL", + "3651": "MMMDCLI", + "3652": "MMMDCLII", + "3653": "MMMDCLIII", + "3654": "MMMDCLIV", + "3655": "MMMDCLV", + "3656": "MMMDCLVI", + "3657": "MMMDCLVII", + "3658": "MMMDCLVIII", + "3659": "MMMDCLIX", + "3660": "MMMDCLX", + "3661": "MMMDCLXI", + "3662": "MMMDCLXII", + "3663": "MMMDCLXIII", + "3664": "MMMDCLXIV", + "3665": "MMMDCLXV", + "3666": "MMMDCLXVI", + "3667": "MMMDCLXVII", + "3668": "MMMDCLXVIII", + "3669": "MMMDCLXIX", + "3670": "MMMDCLXX", + "3671": "MMMDCLXXI", + "3672": "MMMDCLXXII", + "3673": "MMMDCLXXIII", + "3674": "MMMDCLXXIV", + "3675": "MMMDCLXXV", + "3676": "MMMDCLXXVI", + "3677": "MMMDCLXXVII", + "3678": "MMMDCLXXVIII", + "3679": "MMMDCLXXIX", + "3680": "MMMDCLXXX", + "3681": "MMMDCLXXXI", + "3682": "MMMDCLXXXII", + "3683": "MMMDCLXXXIII", + "3684": "MMMDCLXXXIV", + "3685": "MMMDCLXXXV", + "3686": "MMMDCLXXXVI", + "3687": "MMMDCLXXXVII", + "3688": "MMMDCLXXXVIII", + "3689": "MMMDCLXXXIX", + "3690": "MMMDCXC", + "3691": "MMMDCXCI", + "3692": "MMMDCXCII", + "3693": "MMMDCXCIII", + "3694": "MMMDCXCIV", + "3695": "MMMDCXCV", + "3696": "MMMDCXCVI", + "3697": "MMMDCXCVII", + "3698": "MMMDCXCVIII", + "3699": "MMMDCXCIX", + "3700": "MMMDCC", + "3701": "MMMDCCI", + "3702": "MMMDCCII", + "3703": "MMMDCCIII", + "3704": "MMMDCCIV", + "3705": "MMMDCCV", + "3706": "MMMDCCVI", + "3707": "MMMDCCVII", + "3708": "MMMDCCVIII", + "3709": "MMMDCCIX", + "3710": "MMMDCCX", + "3711": "MMMDCCXI", + "3712": "MMMDCCXII", + "3713": "MMMDCCXIII", + "3714": "MMMDCCXIV", + "3715": "MMMDCCXV", + "3716": "MMMDCCXVI", + "3717": "MMMDCCXVII", + "3718": "MMMDCCXVIII", + "3719": "MMMDCCXIX", + "3720": "MMMDCCXX", + "3721": "MMMDCCXXI", + "3722": "MMMDCCXXII", + "3723": "MMMDCCXXIII", + "3724": "MMMDCCXXIV", + "3725": "MMMDCCXXV", + "3726": "MMMDCCXXVI", + "3727": "MMMDCCXXVII", + "3728": "MMMDCCXXVIII", + "3729": "MMMDCCXXIX", + "3730": "MMMDCCXXX", + "3731": "MMMDCCXXXI", + "3732": "MMMDCCXXXII", + "3733": "MMMDCCXXXIII", + "3734": "MMMDCCXXXIV", + "3735": "MMMDCCXXXV", + "3736": "MMMDCCXXXVI", + "3737": "MMMDCCXXXVII", + "3738": "MMMDCCXXXVIII", + "3739": "MMMDCCXXXIX", + "3740": "MMMDCCXL", + "3741": "MMMDCCXLI", + "3742": "MMMDCCXLII", + "3743": "MMMDCCXLIII", + "3744": "MMMDCCXLIV", + "3745": "MMMDCCXLV", + "3746": "MMMDCCXLVI", + "3747": "MMMDCCXLVII", + "3748": "MMMDCCXLVIII", + "3749": "MMMDCCXLIX", + "3750": "MMMDCCL", + "3751": "MMMDCCLI", + "3752": "MMMDCCLII", + "3753": "MMMDCCLIII", + "3754": "MMMDCCLIV", + "3755": "MMMDCCLV", + "3756": "MMMDCCLVI", + "3757": "MMMDCCLVII", + "3758": "MMMDCCLVIII", + "3759": "MMMDCCLIX", + "3760": "MMMDCCLX", + "3761": "MMMDCCLXI", + "3762": "MMMDCCLXII", + "3763": "MMMDCCLXIII", + "3764": "MMMDCCLXIV", + "3765": "MMMDCCLXV", + "3766": "MMMDCCLXVI", + "3767": "MMMDCCLXVII", + "3768": "MMMDCCLXVIII", + "3769": "MMMDCCLXIX", + "3770": "MMMDCCLXX", + "3771": "MMMDCCLXXI", + "3772": "MMMDCCLXXII", + "3773": "MMMDCCLXXIII", + "3774": "MMMDCCLXXIV", + "3775": "MMMDCCLXXV", + "3776": "MMMDCCLXXVI", + "3777": "MMMDCCLXXVII", + "3778": "MMMDCCLXXVIII", + "3779": "MMMDCCLXXIX", + "3780": "MMMDCCLXXX", + "3781": "MMMDCCLXXXI", + "3782": "MMMDCCLXXXII", + "3783": "MMMDCCLXXXIII", + "3784": "MMMDCCLXXXIV", + "3785": "MMMDCCLXXXV", + "3786": "MMMDCCLXXXVI", + "3787": "MMMDCCLXXXVII", + "3788": "MMMDCCLXXXVIII", + "3789": "MMMDCCLXXXIX", + "3790": "MMMDCCXC", + "3791": "MMMDCCXCI", + "3792": "MMMDCCXCII", + "3793": "MMMDCCXCIII", + "3794": "MMMDCCXCIV", + "3795": "MMMDCCXCV", + "3796": "MMMDCCXCVI", + "3797": "MMMDCCXCVII", + "3798": "MMMDCCXCVIII", + "3799": "MMMDCCXCIX", + "3800": "MMMDCCC", + "3801": "MMMDCCCI", + "3802": "MMMDCCCII", + "3803": "MMMDCCCIII", + "3804": "MMMDCCCIV", + "3805": "MMMDCCCV", + "3806": "MMMDCCCVI", + "3807": "MMMDCCCVII", + "3808": "MMMDCCCVIII", + "3809": "MMMDCCCIX", + "3810": "MMMDCCCX", + "3811": "MMMDCCCXI", + "3812": "MMMDCCCXII", + "3813": "MMMDCCCXIII", + "3814": "MMMDCCCXIV", + "3815": "MMMDCCCXV", + "3816": "MMMDCCCXVI", + "3817": "MMMDCCCXVII", + "3818": "MMMDCCCXVIII", + "3819": "MMMDCCCXIX", + "3820": "MMMDCCCXX", + "3821": "MMMDCCCXXI", + "3822": "MMMDCCCXXII", + "3823": "MMMDCCCXXIII", + "3824": "MMMDCCCXXIV", + "3825": "MMMDCCCXXV", + "3826": "MMMDCCCXXVI", + "3827": "MMMDCCCXXVII", + "3828": "MMMDCCCXXVIII", + "3829": "MMMDCCCXXIX", + "3830": "MMMDCCCXXX", + "3831": "MMMDCCCXXXI", + "3832": "MMMDCCCXXXII", + "3833": "MMMDCCCXXXIII", + "3834": "MMMDCCCXXXIV", + "3835": "MMMDCCCXXXV", + "3836": "MMMDCCCXXXVI", + "3837": "MMMDCCCXXXVII", + "3838": "MMMDCCCXXXVIII", + "3839": "MMMDCCCXXXIX", + "3840": "MMMDCCCXL", + "3841": "MMMDCCCXLI", + "3842": "MMMDCCCXLII", + "3843": "MMMDCCCXLIII", + "3844": "MMMDCCCXLIV", + "3845": "MMMDCCCXLV", + "3846": "MMMDCCCXLVI", + "3847": "MMMDCCCXLVII", + "3848": "MMMDCCCXLVIII", + "3849": "MMMDCCCXLIX", + "3850": "MMMDCCCL", + "3851": "MMMDCCCLI", + "3852": "MMMDCCCLII", + "3853": "MMMDCCCLIII", + "3854": "MMMDCCCLIV", + "3855": "MMMDCCCLV", + "3856": "MMMDCCCLVI", + "3857": "MMMDCCCLVII", + "3858": "MMMDCCCLVIII", + "3859": "MMMDCCCLIX", + "3860": "MMMDCCCLX", + "3861": "MMMDCCCLXI", + "3862": "MMMDCCCLXII", + "3863": "MMMDCCCLXIII", + "3864": "MMMDCCCLXIV", + "3865": "MMMDCCCLXV", + "3866": "MMMDCCCLXVI", + "3867": "MMMDCCCLXVII", + "3868": "MMMDCCCLXVIII", + "3869": "MMMDCCCLXIX", + "3870": "MMMDCCCLXX", + "3871": "MMMDCCCLXXI", + "3872": "MMMDCCCLXXII", + "3873": "MMMDCCCLXXIII", + "3874": "MMMDCCCLXXIV", + "3875": "MMMDCCCLXXV", + "3876": "MMMDCCCLXXVI", + "3877": "MMMDCCCLXXVII", + "3878": "MMMDCCCLXXVIII", + "3879": "MMMDCCCLXXIX", + "3880": "MMMDCCCLXXX", + "3881": "MMMDCCCLXXXI", + "3882": "MMMDCCCLXXXII", + "3883": "MMMDCCCLXXXIII", + "3884": "MMMDCCCLXXXIV", + "3885": "MMMDCCCLXXXV", + "3886": "MMMDCCCLXXXVI", + "3887": "MMMDCCCLXXXVII", + "3888": "MMMDCCCLXXXVIII", + "3889": "MMMDCCCLXXXIX", + "3890": "MMMDCCCXC", + "3891": "MMMDCCCXCI", + "3892": "MMMDCCCXCII", + "3893": "MMMDCCCXCIII", + "3894": "MMMDCCCXCIV", + "3895": "MMMDCCCXCV", + "3896": "MMMDCCCXCVI", + "3897": "MMMDCCCXCVII", + "3898": "MMMDCCCXCVIII", + "3899": "MMMDCCCXCIX", + "3900": "MMMCM", + "3901": "MMMCMI", + "3902": "MMMCMII", + "3903": "MMMCMIII", + "3904": "MMMCMIV", + "3905": "MMMCMV", + "3906": "MMMCMVI", + "3907": "MMMCMVII", + "3908": "MMMCMVIII", + "3909": "MMMCMIX", + "3910": "MMMCMX", + "3911": "MMMCMXI", + "3912": "MMMCMXII", + "3913": "MMMCMXIII", + "3914": "MMMCMXIV", + "3915": "MMMCMXV", + "3916": "MMMCMXVI", + "3917": "MMMCMXVII", + "3918": "MMMCMXVIII", + "3919": "MMMCMXIX", + "3920": "MMMCMXX", + "3921": "MMMCMXXI", + "3922": "MMMCMXXII", + "3923": "MMMCMXXIII", + "3924": "MMMCMXXIV", + "3925": "MMMCMXXV", + "3926": "MMMCMXXVI", + "3927": "MMMCMXXVII", + "3928": "MMMCMXXVIII", + "3929": "MMMCMXXIX", + "3930": "MMMCMXXX", + "3931": "MMMCMXXXI", + "3932": "MMMCMXXXII", + "3933": "MMMCMXXXIII", + "3934": "MMMCMXXXIV", + "3935": "MMMCMXXXV", + "3936": "MMMCMXXXVI", + "3937": "MMMCMXXXVII", + "3938": "MMMCMXXXVIII", + "3939": "MMMCMXXXIX", + "3940": "MMMCMXL", + "3941": "MMMCMXLI", + "3942": "MMMCMXLII", + "3943": "MMMCMXLIII", + "3944": "MMMCMXLIV", + "3945": "MMMCMXLV", + "3946": "MMMCMXLVI", + "3947": "MMMCMXLVII", + "3948": "MMMCMXLVIII", + "3949": "MMMCMXLIX", + "3950": "MMMCML", + "3951": "MMMCMLI", + "3952": "MMMCMLII", + "3953": "MMMCMLIII", + "3954": "MMMCMLIV", + "3955": "MMMCMLV", + "3956": "MMMCMLVI", + "3957": "MMMCMLVII", + "3958": "MMMCMLVIII", + "3959": "MMMCMLIX", + "3960": "MMMCMLX", + "3961": "MMMCMLXI", + "3962": "MMMCMLXII", + "3963": "MMMCMLXIII", + "3964": "MMMCMLXIV", + "3965": "MMMCMLXV", + "3966": "MMMCMLXVI", + "3967": "MMMCMLXVII", + "3968": "MMMCMLXVIII", + "3969": "MMMCMLXIX", + "3970": "MMMCMLXX", + "3971": "MMMCMLXXI", + "3972": "MMMCMLXXII", + "3973": "MMMCMLXXIII", + "3974": "MMMCMLXXIV", + "3975": "MMMCMLXXV", + "3976": "MMMCMLXXVI", + "3977": "MMMCMLXXVII", + "3978": "MMMCMLXXVIII", + "3979": "MMMCMLXXIX", + "3980": "MMMCMLXXX", + "3981": "MMMCMLXXXI", + "3982": "MMMCMLXXXII", + "3983": "MMMCMLXXXIII", + "3984": "MMMCMLXXXIV", + "3985": "MMMCMLXXXV", + "3986": "MMMCMLXXXVI", + "3987": "MMMCMLXXXVII", + "3988": "MMMCMLXXXVIII", + "3989": "MMMCMLXXXIX", + "3990": "MMMCMXC", + "3991": "MMMCMXCI", + "3992": "MMMCMXCII", + "3993": "MMMCMXCIII", + "3994": "MMMCMXCIV", + "3995": "MMMCMXCV", + "3996": "MMMCMXCVI", + "3997": "MMMCMXCVII", + "3998": "MMMCMXCVIII", + "3999": "MMMCMXCIX", + "4000": "MMMM", + "4001": "MMMMI", + "4002": "MMMMII", + "4003": "MMMMIII", + "4004": "MMMMIV", + "4005": "MMMMV", + "4006": "MMMMVI", + "4007": "MMMMVII", + "4008": "MMMMVIII", + "4009": "MMMMIX", + "4010": "MMMMX", + "4011": "MMMMXI", + "4012": "MMMMXII", + "4013": "MMMMXIII", + "4014": "MMMMXIV", + "4015": "MMMMXV", + "4016": "MMMMXVI", + "4017": "MMMMXVII", + "4018": "MMMMXVIII", + "4019": "MMMMXIX", + "4020": "MMMMXX", + "4021": "MMMMXXI", + "4022": "MMMMXXII", + "4023": "MMMMXXIII", + "4024": "MMMMXXIV", + "4025": "MMMMXXV", + "4026": "MMMMXXVI", + "4027": "MMMMXXVII", + "4028": "MMMMXXVIII", + "4029": "MMMMXXIX", + "4030": "MMMMXXX", + "4031": "MMMMXXXI", + "4032": "MMMMXXXII", + "4033": "MMMMXXXIII", + "4034": "MMMMXXXIV", + "4035": "MMMMXXXV", + "4036": "MMMMXXXVI", + "4037": "MMMMXXXVII", + "4038": "MMMMXXXVIII", + "4039": "MMMMXXXIX", + "4040": "MMMMXL", + "4041": "MMMMXLI", + "4042": "MMMMXLII", + "4043": "MMMMXLIII", + "4044": "MMMMXLIV", + "4045": "MMMMXLV", + "4046": "MMMMXLVI", + "4047": "MMMMXLVII", + "4048": "MMMMXLVIII", + "4049": "MMMMXLIX", + "4050": "MMMML", + "4051": "MMMMLI", + "4052": "MMMMLII", + "4053": "MMMMLIII", + "4054": "MMMMLIV", + "4055": "MMMMLV", + "4056": "MMMMLVI", + "4057": "MMMMLVII", + "4058": "MMMMLVIII", + "4059": "MMMMLIX", + "4060": "MMMMLX", + "4061": "MMMMLXI", + "4062": "MMMMLXII", + "4063": "MMMMLXIII", + "4064": "MMMMLXIV", + "4065": "MMMMLXV", + "4066": "MMMMLXVI", + "4067": "MMMMLXVII", + "4068": "MMMMLXVIII", + "4069": "MMMMLXIX", + "4070": "MMMMLXX", + "4071": "MMMMLXXI", + "4072": "MMMMLXXII", + "4073": "MMMMLXXIII", + "4074": "MMMMLXXIV", + "4075": "MMMMLXXV", + "4076": "MMMMLXXVI", + "4077": "MMMMLXXVII", + "4078": "MMMMLXXVIII", + "4079": "MMMMLXXIX", + "4080": "MMMMLXXX", + "4081": "MMMMLXXXI", + "4082": "MMMMLXXXII", + "4083": "MMMMLXXXIII", + "4084": "MMMMLXXXIV", + "4085": "MMMMLXXXV", + "4086": "MMMMLXXXVI", + "4087": "MMMMLXXXVII", + "4088": "MMMMLXXXVIII", + "4089": "MMMMLXXXIX", + "4090": "MMMMXC", + "4091": "MMMMXCI", + "4092": "MMMMXCII", + "4093": "MMMMXCIII", + "4094": "MMMMXCIV", + "4095": "MMMMXCV", + "4096": "MMMMXCVI", + "4097": "MMMMXCVII", + "4098": "MMMMXCVIII", + "4099": "MMMMXCIX", + "4100": "MMMMC", + "4101": "MMMMCI", + "4102": "MMMMCII", + "4103": "MMMMCIII", + "4104": "MMMMCIV", + "4105": "MMMMCV", + "4106": "MMMMCVI", + "4107": "MMMMCVII", + "4108": "MMMMCVIII", + "4109": "MMMMCIX", + "4110": "MMMMCX", + "4111": "MMMMCXI", + "4112": "MMMMCXII", + "4113": "MMMMCXIII", + "4114": "MMMMCXIV", + "4115": "MMMMCXV", + "4116": "MMMMCXVI", + "4117": "MMMMCXVII", + "4118": "MMMMCXVIII", + "4119": "MMMMCXIX", + "4120": "MMMMCXX", + "4121": "MMMMCXXI", + "4122": "MMMMCXXII", + "4123": "MMMMCXXIII", + "4124": "MMMMCXXIV", + "4125": "MMMMCXXV", + "4126": "MMMMCXXVI", + "4127": "MMMMCXXVII", + "4128": "MMMMCXXVIII", + "4129": "MMMMCXXIX", + "4130": "MMMMCXXX", + "4131": "MMMMCXXXI", + "4132": "MMMMCXXXII", + "4133": "MMMMCXXXIII", + "4134": "MMMMCXXXIV", + "4135": "MMMMCXXXV", + "4136": "MMMMCXXXVI", + "4137": "MMMMCXXXVII", + "4138": "MMMMCXXXVIII", + "4139": "MMMMCXXXIX", + "4140": "MMMMCXL", + "4141": "MMMMCXLI", + "4142": "MMMMCXLII", + "4143": "MMMMCXLIII", + "4144": "MMMMCXLIV", + "4145": "MMMMCXLV", + "4146": "MMMMCXLVI", + "4147": "MMMMCXLVII", + "4148": "MMMMCXLVIII", + "4149": "MMMMCXLIX", + "4150": "MMMMCL", + "4151": "MMMMCLI", + "4152": "MMMMCLII", + "4153": "MMMMCLIII", + "4154": "MMMMCLIV", + "4155": "MMMMCLV", + "4156": "MMMMCLVI", + "4157": "MMMMCLVII", + "4158": "MMMMCLVIII", + "4159": "MMMMCLIX", + "4160": "MMMMCLX", + "4161": "MMMMCLXI", + "4162": "MMMMCLXII", + "4163": "MMMMCLXIII", + "4164": "MMMMCLXIV", + "4165": "MMMMCLXV", + "4166": "MMMMCLXVI", + "4167": "MMMMCLXVII", + "4168": "MMMMCLXVIII", + "4169": "MMMMCLXIX", + "4170": "MMMMCLXX", + "4171": "MMMMCLXXI", + "4172": "MMMMCLXXII", + "4173": "MMMMCLXXIII", + "4174": "MMMMCLXXIV", + "4175": "MMMMCLXXV", + "4176": "MMMMCLXXVI", + "4177": "MMMMCLXXVII", + "4178": "MMMMCLXXVIII", + "4179": "MMMMCLXXIX", + "4180": "MMMMCLXXX", + "4181": "MMMMCLXXXI", + "4182": "MMMMCLXXXII", + "4183": "MMMMCLXXXIII", + "4184": "MMMMCLXXXIV", + "4185": "MMMMCLXXXV", + "4186": "MMMMCLXXXVI", + "4187": "MMMMCLXXXVII", + "4188": "MMMMCLXXXVIII", + "4189": "MMMMCLXXXIX", + "4190": "MMMMCXC", + "4191": "MMMMCXCI", + "4192": "MMMMCXCII", + "4193": "MMMMCXCIII", + "4194": "MMMMCXCIV", + "4195": "MMMMCXCV", + "4196": "MMMMCXCVI", + "4197": "MMMMCXCVII", + "4198": "MMMMCXCVIII", + "4199": "MMMMCXCIX", + "4200": "MMMMCC", + "4201": "MMMMCCI", + "4202": "MMMMCCII", + "4203": "MMMMCCIII", + "4204": "MMMMCCIV", + "4205": "MMMMCCV", + "4206": "MMMMCCVI", + "4207": "MMMMCCVII", + "4208": "MMMMCCVIII", + "4209": "MMMMCCIX", + "4210": "MMMMCCX", + "4211": "MMMMCCXI", + "4212": "MMMMCCXII", + "4213": "MMMMCCXIII", + "4214": "MMMMCCXIV", + "4215": "MMMMCCXV", + "4216": "MMMMCCXVI", + "4217": "MMMMCCXVII", + "4218": "MMMMCCXVIII", + "4219": "MMMMCCXIX", + "4220": "MMMMCCXX", + "4221": "MMMMCCXXI", + "4222": "MMMMCCXXII", + "4223": "MMMMCCXXIII", + "4224": "MMMMCCXXIV", + "4225": "MMMMCCXXV", + "4226": "MMMMCCXXVI", + "4227": "MMMMCCXXVII", + "4228": "MMMMCCXXVIII", + "4229": "MMMMCCXXIX", + "4230": "MMMMCCXXX", + "4231": "MMMMCCXXXI", + "4232": "MMMMCCXXXII", + "4233": "MMMMCCXXXIII", + "4234": "MMMMCCXXXIV", + "4235": "MMMMCCXXXV", + "4236": "MMMMCCXXXVI", + "4237": "MMMMCCXXXVII", + "4238": "MMMMCCXXXVIII", + "4239": "MMMMCCXXXIX", + "4240": "MMMMCCXL", + "4241": "MMMMCCXLI", + "4242": "MMMMCCXLII", + "4243": "MMMMCCXLIII", + "4244": "MMMMCCXLIV", + "4245": "MMMMCCXLV", + "4246": "MMMMCCXLVI", + "4247": "MMMMCCXLVII", + "4248": "MMMMCCXLVIII", + "4249": "MMMMCCXLIX", + "4250": "MMMMCCL", + "4251": "MMMMCCLI", + "4252": "MMMMCCLII", + "4253": "MMMMCCLIII", + "4254": "MMMMCCLIV", + "4255": "MMMMCCLV", + "4256": "MMMMCCLVI", + "4257": "MMMMCCLVII", + "4258": "MMMMCCLVIII", + "4259": "MMMMCCLIX", + "4260": "MMMMCCLX", + "4261": "MMMMCCLXI", + "4262": "MMMMCCLXII", + "4263": "MMMMCCLXIII", + "4264": "MMMMCCLXIV", + "4265": "MMMMCCLXV", + "4266": "MMMMCCLXVI", + "4267": "MMMMCCLXVII", + "4268": "MMMMCCLXVIII", + "4269": "MMMMCCLXIX", + "4270": "MMMMCCLXX", + "4271": "MMMMCCLXXI", + "4272": "MMMMCCLXXII", + "4273": "MMMMCCLXXIII", + "4274": "MMMMCCLXXIV", + "4275": "MMMMCCLXXV", + "4276": "MMMMCCLXXVI", + "4277": "MMMMCCLXXVII", + "4278": "MMMMCCLXXVIII", + "4279": "MMMMCCLXXIX", + "4280": "MMMMCCLXXX", + "4281": "MMMMCCLXXXI", + "4282": "MMMMCCLXXXII", + "4283": "MMMMCCLXXXIII", + "4284": "MMMMCCLXXXIV", + "4285": "MMMMCCLXXXV", + "4286": "MMMMCCLXXXVI", + "4287": "MMMMCCLXXXVII", + "4288": "MMMMCCLXXXVIII", + "4289": "MMMMCCLXXXIX", + "4290": "MMMMCCXC", + "4291": "MMMMCCXCI", + "4292": "MMMMCCXCII", + "4293": "MMMMCCXCIII", + "4294": "MMMMCCXCIV", + "4295": "MMMMCCXCV", + "4296": "MMMMCCXCVI", + "4297": "MMMMCCXCVII", + "4298": "MMMMCCXCVIII", + "4299": "MMMMCCXCIX", + "4300": "MMMMCCC", + "4301": "MMMMCCCI", + "4302": "MMMMCCCII", + "4303": "MMMMCCCIII", + "4304": "MMMMCCCIV", + "4305": "MMMMCCCV", + "4306": "MMMMCCCVI", + "4307": "MMMMCCCVII", + "4308": "MMMMCCCVIII", + "4309": "MMMMCCCIX", + "4310": "MMMMCCCX", + "4311": "MMMMCCCXI", + "4312": "MMMMCCCXII", + "4313": "MMMMCCCXIII", + "4314": "MMMMCCCXIV", + "4315": "MMMMCCCXV", + "4316": "MMMMCCCXVI", + "4317": "MMMMCCCXVII", + "4318": "MMMMCCCXVIII", + "4319": "MMMMCCCXIX", + "4320": "MMMMCCCXX", + "4321": "MMMMCCCXXI", + "4322": "MMMMCCCXXII", + "4323": "MMMMCCCXXIII", + "4324": "MMMMCCCXXIV", + "4325": "MMMMCCCXXV", + "4326": "MMMMCCCXXVI", + "4327": "MMMMCCCXXVII", + "4328": "MMMMCCCXXVIII", + "4329": "MMMMCCCXXIX", + "4330": "MMMMCCCXXX", + "4331": "MMMMCCCXXXI", + "4332": "MMMMCCCXXXII", + "4333": "MMMMCCCXXXIII", + "4334": "MMMMCCCXXXIV", + "4335": "MMMMCCCXXXV", + "4336": "MMMMCCCXXXVI", + "4337": "MMMMCCCXXXVII", + "4338": "MMMMCCCXXXVIII", + "4339": "MMMMCCCXXXIX", + "4340": "MMMMCCCXL", + "4341": "MMMMCCCXLI", + "4342": "MMMMCCCXLII", + "4343": "MMMMCCCXLIII", + "4344": "MMMMCCCXLIV", + "4345": "MMMMCCCXLV", + "4346": "MMMMCCCXLVI", + "4347": "MMMMCCCXLVII", + "4348": "MMMMCCCXLVIII", + "4349": "MMMMCCCXLIX", + "4350": "MMMMCCCL", + "4351": "MMMMCCCLI", + "4352": "MMMMCCCLII", + "4353": "MMMMCCCLIII", + "4354": "MMMMCCCLIV", + "4355": "MMMMCCCLV", + "4356": "MMMMCCCLVI", + "4357": "MMMMCCCLVII", + "4358": "MMMMCCCLVIII", + "4359": "MMMMCCCLIX", + "4360": "MMMMCCCLX", + "4361": "MMMMCCCLXI", + "4362": "MMMMCCCLXII", + "4363": "MMMMCCCLXIII", + "4364": "MMMMCCCLXIV", + "4365": "MMMMCCCLXV", + "4366": "MMMMCCCLXVI", + "4367": "MMMMCCCLXVII", + "4368": "MMMMCCCLXVIII", + "4369": "MMMMCCCLXIX", + "4370": "MMMMCCCLXX", + "4371": "MMMMCCCLXXI", + "4372": "MMMMCCCLXXII", + "4373": "MMMMCCCLXXIII", + "4374": "MMMMCCCLXXIV", + "4375": "MMMMCCCLXXV", + "4376": "MMMMCCCLXXVI", + "4377": "MMMMCCCLXXVII", + "4378": "MMMMCCCLXXVIII", + "4379": "MMMMCCCLXXIX", + "4380": "MMMMCCCLXXX", + "4381": "MMMMCCCLXXXI", + "4382": "MMMMCCCLXXXII", + "4383": "MMMMCCCLXXXIII", + "4384": "MMMMCCCLXXXIV", + "4385": "MMMMCCCLXXXV", + "4386": "MMMMCCCLXXXVI", + "4387": "MMMMCCCLXXXVII", + "4388": "MMMMCCCLXXXVIII", + "4389": "MMMMCCCLXXXIX", + "4390": "MMMMCCCXC", + "4391": "MMMMCCCXCI", + "4392": "MMMMCCCXCII", + "4393": "MMMMCCCXCIII", + "4394": "MMMMCCCXCIV", + "4395": "MMMMCCCXCV", + "4396": "MMMMCCCXCVI", + "4397": "MMMMCCCXCVII", + "4398": "MMMMCCCXCVIII", + "4399": "MMMMCCCXCIX", + "4400": "MMMMCD", + "4401": "MMMMCDI", + "4402": "MMMMCDII", + "4403": "MMMMCDIII", + "4404": "MMMMCDIV", + "4405": "MMMMCDV", + "4406": "MMMMCDVI", + "4407": "MMMMCDVII", + "4408": "MMMMCDVIII", + "4409": "MMMMCDIX", + "4410": "MMMMCDX", + "4411": "MMMMCDXI", + "4412": "MMMMCDXII", + "4413": "MMMMCDXIII", + "4414": "MMMMCDXIV", + "4415": "MMMMCDXV", + "4416": "MMMMCDXVI", + "4417": "MMMMCDXVII", + "4418": "MMMMCDXVIII", + "4419": "MMMMCDXIX", + "4420": "MMMMCDXX", + "4421": "MMMMCDXXI", + "4422": "MMMMCDXXII", + "4423": "MMMMCDXXIII", + "4424": "MMMMCDXXIV", + "4425": "MMMMCDXXV", + "4426": "MMMMCDXXVI", + "4427": "MMMMCDXXVII", + "4428": "MMMMCDXXVIII", + "4429": "MMMMCDXXIX", + "4430": "MMMMCDXXX", + "4431": "MMMMCDXXXI", + "4432": "MMMMCDXXXII", + "4433": "MMMMCDXXXIII", + "4434": "MMMMCDXXXIV", + "4435": "MMMMCDXXXV", + "4436": "MMMMCDXXXVI", + "4437": "MMMMCDXXXVII", + "4438": "MMMMCDXXXVIII", + "4439": "MMMMCDXXXIX", + "4440": "MMMMCDXL", + "4441": "MMMMCDXLI", + "4442": "MMMMCDXLII", + "4443": "MMMMCDXLIII", + "4444": "MMMMCDXLIV", + "4445": "MMMMCDXLV", + "4446": "MMMMCDXLVI", + "4447": "MMMMCDXLVII", + "4448": "MMMMCDXLVIII", + "4449": "MMMMCDXLIX", + "4450": "MMMMCDL", + "4451": "MMMMCDLI", + "4452": "MMMMCDLII", + "4453": "MMMMCDLIII", + "4454": "MMMMCDLIV", + "4455": "MMMMCDLV", + "4456": "MMMMCDLVI", + "4457": "MMMMCDLVII", + "4458": "MMMMCDLVIII", + "4459": "MMMMCDLIX", + "4460": "MMMMCDLX", + "4461": "MMMMCDLXI", + "4462": "MMMMCDLXII", + "4463": "MMMMCDLXIII", + "4464": "MMMMCDLXIV", + "4465": "MMMMCDLXV", + "4466": "MMMMCDLXVI", + "4467": "MMMMCDLXVII", + "4468": "MMMMCDLXVIII", + "4469": "MMMMCDLXIX", + "4470": "MMMMCDLXX", + "4471": "MMMMCDLXXI", + "4472": "MMMMCDLXXII", + "4473": "MMMMCDLXXIII", + "4474": "MMMMCDLXXIV", + "4475": "MMMMCDLXXV", + "4476": "MMMMCDLXXVI", + "4477": "MMMMCDLXXVII", + "4478": "MMMMCDLXXVIII", + "4479": "MMMMCDLXXIX", + "4480": "MMMMCDLXXX", + "4481": "MMMMCDLXXXI", + "4482": "MMMMCDLXXXII", + "4483": "MMMMCDLXXXIII", + "4484": "MMMMCDLXXXIV", + "4485": "MMMMCDLXXXV", + "4486": "MMMMCDLXXXVI", + "4487": "MMMMCDLXXXVII", + "4488": "MMMMCDLXXXVIII", + "4489": "MMMMCDLXXXIX", + "4490": "MMMMCDXC", + "4491": "MMMMCDXCI", + "4492": "MMMMCDXCII", + "4493": "MMMMCDXCIII", + "4494": "MMMMCDXCIV", + "4495": "MMMMCDXCV", + "4496": "MMMMCDXCVI", + "4497": "MMMMCDXCVII", + "4498": "MMMMCDXCVIII", + "4499": "MMMMCDXCIX", + "4500": "MMMMD" +} \ No newline at end of file diff --git a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index 2f50a8cf2..1a2bf3432 100644 --- a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -297,6 +297,7 @@ + @@ -385,6 +386,9 @@ + + Always + diff --git a/src/NzbDrone.Core.Test/ParserTests/RomanNumeralTests/RomanNumeralConversionFixture.cs b/src/NzbDrone.Core.Test/ParserTests/RomanNumeralTests/RomanNumeralConversionFixture.cs new file mode 100644 index 000000000..348ec221f --- /dev/null +++ b/src/NzbDrone.Core.Test/ParserTests/RomanNumeralTests/RomanNumeralConversionFixture.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using Newtonsoft.Json; +using NUnit.Framework; +using NzbDrone.Core.Parser.RomanNumerals; + +namespace NzbDrone.Core.Test.ParserTests.RomanNumeralTests +{ + [TestFixture] + public class RomanNumeralConversionFixture + { + private const string TEST_VALUES = @"Files/ArabicRomanNumeralDictionary.JSON"; + + + private Dictionary _arabicToRomanNumeralsMapping; + + [OneTimeSetUp] + public void PopulateDictionaryWithProvenValues() + { + var pathToTestValues = Path.Combine(TestContext.CurrentContext.TestDirectory, Path.Combine(TEST_VALUES.Split('/'))); + _arabicToRomanNumeralsMapping = + JsonConvert.DeserializeObject>(File.ReadAllText(pathToTestValues)); + } + + + [Test(Description = "Converts the supported range [1-3999] of Arabic to Roman numerals.")] + [Order(0)] + public void should_convert_arabic_numeral_to_roman_numeral([Range(1,3999)] int arabicNumeral) + { + RomanNumeral romanNumeral = new RomanNumeral(arabicNumeral); + + string expectedValue = _arabicToRomanNumeralsMapping[arabicNumeral]; + + Assert.AreEqual(romanNumeral.ToRomanNumeral(), expectedValue); + } + + [Test] + [Order(1)] + public void should_convert_roman_numeral_to_arabic_numeral([Range(1, 3999)] int arabicNumeral) + { + RomanNumeral romanNumeral = new RomanNumeral(_arabicToRomanNumeralsMapping[arabicNumeral]); + + int expectecdValue = arabicNumeral; + + Assert.AreEqual(romanNumeral.ToInt(), expectecdValue); + } + + + + } +} diff --git a/src/NzbDrone.Core/DecisionEngine/DownloadDecisionMaker.cs b/src/NzbDrone.Core/DecisionEngine/DownloadDecisionMaker.cs index 18d8f3513..a43b408b9 100644 --- a/src/NzbDrone.Core/DecisionEngine/DownloadDecisionMaker.cs +++ b/src/NzbDrone.Core/DecisionEngine/DownloadDecisionMaker.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using NLog; diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index f95c7572d..13c1bcb76 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -992,6 +992,12 @@ + + + + + + diff --git a/src/NzbDrone.Core/Parser/ParsingService.cs b/src/NzbDrone.Core/Parser/ParsingService.cs index cd8086d1e..1090e9895 100644 --- a/src/NzbDrone.Core/Parser/ParsingService.cs +++ b/src/NzbDrone.Core/Parser/ParsingService.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.IO; using System.Linq; using NLog; @@ -7,6 +8,7 @@ using NzbDrone.Core.DataAugmentation.Scene; using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Parser.Model; +using NzbDrone.Core.Parser.RomanNumerals; using NzbDrone.Core.Tv; namespace NzbDrone.Core.Parser @@ -33,20 +35,7 @@ namespace NzbDrone.Core.Parser private readonly ISceneMappingService _sceneMappingService; private readonly IMovieService _movieService; private readonly Logger _logger; - private readonly Dictionary romanNumeralsMapper = new Dictionary - { - { "1", "I"}, - { "2", "II"}, - { "3", "III"}, - { "4", "IV"}, - { "5", "V"}, - { "6", "VI"}, - { "7", "VII"}, - { "8", "VII"}, - { "9", "IX"}, - { "10", "X"}, - - }; //If a movie has more than 10 parts fuck 'em. + private static HashSet _arabicRomanNumeralMappings; public ParsingService(IEpisodeService episodeService, ISeriesService seriesService, @@ -59,6 +48,11 @@ namespace NzbDrone.Core.Parser _sceneMappingService = sceneMappingService; _movieService = movieService; _logger = logger; + + if (_arabicRomanNumeralMappings == null) + { + _arabicRomanNumeralMappings = RomanNumeralParser.GetArabicRomanNumeralsMapping(); + } } public LocalEpisode GetLocalEpisode(string filename, Series series) @@ -354,91 +348,113 @@ namespace NzbDrone.Core.Parser private Movie GetMovie(ParsedMovieInfo parsedMovieInfo, string imdbId, SearchCriteriaBase searchCriteria) { - if (searchCriteria != null) + // TODO: Answer me this: Wouldn't it be smarter to start out looking for a movie if we have an ImDb Id? + if (!String.IsNullOrWhiteSpace(imdbId)) { - var possibleTitles = new List(); - - Movie possibleMovie = null; - - possibleTitles.Add(searchCriteria.Movie.CleanTitle); - - foreach (string altTitle in searchCriteria.Movie.AlternativeTitles) + Movie movieByImDb; + if (TryGetMovieByImDbId(parsedMovieInfo, imdbId, out movieByImDb)) { - possibleTitles.Add(altTitle.CleanSeriesTitle()); + return movieByImDb; } + } - foreach (string title in possibleTitles) + if (searchCriteria != null) + { + Movie movieBySearchCriteria; + if (TryGetMovieBySearchCriteria(parsedMovieInfo, searchCriteria, out movieBySearchCriteria)) { - if (title == parsedMovieInfo.MovieTitle.CleanSeriesTitle()) - { - possibleMovie = searchCriteria.Movie; - } + return movieBySearchCriteria; + } + } + else + { + Movie movieByTitleAndOrYear; + if (TryGetMovieByTitleAndOrYear(parsedMovieInfo, out movieByTitleAndOrYear)) + { + return movieByTitleAndOrYear; + } + } - foreach (KeyValuePair entry in romanNumeralsMapper) - { - string num = entry.Key; - string roman = entry.Value.ToLower(); + // nothing found up to here => logging that and returning null + _logger.Debug($"No matching movie {parsedMovieInfo.MovieTitle}"); + return null; + } - if (title.Replace(num, roman) == parsedMovieInfo.MovieTitle.CleanSeriesTitle()) - { - possibleMovie = searchCriteria.Movie; - } + private bool TryGetMovieByImDbId(ParsedMovieInfo parsedMovieInfo, string imdbId, out Movie movie) + { + movie = _movieService.FindByImdbId(imdbId); + //Should fix practically all problems, where indexer is shite at adding correct imdbids to movies. + if (movie != null && parsedMovieInfo.Year > 1800 && parsedMovieInfo.Year != movie.Year) + { + movie = null; + return false; + } + return movie != null; + } - if (title.Replace(roman, num) == parsedMovieInfo.MovieTitle.CleanSeriesTitle()) - { - possibleMovie = searchCriteria.Movie; - } - } + private bool TryGetMovieByTitleAndOrYear(ParsedMovieInfo parsedMovieInfo, out Movie movieByTitleAndOrYear) + { + Func isNotNull = movie => movie != null; + if (parsedMovieInfo.Year > 1800) + { + movieByTitleAndOrYear = _movieService.FindByTitle(parsedMovieInfo.MovieTitle, parsedMovieInfo.Year); + if (isNotNull(movieByTitleAndOrYear)) + { + return true; } + } + movieByTitleAndOrYear = _movieService.FindByTitle(parsedMovieInfo.MovieTitle); + if (isNotNull(movieByTitleAndOrYear)) + { + return true; + } + movieByTitleAndOrYear = null; + return false; + } - if (possibleMovie != null && (parsedMovieInfo.Year < 1800 || possibleMovie.Year == parsedMovieInfo.Year)) - { - return possibleMovie; - } + private static bool TryGetMovieBySearchCriteria(ParsedMovieInfo parsedMovieInfo, SearchCriteriaBase searchCriteria, out Movie possibleMovie) + { + possibleMovie = null; + List possibleTitles = new List(); - - } + possibleTitles.Add(searchCriteria.Movie.CleanTitle); - Movie movie = null; + foreach (string altTitle in searchCriteria.Movie.AlternativeTitles) + { + possibleTitles.Add(altTitle.CleanSeriesTitle()); + } - if (searchCriteria == null) + foreach (string title in possibleTitles) { - if (parsedMovieInfo.Year > 1800) - { - movie = _movieService.FindByTitle(parsedMovieInfo.MovieTitle, parsedMovieInfo.Year); - } - else + if (title == parsedMovieInfo.MovieTitle.CleanSeriesTitle()) { - movie = _movieService.FindByTitle(parsedMovieInfo.MovieTitle); + possibleMovie = searchCriteria.Movie; } - if (movie == null) + foreach (ArabicRomanNumeral numeralMapping in _arabicRomanNumeralMappings) { - movie = _movieService.FindByTitle(parsedMovieInfo.MovieTitle); - } - // return movie; - } - + string arabicNumeral = numeralMapping.ArabicNumeralAsString; + string romanNumeral = numeralMapping.RomanNumeralLowerCase; + if (title.Replace(arabicNumeral, romanNumeral) == parsedMovieInfo.MovieTitle.CleanSeriesTitle()) + { + possibleMovie = searchCriteria.Movie; + } - if (movie == null && imdbId.IsNotNullOrWhiteSpace()) - { - movie = _movieService.FindByImdbId(imdbId); + if (title.Replace(romanNumeral, arabicNumeral) == parsedMovieInfo.MovieTitle.CleanSeriesTitle()) + { + possibleMovie = searchCriteria.Movie; + } - //Should fix practically all problems, where indexer is shite at adding correct imdbids to movies. - if (movie != null && parsedMovieInfo.Year > 1800 && parsedMovieInfo.Year != movie.Year) - { - movie = null; - } + } } - if (movie == null) + if (possibleMovie != null && (parsedMovieInfo.Year < 1800 || possibleMovie.Year == parsedMovieInfo.Year)) { - _logger.Debug($"No matching movie {parsedMovieInfo.MovieTitle}"); - return null; + return true; } - - return movie; + possibleMovie = null; + return false; } private Series GetSeries(ParsedEpisodeInfo parsedEpisodeInfo, int tvdbId, int tvRageId, SearchCriteriaBase searchCriteria) diff --git a/src/NzbDrone.Core/Parser/RomanNumerals/ArabicRomanNumeral.cs b/src/NzbDrone.Core/Parser/RomanNumerals/ArabicRomanNumeral.cs new file mode 100644 index 000000000..05f9f3fdd --- /dev/null +++ b/src/NzbDrone.Core/Parser/RomanNumerals/ArabicRomanNumeral.cs @@ -0,0 +1,18 @@ +namespace NzbDrone.Core.Parser.RomanNumerals +{ + public class ArabicRomanNumeral + { + public ArabicRomanNumeral(int arabicNumeral, string arabicNumeralAsString, string romanNumeral) + { + ArabicNumeral = arabicNumeral; + ArabicNumeralAsString = arabicNumeralAsString; + RomanNumeral = romanNumeral; + } + + public int ArabicNumeral { get; private set; } + public string ArabicNumeralAsString { get; private set; } + public string RomanNumeral { get; private set; } + + public string RomanNumeralLowerCase => RomanNumeral.ToLower(); + } +} diff --git a/src/NzbDrone.Core/Parser/RomanNumerals/IRomanNumeral.cs b/src/NzbDrone.Core/Parser/RomanNumerals/IRomanNumeral.cs new file mode 100644 index 000000000..063d81bd3 --- /dev/null +++ b/src/NzbDrone.Core/Parser/RomanNumerals/IRomanNumeral.cs @@ -0,0 +1,12 @@ +namespace NzbDrone.Core.Parser.RomanNumerals +{ + public interface IRomanNumeral + { + int CompareTo(object obj); + int CompareTo(RomanNumeral other); + bool Equals(RomanNumeral other); + int ToInt(); + long ToLong(); + string ToString(); + } +} \ No newline at end of file diff --git a/src/NzbDrone.Core/Parser/RomanNumerals/RomanNumeral.cs b/src/NzbDrone.Core/Parser/RomanNumerals/RomanNumeral.cs new file mode 100644 index 000000000..8a5fa6218 --- /dev/null +++ b/src/NzbDrone.Core/Parser/RomanNumerals/RomanNumeral.cs @@ -0,0 +1,357 @@ +using System; +using System.Text; + +namespace NzbDrone.Core.Parser.RomanNumerals +{ + /// + /// Represents the numeric system used in ancient Rome, employing combinations of letters from the Latin alphabet to signify values. + /// Implementation adapted from: http://www.c-sharpcorner.com/Blogs/14255/converting-to-and-from-roman-numerals.aspx + /// + public class RomanNumeral : IComparable, IComparable, IEquatable, IRomanNumeral + { + #region Fields + + /// + /// The numeric value of the roman numeral. + /// + private readonly int _value; + + /// + /// Represents the smallest possible value of an . This field is constant. + /// + public static readonly int MinValue = 1; + + /// + /// Represents the largest possible value of an . This field is constant. + /// + public static readonly int MaxValue = 3999; + + private static readonly string[] Thousands = { "MMM", "MM", "M" }; + private static readonly string[] Hundreds = { "CM", "DCCC", "DCC", "DC", "D", "CD", "CCC", "CC", "C" }; + private static readonly string[] Tens = { "XC", "LXXX", "LXX", "LX", "L", "XL", "XXX", "XX", "X" }; + private static readonly string[] Units = { "IX", "VIII", "VII", "VI", "V", "IV", "III", "II", "I" }; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public RomanNumeral() + { + _value = 1; + } + + /// + /// Initializes a new instance of the class. + /// + /// The value. + public RomanNumeral(int value) + { + _value = value; + } + + /// + /// Initializes a new instance of the class. + /// + /// The roman numeral. + public RomanNumeral(string romanNumeral) + { + int value; + + if (TryParse(romanNumeral, out value)) + { + _value = value; + } + } + + #endregion + + #region Methods + + /// + /// Converts this instance to an integer. + /// + /// A numeric int representation. + public int ToInt() + { + return _value; + } + + /// + /// Converts this instance to a long. + /// + /// A numeric long representation. + public long ToLong() + { + return _value; + } + + /// + /// Converts the string representation of a number to its 32-bit signed integer equivalent. A return value indicates whether the conversion succeeded. + /// + /// A string containing a number to convert. + /// When this method returns, contains the 32-bit signed integer value equivalent of the number contained in , + /// if the conversion succeeded, or zero if the conversion failed. The conversion fails if the parameter is null or + /// , is not of the correct format, or represents a number less than or greater than . This parameter is passed uninitialized. 1 + /// + /// true if was converted successfully; otherwise, false. + /// + public static bool TryParse(string text, out int value) + { + value = 0; + if (string.IsNullOrEmpty(text)) return false; + text = text.ToUpper(); + int len = 0; + + for (int i = 0; i < 3; i++) + { + if (text.StartsWith(Thousands[i])) + { + value += 1000 * (3 - i); + len = Thousands[i].Length; + break; + } + } + + if (len > 0) + { + text = text.Substring(len); + len = 0; + } + + for (int i = 0; i < 9; i++) + { + if (text.StartsWith(Hundreds[i])) + { + value += 100 * (9 - i); + len = Hundreds[i].Length; + break; + } + } + + if (len > 0) + { + text = text.Substring(len); + len = 0; + } + + for (int i = 0; i < 9; i++) + { + if (text.StartsWith(Tens[i])) + { + value += 10 * (9 - i); + len = Tens[i].Length; + break; + } + } + + if (len > 0) + { + text = text.Substring(len); + len = 0; + } + + for (int i = 0; i < 9; i++) + { + if (text.StartsWith(Units[i])) + { + value += 9 - i; + len = Units[i].Length; + break; + } + } + + if (text.Length > len) + { + value = 0; + return false; + } + + return true; + } + + /// + /// Converts a number into a roman numeral. + /// + /// The number. + /// + private static string ToRomanNumeral(int number) + { + RangeGuard(number); + int thousands, hundreds, tens, units; + thousands = number / 1000; + number %= 1000; + hundreds = number / 100; + number %= 100; + tens = number / 10; + units = number % 10; + var sb = new StringBuilder(); + if (thousands > 0) sb.Append(Thousands[3 - thousands]); + if (hundreds > 0) sb.Append(Hundreds[9 - hundreds]); + if (tens > 0) sb.Append(Tens[9 - tens]); + if (units > 0) sb.Append(Units[9 - units]); + return sb.ToString(); + } + + /// + /// Returns the Roman numeral that was passed in as either an Arabic numeral + /// or a Roman numeral. + /// + /// A representing a Roman Numeral + public string ToRomanNumeral() + { + return ToString(); + } + + /// + /// Determines whether a given number is within the valid range of values for a roman numeral. + /// + /// The number to validate. + /// + /// $Roman numerals can not be larger than {MaxValue}. + /// or + /// $Roman numerals can not be smaller than {MinValue}. + /// + private static void RangeGuard(int number) + { + if (number > MaxValue) + throw new ArgumentOutOfRangeException(nameof(number), number, + $"Roman numerals can not be larger than {MaxValue}."); + if (number < MinValue) + throw new ArgumentOutOfRangeException(nameof(number), number, + $"Roman numerals can not be smaller than {MinValue}."); + } + + #endregion + + #region Operators + + /// + /// Implements the operator *. + /// + /// The first numeral. + /// The second numeral. + /// + /// The result of the operator. + /// + public static RomanNumeral operator *(RomanNumeral firstNumeral, RomanNumeral secondNumeral) + { + return new RomanNumeral(firstNumeral._value * secondNumeral._value); + } + + /// + /// Implements the operator /. + /// + /// The numerator. + /// The denominator. + /// + /// The result of the operator. + /// + public static RomanNumeral operator /(RomanNumeral numerator, RomanNumeral denominator) + { + return new RomanNumeral(numerator._value / denominator._value); + } + + /// + /// Implements the operator +. + /// + /// The first numeral. + /// The second numeral. + /// + /// The result of the operator. + /// + public static RomanNumeral operator +(RomanNumeral firstNumeral, RomanNumeral secondNumeral) + { + return new RomanNumeral(firstNumeral._value + secondNumeral._value); + } + + /// + /// Implements the operator -. + /// + /// The first numeral. + /// The second numeral. + /// + /// The result of the operator. + /// + public static RomanNumeral operator -(RomanNumeral firstNumeral, RomanNumeral secondNumeral) + { + return new RomanNumeral(firstNumeral._value - secondNumeral._value); + } + + #endregion + + #region Interface Implementations + + /// + /// + /// The object. + /// + public int CompareTo(object obj) + { + if (obj is sbyte + || obj is byte + || obj is short + || obj is ushort + || obj is int + || obj is uint + || obj is long + || obj is ulong + || obj is float + || obj is double + || obj is decimal) + { + var value = (int)obj; + return _value.CompareTo(value); + } + else if (obj is string) + { + int value; + var numeral = obj as string; + + if (TryParse(numeral, out value)) + { + return _value.CompareTo(value); + } + } + + return 0; + } + + /// + /// Compares to. + /// + /// The other. + /// + public int CompareTo(RomanNumeral other) + { + return _value.CompareTo(other._value); + } + + /// + /// Equalses the specified other. + /// + /// The other. + /// + public bool Equals(RomanNumeral other) + { + return _value == other._value; + } + + /// + /// Returns the Roman Numeral which was passed to this Instance + /// during creation. + /// + /// + /// A that represents a Roman Numeral. + /// + public override string ToString() + { + return ToRomanNumeral(_value); + } + + #endregion + } + +} diff --git a/src/NzbDrone.Core/Parser/RomanNumerals/RomanNumeralParser.cs b/src/NzbDrone.Core/Parser/RomanNumerals/RomanNumeralParser.cs new file mode 100644 index 000000000..1989116b4 --- /dev/null +++ b/src/NzbDrone.Core/Parser/RomanNumerals/RomanNumeralParser.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NzbDrone.Common.Extensions; + +namespace NzbDrone.Core.Parser.RomanNumerals +{ + + + public static class RomanNumeralParser + { + private const int DICTIONARY_PREPOPULATION_SIZE = 20; + + private static HashSet _arabicRomanNumeralsMapping; + + private static Dictionary _simpleArabicNumeralMappings; + + static RomanNumeralParser() + { + PopluateDictionariesReasonablyLarge(); + } + + private static void PopluateDictionariesReasonablyLarge() + { + if(_simpleArabicNumeralMappings != null || _arabicRomanNumeralsMapping != null) + { + return; + } + _arabicRomanNumeralsMapping = new HashSet(); + _simpleArabicNumeralMappings = new Dictionary(); + foreach (int arabicNumeral in Enumerable.Range(1,DICTIONARY_PREPOPULATION_SIZE +1)) + { + string romanNumeralAsString, arabicNumeralAsString; + GenerateRomanNumerals(arabicNumeral, out romanNumeralAsString, out arabicNumeralAsString); + ArabicRomanNumeral arm = new ArabicRomanNumeral(arabicNumeral, arabicNumeralAsString, romanNumeralAsString); + _arabicRomanNumeralsMapping.Add(arm); + + SimpleArabicNumeral sam = new SimpleArabicNumeral(arabicNumeral); + SimpleRomanNumeral srm = new SimpleRomanNumeral(romanNumeralAsString); + _simpleArabicNumeralMappings.Add(sam, srm); + } + } + + private static void GenerateRomanNumerals(int arabicNumeral, out string romanNumeral, out string arabicNumeralAsString) + { + RomanNumeral romanNumeralObject = new RomanNumeral(arabicNumeral); + romanNumeral = romanNumeralObject.ToRomanNumeral(); + arabicNumeralAsString = Convert.ToString(arabicNumeral); + } + + private static HashSet GenerateAdditionalMappings(int offset, int length) + { + HashSet additionalArabicRomanNumerals = new HashSet(); + foreach (int arabicNumeral in Enumerable.Range(offset, length)) + { + string romanNumeral; + string arabicNumeralAsString; + GenerateRomanNumerals(arabicNumeral, out romanNumeral, out arabicNumeralAsString); + ArabicRomanNumeral arm = new ArabicRomanNumeral(arabicNumeral, arabicNumeralAsString, romanNumeral); + additionalArabicRomanNumerals.Add(arm); + } + return additionalArabicRomanNumerals; + } + + public static HashSet GetArabicRomanNumeralsMapping(int upToArabicNumber = DICTIONARY_PREPOPULATION_SIZE) + { + if (upToArabicNumber == DICTIONARY_PREPOPULATION_SIZE) + { + return new HashSet(_arabicRomanNumeralsMapping.Take(upToArabicNumber)); + } + + if (upToArabicNumber < DICTIONARY_PREPOPULATION_SIZE) + { + return + (HashSet) + new HashSet(_arabicRomanNumeralsMapping).Take(upToArabicNumber); + } + if (upToArabicNumber >= DICTIONARY_PREPOPULATION_SIZE) + { + if (_arabicRomanNumeralsMapping.Count >= upToArabicNumber) + { + return new HashSet(_arabicRomanNumeralsMapping.Take(upToArabicNumber)); + } + HashSet largerMapping = GenerateAdditionalMappings(DICTIONARY_PREPOPULATION_SIZE + 1, upToArabicNumber); + _arabicRomanNumeralsMapping = (HashSet)_arabicRomanNumeralsMapping.Union(largerMapping); + } + return _arabicRomanNumeralsMapping; + } + + public static Dictionary GetArabicRomanNumeralAsDictionary( + int upToArabicNumer = DICTIONARY_PREPOPULATION_SIZE) + { + Func + , int, + Dictionary> take = + (mapping, amountToTake) => + new Dictionary( + mapping.Take(amountToTake).ToDictionary(key => key.Key, value => value.Value)); + if (upToArabicNumer == DICTIONARY_PREPOPULATION_SIZE) + { + return take(_simpleArabicNumeralMappings, upToArabicNumer); + } + if (upToArabicNumer > DICTIONARY_PREPOPULATION_SIZE) + { + if (_simpleArabicNumeralMappings.Count >= upToArabicNumer) + { + return take(_simpleArabicNumeralMappings, upToArabicNumer); + } + var moreSimpleNumerals = GenerateAdditionalSimpleNumerals(DICTIONARY_PREPOPULATION_SIZE, upToArabicNumer); + _simpleArabicNumeralMappings = + (Dictionary) + _simpleArabicNumeralMappings.Union(moreSimpleNumerals); + return take(_simpleArabicNumeralMappings, _arabicRomanNumeralsMapping.Count); + } + if (upToArabicNumer < DICTIONARY_PREPOPULATION_SIZE) + { + return take(_simpleArabicNumeralMappings, upToArabicNumer); + } + return _simpleArabicNumeralMappings; + } + + + private static Dictionary GenerateAdditionalSimpleNumerals(int offset, + int length) + { + Dictionary moreNumerals = new Dictionary(); + foreach (int arabicNumeral in Enumerable.Range(offset, length)) + { + string romanNumeral; + string arabicNumeralAsString; + GenerateRomanNumerals(arabicNumeral, out romanNumeral, out arabicNumeralAsString); + SimpleArabicNumeral san = new SimpleArabicNumeral(arabicNumeral); + SimpleRomanNumeral srn = new SimpleRomanNumeral(romanNumeral); + moreNumerals.Add(san,srn); + } + return moreNumerals; + } + + + + + + + + } +} diff --git a/src/NzbDrone.Core/Parser/RomanNumerals/SimpleArabicNumeral.cs b/src/NzbDrone.Core/Parser/RomanNumerals/SimpleArabicNumeral.cs new file mode 100644 index 000000000..6caaa85ee --- /dev/null +++ b/src/NzbDrone.Core/Parser/RomanNumerals/SimpleArabicNumeral.cs @@ -0,0 +1,15 @@ +using System; + +namespace NzbDrone.Core.Parser.RomanNumerals +{ + public class SimpleArabicNumeral + { + public SimpleArabicNumeral(int numeral) + { + Numeral = numeral; + } + + public int Numeral { get; private set; } + public string NumeralAsString => Convert.ToString(Numeral); + } +} diff --git a/src/NzbDrone.Core/Parser/RomanNumerals/SimpleRomanNumeral.cs b/src/NzbDrone.Core/Parser/RomanNumerals/SimpleRomanNumeral.cs new file mode 100644 index 000000000..e774dabfe --- /dev/null +++ b/src/NzbDrone.Core/Parser/RomanNumerals/SimpleRomanNumeral.cs @@ -0,0 +1,13 @@ +namespace NzbDrone.Core.Parser.RomanNumerals +{ + public class SimpleRomanNumeral + { + public SimpleRomanNumeral(string numeral) + { + Numeral = numeral; + } + + public string Numeral { get; private set; } + public string NumeralLowerCase => Numeral.ToLower(); + } +} diff --git a/src/NzbDrone.Core/Tv/MovieRepository.cs b/src/NzbDrone.Core/Tv/MovieRepository.cs index f970f22d9..aa500de88 100644 --- a/src/NzbDrone.Core/Tv/MovieRepository.cs +++ b/src/NzbDrone.Core/Tv/MovieRepository.cs @@ -6,7 +6,9 @@ using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Datastore.Extensions; using Marr.Data.QGen; using NzbDrone.Core.MediaFiles; +using NzbDrone.Core.Parser.RomanNumerals; using NzbDrone.Core.Qualities; +using CoreParser = NzbDrone.Core.Parser.Parser; namespace NzbDrone.Core.Tv { @@ -28,21 +30,6 @@ namespace NzbDrone.Core.Tv public class MovieRepository : BasicRepository, IMovieRepository { - private readonly Dictionary romanNumeralsMapper = new Dictionary - { - { "1", "I"}, - { "2", "II"}, - { "3", "III"}, - { "4", "IV"}, - { "5", "V"}, - { "6", "VI"}, - { "7", "VII"}, - { "8", "VII"}, - { "9", "IX"}, - { "10", "X"}, - - }; //If a movie has more than 10 parts fuck 'em. - protected IMainDatabase _database; public MovieRepository(IMainDatabase database, IEventAggregator eventAggregator) @@ -58,94 +45,12 @@ namespace NzbDrone.Core.Tv public Movie FindByTitle(string cleanTitle) { - cleanTitle = cleanTitle.ToLowerInvariant(); - - var cleanRoman = cleanTitle; - - var cleanNum = cleanTitle; - - foreach (KeyValuePair entry in romanNumeralsMapper) - { - string num = entry.Key; - string roman = entry.Value.ToLower(); - - cleanRoman = cleanRoman.Replace(num, roman); - - cleanNum = cleanNum.Replace(roman, num); - } - - var result = Query.Where(s => s.CleanTitle == cleanTitle).FirstOrDefault(); - - if (result == null) - { - result = Query.Where(s => s.CleanTitle == cleanNum).OrWhere(s => s.CleanTitle == cleanRoman).FirstOrDefault(); - - if (result == null) - { - var movies = this.All(); - - result = movies.Where(m => m.AlternativeTitles.Any(t => Parser.Parser.CleanSeriesTitle(t.ToLower()) == cleanTitle || - Parser.Parser.CleanSeriesTitle(t.ToLower()) == cleanRoman || - Parser.Parser.CleanSeriesTitle(t.ToLower()) == cleanNum)).FirstOrDefault(); - - return result; - } - else - { - return result; - } - - } - else - { - return result; - } + return FindByTitle(cleanTitle, null); } public Movie FindByTitle(string cleanTitle, int year) { - cleanTitle = cleanTitle.ToLowerInvariant(); - - var cleanRoman = cleanTitle; - - var cleanNum = cleanTitle; - - foreach (KeyValuePair entry in romanNumeralsMapper) - { - string num = entry.Key; - string roman = entry.Value.ToLower(); - - cleanRoman = cleanRoman.Replace(num, roman); - - cleanNum = cleanNum.Replace(roman, num); - } - - var results = Query.Where(s => s.CleanTitle == cleanTitle); - - if (results == null) - { - results = Query.Where(s => s.CleanTitle == cleanNum).OrWhere(s => s.CleanTitle == cleanRoman); - - if (results == null) - { - var movies = this.All(); - - var listResults = movies.Where(m => m.AlternativeTitles.Any(t => Parser.Parser.CleanSeriesTitle(t.ToLower()) == cleanTitle || - Parser.Parser.CleanSeriesTitle(t.ToLower()) == cleanRoman || - Parser.Parser.CleanSeriesTitle(t.ToLower()) == cleanNum)); - - return listResults.Where(m => m.Year == year).FirstOrDefault(); - } - else - { - return results.Where(m => m.Year == year).FirstOrDefault(); - } - - } - else - { - return results.Where(m => m.Year == year).FirstOrDefault(); - } + return FindByTitle(cleanTitle, year as int?); } public Movie FindByImdbId(string imdbid) @@ -318,6 +223,46 @@ namespace NzbDrone.Core.Tv return string.Format("({0})", string.Join(" OR ", clauses)); } + private Movie FindByTitle(string cleanTitle, int? year) + { + cleanTitle = cleanTitle.ToLowerInvariant(); + string cleanTitleWithRomanNumbers = cleanTitle; + string cleanTitleWithArabicNumbers = cleanTitle; + + + foreach (ArabicRomanNumeral arabicRomanNumeral in RomanNumeralParser.GetArabicRomanNumeralsMapping()) + { + string arabicNumber = arabicRomanNumeral.ArabicNumeralAsString; + string romanNumber = arabicRomanNumeral.RomanNumeral; + cleanTitleWithRomanNumbers = cleanTitleWithRomanNumbers.Replace(arabicNumber, romanNumber); + cleanTitleWithArabicNumbers = cleanTitleWithArabicNumbers.Replace(romanNumber, arabicNumber); + } + + IEnumerable results = Query.Where(s => s.CleanTitle == cleanTitle); + + if (results == null) + { + results = Query.Where(movie => movie.CleanTitle == cleanTitleWithArabicNumbers) ?? + Query.Where(movie => movie.CleanTitle == cleanTitleWithRomanNumbers); + + if (results == null) + { + IEnumerable movies = All(); + Func titleCleaner = title => CoreParser.CleanSeriesTitle(title.ToLower()); + Func, string, bool> altTitleComparer = + (alternativeTitles, atitle) => + alternativeTitles.Any(altTitle => altTitle == titleCleaner(atitle)); + + results = movies.Where(m => altTitleComparer(m.AlternativeTitles, cleanTitle) || + altTitleComparer(m.AlternativeTitles, cleanTitleWithRomanNumbers) || + altTitleComparer(m.AlternativeTitles, cleanTitleWithArabicNumbers)); + } + } + return year.HasValue + ? results?.FirstOrDefault(movie => movie.Year == year.Value) + : results?.FirstOrDefault(); + } + public Movie FindByTmdbId(int tmdbid) { return Query.Where(m => m.TmdbId == tmdbid).FirstOrDefault();