{"version":3,"file":"CanvasShipUtils.mjs","sources":["../../../../../packages/sdk/utils/CanvasShipUtils.ts"],"sourcesContent":["import L from 'leaflet'\nimport dayjs from 'dayjs'\nimport { CanvasShip } from '@map-sdk/sdk/model/CanvasShip'\nimport { ShipxyOptions } from '@map-sdk/sdk/config'\nimport { CommUtils } from '@map-sdk/sdk/utils/CommUtils'\nimport { GPS } from '@map-sdk/sdk/utils/GPS'\nimport type { Template } from '@map-sdk/sdk/CanvasShipSymbol'\nimport type {\n  LatLng,\n  LatLngExpression,\n  LatLngLiteral,\n  LatLngTuple,\n  Layer,\n  Map,\n  Point,\n  Tooltip,\n  TooltipOptions,\n} from 'leaflet'\n\nexport interface CustomMap extends L.Map {\n  mapType?: string\n  shipxy_tooltip?: Tooltip | null\n  shipxy_tooltip_timer?: ReturnType<typeof setTimeout>\n}\n\ninterface ShipTemplate {\n  name: string\n  area: [number, number][]\n  centerXY: [number, number]\n  headXY: [number, number]\n  tailXY: [number, number]\n  radius: number\n  headLength?: number // 可能不需要这个字段，因为上面没有用到\n  length?: number // 如果 length 不一定存在，可以标记为可选\n  width?: number // 如果 width 不一定存在，也可以标记为可选\n}\n\nexport class CanvasShipUtils {\n  static shipTemplaterThree = {\n    name: 'three',\n    area: [\n      [0, 0],\n      [5, -20],\n      [10, 0],\n      [0, 0],\n    ],\n    centerXY: [5, -10],\n    headXY: [5, -20],\n    headXY2: [5, -35],\n    headLength: 15,\n    r: 10,\n  }\n  shipTemplaterArc_noUse = {\n    name: 'arc',\n    area: [\n      [0, 5],\n      [5, 0],\n      [10, 5],\n      [5, 10],\n    ],\n    centerXY: [5, 5],\n    headXY: [5, 0],\n    headXY2: [5, -15],\n    r: 5,\n  }\n  static dis = {\n    zh_CN: {\n      naviStatus: [\n        '在航(主机推动)',\n        '锚泊',\n        '失控',\n        '操作受限',\n        '吃水受限',\n        '靠泊',\n        '搁浅',\n        '捕捞作业',\n        '靠船帆提供动力',\n      ],\n      shipType: [\n        '其他',\n        '散货船',\n        '杂货船',\n        '集装箱船',\n        '油船',\n        '化学品船',\n        'LNG',\n        'LPG',\n        '滚装船',\n        '其他货船',\n        '其他油船',\n        '客船',\n        '渔船',\n        '拖轮/引航船',\n        '其他',\n      ],\n      shipTypeAIS: [\n        '引航船',\n        '搜救船',\n        '拖轮',\n        '港口供应船',\n        '装有防污装置和设备的船舶',\n        '执法艇',\n        '备用-用于当地船舶的任务分配',\n        '备用-用于当地船舶的任务分配',\n        '医疗船',\n        '符合18号决议(Mob-83)的船舶',\n        '捕捞',\n        '拖引',\n        '拖引并且船长>200m或船宽>25m',\n        '疏浚或水下作业',\n        '潜水作业',\n        '参与军事行动',\n        '帆船航行',\n        '娱乐船',\n        '地效应船',\n        '高速船',\n        '客船',\n        '货船',\n        '油轮',\n        '其他类型的船舶',\n        '集装箱船',\n        '其他',\n      ],\n    },\n    en_US: {\n      naviStatus: [\n        'Under way using engine',\n        'At anchor',\n        'Not under command',\n        'Restricted manoeuvrability',\n        'Constrained by her draught',\n        'Moored',\n        'Aground',\n        'Engaged in Fishing',\n        'Under way sailing',\n      ],\n      shipType: [\n        'Others',\n        'Bulk Carriers',\n        'General Cargo Ship',\n        'Container Ship',\n        'Oil Tanker',\n        'Chemical Tanker',\n        'LNG Tanker',\n        'LPG Tanker',\n        'Ro-Ro Cargo Ship',\n        'Other Cargo Ships',\n        'Other Tankers',\n        'Passenger Ship',\n        'Fishing Ship',\n        'Tug/Pilot vessel',\n        'Others',\n      ],\n      shipTypeAIS: [\n        'Pilot vessel',\n        'Search and rescue vessel',\n        'Tug',\n        'Port tender',\n        'Vessel with anti-pollution facilities or equipment',\n        'Law enforcement boat',\n        'Spare-for assignments to local vessel',\n        'Spare-for assignments to local vessel',\n        'Medical transport',\n        'Ship according to Resolution No 18(Mob-83)',\n        'Fishing',\n        'Towing',\n        'Towing and length>200m or breadth>25m',\n        'Engaged in dredging or underwater operations',\n        'Engaged in diving operations',\n        'Enagged in military operations',\n        'Sailing',\n        'Pleasure craft',\n        'WIG',\n        'HSC',\n        'Passenger ship',\n        'Cargo ship',\n        'Tanker',\n        'Other type of ship',\n        'Container',\n        'Other',\n      ],\n    },\n    seaArea: {\n      '1': { id: '1', name_en: 'Baltic Sea', name_cn: '波罗的海' },\n      '2': { id: '2', name_en: 'Kattegat', name_cn: '卡特加特海峡' },\n      '3': { id: '3', name_en: 'Skaggerak', name_cn: '斯卡格拉克海峡' },\n      '4': { id: '4', name_en: 'North Sea', name_cn: '北海' },\n      '5': { id: '5', name_en: 'Greenland Sea', name_cn: '格陵兰海' },\n      '6': { id: '6', name_en: 'Norwegian Sea', name_cn: '挪威海' },\n      '7': { id: '7', name_en: 'Barentsz Sea', name_cn: '巴伦支海' },\n      '8': { id: '8', name_en: 'White Sea', name_cn: '白海' },\n      '9': { id: '9', name_en: 'Kara Sea', name_cn: '喀拉海' },\n      '10': { id: '10', name_en: 'Laptev Sea', name_cn: '拉普捷夫海' },\n      '11': { id: '11', name_en: 'East Siberian Sea', name_cn: '东西伯利亚海' },\n      '12': { id: '12', name_en: 'Chukchi Sea', name_cn: '楚科奇海' },\n      '13': { id: '13', name_en: 'Beaufort Sea', name_cn: '波弗特海' },\n      '14': { id: '14', name_en: 'Northwestern Passages', name_cn: '西北通道' },\n      '15': { id: '15', name_en: 'Davis Strait', name_cn: '戴维斯海峡' },\n      '16': { id: '16', name_en: 'Hudson Bay', name_cn: '哈得逊湾' },\n      '17': { id: '17', name_en: 'Arctic Ocean', name_cn: '北冰洋' },\n      '18': {\n        id: '18',\n        name_en: 'Inner Seas off the West Coast of Scotland',\n        name_cn: '苏格兰西海岸的海洋',\n      },\n      '19': {\n        id: '19',\n        name_en: \"Irish Sea and St. George's Channel'\",\n        name_cn: '爱尔兰海和圣乔治海峡',\n      },\n      '20': { id: '20', name_en: 'Bristol Channel', name_cn: '布里斯托尔海峡' },\n      '21': { id: '21', name_en: 'English Channel', name_cn: '英吉利海峡' },\n      '22': { id: '22', name_en: 'Bay of Biscay', name_cn: '比斯开湾' },\n      '23': { id: '23', name_en: 'North Atlantic Ocean', name_cn: '北大西洋' },\n      '24': { id: '24', name_en: 'Gulf of St-Lawrence', name_cn: '劳伦斯湾' },\n      '25': { id: '25', name_en: 'Bay of Fundy', name_cn: '芬迪湾' },\n      '26': { id: '26', name_en: 'Gulf of Mexico', name_cn: '墨西哥湾' },\n      '27': { id: '27', name_en: 'Caribbean Sea', name_cn: '加勒比海' },\n      '28': { id: '28', name_en: 'Mediterranean Sea', name_cn: '地中海' },\n      '29': { id: '29', name_en: 'Sea of Marmara', name_cn: '马尔马拉海' },\n      '30': { id: '30', name_en: 'Black Sea', name_cn: '黑海' },\n      '31': { id: '31', name_en: 'Sea of Azov', name_cn: '亚速海' },\n      '32': { id: '32', name_en: 'South Atlantic Ocean', name_cn: '南大西洋' },\n      '33': { id: '33', name_en: 'Rio de La Plata', name_cn: '拉普拉塔河' },\n      '34': { id: '34', name_en: 'Gulf of Guinea', name_cn: '几内亚湾' },\n      '35': { id: '35', name_en: 'Gulf of Suez', name_cn: '苏伊士湾' },\n      '36': { id: '36', name_en: 'Gulf of Aqaba', name_cn: '亚喀巴湾' },\n      '37': { id: '37', name_en: 'Red Sea', name_cn: '红海' },\n      '38': { id: '38', name_en: 'Gulf of Aden', name_cn: '亚丁湾' },\n      '39': { id: '39', name_en: 'Arabian Sea', name_cn: '阿拉伯海' },\n      '40': { id: '40', name_en: 'Gulf of Oman', name_cn: '阿曼湾' },\n      '41': { id: '41', name_en: 'Persian Gulf', name_cn: '波斯湾' },\n      '42': { id: '42', name_en: 'Laccadive Sea', name_cn: '拉克代夫海' },\n      '43': { id: '43', name_en: 'Bay of Bengal', name_cn: '孟加拉湾' },\n      '44': { id: '44', name_en: 'Andaman or Burma Sea', name_cn: '缅甸海' },\n      '45': { id: '45', name_en: 'Indian Ocean', name_cn: '印度洋' },\n      '46': { id: '46', name_en: 'Malacca Strait', name_cn: '马六甲海峡' },\n      '47': { id: '47', name_en: 'Gulf of Thailand', name_cn: '泰国湾' },\n      '48': {\n        id: '48',\n        name_en: 'East Indian Archipelago (Indonesia)',\n        name_cn: '东印度群岛',\n      },\n      '49': { id: '49', name_en: 'South China Sea', name_cn: '南海' },\n      '50': { id: '50', name_en: 'Eastern China Sea', name_cn: '东海' },\n      '51': { id: '51', name_en: 'Yellow Sea', name_cn: '黄海' },\n      '52': { id: '52', name_en: 'Japan Sea', name_cn: '日本海' },\n      '53': { id: '53', name_en: 'Inland Sea', name_cn: '濑户内海' },\n      '54': { id: '54', name_en: 'Sea of Okhotsk', name_cn: '鄂霍次克海' },\n      '55': { id: '55', name_en: 'Bering Sea', name_cn: '白令海' },\n      '56': { id: '56', name_en: 'Philippine Sea', name_cn: '菲律宾海' },\n      '57': { id: '57', name_en: 'North Pacific Ocean', name_cn: '北太平洋' },\n      '58': { id: '58', name_en: 'Gulf of Alaska', name_cn: '阿拉斯加湾' },\n      '59': {\n        id: '59',\n        name_en: 'The Coastal Waters of Southeast Alaska and British Columbia',\n        name_cn: '阿拉斯加东南部和不列颠哥伦比亚省的沿海水域',\n      },\n      '60': {\n        id: '60',\n        name_en: 'Gulf of California',\n        name_cn: '加利福尼亚湾',\n      },\n      '61': { id: '61', name_en: 'South Pacific Ocean', name_cn: '南太平洋' },\n      '62': {\n        id: '62',\n        name_en: 'Great Australian Bight',\n        name_cn: '大澳大利亚湾',\n      },\n      '63': { id: '63', name_en: 'Tasman Sea', name_cn: '塔斯曼海' },\n      '64': { id: '64', name_en: 'Coral Sea', name_cn: '珊瑚海' },\n      '65': { id: '65', name_en: 'Solomon Sea', name_cn: '所罗门海' },\n      '66': { id: '66', name_en: 'Bismarck Sea', name_cn: '俾斯麦海' },\n      '67': { id: '67', name_en: 'Southern Ocean', name_cn: '南大洋' },\n      '120100': { id: '120100', name_en: '', name_cn: '天津市天津城区' },\n      '130200': { id: '130200', name_en: '', name_cn: '河北省唐山市' },\n      '130300': { id: '130300', name_en: '', name_cn: '河北省秦皇岛市' },\n      '130900': { id: '130900', name_en: '', name_cn: '河北省沧州市' },\n      '210200': { id: '210200', name_en: '', name_cn: '辽宁省大连市' },\n      '210700': { id: '210700', name_en: '', name_cn: '辽宁省锦州市' },\n      '210800': { id: '210800', name_en: '', name_cn: '辽宁省营口市' },\n      '211100': { id: '211100', name_en: '', name_cn: '辽宁省盘锦市' },\n      '211400': { id: '211400', name_en: '', name_cn: '辽宁省葫芦岛市' },\n      '310100': { id: '310100', name_en: '', name_cn: '上海市上海城区' },\n      '320100': { id: '320100', name_en: '', name_cn: '江苏省南京市' },\n      '320200': { id: '320200', name_en: '', name_cn: '江苏省无锡市' },\n      '320300': { id: '320300', name_en: '', name_cn: '江苏省徐州市' },\n      '320400': { id: '320400', name_en: '', name_cn: '江苏省常州市' },\n      '320500': { id: '320500', name_en: '', name_cn: '江苏省苏州市' },\n      '320600': { id: '320600', name_en: '', name_cn: '江苏省南通市' },\n      '320700': { id: '320700', name_en: '', name_cn: '江苏省连云港市' },\n      '320800': { id: '320800', name_en: '', name_cn: '江苏省淮安市' },\n      '320900': { id: '320900', name_en: '', name_cn: '江苏省盐城市' },\n      '321000': { id: '321000', name_en: '', name_cn: '江苏省扬州市' },\n      '321100': { id: '321100', name_en: '', name_cn: '江苏省镇江市' },\n      '321200': { id: '321200', name_en: '', name_cn: '江苏省泰州市' },\n      '321300': { id: '321300', name_en: '', name_cn: '江苏省宿迁市' },\n      '330100': { id: '330100', name_en: '', name_cn: '浙江省杭州市' },\n      '330200': { id: '330200', name_en: '', name_cn: '浙江省宁波市' },\n      '330300': { id: '330300', name_en: '', name_cn: '浙江省温州市' },\n      '330400': { id: '330400', name_en: '', name_cn: '浙江省嘉兴市' },\n      '330500': { id: '330500', name_en: '', name_cn: '浙江省湖州市' },\n      '330900': { id: '330900', name_en: '', name_cn: '浙江省舟山市' },\n      '331000': { id: '331000', name_en: '', name_cn: '浙江省台州市' },\n      '340200': { id: '340200', name_en: '', name_cn: '安徽省芜湖市' },\n      '340500': { id: '340500', name_en: '', name_cn: '安徽省马鞍山市' },\n      '340700': { id: '340700', name_en: '', name_cn: '安徽省铜陵市' },\n      '340800': { id: '340800', name_en: '', name_cn: '安徽省安庆市' },\n      '341700': { id: '341700', name_en: '', name_cn: '安徽省池州市' },\n      '350100': { id: '350100', name_en: '', name_cn: '福建省福州市' },\n      '350200': { id: '350200', name_en: '', name_cn: '福建省厦门市' },\n      '350300': { id: '350300', name_en: '', name_cn: '福建省莆田市' },\n      '350500': { id: '350500', name_en: '', name_cn: '福建省泉州市' },\n      '350600': { id: '350600', name_en: '', name_cn: '福建省漳州市' },\n      '350900': { id: '350900', name_en: '', name_cn: '福建省宁德市' },\n      '360400': { id: '360400', name_en: '', name_cn: '江西省九江市' },\n      '370200': { id: '370200', name_en: '', name_cn: '山东省青岛市' },\n      '370400': { id: '370400', name_en: '', name_cn: '山东省枣庄市' },\n      '370500': { id: '370500', name_en: '', name_cn: '山东省东营市' },\n      '370600': { id: '370600', name_en: '', name_cn: '山东省烟台市' },\n      '370700': { id: '370700', name_en: '', name_cn: '山东省潍坊市' },\n      '371000': { id: '371000', name_en: '', name_cn: '山东省威海市' },\n      '371100': { id: '371100', name_en: '', name_cn: '山东省日照市' },\n      '371600': { id: '371600', name_en: '', name_cn: '山东省滨州市' },\n      '420100': { id: '420100', name_en: '', name_cn: '湖北省武汉市' },\n      '420200': { id: '420200', name_en: '', name_cn: '湖北省黄石市' },\n      '420500': { id: '420500', name_en: '', name_cn: '湖北省宜昌市' },\n      '420700': { id: '420700', name_en: '', name_cn: '湖北省鄂州市' },\n      '420900': { id: '420900', name_en: '', name_cn: '湖北省孝感市' },\n      '421000': { id: '421000', name_en: '', name_cn: '湖北省荆州市' },\n      '421100': { id: '421100', name_en: '', name_cn: '湖北省黄冈市' },\n      '421200': { id: '421200', name_en: '', name_cn: '湖北省咸宁市' },\n      '422800': {\n        id: '422800',\n        name_en: '',\n        name_cn: '湖北省恩施土家族苗族自治州',\n      },\n      '430100': { id: '430100', name_en: '', name_cn: '湖南省长沙市' },\n      '430600': { id: '430600', name_en: '', name_cn: '湖南省岳阳市' },\n      '430700': { id: '430700', name_en: '', name_cn: '湖南省常德市' },\n      '430900': { id: '430900', name_en: '', name_cn: '湖南省益阳市' },\n      '440100': { id: '440100', name_en: '', name_cn: '广东省广州市' },\n      '440300': { id: '440300', name_en: '', name_cn: '广东省深圳市' },\n      '440400': { id: '440400', name_en: '', name_cn: '广东省珠海市' },\n      '440500': { id: '440500', name_en: '', name_cn: '广东省汕头市' },\n      '440600': { id: '440600', name_en: '', name_cn: '广东省佛山市' },\n      '440700': { id: '440700', name_en: '', name_cn: '广东省江门市' },\n      '440800': { id: '440800', name_en: '', name_cn: '广东省湛江市' },\n      '440900': { id: '440900', name_en: '', name_cn: '广东省茂名市' },\n      '441200': { id: '441200', name_en: '', name_cn: '广东省肇庆市' },\n      '441300': { id: '441300', name_en: '', name_cn: '广东省惠州市' },\n      '441500': { id: '441500', name_en: '', name_cn: '广东省汕尾市' },\n      '441700': { id: '441700', name_en: '', name_cn: '广东省阳江市' },\n      '441800': { id: '441800', name_en: '', name_cn: '广东省清远市' },\n      '441900': { id: '441900', name_en: '', name_cn: '广东省东莞市' },\n      '442000': { id: '442000', name_en: '', name_cn: '广东省中山市' },\n      '445100': { id: '445100', name_en: '', name_cn: '广东省潮州市' },\n      '445200': { id: '445200', name_en: '', name_cn: '广东省揭阳市' },\n      '445300': { id: '445300', name_en: '', name_cn: '广东省云浮市' },\n      '450100': { id: '450100', name_en: '', name_cn: '广西壮族自治区南宁市' },\n      '450400': { id: '450400', name_en: '', name_cn: '广西壮族自治区梧州市' },\n      '450600': {\n        id: '450600',\n        name_en: '',\n        name_cn: '广西壮族自治区防城港市',\n      },\n      '450700': { id: '450700', name_en: '', name_cn: '广西壮族自治区钦州市' },\n      '450800': { id: '450800', name_en: '', name_cn: '广西壮族自治区贵港市' },\n      '460100': { id: '460100', name_en: '', name_cn: '海南省海口市' },\n      '460200': { id: '460200', name_en: '', name_cn: '海南省三亚市' },\n      '510500': { id: '510500', name_en: '', name_cn: '四川省泸州市' },\n      '511500': { id: '511500', name_en: '', name_cn: '四川省宜宾市' },\n      '710000': { id: '710000', name_en: '', name_cn: '台湾省' },\n      '810000': { id: '810000', name_en: '', name_cn: '香港特别行政区' },\n      '820000': { id: '820000', name_en: '', name_cn: '澳门特别行政区' },\n    },\n  } as any\n  static isEmpty = CommUtils.isEmpty\n  static getObjType = CommUtils.getObjType\n  static YuzhengHaijianBaimingdan = undefined\n  /**\n   * 特定形状船只的模板对象，其中包含了船只各部位的几何属性（如轮廓坐标、中心坐标、头部坐标、尾部坐标、半径、长度和宽度等）。通过给定的高度和宽度先计算出它们各自的一半并除以缩放因子，然后基于这些计算值来构造船只的轮廓区域和其他相关属性。最后，函数返回这个构建完成的船只模板对象\n   * @param height 船体高度\n   * @param width 船体宽度\n   * @param scale 缩放因子\n   * @returns\n   */\n  static getShipTemplaterNine(\n    length: number,\n    width: number,\n    metersPerPixel: number\n  ): ShipTemplate {\n    const halfLength = length / metersPerPixel / 2\n    const halfWidth = width / metersPerPixel / 2\n    const shipTemplater: ShipTemplate = {\n      name: 'nine',\n      area: [],\n      centerXY: [0, 0],\n      headXY: [0, 0],\n      headLength: 50,\n      radius: 0,\n      tailXY: [0, 0],\n    }\n\n    shipTemplater.area.push(\n      [0, -halfLength],\n      [halfWidth / 2, -halfLength + (3 * halfWidth) / 4],\n      [halfWidth, -halfLength + (9 * halfWidth) / 4],\n      [halfWidth, -(-halfLength + halfWidth)],\n      [(2 * halfWidth) / 3, -(-halfLength)],\n      [(-2 * halfWidth) / 3, -(-halfLength)],\n      [-halfWidth, -(-halfLength + halfWidth)],\n      [-halfWidth, -halfLength + (9 * halfWidth) / 4],\n      [-halfWidth / 2, -halfLength + (3 * halfWidth) / 4],\n      [0, -halfLength]\n    )\n\n    shipTemplater.centerXY = [0, 0]\n    shipTemplater.headXY = [0, -halfLength]\n    shipTemplater.tailXY = [0, -(-halfLength)]\n    shipTemplater.radius = halfLength\n    shipTemplater.length = 2 * halfLength\n    shipTemplater.width = 2 * halfWidth\n\n    return shipTemplater\n  }\n  /**\n   * 地图实例、船只数据、缩放阈值和默认模板。函数主要目的是根据地图的缩放级别、船只数据以及屏幕像素与实际米数的比例关系，确定是否应用一种特定的（由 this.getShipTemplaterNine 计算得出的）船只渲染模板，并最终返回一个包含渲染所需信息的模板对象。如果某些条件不满足（例如缩放级别低于阈值、船只数据不完整、长宽比不合适等），则返回默认模板\n   * @param mapInstance\n   * @param shipData\n   * @param zoomThreshold\n   * @param defaultTemplate\n   * @returns\n   */\n  static getShipTemplater(\n    mapInstance: L.Map,\n    shipData: { length: number; width: number },\n    zoomThreshold: number,\n    defaultTemplate?: {\n      name: string\n      area: number[][]\n      centerXY: number[]\n      headXY: number[]\n      headXY2: number[]\n      headLength: number\n      r: number\n    }\n  ) {\n    const initialTemplate: Template = {\n      name: 'nine',\n      area: [],\n      centerXY: [0, 0],\n      headXY: [0, 0],\n      radius: 0,\n    }\n    // 如果没有提供默认模板，则使用CanvasShipUtils.shipTemplaterThree\n    if (!defaultTemplate) {\n      defaultTemplate = CanvasShipUtils.shipTemplaterThree\n    }\n\n    if (mapInstance.getZoom() < zoomThreshold) {\n      return L.extend(initialTemplate, defaultTemplate)\n    }\n    // 如果船只尺寸信息不完整，则使用默认模板\n    if (!shipData || !shipData.length || !shipData.width) {\n      return L.extend(initialTemplate, defaultTemplate)\n    }\n\n    const pixelPerMeter = this.meters2pixel(mapInstance)\n    // 如果无法计算像素与米的比例，则使用默认模板\n    if (pixelPerMeter <= 0) {\n      return L.extend(initialTemplate, defaultTemplate)\n    }\n\n    const scaledLength = shipData.length / pixelPerMeter\n    const scaledWidth = shipData.width / pixelPerMeter\n\n    // 如果船只尺寸比例不符合特定条件，则使用默认模板\n    if (scaledLength > 25 && scaledWidth > 3) {\n      if (\n        scaledLength / scaledWidth < 2 ||\n        scaledLength / scaledWidth > 20 ||\n        shipData.length > 500\n      ) {\n        return L.extend(initialTemplate, defaultTemplate)\n      }\n\n      const ninePartTemplate = this.getShipTemplaterNine(\n        shipData.length,\n        shipData.width,\n        pixelPerMeter\n      )\n\n      // 如果找到了特定的模板，则使用它，否则使用默认模板\n      return !ninePartTemplate\n        ? L.extend(initialTemplate, defaultTemplate)\n        : L.extend(initialTemplate, ninePartTemplate)\n    }\n\n    return L.extend(initialTemplate, defaultTemplate)\n  }\n  /**\n   * 接受一个船体模板数据和一个缩放因子，将船体模板的所有坐标属性（包括area、centerXY、headXY以及r）根据缩放因子进行缩放，并返回一个新的船体模板数据。\n   * @param shipData\n   * @param zoomFactor\n   * @returns\n   */\n  static sizeZoomShipTemplater(shipData: Template, zoomFactor: number) {\n    const resizedShip = {\n      name: 'nine',\n      area: [] as any,\n      centerXY: [] as any,\n      headXY: [] as any,\n      radius: 0,\n    }\n\n    if (shipData) {\n      resizedShip.name = shipData.name\n\n      for (let i = 0; i < shipData.area.length; i++) {\n        resizedShip.area.push([\n          shipData.area[i][0] * zoomFactor,\n          shipData.area[i][1] * zoomFactor,\n        ])\n      }\n\n      resizedShip.centerXY.push(\n        shipData.centerXY[0] * zoomFactor,\n        shipData.centerXY[1] * zoomFactor\n      )\n      resizedShip.headXY.push(\n        shipData.headXY[0] * zoomFactor,\n        shipData.headXY[1] * zoomFactor\n      )\n\n      if (shipData.radius) {\n        resizedShip.radius = shipData.radius * zoomFactor\n      }\n    }\n\n    return resizedShip\n  }\n\n  /**\n   * 接受一个点坐标、旋转中心坐标以及旋转角度（以度为单位），返回该点绕着旋转中心旋转指定角度后的坐标。\n   * @param point\n   * @param origin\n   * @param angleInDegrees\n   * @returns\n   */\n  static pointRotate(point: any[], origin: any[], angleInDegrees: number) {\n    const x = point[0],\n      y = point[1],\n      centerX = origin[0],\n      centerY = origin[1],\n      sinTheta = Math.sin((angleInDegrees * Math.PI) / 180),\n      cosTheta = Math.cos((angleInDegrees * Math.PI) / 180)\n\n    return [\n      (centerX - x) * cosTheta - (centerY - y) * sinTheta + x,\n      (centerX - x) * sinTheta + (centerY - y) * cosTheta + y,\n    ]\n  }\n  static getBoundingBoxArea(latlngs: L.LatLngExpression[]): L.Bounds {\n    let minX = 0,\n      minY = 0,\n      maxX = 0,\n      maxY = 0\n    for (const [i, latlng] of latlngs.entries()) {\n      const lat = latlng as any[0]\n      const lng = latlng as any[1]\n      if (i === 0) {\n        minX = lat\n        minY = lng\n        maxX = lat\n        maxY = lng\n      } else {\n        if (lat < minX) minX = lat\n        if (lng < minY) minY = lng\n        if (lat > maxX) maxX = lat\n        if (lng > maxY) maxY = lng\n      }\n    }\n    return new L.Bounds(new L.Point(minX, minY), new L.Point(maxX, maxY))\n  }\n  static getLatLngBoundsBoxArea(\n    points: L.LatLngExpression[],\n    map?: L.Map\n  ): L.LatLngBounds {\n    let minLat = 0,\n      minLng = 0,\n      maxLat = 0,\n      maxLng = 0\n    for (const [i, point] of points.entries()) {\n      let latLng = L.latLng(point)\n      if (map) {\n        latLng = this.GPSEncryptByMapToLatLng(latLng, map)\n      }\n      const lat = latLng.lat\n      const lng = latLng.lng\n      if (i === 0) {\n        minLat = lat\n        minLng = lng\n        maxLat = lat\n        maxLng = lng\n      } else {\n        if (lat < minLat) minLat = lat\n        if (lng < minLng) minLng = lng\n        if (lat > maxLat) maxLat = lat\n        if (lng > maxLng) maxLng = lng\n      }\n    }\n    return new L.LatLngBounds(\n      new L.LatLng(minLat, minLng),\n      new L.LatLng(maxLat, maxLng)\n    )\n  }\n  static fitBoundsByLatlngs(\n    map: L.Map,\n    bounds: L.LatLngBoundsExpression,\n    options: { timeout?: number; extend: number[] } = {\n      timeout: 100,\n      extend: [50, 50, 50, 50],\n    }\n  ): void {\n    map.fitBounds(bounds)\n\n    setTimeout(() => {\n      const extendedBounds = map.getBounds()\n      const ne = extendedBounds.getNorthEast()\n      const sw = extendedBounds.getSouthWest()\n\n      const neContainerPoint = map.latLngToContainerPoint(ne)\n      const swContainerPoint = map.latLngToContainerPoint(sw)\n\n      const topMargin = neContainerPoint.y - options.extend[0]\n      const rightMargin = neContainerPoint.x + options.extend[1]\n      const bottomMargin = swContainerPoint.y + options.extend[2]\n      const leftMargin = swContainerPoint.x - options.extend[3]\n\n      const northEastExtended = map.containerPointToLatLng(\n        L.point(rightMargin, topMargin)\n      )\n      const southWestExtended = map.containerPointToLatLng(\n        L.point(leftMargin, bottomMargin)\n      )\n\n      console.log([northEastExtended, southWestExtended])\n      // 创建一个新的LatLngBounds对象\n      map.fitBounds(L.latLngBounds([northEastExtended, southWestExtended]))\n    }, options.timeout)\n  }\n  // 渲染船舶时使用 已调整\n  static getSplitLatLngBounds(\n    bounds: L.LatLngBounds,\n    zoom: number\n  ): {\n    bounds: L.LatLngBounds\n    offset: number\n  }[] {\n    const splitLatLngBounds: { bounds: L.LatLngBounds; offset: number }[] = []\n    const slat = bounds.getSouthWest().lat\n    let slng = bounds.getSouthWest().lng\n    const nlat = bounds.getNorthEast().lat\n    let nlng = bounds.getNorthEast().lng\n    let offset = 0\n    if (zoom > 2) {\n      if (slng >= -180 && nlng <= 180) {\n        offset = 0\n        splitLatLngBounds.push({\n          bounds: L.latLngBounds(\n            new L.LatLng(slat, slng),\n            new L.LatLng(nlat, nlng)\n          ),\n          offset,\n        })\n      } else if (nlng < -180) {\n        offset = -360\n        splitLatLngBounds.push({\n          bounds: L.latLngBounds(\n            new L.LatLng(slat, slng - offset),\n            new L.LatLng(nlat, nlng - offset)\n          ),\n          offset,\n        })\n      } else if (slng > 180) {\n        offset = 360\n        splitLatLngBounds.push({\n          bounds: L.latLngBounds(\n            new L.LatLng(slat, slng - offset),\n            new L.LatLng(nlat, nlng - offset)\n          ),\n          offset,\n        })\n      } else if (slng < -180 && nlng > -180) {\n        offset = -360\n        splitLatLngBounds.push({\n          bounds: L.latLngBounds(\n            new L.LatLng(slat, slng - offset),\n            new L.LatLng(nlat, -180 - offset)\n          ),\n          offset,\n        })\n        offset = 0\n        slng = -180\n        splitLatLngBounds.push({\n          bounds: L.latLngBounds(\n            new L.LatLng(slat, slng),\n            new L.LatLng(nlat, nlng)\n          ),\n          offset,\n        })\n      } else if (slng < 180 && nlng > 180) {\n        offset = 360\n        splitLatLngBounds.push({\n          bounds: L.latLngBounds(\n            new L.LatLng(slat, 180 - offset),\n            new L.LatLng(nlat, nlng - offset)\n          ),\n          offset,\n        })\n        offset = 0\n        nlng = 180\n        splitLatLngBounds.push({\n          bounds: L.latLngBounds(\n            new L.LatLng(slat, slng),\n            new L.LatLng(nlat, nlng)\n          ),\n          offset,\n        })\n      } else {\n        console.log('区域船地图视图范围处理异常')\n      }\n    }\n    return splitLatLngBounds\n  }\n  static getSplitLatLngBounds180(bounds: L.LatLngBounds): L.LatLngBounds[] {\n    const westBoundLat = bounds.getSouthWest().lat\n    const westBoundLng = bounds.getSouthWest().lng\n    const eastBoundLat = bounds.getNorthEast().lat\n    const eastBoundLng = bounds.getNorthEast().lng\n\n    const boundsArray: L.LatLngBounds[] = []\n    if (Math.abs(westBoundLng - eastBoundLng) >= 180) {\n      boundsArray.push(\n        L.latLngBounds(\n          new L.LatLng(westBoundLat, -180),\n          new L.LatLng(eastBoundLat, westBoundLng)\n        ),\n        L.latLngBounds(\n          new L.LatLng(westBoundLat, eastBoundLng),\n          new L.LatLng(eastBoundLat, 180)\n        )\n      )\n    } else {\n      boundsArray.push(bounds)\n    }\n    return boundsArray\n  }\n  static meters2pixel(map: L.Map): number {\n    const halfSizeY = map.getSize().y / 2\n    return (\n      map.distance(\n        map.containerPointToLatLng([0, halfSizeY]),\n        map.containerPointToLatLng([100, halfSizeY])\n      ) / 100\n    )\n  }\n\n  static getShipRealCenterPoint(\n    point: L.Point,\n    ship: any,\n    meters2pixel: number\n  ): L.Point {\n    if (!ship.length || !ship.width) return new L.Point(point.x, point.y)\n\n    const shipLength = ship.length\n    const shipWidth = ship.width\n    let shipLeft = ship.left || shipWidth / 2\n    shipLeft = Math.min(shipLeft, shipWidth / 2)\n    let shipTrail = ship.trail || shipLength / 2\n    shipTrail = Math.min(shipTrail, shipLength / 2)\n    const shipHdg = ship.hdg\n    const angle = this.getAngle(shipHdg, ship.sog, ship.cog)\n    const halfShipWidthInPixel =\n      shipWidth / meters2pixel / 2 - shipLeft / meters2pixel\n    const halfShipTrailInPixel =\n      shipTrail / meters2pixel - shipLength / meters2pixel / 2\n    const rotatedPoint = this.pointRotate(\n      [point.x, point.y],\n      [point.x + halfShipWidthInPixel, point.y + halfShipTrailInPixel],\n      angle\n    )\n\n    return new L.Point(rotatedPoint[0], rotatedPoint[1])\n  }\n  static getMousePos(target: HTMLElement, event: any): [number, number] {\n    if ('originalEvent' in event) {\n      event = event.originalEvent as any\n    }\n    const rect = target.getBoundingClientRect()\n    // const scaleX = rect.width / target.offsetWidth\n    // const scaleY = rect.height / target.offsetHeight\n    const scaleX = rect.width / (target as any).width\n    const scaleY = rect.height / (target as any).height\n    return [\n      (event.clientX - rect.left) / scaleX,\n      (event.clientY - rect.top) / scaleY,\n    ]\n  }\n  /**\n   * 该函数接收一个表示经纬度坐标点的数组 latlng 和一个多边形顶点数组 data，用于判断给定点 latlng 是否在由 data 定义的多边形区域内。\n函数通过计算给定点与多边形每条边的交叉数来判断点是否在多边形内部。若交叉数不为零，则说明点位于多边形内。\n   * @param latlng\n   * @param data\n   * @returns\n   */\n  static LatLngInRegion(\n    latlng: [number, number],\n    data: Array<[number, number]>\n  ): boolean {\n    if (!latlng || !data) {\n      return false\n    }\n\n    let crossCount = 0\n    for (let i = 0; i < data.length; i++) {\n      const nextIndex = (i + 1) % data.length\n      const determinant =\n        (data[nextIndex][0] - data[i][0]) * (latlng[1] - data[i][1]) -\n        (latlng[0] - data[i][0]) * (data[nextIndex][1] - data[i][1])\n\n      if (data[i][1] <= latlng[1]) {\n        if (data[nextIndex][1] > latlng[1] && determinant > 0) {\n          crossCount++\n        }\n      } else {\n        if (data[nextIndex][1] <= latlng[1] && determinant < 0) {\n          crossCount--\n        }\n      }\n    }\n\n    return crossCount !== 0\n  }\n  static mouseInArr(\n    target: HTMLElement,\n    event: MouseEvent,\n    regions: any[]\n  ): any | null {\n    if (regions && regions.length > 0) {\n      const mousePos = this.getMousePos(target, event)\n      for (let i = 0, len = regions.length; i < len; i++) {\n        if (this.LatLngInRegion(mousePos, regions[i].bodyArea)) {\n          return regions[i]\n        }\n      }\n    }\n    return null\n  }\n  static calcLabel(\n    map: L.Map,\n    center: L.Point,\n    text: string,\n    labelList: any[],\n    allowance: number,\n    avoidOverlap: boolean,\n    font: any,\n    imgObj: { imgWidth: number; imgSize: number } = {\n      imgWidth: 0,\n      imgSize: 18,\n    }\n  ): any | null {\n    text = text || 'S'\n    const strLength = CommUtils.calcStrLength(map, text, font)\n    const imgTotalWidth = strLength + imgObj.imgWidth\n    allowance ||= 20\n    return this.askLabelSpace(\n      center,\n      imgTotalWidth,\n      imgObj.imgSize + 2,\n      labelList,\n      allowance,\n      avoidOverlap\n    )\n  }\n  // 标牌要使用\n  static askLabelSpace(\n    center: L.Point,\n    imgWidth: number,\n    imgSize: number,\n    labelList: any[],\n    allowance = 50,\n    avoidOverlap: boolean\n  ): {\n    center: L.Point\n    x: L.Point\n    l: L.Point\n    r: L.Point\n    bounds: L.Bounds\n    position: number\n  } | null {\n    let bounds: L.Bounds\n    let position = -1\n    if (!avoidOverlap) {\n      position = 0\n      bounds = this._getLabelBound(\n        center,\n        position,\n        imgWidth,\n        imgSize,\n        allowance\n      )\n    } else {\n      for (let i = 0; i < 8; i++) {\n        bounds = this._getLabelBound(center, i, imgWidth, imgSize, allowance)\n        let isIntersects = false\n        for (const element of labelList) {\n          const bound = element.bounds as any\n          const boundEntity = new L.Bounds(\n            new L.Point(bound.min.x - 20, bound.min.y - 20),\n            new L.Point(bound.max.x + 20, bound.max.y + 20)\n          )\n          if (bounds.intersects(boundEntity)) {\n            isIntersects = true\n            break\n          }\n        }\n        if (!isIntersects) {\n          position = i\n          break\n        }\n      }\n    }\n    if (position > -1) {\n      const left = bounds!.getTopLeft()\n      const right = bounds!.getBottomRight()\n      return {\n        center,\n        x: CanvasShipUtils._getLabelAnchor(\n          center,\n          position,\n          imgWidth,\n          imgSize,\n          allowance\n        ),\n        l: left,\n        r: right,\n        bounds: bounds!,\n        position,\n      }\n    }\n    return null\n  }\n  /**\n   * 为点上的图形请求可用空间\n   * @param existingGraphicsData 已存在的图形及其边界信息数据\n   * @param centerPoint 图形中心点坐标\n   * @param imageWidth 图片宽度\n   * @param imageSize 图片高度\n   * @param tolerance 容差值，默认为50\n   * @param startingSearchIndex  开始搜索的位置，默认从起始方向开始，表示循环8个方向\n   * @returns 如果找到可用空间，则返回包含该空间信息的对象；否则返回null\n   */\n  static askPointSpace(\n    data: Record<string, { bounds: L.LatLngBounds }>,\n    point: L.Point,\n    imgWidth: number,\n    imgSize: number,\n    allowance = 50,\n    startingSearchIndex = 99\n  ): {\n    center: L.Point\n    x: L.Point\n    l: L.Point\n    r: L.Point\n    bounds: L.Bounds\n    position: number\n  } | null {\n    let bounds: L.Bounds\n    let position = -1\n    let isOverlaps = false\n\n    let currentIndex = startingSearchIndex || 99\n    let endIndex = startingSearchIndex + 1\n    if (startingSearchIndex === 99) {\n      currentIndex = 0\n      endIndex = 8\n    }\n\n    for (let i = currentIndex; i < endIndex; i++) {\n      bounds = this.getPointBound(point, i, imgWidth, imgSize, allowance)\n      for (const key in data) {\n        if (bounds.overlaps(data[key].bounds as any)) {\n          isOverlaps = true\n          break\n        }\n      }\n      if (!isOverlaps) {\n        position = i\n        break\n      }\n    }\n\n    if (position > -1) {\n      const left = bounds!.getTopLeft()\n      const right = bounds!.getBottomRight()\n      return {\n        center: point,\n        x: CanvasShipUtils._getLabelAnchor(\n          point,\n          position,\n          imgWidth,\n          imgSize,\n          allowance\n        ),\n        l: left,\n        r: right,\n        bounds: bounds!,\n        position,\n      }\n    }\n\n    return null\n  }\n  /**\n   * 计算点与图片边界的矩形范围\n   * @param point 坐标点\n   * @param key 图片位置索引\n   * @param imgWidth 图片宽度\n   * @param imgSize 图片高度\n   * @param allowance 容差值，默认留白空间\n   * @returns 返回包含边界信息的L.Bounds对象\n   */\n  static getPointBound(\n    point: L.Point,\n    key: number,\n    imgWidth: number,\n    imgSize: number,\n    allowance: number\n  ): L.Bounds {\n    let x1 = 0,\n      x2 = 0,\n      y2 = 0,\n      y1 = 0\n    const pointX = point.x\n    const pointY = point.y\n\n    switch (key) {\n      case 0:\n        x2 = (x1 = pointX + allowance) + imgWidth\n        y1 = (y2 = pointY - allowance) - imgSize\n        break\n      case 1:\n        x2 = (x1 = pointX + allowance) + imgWidth\n        y1 = (y2 = pointY + imgSize / 2) - imgSize\n        break\n      case 2:\n        x2 = (x1 = pointX + allowance) + imgWidth\n        y1 = (y2 = pointY + allowance + imgSize) - imgSize\n        break\n      case 3:\n        x2 = (x1 = pointX - imgWidth / 2) + imgWidth\n        y1 = (y2 = pointY + allowance + imgSize) - imgSize\n        break\n      case 4:\n        x1 = (x2 = pointX) - imgWidth\n        y1 = (y2 = pointY + allowance + imgSize) - imgSize\n        break\n      case 5:\n        x1 = (x2 = pointX - allowance) - imgWidth\n        y1 = (y2 = pointY + imgSize / 2) - imgSize\n        break\n      case 6:\n        x1 = (x2 = pointX) - imgWidth\n        y1 = (y2 = pointY - allowance) - imgSize\n        break\n      case 7:\n        x2 = (x1 = pointX - imgWidth / 2) + imgWidth\n        y1 = (y2 = pointY - allowance) - imgSize\n    }\n\n    return new L.Bounds(new L.Point(x1, y1), new L.Point(x2, y2))\n  }\n\n  /**\n   * 计算标签的边界范围\n   * @param point 坐标点\n   * @param key 图片位置索引\n   * @param imgWidth 图片宽度\n   * @param imgSize 图片高度\n   * @param allowance 容差值，默认留白空间\n   * @returns 返回包含边界信息的L.Bounds对象\n   */\n  static _getLabelBound(\n    point: L.Point,\n    key: number,\n    imgWidth: number,\n    imgSize: number,\n    allowance: number\n  ): L.Bounds {\n    return this.getPointBound(point, key, imgWidth, imgSize, allowance)\n  }\n\n  /**\n   * 计算标签锚点的位置\n   * @param point 坐标点\n   * @param key 图片位置索引\n   * @param imgWidth 图片宽度\n   * @param imgSize 图片高度\n   * @param allowance 容差值，默认留白空间\n   * @returns 返回包含锚点信息的L.Point对象\n   */\n  static _getLabelAnchor(\n    point: L.Point,\n    key: number,\n    imgWidth = 70,\n    imgSize = 20,\n    allowance = 20\n  ): L.Point {\n    const anchorPoint = new L.Point(0, 0)\n\n    switch (key) {\n      case 0:\n        anchorPoint.x = point.x + allowance\n        anchorPoint.y = point.y - allowance - imgSize / 2\n        break\n      case 1:\n        anchorPoint.x = point.x + allowance\n        anchorPoint.y = point.y\n        break\n      case 2:\n        anchorPoint.x = point.x + allowance\n        anchorPoint.y = point.y + allowance + imgSize / 2\n        break\n      case 3:\n        anchorPoint.x = point.x\n        anchorPoint.y = point.y + allowance + imgSize / 4\n        break\n      case 4:\n        anchorPoint.x = Math.max(point.x - allowance, point.x - imgWidth / 2)\n        anchorPoint.y = point.y + allowance + imgSize / 4\n        break\n      case 5:\n        anchorPoint.x = point.x - allowance\n        anchorPoint.y = point.y\n        break\n      case 6:\n        anchorPoint.x = Math.max(point.x - allowance, point.x - imgWidth / 2)\n        anchorPoint.y = point.y - allowance - imgSize / 4\n        break\n      case 7:\n        anchorPoint.x = point.x\n        anchorPoint.y = point.y - allowance - imgSize / 4\n    }\n\n    return anchorPoint\n  }\n  static calcStrWidthOnCanvas(text: string, font?: string): number {\n    if (!text || text.length === 0) {\n      return 0\n    }\n    // 创建并初始化一个临时 canvas 元素\n    const canvas = document.createElement('canvas')\n    const ctx = canvas.getContext('2d')\n    if (!ctx) {\n      return 0\n    }\n    ctx.font = font || 'bold 12px Arial'\n    // 计算文本宽度\n    const width = ctx.measureText(text).width\n    // 无需在地图容器内操作，所以这里省略了与地图容器相关的DOM操作\n    return width\n  }\n  static calcStrLength(map: Map, text: string, font?: string): number {\n    const width = this.calcStrWidthOnCanvas(text, font)\n    // 这里原本的操作已经简化掉，仅保留计算部分\n    return width\n  }\n  static drawRectangleRadius(\n    canvas: CanvasRenderingContext2D,\n    x: number,\n    y: number,\n    xAllowance: number,\n    yAllowance: number,\n    strokeStyle = '#000000',\n    fillStyle?: string\n  ): void {\n    canvas.save()\n\n    canvas.beginPath()\n    canvas.moveTo(x, y)\n    canvas.lineTo(x, y + yAllowance)\n    canvas.lineTo(x + xAllowance, y + yAllowance)\n    canvas.lineTo(x + xAllowance, y)\n    canvas.lineTo(x, y)\n\n    canvas.lineWidth = 1\n    canvas.lineJoin = 'round'\n    if (strokeStyle) {\n      canvas.strokeStyle = strokeStyle\n    }\n    if (fillStyle) {\n      canvas.fillStyle = fillStyle\n    }\n\n    if (strokeStyle) {\n      canvas.stroke()\n    }\n    if (fillStyle) {\n      canvas.fill()\n    }\n\n    canvas.closePath()\n    canvas.restore()\n  }\n  static trackUnitConversion(ship: any): Record<string, number> | null {\n    const tracks: { [key: string]: any } = {}\n\n    if (!ship) return null\n\n    if (ship.hdg) {\n      tracks.hdg = (ship.hdg / 100).toFixed(2)\n      if (tracks.hdg > 512) tracks.hdg = undefined\n      while (tracks.hdg > 360) tracks.hdg -= 360\n    }\n\n    if (ship.cog) {\n      tracks.cog = (ship.cog / 100).toFixed(2)\n      if (tracks.cog > 512) tracks.cog = undefined\n      while (tracks.cog > 360) tracks.cog -= 360\n    }\n\n    if (ship.sog) {\n      tracks.sog = (ship.sog / 514).toFixed(2)\n      if (tracks.sog > 102.2) tracks.sog = undefined\n    }\n\n    if (ship.draught) {\n      tracks.draught = (ship.draught / 1000).toFixed(1)\n    }\n\n    if (ship.rot) {\n      if (ship.rot > 1200 || ship.rot < -1200) {\n        tracks.rot = undefined\n      } else {\n        tracks.rot = (ship.rot / 100).toFixed(2)\n      }\n    }\n\n    return tracks\n  }\n  static mToUnit(distance: number, unit: string): number | string {\n    let convertedDistance: string | number = 0\n    if (this.isEmpty(distance)) return convertedDistance\n\n    switch (unit) {\n      case 'nm':\n      case 'nauticalmiles':\n        convertedDistance = (distance / 1852).toFixed(\n          distance >= 1852000 ? 0 : distance >= 185200 ? 1 : 2\n        )\n        break\n      case 'mi':\n      case 'landmiles':\n        convertedDistance = (distance / 1609.344).toFixed(\n          distance >= 1609344 ? 0 : distance >= 160934.4 ? 1 : 2\n        )\n        break\n      default:\n        convertedDistance = (distance / 1000).toFixed(\n          distance >= 1000000 ? 0 : distance >= 186_411 ? 1 : 2\n        )\n    }\n\n    return Number(convertedDistance)\n  }\n  static unitToM(distance: number, unit: string): number {\n    let meters: number | string = distance\n    if (this.isEmpty(distance)) return 0\n\n    switch (unit) {\n      case 'nm':\n      case 'nauticalmiles':\n        meters = (1852 * distance).toFixed(0)\n        break\n      case 'mi':\n      case 'landmiles':\n        meters = (1609.344 * distance).toFixed(0)\n        break\n      case 'km':\n        meters = (1000 * distance).toFixed(0)\n        break\n    }\n\n    return Number(meters)\n  }\n  static dataToShip(\n    data: any,\n    options?: any,\n    normalizeData?: boolean\n  ): CanvasShip {\n    normalizeData = normalizeData !== false\n    const ship = new CanvasShip()\n    L.Util.extend(ship, data)\n\n    ship.type = `${ship.shiptype}`\n    if (ship.shiptype && ship.rot && (ship.rot > 1200 || ship.rot < -1200)) {\n      ship.rot = 0\n    }\n    if (normalizeData) {\n      ship.lng /= 1000000\n      ship.lat /= 1000000\n      ship.hdg = CommUtils.getNumberLEValue(ship.hdg, 35900, 100, 1)\n      ship.hdg = this.xTo360(ship.hdg)\n      ship.cog = CommUtils.getNumberLEValue(ship.cog, 35990, 100, 1)\n      ship.cog = this.xTo360(ship.cog)\n      ship.sog = CommUtils.getNumberLEValue(ship.sog, 52576, 514, 1)\n      ship.rot = ship.rot ? CommUtils.getNumber(ship.rot / 100, 2) : 0\n      ship.draught /= 1000\n      ship.length /= 10\n      ship.width /= 10\n      ship.left /= 10\n      ship.trail /= 10\n    } else {\n      if (ship.lng > 1000) {\n        ship.lng /= 1000000\n      }\n      if (ship.lat > 1000) {\n        ship.lat /= 1000000\n      }\n      if (ship.hdg && ship.hdg > 1000) {\n        ship.hdg = CommUtils.getNumberLEValue(ship.hdg, 35900, 100, 1)\n        ship.hdg = this.xTo360(ship.hdg)\n      }\n      if (ship.cog && ship.cog > 1000) {\n        ship.cog = CommUtils.getNumberLEValue(ship.cog, 35990, 100, 1)\n        ship.cog = this.xTo360(ship.cog)\n      }\n      if (ship.sog && ship.sog > 514) {\n        ship.sog = CommUtils.getNumberLEValue(ship.sog, 52576, 514, 1)\n      }\n      if (ship.rot && ship.rot > 1000) {\n        ship.rot = CommUtils.getNumber(ship.rot / 100, 2)\n      }\n      if (ship.draught > 1000) {\n        ship.draught = CommUtils.getNumber(ship.draught / 1000, 1)\n      }\n    }\n\n    if (options) {\n      ship.color = options.color || '#d3d3d3'\n      ship.istop = !options.istop || options.istop\n    }\n\n    ship.datapower = `${ship.mmsi}`.indexOf('*') > 0 ? 1 : 0\n    ship.is_yh = this.isYUNZHENAndHAIJIAN(ship.name, ship.mmsi, ship) || false\n    ship.outCN = GPS.outOfChina(ship.lat, ship.lng)\n\n    ship.gps_lat = ship.lat\n    ship.gps_lng = ship.lng\n    ship.gps_lastdyn = `${ship.lastdyn}`\n\n    return ship\n  }\n  sortArray(\n    sortingArr: any[],\n    keyName?: string | boolean,\n    ascendingFlag?: boolean\n  ): any[] {\n    if (!sortingArr || sortingArr.length < 2) {\n      return sortingArr\n    }\n\n    if (typeof keyName === 'undefined') {\n      keyName = true\n    }\n    if (typeof ascendingFlag === 'undefined') {\n      ascendingFlag = true\n    }\n\n    if (keyName) {\n      return ascendingFlag\n        ? sortingArr.sort((a: any, b: any) => {\n            if (typeof a === 'string' && typeof b === 'string') {\n              return a.localeCompare(b)\n            } else {\n              return a - b\n            }\n          })\n        : sortingArr.sort((a: any, b: any) => {\n            if (a.length === b.length) {\n              return a.localeCompare(b)\n            } else {\n              return a.length - b.length\n            }\n          })\n    } else {\n      return ascendingFlag\n        ? sortingArr.sort((a: any, b: any) => b - a)\n        : sortingArr.sort((a: any, b: any) => {\n            if (a.length === b.length) {\n              return b.localeCompare(a)\n            } else {\n              return b.length - a.length\n            }\n          })\n    }\n  }\n  static getNumber(\n    value: any,\n    precision?: number,\n    roundingMethod?: 'round' | 'floor' | 'ceil'\n  ): number {\n    let result = 0\n    if (!value) {\n      return 0\n    }\n\n    let multiplier = 10 ** (precision ?? 0)\n    multiplier <= 0 && (multiplier = 1)\n\n    switch (roundingMethod) {\n      case 'round':\n        result = Math.round(value * multiplier) / multiplier\n        break\n      case 'floor':\n      default:\n        result = Math.floor(value * multiplier) / multiplier\n        break\n      case 'ceil':\n        result = Math.ceil(value * multiplier) / multiplier\n    }\n\n    return result\n  }\n  static openTooltip(\n    mapInstance: CustomMap,\n    latlng: LatLngLiteral | LatLngExpression,\n    content: string | HTMLElement,\n    tooltipOptions: TooltipOptions\n  ): L.Tooltip {\n    // 关闭当前地图实例上的tooltip\n    CanvasShipUtils.closeTooltip(mapInstance)\n\n    // 创建新的Tooltip对象，并将其存储在shipxy_tooltip属性中\n    const tooltip = new L.Tooltip(tooltipOptions)\n    mapInstance.shipxy_tooltip = tooltip\n\n    // 设置Tooltip的内容\n    mapInstance.shipxy_tooltip.setContent(content)\n\n    // 设置Tooltip的位置坐标\n    mapInstance.shipxy_tooltip.setLatLng(L.latLng(latlng))\n\n    // 将Tooltip图层添加到地图实例上\n    mapInstance.addLayer(mapInstance.shipxy_tooltip)\n\n    // 如果存在shipxy_tooltip_timer，则清除之前的定时器\n    if (mapInstance.shipxy_tooltip_timer) {\n      clearTimeout(mapInstance.shipxy_tooltip_timer)\n    }\n\n    // 设置新的定时器，在5秒后执行回调函数，移除当前的Tooltip\n    mapInstance.shipxy_tooltip_timer = setTimeout(\n      (tooltipToRemove: Tooltip | undefined) => {\n        if (tooltipToRemove) {\n          tooltipToRemove.remove()\n        }\n      },\n      5000,\n      mapInstance.shipxy_tooltip\n    )\n\n    // 返回已创建和显示的Tooltip对象\n    return mapInstance.shipxy_tooltip\n  }\n  static closeTooltip(mapInstance: CustomMap, specificTooltip?: Layer): void {\n    if (specificTooltip) {\n      mapInstance.removeLayer(specificTooltip)\n    }\n\n    const currentTooltip = mapInstance.shipxy_tooltip\n    if (currentTooltip) {\n      mapInstance.removeLayer(currentTooltip)\n      mapInstance.shipxy_tooltip = null\n    }\n  }\n  static dataFormat(\n    date: string | number | Date | dayjs.Dayjs | null | undefined,\n    format: string | undefined\n  ) {\n    return dayjs(date).format(format)\n  }\n  static getGPSLatLngByMap(\n    mapCoordinate: LatLngLiteral | LatLngTuple,\n    mapParams: any\n  ): LatLng {\n    return GPS.latLngToGPSBymap(mapCoordinate, mapParams)\n  }\n  static GPSEncryptByMapToLatLng(latLng: LatLngExpression, map: L.Map): LatLng {\n    return GPS.gpsToLatLngBymap(latLng, map as any)\n  }\n  static GPSEncryptByMapTypeToLatLng(\n    latLng: LatLngExpression,\n    type: string\n  ): LatLng {\n    const latLngInstance = L.latLng(latLng)\n    if (type === 'MT_ESRI') {\n      const { lat, lon } = GPS.gcj_encrypt(\n        latLngInstance.lat,\n        latLngInstance.lng\n      )\n      return L.latLng(lat, lon)\n    }\n    return latLngInstance\n  }\n  static GPSEncryptByMapTypeToPoint(\n    latLng: LatLngExpression,\n    mapType: string,\n    map: L.Map\n  ): Point {\n    return this.GPSEncryptByMapToPoint(latLng, map)\n  }\n  static GPSEncryptByMapToPoint(latLng: LatLngExpression, map: L.Map): Point {\n    const encryptedLatLng = this.GPSEncryptByMapToLatLng(latLng, map)\n    return map.latLngToContainerPoint(encryptedLatLng)\n  }\n  static latFormatter(lat: number): string {\n    if (!lat || `${lat}`.length === 0) return ''\n\n    const direction = lat < 0 ? ' S' : ' N'\n    let formattedLat = String(lat)\n    if (-1 === formattedLat.lastIndexOf('.')) {\n      formattedLat += '.000'\n    }\n    const decimalIndex = formattedLat.lastIndexOf('.')\n    const degrees = Number(formattedLat.slice(0, Math.max(0, decimalIndex)))\n    const minutes =\n      60 *\n      Number(\n        `0.${formattedLat.substring(decimalIndex + 1, formattedLat.length)}`\n      )\n\n    return `${Math.abs(degrees)}º ${L.Util.formatNum(minutes, 3)}${direction}`\n  }\n  static lngFormatter(lng: number): string {\n    if (!lng || `${lng}`.length === 0) return ''\n\n    let direction = 'W'\n    if (((lng %= 360) < 0 && lng > -180) || (lng > 180 && lng < 360)) {\n      direction = ' W'\n      if (lng > 180 && lng < 360) {\n        lng -= 360\n      }\n    } else if ((lng > 0 && lng < 180) || (lng < -180 && lng > -360)) {\n      direction = ' E'\n      if (lng < -180 && lng > -360) {\n        lng += 360\n      }\n    }\n\n    let formattedLng = String(lng)\n    if (-1 === formattedLng.lastIndexOf('.')) {\n      formattedLng += '.000'\n    }\n    const decimalIndex = formattedLng.lastIndexOf('.')\n    const degrees = Number(formattedLng.slice(0, Math.max(0, decimalIndex)))\n    const minutes =\n      60 *\n      Number(\n        `0.${formattedLng.substring(decimalIndex + 1, formattedLng.length)}`\n      )\n\n    return `${Math.abs(degrees)}º ${L.Util.formatNum(minutes, 3)}${direction}`\n  }\n  static latlngFormatter(latlng: L.LatLngLiteral | L.LatLng): string {\n    if (!latlng) return ''\n    const { lat, lng } = L.latLng(latlng as L.LatLngLiteral)\n    return `${this.latFormatter(lat)},${this.lngFormatter(lng)}`\n  }\n  /**\n   * 格式化鼠标悬浮经纬度\n   * @param value\n   * @param isLng 参数来区分经度和纬度的处理方式\n   * @returns\n   */\n  static formatDegreesToDMS(value: number, isLng: boolean): string {\n    const direction: 'E' | 'W' | 'N' | 'S' = isLng\n      ? value > 0\n        ? 'E'\n        : 'W'\n      : value > 0\n      ? 'N'\n      : 'S'\n    value = ((value + 180) % 360) - (isLng && value > 0 ? 360 : 0)\n\n    const degreeStr = String(value)\n    const decimalIndex = degreeStr.lastIndexOf('.')\n    const degrees = Math.abs(\n      Number(degreeStr.slice(0, Math.max(0, decimalIndex)))\n    )\n    const minutes =\n      Number(`0.${degreeStr.slice(Math.max(0, decimalIndex + 1))}`) * 60\n\n    return `${degrees}º ${L.Util.formatNum(minutes, 3)}${direction}`\n  }\n\n  static isLatLngInRegion(\n    latlng: [number, number],\n    data: [number, number][]\n  ): boolean {\n    if (!latlng || !data) {\n      return false\n    }\n\n    let counter = 0\n    let nextIndex = 0\n\n    for (let i = 0; i < data.length; i++) {\n      const lastIndex = data.length - 1\n      nextIndex = i === lastIndex ? 0 : i + 1\n\n      const crossProduct =\n        (data[nextIndex][0] - data[i][0]) * (latlng[1] - data[i][1]) -\n        (latlng[0] - data[i][0]) * (data[nextIndex][1] - data[i][1])\n\n      if (data[i][1] <= latlng[1]) {\n        if (data[nextIndex][1] > latlng[1] && crossProduct > 0) {\n          counter++\n        }\n      } else {\n        if (data[nextIndex][1] <= latlng[1] && crossProduct < 0) {\n          counter--\n        }\n      }\n    }\n\n    return counter !== 0\n  }\n\n  static getAngleByLatLng(\n    latLng: L.LatLngExpression,\n    latLng1: L.LatLngExpression\n  ): number {\n    const pointA = L.latLng(latLng)\n    const pointB = L.latLng(latLng1)\n    const deltaLat = pointB.lat - pointA.lat\n    const deltaLng = pointB.lng - pointA.lng\n    return Number((57.29578 * -Math.atan2(deltaLat, deltaLng)).toFixed(2))\n  }\n  static getAngleByLatLngToBigCircle(\n    beforeLatLng: L.LatLngExpression,\n    latLng: L.LatLngExpression\n  ): number {\n    // 使用Leaflet的latLng方法来确保输入是有效的经纬度对象\n    const beforePoint = L.latLng(beforeLatLng)\n    const targetPoint = L.latLng(latLng)\n\n    // 将经纬度从度转换为弧度\n    const beforeLatRad = beforePoint.lat * (Math.PI / 180)\n    const beforeLngRad = beforePoint.lng * (Math.PI / 180)\n    const latRad = targetPoint.lat * (Math.PI / 180)\n    const lngRad = targetPoint.lng * (Math.PI / 180)\n\n    // 使用球面三角学公式计算两点之间的方位角\n    const sinDeltaLng = Math.sin(lngRad - beforeLngRad)\n    const cosLat1 = Math.cos(beforeLatRad)\n    const sinLat2 = Math.sin(latRad)\n    const cosLat2 = Math.cos(latRad)\n    const sinDeltaLat =\n      cosLat1 * sinLat2 -\n      Math.sin(beforeLatRad) * cosLat2 * Math.cos(lngRad - beforeLngRad)\n\n    // 计算方位角，并将结果从弧度转换为度\n    const bearing = Math.atan2(sinDeltaLng, sinDeltaLat) * (180 / Math.PI)\n\n    // 调整方位角，确保它在0到360度之间\n    const adjustedBearing = Number(bearing.toFixed(2)) + (bearing < 0 ? 360 : 0)\n\n    // 返回调整后的方位角，保留两位小数\n    return adjustedBearing\n  }\n  static getAngleForLatLngByDistFromLatLngs(\n    startLatLng: L.LatLngExpression,\n    endLatLng: L.LatLngExpression\n  ): number {\n    // 使用 Leaflet 的 latLng 方法将输入转换为经纬度对象\n    const startPoint = L.latLng(startLatLng)\n    const endPoint = L.latLng(endLatLng)\n\n    // 将经纬度从度转换为弧度\n    const startLatRad = startPoint.lat * (Math.PI / 180)\n    const startLngRad = startPoint.lng * (Math.PI / 180)\n    const endLatRad = endPoint.lat * (Math.PI / 180)\n    const endLngRad = endPoint.lng * (Math.PI / 180)\n\n    // 使用 Haversine 公式计算两点之间的大圆距离\n    const dLat = endLatRad - startLatRad\n    const dLng = endLngRad - startLngRad\n\n    const a =\n      Math.sin(dLat / 2) ** 2 +\n      Math.cos(startLatRad) * Math.cos(endLatRad) * Math.sin(dLng / 2) ** 2\n    // 返回弧度表示的角度\n    return 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))\n  }\n  static getLatLngByDistFromLatLngs(\n    startLatLng: L.LatLng,\n    endLatLng: L.LatLng,\n    distanceRatio: number,\n    distance: number\n  ): L.LatLng | null {\n    if (\n      !(startLatLng instanceof L.LatLng) ||\n      !(endLatLng instanceof L.LatLng) ||\n      distanceRatio < 0 ||\n      distanceRatio > 1 ||\n      distance <= 0\n    ) {\n      return null\n    }\n\n    const angle =\n      distanceRatio ||\n      this.getAngleForLatLngByDistFromLatLngs(startLatLng, endLatLng)\n\n    if (angle === 0 || distance < 1) {\n      return null\n    }\n\n    const distanceToEachOther = startLatLng.distanceTo(endLatLng)\n    const distanceFraction = distance / distanceToEachOther\n\n    const startLatRad = startLatLng.lat * (Math.PI / 180)\n    const startLngRad = startLatLng.lng * (Math.PI / 180)\n    const endLatRad = endLatLng.lat * (Math.PI / 180)\n    const endLngRad = endLatLng.lng * (Math.PI / 180)\n\n    const sinFraction = Math.sin((1 - distanceFraction) * angle)\n    const cosFraction = Math.cos(distanceFraction * angle)\n\n    const x =\n      sinFraction * Math.cos(startLatRad) * Math.cos(startLngRad) +\n      cosFraction * Math.cos(endLatRad) * Math.cos(endLngRad)\n    const y =\n      sinFraction * Math.cos(startLatRad) * Math.sin(startLngRad) +\n      cosFraction * Math.cos(endLatRad) * Math.sin(endLngRad)\n    const z =\n      sinFraction * Math.sin(startLatRad) + cosFraction * Math.sin(endLatRad)\n\n    const newLatRad = Math.atan2(z, Math.sqrt(x ** 2 + y ** 2))\n    const newLngRad = Math.atan2(y, x)\n\n    const newLatitude = (newLatRad * (180 / Math.PI)) as any // as any是为了绕过TypeScript的类型检查，因为Math.atan2可能返回-π到π之间的值，需要转换为-90到90之间的纬度值\n    const newLongitude = (newLngRad * (180 / Math.PI)) as any // 同上，需要转换为-180到180之间的经度值\n\n    // 规范化经度，使其处于-180到180之间\n    let normalizedLongitude = newLongitude - (180 * startLngRad) / Math.PI\n    function mathMethod(number: number): number {\n      return number > 0 ? Math.floor(number) : Math.ceil(number)\n    }\n    normalizedLongitude -=\n      normalizedLongitude < 0\n        ? 360 * mathMethod((normalizedLongitude - 180) / 360)\n        : 360 * mathMethod((normalizedLongitude + 180) / 360)\n\n    return L.latLng(newLatitude, normalizedLongitude)\n  }\n  static getDistance(\n    latLng1: [number, number],\n    latLng2: [number, number],\n    unitConversionFactor: string\n  ): number {\n    const point1 = L.latLng(latLng1)\n    const point2 = L.latLng(latLng2)\n\n    const lat1InRadians = (point1.lat * Math.PI) / 180\n    const lng1InRadians = (point1.lng * Math.PI) / 180\n    const lat2InRadians = (point2.lat * Math.PI) / 180\n    const lng2InRadians = (point2.lng * Math.PI) / 180\n\n    const deltaLatInRadians = Math.abs(lat1InRadians - lat2InRadians)\n    const deltaLngInRadians = Math.abs(lng1InRadians - lng2InRadians)\n\n    const a = Math.sin(deltaLatInRadians / 2)\n    const b = Math.sin(deltaLngInRadians / 2)\n\n    const c =\n      a ** 2 + Math.cos(lat1InRadians) * Math.cos(lat2InRadians) * b ** 2\n\n    const distanceInMeters = 12742 * Math.asin(Math.sqrt(c)) * 1000\n\n    // 假设 this.mToUnit 是一个将米转换为指定单位的函数\n    const distanceInUnits = this.mToUnit(distanceInMeters, unitConversionFactor)\n\n    return Number(distanceInUnits)\n  }\n  //用于在两个经纬度点之间创建一个平滑的大圆弧线段，并将其分割成多个点。calculateCoordinates 是一个内部辅助函数，用于计算特定比例位置处的弧线上点的经度和纬度。最后，这个函数返回的是由这些点构成的一个数组，每个元素是一个 [经度, 纬度] 对\n  static polylineArc(\n    item: any,\n    nextItem: any,\n    resolution?: number\n  ): [number, number][] {\n    function calculateCoordinates(\n      t: number,\n      startLat: number,\n      startLng: number,\n      endLat: number,\n      endLng: number,\n      arcRadius: number\n    ): [number, number] {\n      const sinFactor1 = Math.sin((1 - t) * arcRadius) / Math.sin(arcRadius),\n        sinFactor2 = Math.sin(t * arcRadius) / Math.sin(arcRadius)\n      const x =\n          sinFactor1 * Math.cos(startLat) * Math.cos(startLng) +\n          sinFactor2 * Math.cos(endLat) * Math.cos(endLng),\n        y =\n          sinFactor1 * Math.cos(startLat) * Math.sin(startLng) +\n          sinFactor2 * Math.cos(endLat) * Math.sin(endLng),\n        z = sinFactor1 * Math.sin(startLat) + sinFactor2 * Math.sin(endLat)\n\n      const bearing = (180 / Math.PI) * Math.atan2(z, Math.sqrt(x * x + y * y)),\n        inclination = (180 / Math.PI) * Math.atan2(y, x),\n        adjustedInclination = inclination - (180 * startLng) / Math.PI\n\n      function roundIfPositive(value: number): number {\n        return Math[value > 0 ? 'floor' : 'ceil'](value)\n      }\n\n      return [\n        bearing,\n        (inclination -\n          (adjustedInclination < 0\n            ? 360 * roundIfPositive((adjustedInclination - 180) / 360)\n            : 360 * roundIfPositive((adjustedInclination + 180) / 360))) %\n          360,\n      ]\n    }\n\n    // 将 item 和 nextItem 转换成 Leaflet LatLng 对象\n    item = L.latLng(item)\n    nextItem = L.latLng(nextItem)\n\n    let startLat = item.lat,\n      startLng = item.lng,\n      endLat = nextItem.lat,\n      endLng = nextItem.lng\n\n    // 将经纬度转成弧度\n    startLat = (startLat * Math.PI) / 180\n    startLng = (startLng * Math.PI) / 180\n    endLat = (endLat * Math.PI) / 180\n    endLng = (endLng * Math.PI) / 180\n\n    // 计算两点之间的大圆弧长（以弧度表示）\n    const greatCircleDistance =\n      2 *\n      Math.asin(\n        Math.sqrt(\n          Math.sin((startLat - endLat) / 2) ** 2 +\n            Math.cos(startLat) *\n              Math.cos(endLat) *\n              Math.sin((startLng - endLng) / 2) ** 2\n        )\n      )\n\n    // 如果距离为0，则直接返回起点坐标\n    let resultArray: [number, number][] = []\n    if (greatCircleDistance === 0) {\n      resultArray = [[startLat, startLng]]\n    } else {\n      // 否则计算路径上的点\n      const segments = resolution || 456 // 默认值为 450\n      const segmentRatio = 1 / (segments - 1)\n\n      for (let i = 0; i < segments; i++) {\n        const currentRatio = segmentRatio * i\n        const coordinates = calculateCoordinates(\n          currentRatio,\n          startLat,\n          startLng,\n          endLat,\n          endLng,\n          greatCircleDistance\n        )\n        resultArray.push(coordinates)\n      }\n    }\n\n    return resultArray\n  }\n  static getAngle(hdg: number, sog: number, cog: number): number {\n    let result: string | number = 0\n    if (hdg >= 0 && hdg < 360) {\n      result =\n        sog >= 3 && this.angleAbs(hdg - cog) >= 15 && cog >= 0 && cog < 360\n          ? Number(cog).toFixed(5)\n          : Number(hdg).toFixed(5)\n    } else if (cog >= 0 && cog < 360) {\n      result = Number(cog).toFixed(5)\n    }\n    !result && (result = 0)\n    return Number(result)\n  }\n  static angleAbs(val: number): number {\n    const absoluteValue = Math.abs(val)\n    return absoluteValue > 180 ? 360 - absoluteValue : absoluteValue\n  }\n\n  static lngTo360(val: any): number {\n    if (CommUtils.isEmpty(val)) return val\n    val = Number(val)\n    while (val < 0) val += 360\n    return val\n  }\n  static lngTo360ForArray(\n    inputArray: { lon?: number; lng?: number }[]\n  ): { lon?: number; lng?: number }[] {\n    const outputArray: { lon?: number; lng?: number }[] = []\n\n    if (!inputArray || inputArray.length === 0) {\n      return outputArray\n    }\n\n    for (const item of inputArray) {\n      if (!item.lng) {\n        item.lng = item.lon // 如果 lng 属性不存在，则使用 lon 属性的值\n      }\n      item.lng = Number(item.lng) // 确保 lng 是一个数字\n\n      if (item.lng < 0) {\n        item.lng = this.lngTo360(item.lng) // 如果 lng 小于 0，则调用 lngTo360 函数进行转换\n      }\n\n      if (item.lon) {\n        item.lon = item.lng // 如果 lon 属性存在，则将其值设置为与 lng 相同\n      }\n\n      outputArray.push(item) // 将处理过的对象添加到输出数组中\n    }\n\n    return outputArray\n  }\n  static latlngsFrom180(points: any[]): any[] {\n    return this.objFrom180(points, '')\n  }\n  static objFrom180(\n    points: any[] & { [key: string]: any },\n    propertyPath?: string,\n    correction?: number\n  ): any[] {\n    if (CommUtils.isEmpty(correction)) correction = 0\n    if (!points || points.length < 2) return points\n\n    const objFrom180ToLine = this.objFrom180ToLine(points, propertyPath)\n    const length = objFrom180ToLine.length\n    let cross180Detected = false,\n      moreThan180Count = 0,\n      lessThanMinus90Count = 0\n\n    for (let i = 0; i < length; i++) {\n      const value = !propertyPath\n        ? objFrom180ToLine[i]\n        : objFrom180ToLine[i][propertyPath]\n      value.lat = Number(value.lat)\n      if (CommUtils.isEmpty(value.lng)) value.lng = Number(value.lon)\n\n      if (Math.abs(value.lng) >= 180) cross180Detected = true\n      if (value.lng > 360) moreThan180Count++\n      if (value.lng <= -90) lessThanMinus90Count++\n    }\n\n    if (\n      cross180Detected ||\n      (correction === 0 && lessThanMinus90Count / length >= 0.5)\n    ) {\n      let shiftAmount = 0\n      if (correction === 0) {\n        if (moreThan180Count / length >= 0.5) shiftAmount = -360\n        if (lessThanMinus90Count / length >= 0.5) shiftAmount = 360\n\n        for (let i = 0; i < length; i++) {\n          const value = !propertyPath\n            ? objFrom180ToLine[i]\n            : objFrom180ToLine[i][propertyPath]\n          value.lng = Number(value.lng) + shiftAmount\n          if (!CommUtils.isEmpty(value.lon)) value.lon = value.lng\n          if (!propertyPath) {\n            objFrom180ToLine[i] = value\n          } else {\n            objFrom180ToLine[i][propertyPath] = value\n          }\n        }\n      } else if (correction) {\n        return objFrom180ToLine\n      }\n    }\n\n    return objFrom180ToLine\n  }\n\n  static objFrom180ToLine(\n    points: any[] & { [key: string]: any },\n    propertyPath?: string\n  ): any[] {\n    if (!points) return points\n    const copyOfPoints = [...points]\n\n    for (let i = 1; i < copyOfPoints.length; i++) {\n      const prevValue = propertyPath\n        ? copyOfPoints[i - 1][propertyPath]\n        : copyOfPoints[i - 1]\n      const currentValue = propertyPath\n        ? copyOfPoints[i][propertyPath]\n        : copyOfPoints[i]\n\n      prevValue.lat = Number(prevValue.lat)\n      if (CommUtils.isEmpty(prevValue.lng)) {\n        prevValue.lng = Number(prevValue.lon || prevValue.lng)\n      }\n      currentValue.lat = Number(currentValue.lat)\n      if (CommUtils.isEmpty(currentValue.lng)) {\n        currentValue.lng = Number(currentValue.lon || currentValue.lng)\n      }\n\n      let shiftAmount = 0\n      if (\n        Math.abs(\n          Number.parseFloat(prevValue.lng) - Number.parseFloat(currentValue.lng)\n        ) >= 180\n      ) {\n        shiftAmount = prevValue.lng >= 0 ? 360 : -360\n        currentValue.lng = Number(currentValue.lng) + shiftAmount\n        if (!CommUtils.isEmpty(currentValue.lon)) {\n          currentValue.lon = currentValue.lng\n        }\n\n        if (!propertyPath) {\n          copyOfPoints[i - 1] = prevValue\n          copyOfPoints[i] = currentValue\n        } else {\n          copyOfPoints[i - 1][propertyPath] = prevValue\n          copyOfPoints[i][propertyPath] = currentValue\n        }\n      }\n    }\n\n    return copyOfPoints\n  }\n  static lngTo180(lng: any): number {\n    if (CommUtils.isEmpty(lng)) return lng\n    while (lng > 180) lng -= 360\n    while (lng < -180) lng += 360\n    return lng\n  }\n  static latlngsTo180(latlngs: L.LatLng[]): L.LatLngLiteral[] {\n    if (!latlngs || latlngs.length < 1) return latlngs\n\n    const length = latlngs.length,\n      convertedLatLngs: L.LatLngLiteral[] = []\n\n    for (let i = 0; i < length; i++) {\n      const convertedObject: L.LatLng = latlngs[i]\n      convertedObject.lng = this.lngTo180(convertedObject.lng)\n      convertedLatLngs.push(convertedObject)\n    }\n\n    return convertedLatLngs\n  }\n\n  static xTo360(val: any): number {\n    if (CommUtils.isEmpty(val)) return val\n    for (val = Number(val); val > 360; ) val -= 360\n    for (; val < -360; ) val += 360\n    return val\n  }\n  static getMaxXYByLatlngs(\n    map: L.Map,\n    layerLatLng: L.LatLngExpression,\n    latLng: L.LatLngExpression\n  ): number {\n    const distanceXY = this.getDistanceXYByLatlngs(map, layerLatLng, latLng)\n    return Math.max(distanceXY.x, distanceXY.y)\n  }\n  static getDistanceXYByLatlngs(\n    map: L.Map,\n    layerLatLng: L.LatLngExpression,\n    latLng: L.LatLngExpression\n  ): { x: number; y: number } {\n    const point1 = map.latLngToLayerPoint(layerLatLng)\n    const point2 = map.latLngToLayerPoint(latLng)\n    return {\n      x: Math.abs(point1.x - point2.x),\n      y: Math.abs(point1.y - point2.y),\n    }\n  }\n\n  static getUrlParam(url: string): { [key: string]: string } {\n    const queryObject: { [key: string]: string } = {}\n    const paramsstartingSearchIndex = url.indexOf('?')\n    url = url.slice(paramsstartingSearchIndex + 1)\n    const parameters = url.split('&')\n\n    for (const parameter of parameters) {\n      const paramIndex = parameter.indexOf('=')\n      if (paramIndex > 0) {\n        const paramName = parameter.slice(0, Math.max(0, paramIndex))\n        const paramValue = parameter.slice(paramIndex + 1)\n        queryObject[paramName] = decodeURIComponent(paramValue)\n      }\n    }\n\n    return queryObject\n  }\n\n  static isCNShip(mmsi: string) {\n    let countryCode = 1\n    const mmsiStr = `${mmsi}`\n    if (!this.isEmpty(mmsiStr) && mmsiStr.length >= 3) {\n      switch (mmsiStr.slice(0, 3)) {\n        case '412':\n        case '413':\n        case '414':\n          countryCode = 0\n          break\n        case '416':\n        case '453':\n        case '477':\n          countryCode = 2\n          break\n        default:\n          countryCode = 1\n      }\n    }\n\n    return countryCode\n  }\n  static isYUNZHENAndHAIJIAN(\n    shipName: string,\n    shipMMSI: string,\n    ship: any\n  ): boolean {\n    if (!this.isEmpty(shipMMSI)) {\n      if (\n        !this.YuzhengHaijianBaimingdan &&\n        !this.isEmpty(ShipxyOptions.shipDataServer.getYuzhengHaijianBaimingdan)\n      ) {\n        try {\n          //     this.YuzhengHaijianBaimingdan = resData\n        } catch (e) {\n          console.error('获取运政海船监MMSI白名单异常', e)\n        }\n      }\n\n      return true\n      // if (\n      //   this.YuzhengHaijianBaimingdan &&\n      //   shipMMSI in this.YuzhengHaijianBaimingdan\n      // ) {\n      //   return false\n      // }\n    }\n\n    if (!this.isEmpty(ship) && ship.shiptype !== 0x37) {\n      return false\n    }\n\n    if (!this.isEmpty(shipName)) {\n      shipName = shipName.toUpperCase()\n      const shipNameReplace = shipName.replace(/\\s+|\\d+/gi, '')\n      if (CommUtils.isEmpty(shipNameReplace)) {\n        return false\n      }\n      const furtherCleanedName = shipNameReplace.replace(\n        /ZHONGGUO|HAIJING|YUZHENG|HAO|HAIJIAN/gi,\n        ''\n      )\n      if (CommUtils.isEmpty(furtherCleanedName)) {\n        return true\n      }\n    }\n\n    return false\n  }\n\n  /**\n   * 获取由经纬度生成的网格键，默认网格大小为 1，前缀为空字符串，连接符为下划线 _。\n   * @param lat 纬度\n   * @param lng 经度\n   * @param gridSize 网格大小，默认为 1\n   * @param prefix 前缀，默认为空字符串\n   * @param linkStr 连接符，默认为下划线 _\n   * @returns 网格键字符串\n   */\n  static getGridKeyByLatLng(\n    lat: number,\n    lng: number,\n    gridSize = 1,\n    prefix = '',\n    linkStr = '_'\n  ): string {\n    if (!Number.isFinite(lat) || !Number.isFinite(lng)) {\n      return ''\n    }\n    // 计算网格精度\n    const gridKeyPrecision =\n      gridSize % 1 !== 0 ? gridSize.toString().split('.')[1]?.length || 0 : 0\n\n    // return (\n    //   prefix +\n    //   (parseInt((lat / gridSize).toString()) * gridSize).toFixed(\n    //     gridKeyPrecision\n    //   ) +\n    //   linkStr +\n    //   (parseInt((lng / gridSize).toString()) * gridSize).toFixed(\n    //     gridKeyPrecision\n    //   )\n    // )\n    // 四舍五入经纬度到 gridSize 的整数倍并保留精度\n    const roundedLat = (Math.round(lat / gridSize) * gridSize).toFixed(\n      gridKeyPrecision\n    )\n    const roundedLng = (Math.round(lng / gridSize) * gridSize).toFixed(\n      gridKeyPrecision\n    )\n\n    return prefix + roundedLat + linkStr + roundedLng\n  }\n  static openLoadingPopup(time: number, cb: any) {\n    console.log('打开')\n    cb && cb()\n  }\n  static closeLoadingPopup() {\n    console.log('关闭加载框')\n  }\n  /**\n   * 据给定的 key、距离计算方法 disMethod 和语言环境 language 返回对应的描述信息\n   * @param key\n   * @param disMethod\n   * @param language\n   * @returns\n   */\n  static getDisValue(\n    key: string | number,\n    disMethod: string,\n    language: 'zh_CN' | string = 'zh_CN'\n  ): string {\n    let value = ''\n\n    if (!disMethod || disMethod.length === 0 || Number(key) < 0) {\n      return value\n    }\n\n    if (disMethod === 'seaArea') {\n      const item = this.dis[disMethod][`${key}`]\n      if (!item) {\n        return ''\n      }\n      value = language === 'zh_CN' ? item.name_cn : item.name_en\n    } else if (language in this.dis && disMethod in this.dis[language]) {\n      value = this.dis[language][disMethod][key]\n    }\n\n    return value\n  }\n  static getDisValueEN(\n    key: number,\n    disMethod: string,\n    language: 'en_US'\n  ): string {\n    if (!disMethod) {\n      throw new Error('Invalid disMethod')\n    }\n\n    if (100 === key) {\n      return this.getDisValue(24, 'shipTypeAIS', language)\n    }\n\n    if (key < 10 || key > 100) {\n      return this.getDisValue(25, 'shipTypeAIS', language)\n    }\n\n    const tensDigit = Math.floor(key / 10)\n    const onesDigit = key % 10\n\n    if (5 === tensDigit) {\n      return this.getDisValue(onesDigit, 'shipTypeAIS', language)\n    }\n\n    if (3 === tensDigit && onesDigit >= 0 && onesDigit <= 7) {\n      return this.getDisValue(onesDigit + 10, 'shipTypeAIS', language)\n    }\n\n    switch (tensDigit) {\n      case 1:\n      default:\n        return this.getDisValue(25, 'shipTypeAIS', language)\n      case 2:\n        return this.getDisValue(18, 'shipTypeAIS', language)\n      case 4:\n        return this.getDisValue(19, 'shipTypeAIS', 'en_US')\n      case 6:\n        return this.getDisValue(20, 'shipTypeAIS', 'en_US')\n      case 7:\n        return this.getDisValue(21, 'shipTypeAIS', 'en_US')\n      case 8:\n        return this.getDisValue(22, 'shipTypeAIS', 'en_US')\n      case 9:\n        return this.getDisValue(23, 'shipTypeAIS', 'en_US')\n    }\n  }\n  static getShipTypeCN(key: number): string {\n    if (key === 100) {\n      return '集装箱船'\n    }\n    if (key < 10 || key > 100) {\n      return '其他'\n    }\n\n    const tensDigit = Math.floor(key / 10)\n    const onesDigit = key % 10\n\n    if (tensDigit === 5) {\n      return ShipxyOptions.shipResourceManager.type[onesDigit]\n    }\n\n    if (tensDigit === 3) {\n      return onesDigit >= 0 && onesDigit <= 7\n        ? ShipxyOptions.shipResourceManager.type[onesDigit + 10]\n        : '其他'\n    }\n\n    switch (tensDigit) {\n      case 1:\n      default:\n        return '其他'\n      case 2:\n        return ShipxyOptions.shipResourceManager.type[18]\n      case 4:\n        return ShipxyOptions.shipResourceManager.type[19]\n      case 6:\n        return ShipxyOptions.shipResourceManager.type[20]\n      case 7:\n        return ShipxyOptions.shipResourceManager.type[21]\n      case 8:\n        return ShipxyOptions.shipResourceManager.type[22]\n      case 9:\n        return ShipxyOptions.shipResourceManager.type[23]\n    }\n  }\n  static getShipTypeEN(key: number) {\n    return this.getDisValueEN(key, 'shipTypeAIS', 'en_US')\n  }\n  static getNewShipTypeCN(key: number) {\n    return CanvasShipUtils.getDisValue(key, 'shipType', 'zh_CN')\n  }\n}\n"],"names":["p","constructor","this","shipTemplaterArc_noUse","name","area","centerXY","headXY","headXY2","r","getShipTemplaterNine","n","t","a","e","i","headLength","radius","tailXY","push","length","width","getShipTemplater","shipTemplaterThree","getZoom","m","extend","meters2pixel","o","s","c","sizeZoomShipTemplater","pointRotate","Math","sin","PI","cos","getBoundingBoxArea","entries","Bounds","Point","getLatLngBoundsBoxArea","latLng","GPSEncryptByMapToLatLng","u","lat","l","lng","LatLngBounds","LatLng","fitBoundsByLatlngs","timeout","fitBounds","setTimeout","getBounds","getNorthEast","getSouthWest","latLngToContainerPoint","y","x","g","d","containerPointToLatLng","point","L","latLngBounds","getSplitLatLngBounds","bounds","offset","getSplitLatLngBounds180","abs","getSize","distance","getShipRealCenterPoint","left","min","trail","hdg","getAngle","sog","cog","getMousePos","originalEvent","getBoundingClientRect","height","clientX","clientY","top","LatLngInRegion","mouseInArr","bodyArea","calcLabel","imgWidth","imgSize","h","calcStrLength","askLabelSpace","_getLabelBound","max","intersects","getTopLeft","getBottomRight","center","_getLabelAnchor","position","askPointSpace","getPointBound","overlaps","calcStrWidthOnCanvas","document","createElement","getContext","font","measureText","drawRectangleRadius","save","beginPath","moveTo","lineTo","lineWidth","lineJoin","strokeStyle","fillStyle","stroke","fill","closePath","restore","trackUnitConversion","toFixed","draught","rot","mToUnit","isEmpty","Number","unitToM","dataToShip","A","Util","type","shiptype","getNumberLEValue","xTo360","getNumber","color","istop","datapower","mmsi","indexOf","is_yh","isYUNZHENAndHAIJIAN","outCN","E","outOfChina","gps_lat","gps_lng","gps_lastdyn","lastdyn","sortArray","sort","localeCompare","round","floor","ceil","openTooltip","closeTooltip","Tooltip","shipxy_tooltip","setContent","setLatLng","addLayer","shipxy_tooltip_timer","clearTimeout","remove","removeLayer","dataFormat","C","format","getGPSLatLngByMap","latLngToGPSBymap","gpsToLatLngBymap","GPSEncryptByMapTypeToLatLng","lon","gcj_encrypt","GPSEncryptByMapTypeToPoint","GPSEncryptByMapToPoint","latFormatter","String","lastIndexOf","slice","substring","formatNum","lngFormatter","latlngFormatter","formatDegreesToDMS","isLatLngInRegion","getAngleByLatLng","atan2","getAngleByLatLngToBigCircle","getAngleForLatLngByDistFromLatLngs","sqrt","getLatLngByDistFromLatLngs","distanceTo","_","b","T","S","B","M","getDistance","asin","polylineArc","P","N","I","w","angleAbs","lngTo360","lngTo360ForArray","latlngsFrom180","objFrom180","objFrom180ToLine","parseFloat","lngTo180","latlngsTo180","getMaxXYByLatlngs","getDistanceXYByLatlngs","latLngToLayerPoint","getUrlParam","split","decodeURIComponent","isCNShip","YuzhengHaijianBaimingdan","f","shipDataServer","getYuzhengHaijianBaimingdan","toUpperCase","replace","getGridKeyByLatLng","isFinite","toString","openLoadingPopup","closeLoadingPopup","getDisValue","dis","name_cn","name_en","getDisValueEN","Error","getShipTypeCN","shipResourceManager","getShipTypeEN","getNewShipTypeCN","CanvasShipUtils","zh_CN","naviStatus","shipType","shipTypeAIS","en_US","seaArea","id","getObjType"],"mappings":"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GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,MAAM,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,WAA8C,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,MAAM,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,MAAM,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,iBAAkF,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,MAAM,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,cAAgE,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,cAAgE,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,eAAsE,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,cAAgE,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,cAAgE,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,OAAO,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,UAAwC,KAAK,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,OAAsB,KAAK,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,WAA8C,KAAK,CAACe,GAAG,SAASd,QAAQ,GAAGD,QAAQ,aAAgDQ,EAAgBxH,QAAQtC,EAAEsC,QAAQwH,EAAgBQ,WAAWtK,EAAEsK,WAAWR,EAAgBrB,8BAAyB"}