From 0f689810d77cf63c544f298195326b602ce0584b Mon Sep 17 00:00:00 2001 From: Pax1601 Date: Sun, 8 Jan 2023 22:33:38 +0100 Subject: [PATCH] Continued typescript conversion --- .gitignore | 3 + www/css/SelectionWheel.css | 1 + www/img/buttons/attack.png | Bin 1380 -> 4973 bytes www/img/buttons/bomb.png | Bin 1603 -> 0 bytes www/img/buttons/carpet.png | Bin 2200 -> 0 bytes www/img/buttons/formation.png | Bin 1944 -> 3370 bytes www/img/buttons/land.png | Bin 1977 -> 0 bytes www/img/buttons/rtb.png | Bin 0 -> 3839 bytes www/img/buttons/tanker.png | Bin 0 -> 7151 bytes www/img/buttons/wheelButtons.xcf | Bin 3579457 -> 3699416 bytes www/index.html | 28 +- www/js/DCS/payloadNames.js | 1 - www/js/Map/SelectionScroll.js | 43 - www/js/Map/SelectionWheel.js | 100 -- www/js/Other/MissionData.js | 67 - www/js/Panels/ActionPanel.js | 30 - www/js/Panels/PanelButton.js | 82 - www/js/Panels/SettingsPanel.js | 86 - www/js/Panels/UnitControlPanel.js | 35 - www/package-lock.json | 1524 +++++++++++++++++ www/package.json | 24 + .../DCSCommands.js => src/DCS/DCSCommands.ts} | 12 +- www/src/DCS/payloadNames.ts | 1 + www/{js/Map/Map.js => src/Map/Map.ts} | 203 ++- www/src/Map/SelectionScroll.ts | 48 + www/src/Map/SelectionWheel.ts | 130 ++ www/{js => src}/Other/AirbaseMarker.js | 0 www/src/Other/MissionData.ts | 77 + www/{js/Other/Utils.js => src/Other/Utils.ts} | 50 +- .../Panels/FormationControlPanel.ts} | 38 +- www/src/Panels/PanelButton.ts | 87 + www/src/Panels/SettingsPanel.ts | 106 ++ www/src/Panels/UnitControlPanel.ts | 43 + .../Panels/UnitInfoPanel.ts} | 22 +- www/{js/Units/Unit.js => src/Units/Unit.ts} | 189 +- www/{js => src}/Units/UnitMarker.js | 0 .../Units/UnitsManager.ts} | 95 +- .../unitTypes.js => src/Units/unitTypes.ts} | 3 +- www/src/globals.d.ts | 18 + www/{js => src}/index.ts | 51 +- www/tsconfig.json | 25 +- 41 files changed, 2431 insertions(+), 791 deletions(-) delete mode 100644 www/img/buttons/bomb.png delete mode 100644 www/img/buttons/carpet.png delete mode 100644 www/img/buttons/land.png create mode 100644 www/img/buttons/rtb.png create mode 100644 www/img/buttons/tanker.png delete mode 100644 www/js/DCS/payloadNames.js delete mode 100644 www/js/Map/SelectionScroll.js delete mode 100644 www/js/Map/SelectionWheel.js delete mode 100644 www/js/Other/MissionData.js delete mode 100644 www/js/Panels/ActionPanel.js delete mode 100644 www/js/Panels/PanelButton.js delete mode 100644 www/js/Panels/SettingsPanel.js delete mode 100644 www/js/Panels/UnitControlPanel.js create mode 100644 www/package-lock.json create mode 100644 www/package.json rename www/{js/DCS/DCSCommands.js => src/DCS/DCSCommands.ts} (89%) create mode 100644 www/src/DCS/payloadNames.ts rename www/{js/Map/Map.js => src/Map/Map.ts} (55%) create mode 100644 www/src/Map/SelectionScroll.ts create mode 100644 www/src/Map/SelectionWheel.ts rename www/{js => src}/Other/AirbaseMarker.js (100%) create mode 100644 www/src/Other/MissionData.ts rename www/{js/Other/Utils.js => src/Other/Utils.ts} (53%) rename www/{js/Panels/FormationControlPanel.js => src/Panels/FormationControlPanel.ts} (60%) create mode 100644 www/src/Panels/PanelButton.ts create mode 100644 www/src/Panels/SettingsPanel.ts create mode 100644 www/src/Panels/UnitControlPanel.ts rename www/{js/Panels/UnitInfoPanel.js => src/Panels/UnitInfoPanel.ts} (89%) rename www/{js/Units/Unit.js => src/Units/Unit.ts} (65%) rename www/{js => src}/Units/UnitMarker.js (100%) rename www/{js/Units/UnitsManager.js => src/Units/UnitsManager.ts} (65%) rename www/{js/Units/unitTypes.js => src/Units/unitTypes.ts} (99%) create mode 100644 www/src/globals.d.ts rename www/{js => src}/index.ts (63%) diff --git a/.gitignore b/.gitignore index 692cffec..ce8c2d57 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,6 @@ core.vcxproj.user .vscode *.user Output +server +/www/js +/www/node_modules diff --git a/www/css/SelectionWheel.css b/www/css/SelectionWheel.css index e2c5fc34..3a15e096 100644 --- a/www/css/SelectionWheel.css +++ b/www/css/SelectionWheel.css @@ -1,6 +1,7 @@ :root { --blue: #2196F3aa; --red: #f32121aa; + --dark: #202831AA; --normal: #2196F3aa; --highlight: #FFFFFFAA; --start_angle: 0deg; diff --git a/www/img/buttons/attack.png b/www/img/buttons/attack.png index 82a3733f6610c898b4526eb37fd08aa6396fb96b..c1a3e62a4da4a3c9b4c7a89e1b918aa9221e0ec5 100644 GIT binary patch literal 4973 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 delta 1245 zcmV<31S0$GCgchsiBL{Q4GJ0x0000DNk~Le0000U0000U2nGNE06Q?QqLCpW3{$l# z6$d+rIAo~0SdmRXf4$69vtt5KHOolGqGBeyDh6KRLl=7B$C$)SJ)T-j!?V8bshjF9 z!n3^l{;WPFXEMMi63;Q+u!uK^XErUJ^FDEi6(xoEoOs-z3lcwaU3U46bHQPOXNHV) za-KLuEEd{WZevz7RN`sku%c>|FJxR+IB#)Q%T?CACx2luf2XaaxK3*rF)SgD1VqTF zqJ%OmL}=GYF_EP6sE2>Z@h8Y7ldA+qjs;YpLUR1zfAD*@W`1hYO$tVV&KKMM7y$yi zK%-{c-^aGyI05|6z?IhWSL(p*C+W487Cr*{w}Ff6mL~53mpj1VlP(#OBl&3w`8@D` zM&FbL25y1gIyHB0&2yYS0BM@l@(pls2#gjed)?#R-R*Pxx2HM3A0lmXhmg=HWB>pF z24YJ`L;wH)0002_L%V;I!~q}(1_=)|c4H(1lk5Q}e*-&7L_t(Y$K{rLNK{!I$3IRs zI?b$6&C+v1%Prd2a<_znBB-Fm4SQ08QncHXNKYr(Y_`SZr10UOpv*_MY za@*y1e*hSYHLzI(wF6Ut^bI-REtCItEcDU=j0e)@&R@9u%=H%kgRVDytFks{0AsCy z+JT8cI*^^5I=jN#^!SCM3GwT-dk=tRfGhSuyh)zAD$m{6GREoJWV6|3PESd7kDKsm zd{3zJb#dYDTA*`ej?Dr)A1l6b*?HfmJ6%b3e}MkJUgKEF{>u+r@7x0Z1#~luD_Tes zyyvTvo~zG>FIRj1>GPhex(9U2s@Bc&I0~ISEje{%S=Ghdl+@XdaDSiC`});j9C0sz z4xs;ihvPpK3alzRQoUp5tU2z1aDU`fMNz{azx!LZ@7&`A+GTEaGutK^*j`)T98@$R ze|+6T`rd=b>w!#Q2H=)-vFIVmZ8)KlBDAW4F(i68I_C$<;s*8#m zZyS(pl@>>#YYIv#8{0yIx}phj{OolFf5?@gwajsB7uyeXD3fTxj$^1AYWP z`%q~72&fzQ@{0wFzDh_)Oj*7tD*Nuck$D~P9J)g9- zG(Gtt=j&3S8TcQFSoJ&|3#0+tem+os2-qyu$+9=`$Ftr6hNo48OFMZV00000NkvXX Hu0mjfeZE*G diff --git a/www/img/buttons/bomb.png b/www/img/buttons/bomb.png deleted file mode 100644 index 823ddf6c4e318acfbb5a59be4618e111b9dfd5a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1603 zcmV-J2E6%+P)EX>4Tx04R}tkv&MmP!xqvQ?)7;2Rn#3WT?7W5EXHhDi*;)X)CnqVDi#GXws0R zxHt-~1qXi?s}3&Cx;nTDg5VE`tBaGOi;H#7sS&T1>;UzV4};>Mp{wy!-yFJ|$-|z$X&VG2O6;H;898 zEuHf|aflTqh4`F!+@K2*KXP4m`HgeIVS#6cjC69II7BQK+E{L5Ry0)NY2vV=YLqWz zTvj-5aaPM!*1RWwVKAqyq_|FN7%?m%js!%=sG@{2EJSG6NHLM5^Qeb^$nhu0C6lWJ zMvetkph9x|;D7LYwq|~6(oG6RfzB7({uluQyFjC6+uz5w-8cdK&%l+|@>lA>>?i59 zmKHt&`nQ3L>y{?(0hc?#;FB&Hk|X(P3Hdzmen#Jv1qN<`-Zgh_&2yYS0BM@l@(pls z2#gjed)?#R-R*Pxx2HM3A0lmXhmg=HWB>pF24YJ`L;wH)0002_L%V+f000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>9>2@xc}l?%84000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}000CUNkl|}YgKGz?=#0gySiNw!JVFDe$8Z_yytt*c|U5S2Rs4Xg=~;t)p~ZsgjzOnUk9@4LeVs zBO-sSa$U-1vk9ZoC==1b<&M%_gYJ;#@-PoiX#Dg`dpZCV5|KrcBq8Yu_WS)pRaFZ! zFUq<(=XPN*Q1pBYi&o?3FVkFc`FGnr2^8xNP;Ej@9CI@b2N};U%VGU34lxhW?i60qtQ%6^8swwvaR;S=imOOMxlM9 zUhR>s&mIL(OhoBKBomR)3z`X_>V;QYT+SbTS`_N?Fu&T`?gp?4z&u@`Hk&Ql-b?_S z8V-E;P4D+Jv!EaMe&+*F10b7-%ol?it`zF^dPOJ{N@eDP9ZfBdF1^dKNRs{@4)29O z_|Snp-2mDExBSxwlzQ6o9ZDn9BP_0Cf2@-WvlymJ*D;raUJzMiip z!|~9TPfq>{U@L$Hx{Qs}9!IpVu1XGtA^#Q-e2++>oHlH|zZ zuWs#d{t^#u?dYG*FDh;TkOx4~1!}cgg(OK=0l2rO@vVX332nC0{t=(<(1?r8L}XuC zvS#-eXMdlyncnFP!LbO0OQIQ;2&EcCr&uIYkhch~8zG-hV)>#C~v z4W0}CbvxYue$S*W?dsrYh1P B?9c!J diff --git a/www/img/buttons/carpet.png b/www/img/buttons/carpet.png deleted file mode 100644 index 1fe51a1b7a3d53fdeb6d28049c4bc377fa73bb17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2200 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 diff --git a/www/img/buttons/formation.png b/www/img/buttons/formation.png index 66b46a46b64a2a747a23ff295128a0f52386e412..e75ccea1c3259f9601090fe96f1896b833b5600a 100644 GIT binary patch literal 3370 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 Ef>Ok diff --git a/www/img/buttons/land.png b/www/img/buttons/land.png deleted file mode 100644 index 525c34cfe06fd41089a7c52e11f180a67d539c2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1977 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 LNkvXXu0mjfViTn_ diff --git a/www/img/buttons/rtb.png b/www/img/buttons/rtb.png new file mode 100644 index 0000000000000000000000000000000000000000..e35be5e87362d516282a46e91bb14365dbec8342 GIT binary patch literal 3839 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 NE?+Xx%G0z9{VyyuDINd- literal 0 HcmV?d00001 diff --git a/www/img/buttons/wheelButtons.xcf b/www/img/buttons/wheelButtons.xcf index f1e3791a7dc8911c0d483af68f2e9766d5ca7b8d..5ef9f1f37167917b0097fecefe1f0a14dec4d43c 100644 GIT binary patch delta 125613 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 aJl^54=}sHr&pmygJUCOA+4Q#ucl|#nPgoQH delta 9342 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 M7aUcS+D5zmFM%6DQUCw| diff --git a/www/index.html b/www/index.html index 3a1c9d27..17023d17 100644 --- a/www/index.html +++ b/www/index.html @@ -20,30 +20,9 @@ integrity="sha256-o9N1jGDZrf5tS+Ft4gbIK7mYMipq9lqpVJ91xHSyKhg=" crossorigin=""> - - - - - - - - - + + - - - - - - - - - - - - - - @@ -56,11 +35,10 @@
-
-
ASD
+
diff --git a/www/js/DCS/payloadNames.js b/www/js/DCS/payloadNames.js deleted file mode 100644 index 37990c29..00000000 --- a/www/js/DCS/payloadNames.js +++ /dev/null @@ -1 +0,0 @@ -payloadNames = {"A-10A": ["MK-84*2 , LAU-68*2 , AGM-65K*2", "LAU-68-MK5*6", "AGM-65K*2,Mk20*6,AIM-9*2,ECM", "Mk-82*6,AIM-9*2,ECM", "Mk20*6,AIM-9*2,ECM", "AGM-65D*4,AIM-9*2,ECM", "AGM-65K, AGM-65D", "ECM", "Mk-82*6, Mk-84*2", "Mk20*8", "AGM-65K*2,Mk-84*2,AIM-9*2,ECM", "AGM-65K*2,Mk-82*6,AIM-9*2,ECM", "Mk-84*2,AIM-9*2,ECM", "AGM-65K*2,Mk84*2,Mk82*4,AIM-9M*2,ECM", "AGM-65H*6,Mk82*10,AIM-9M*2,ECM"], "A-10C": ["LAU-68 42 rkt M156 WP, AIM-9*2, ECM", "AGM-65D*4, CBU-97*2, CBU-87*2, TGP, ECM, AIM-9*2", "LAU-131 98 rkt M156 WP, AIM-9*2,ECM", "SUU-25*9,AIM-9*2,ECM", "AGM-65D*4, CBU-97*4,TGP, ECM, AIM-9*2", "Mk-82AIR*8,AIM-9*2,ECM", "MK-84*2,LAU-68*2,AGM-65K*2", "BDU-33*6, TGM-65H, TGM-65D, TGP, BDU-50LGB*2, CAP-9*1", "Mk-82*6,Mk-84*2,AIM-9*2,ECM", "Mk-84*4,AIM-9*2,ECM", "Mk-82*8,AIM-9*2,ECM", "BDU-33*12, TGP, CAP-9*1", "AGM-65D*4,Mk-82AIR*2,CBU-87*2,AIM-9M*2,ECM,TGP", "AGM-65D*4,GBU-12*2,GBU-38,Mk-82,AIM-9,TGP,ECM", "AGM-65D*2, AGM-65H*2, CBU-97*2, CBU-87*2, TGP, ECM, AIM-9*2", "BDU-50HD*6,Mk1*7,TGP, CAP-9*1", "AGM-65H*4, CBU-97*4,TGP, ECM, AIM-9*2", "AGM-65D*2,AGM-65H*2,Mk-82AIR*2,CBU-87*2,AIM-9M*2,ECM,TGP", "AGM-65K*2,GBU-38*4,AIM-9*2,TGP,ECM", "BDU-33*6, TGP, CAP-9*1", "AGM-65D*2,AGM-65H*2,GBU-12*2,GBU-38*2,AIM-9*2,TGP,ECM,MK151*7", "TGP", "BDU-33*6, TGP, CAP-9*1, BDU-50LD*2", "GBU-12*6,GBU-10*2,TGP, AIM-9*2", "TGP, CBU-87*3, M151*28, AIM-9*2, ECM", "AGM-65D*4,Mk-82*6,CBU-87*2,TGP,AIM-9*2,Mk151*7", "PGM- GBU-10*2,GBU-12*4,AIM-9*2,TGP,ECM", "AGM-65D*4,TGP, ECM, AIM-9*2", "TGP, CAP-9*1, CATM-65K*1, TGM-65G*1", "AGM-65G*2,GBU-31*2,AIM-9*2,TGP,ECM", "TGP, M151*14, Mk-82*2, Mk-82AIR*2, AIM-9*2, ECM", "PGM- GBU-10*4, AGM-65K*2,AIM-9*2,TGP,ECM", "AGM-65D*2,AGM-65H*2,Mk-82AIR*6,CBU-87*2,Mk151*7,AIM-9*2,TGP,ECM", "GBU-31*2,GBU-38*2, AGM-65H*2, AIM-9*2,TGP, ECM", "CBU-103*4, M151*14, AIM-9*2, ECM", "CBU-87*4, M151*42, AIM-9*2, ECM", "AGM-65D*6, CBU-97*4,TGP, ECM, AIM-9*2", "CBU-87*2, M151*14, MK-82AIR*6, AIM-9*2,ECM", "AGM-65D*4, CBU-105*4,TGP, ECM, AIM-9*2", "BDU-50HD*2,BDU-50LGB*2,TGP, CAP-9*1", "CBU-87*4, M151*28, AIM-9*2,ECM", "M151*98, Mk-82*2,AIM-9*2,ECM", "AGM-65D*2,AGM-65H*2,GBU-12,GBU-38,MK82*3,MK82AIR*3,MK5*7,TGP,AM-9*2", "TGP, M151*42, Mk-82*6, Mk-82AIR*6, AIM-9*2, ECM", "TGP, M151*84, Mk-82*2,AIM-9*2, ECM", "BDU-50LD*2, BDU-50HD*2,CATM-65K, TGM-65G, TGP, CAP-9*1", "TGP, M151*49, Mk-82*2, CBU-87*2, AIM-9*2, ECM", "TGP, CAP-9*1, BDU-50LGB*4", "GBU-12*14,TGP, AIM-9*2", "AGM-65D*3, AGM-65H*3, CBU-97*4,TGP, ECM, AIM-9*2", "AGM-65D*2,AGM-65H*2,Mk-82AIR*2,CBU-97*2,AIM-9M*2,TGP,ECM", "AGM-65D*4, CBU-105*2,CBU-97*2, TGP, ECM, AIM-9*2", "AGM-65D*2,Mk-82*6,AIM-9*2,ECM", "AGM-65D*2,AGM-65H*2,TGP, ECM, AIM-9*2", "GBU-38*4,GBU-31*2,TGP, AIM-9*2", "AGM-65D*4,GBU-12*2,GBU-38*2,AIM-9*2,TGP,ECM,MK5*7", "AGM-65G,AGM-65K,GBU-10*2,AIM-9*2,TGP,ECM", "AGM-65G,AGM-65D,Mk-82*7,AIM-9*2,ECM", "GBU-31*2,GBU-38*4,AIM-9*2,TGP,ECM, AIM-9*2", "AGM-65K*2,GBU-12*8,AIM-9M*2.ECM,TGP", "AGM-65D*6,GBU-12*4,AIM-9M*2,ECM,TGP"], "A-10C_2": ["LAU-68 42 rkt M156 WP, AIM-9*2, ECM", "AGM-65D*4, CBU-97*2, CBU-87*2, TGP, ECM, AIM-9*2", "LAU-131 98 rkt M156 WP, AIM-9*2,ECM", "SUU-25*9,AIM-9*2,ECM", "AGM-65D*4, CBU-97*4,TGP, ECM, AIM-9*2", "Mk-82AIR*8,AIM-9*2,ECM", "MK-84*2,LAU-68*2,AGM-65K*2", "BDU-33*6, TGM-65H, TGM-65D, TGP, BDU-50LGB*2, CAP-9*1", "Mk-82*6,Mk-84*2,AIM-9*2,ECM", "Mk-84*4,AIM-9*2,ECM", "Mk-82*8,AIM-9*2,ECM", "BDU-33*12, TGP, CAP-9*1", "AGM-65D*4,Mk-82AIR*2,CBU-87*2,AIM-9M*2,ECM,TGP", "AGM-65D*4,GBU-12*2,GBU-38,Mk-82,AIM-9,TGP,ECM", "AGM-65D*2, AGM-65H*2, CBU-97*2, CBU-87*2, TGP, ECM, AIM-9*2", "BDU-50HD*6,Mk1*7,TGP, CAP-9*1", "AGM-65H*4, CBU-97*4,TGP, ECM, AIM-9*2", "AGM-65D*2,AGM-65H*2,Mk-82AIR*2,CBU-87*2,AIM-9M*2,ECM,TGP", "AGM-65K*2,GBU-38*4,AIM-9*2,TGP,ECM", "BDU-33*6, TGP, CAP-9*1", "AGM-65D*2,AGM-65H*2,GBU-12*2,GBU-38*2,AIM-9*2,TGP,ECM,MK151*7", "TGP", "BDU-33*6, TGP, CAP-9*1, BDU-50LD*2", "GBU-12*6,GBU-10*2,TGP, AIM-9*2", "TGP, CBU-87*3, M151*28, AIM-9*2, ECM", "AGM-65D*4,Mk-82*6,CBU-87*2,TGP,AIM-9*2,Mk151*7", "PGM- GBU-10*2,GBU-12*4,AIM-9*2,TGP,ECM", "AGM-65D*4,TGP, ECM, AIM-9*2", "TGP, CAP-9*1, CATM-65K*1, TGM-65G*1", "AGM-65G*2,GBU-31*2,AIM-9*2,TGP,ECM", "TGP, M151*14, Mk-82*2, Mk-82AIR*2, AIM-9*2, ECM", "PGM- GBU-10*4, AGM-65K*2,AIM-9*2,TGP,ECM", "AGM-65D*2,AGM-65H*2,Mk-82AIR*6,CBU-87*2,Mk151*7,AIM-9*2,TGP,ECM", "GBU-31*2,GBU-38*2, AGM-65H*2, AIM-9*2,TGP, ECM", "CBU-103*4, M151*14, AIM-9*2, ECM", "CBU-87*4, M151*42, AIM-9*2, ECM", "AGM-65D*6, CBU-97*4,TGP, ECM, AIM-9*2", "CBU-87*2, M151*14, MK-82AIR*6, AIM-9*2,ECM", "AGM-65D*4, CBU-105*4,TGP, ECM, AIM-9*2", "BDU-50HD*2,BDU-50LGB*2,TGP, CAP-9*1", "CBU-87*4, M151*28, AIM-9*2,ECM", "M151*98, Mk-82*2,AIM-9*2,ECM", "AGM-65D*2,AGM-65H*2,GBU-12,GBU-38,MK82*3,MK82AIR*3,MK5*7,TGP,AM-9*2", "TGP, M151*42, Mk-82*6, Mk-82AIR*6, AIM-9*2, ECM", "TGP, M151*84, Mk-82*2,AIM-9*2, ECM", "BDU-50LD*2, BDU-50HD*2,CATM-65K, TGM-65G, TGP, CAP-9*1", "TGP, M151*49, Mk-82*2, CBU-87*2, AIM-9*2, ECM", "TGP, CAP-9*1, BDU-50LGB*4", "GBU-12*14,TGP, AIM-9*2", "AGM-65D*3, AGM-65H*3, CBU-97*4,TGP, ECM, AIM-9*2", "AGM-65D*2,AGM-65H*2,Mk-82AIR*2,CBU-97*2,AIM-9M*2,TGP,ECM", "AGM-65D*4, CBU-105*2,CBU-97*2, TGP, ECM, AIM-9*2", "AGM-65D*2,Mk-82*6,AIM-9*2,ECM", "AGM-65D*2,AGM-65H*2,TGP, ECM, AIM-9*2", "GBU-38*4,GBU-31*2,TGP, AIM-9*2", "AGM-65D*4,GBU-12*2,GBU-38*2,AIM-9*2,TGP,ECM,MK5*7", "AGM-65G,AGM-65K,GBU-10*2,AIM-9*2,TGP,ECM", "AGM-65G,AGM-65D,Mk-82*7,AIM-9*2,ECM", "GBU-31*2,GBU-38*4,AIM-9*2,TGP,ECM, AIM-9*2", "AGM-65K*2,GBU-12*8,AIM-9M*2.ECM,TGP", "AGM-65D*6,GBU-12*4,AIM-9M*2,ECM,TGP", "AGM-65E*2,Mk-82AIR*2,CBU-97*2,AIM-9M*2,ECM,TGP", "AGM-65E*2,CBU-97*4,AIM-9M*2,ECM,TGP", "AGM-65E*2,CBU-97*4,AIM-9M*2,ECM,M151 APKWS*7,TGP", "AGM-65E*2,CBU-105*4,AIM-9M*2,ECM,M151 APKWS*7,TGP", "Mk-82*4,Mk-8AIR*4,AIM-9*2,ECM", "Mk-82*20,AIM-9*2,ECM", "Mk-82*6,AIM-9*2,TGP,ECM", "Mk-84*6,AIM-9*2,TGP,ECM", "Mk-82AIR*6,Mk-8AIR*4,M151*1,TGP,AIM-9*2,ECM", "GBU-38*4,M151 APKWS*7,AGM-65D*1,AGM-65H*1,TGP,AIM-9*2,ECM", "GBU-38*4,M151 APKWS*7,AGM-65E*2,TGP,AIM-9*2,ECM", "GBU-12*4,M151 APKWS*7,AGM-65E*2,TGP,AIM-9*2,ECM", "GBU-12*2,GBU-38*2,M151 APKWS*7,AGM-65E*2,TGP,AIM-9*2,ECM", "GBU-10*2,M151 APKWS*7,AGM-65E*2,TGP,AIM-9*2,ECM", "GBU-31*2,M151 APKWS*7,AGM-65E*2,TGP,AIM-9*2,ECM", "GBU-54*4,M151 APKWS*7,AGM-65E*2,TGP,AIM-9*2,ECM", "GBU-54*4,M151 APKWS*7,AGM-65D*4,TGP,AIM-9*2,ECM"], "AH-64D_BLK_II": ["4 * Fuel Tank 230 gal", "2 * M261: M151 (6PD), 2 * Hellfire station: 4*AGM-114K", "4 * Hellfire station: 4*AGM-114K", "4 * M261: M151 (6PD)", "2 * M261: M151 (6PD), 2 * Fuel Tank 230 gal", "2 * Fuel Tank 230 gal, 2 * Hellfire station: 4*AGM-114K", "2 * M261: A/B - M151 (6PD), E - M274 (6SK), 2 * Hellfire station: 4*AGM-114K", "2 * M261: A/B - M151 (6PD), E - M257 (6IL), 2 * Hellfire station: 4*AGM-114K", "2 * M261: C - M257 (6IL), D/E - M151 (6PD), 2 * Hellfire station: 4*AGM-114K", "2 * M261: C - M274 (6SK), D/E - M151 (6PD), 2 * Hellfire station: 4*AGM-114K"], "AJS37": ["Battlefield Air Interdiction: RB-75*4, RB-24J*2, XT", "Anti-ship: RB-04E*2, RB-74*2, XT", "Anti-ship (Heavy Mav): RB-75T*4, XT", "Hard Target (Countermeasures): RB-05, XT, KB, U22", "Hard Target (MAV): RB-75T*2, RB-74*2, XT", "Ferry Flight: XT", "CAS (75 GUN): RB-75*2, AKAN", "CAP: RB-74*4, XT", "Countermeasures Escort: U/22A, KB", "Strike: BK90 (MJ1)*2, RB-74*2, XT", "CAS: AKAN, RB-05A", "CAP (6 AAM): RB-74*4, RB-24J*2, XT", "Rocket Half Load HE: ARAK HE*2, RB-74*2, XT", "CAP / Intecept: RB-05A*2, RB-74*2, XT", "Bombs Low-drag: SB71LD*16, RB-24J*2, XT", "SEAD: RB-75T*2, U22/A, KB, XT", "Anti-Ship (Modern): RB-15F*2, RB-74*2, XT", "New Payload", "CAP (AJ37): RB-24J*2", "ECM Escort Anti-ship: RB-04E, KB, RB-74*2, XT", "Bombs High-drag: SB71HD*16, XT, RB-24J", "Anti-ship (Light Mav): RB-75*4, XT", "Rocket Full Load HE: ARAK HE*4, RB-24J, XT", "Illumination: LYSB*8, XT", "Anti-ship (RB05): RB-05A*2, RB-74*2, XT", "CAP (Gun): AKAN*2, RB-74*2, XT", "Hard Target: RB-05A*2, RB-74*2, XT", "RB-05*2, XT", "CAS: ARAK M70 HE*4, XT", "Runway Strike: SB71HD*16, RB-24J, XT"], "AV8BNA": ["H-L-H 2", "AFAC 1", "AS 1", "H-M-H 3", "Interdiction 1 (H-H-H-H)", "Interdiction 2 (H-H-H-H)", "AFAC 3", "Interdiction 3 (H-L-L-H)", "H-M-H 1", "H-L-H 1", "PGM 2 (H-H-H-H)", "L-L-L 1", "AFAC 2", "H-M-H 2", "Area Suppression", "Rockets 1", "AS 2", "Helo Escort 1", "PGM 1 (H-H-H-H)", "Helo Escort 2", "PGM 3 (H-H-H-H)", "Anti Armor", "RA 1 (H-M-M-H)", "Stand Off 1", "Stand Off 2", "Stand Off 3", "Iron Hand 1", "Iron Hand 2"], "C-101CC": ["2*AIM-9P, DEFA 553 CANNON (I)", "2*AIM-9M, DEFA 553 CANNON (I)", "2*AIM-9P, DEFA 533 CANNON (II)", "2*AIM-9P, AN-M3 CANNON (IV)", "2*R.550 MAGIC, DEFA 553 CANNON", "2*AIM-9M, AN-M3 CANNON (III)", "2*AIM-9P, DEFA 553 CANNON", "2*R.550 MAGIC, DEFA 553 CANNON (III)", "2*AIM-9P, 2*BELOUGA, DEFA 553 CANNON", "2*AIM9-P, 2*SEA EAGLE, DEFA-553 CANNON", "2*AIM-9M 2*SEA EAGLE, AN-M3 CANNON", "2*AIM-9M, AN-M3 CANNON", "2*BELOUGA,2*BDU-33, DEFA-553 CANNON", "2* SEA EAGLE, DEFA-553 CANNON", "2*AIM-9P, 2*BR-250,2*MK-82, DEFA 553 CANNON", "2*R.550 MAGIC, 2*SEA EAGLE , DEFA-553 CANNON", "2*R.550 MAGIC, DEFA 553 CANNON (IV)", "2*BELOUGA, 2*BR-500, DEFA 553 CANNON", "2*AIM-9M, DEFA 553 CANNON (IV)", "2*R.550 MAGIC, AN-M3 CANNON (II)", "2*R550 Magic, DEFA 553 CANNON (I)", "2*AIM-9M ,2*BELOUGA,2*BIN-200, AN-M3 CANNON", "2*AIM-9M, 2*LAU 68, 2*MK-82, DEFA 553 CANNON", "2*AIM-9P, AN-M3 CANNON (III)", "2*AIM-9M, DEFA 533 CANNON (II)", "2*R.550 MAGIC, 2*BR-250, 2*BDU-33, DEFA 553 CANNON"], "C-101EB": ["Smoke System: White Smoke", "Smoke System: White Smoke+Red Colorant", "Smoke System: White Smoke+Yellow Colorant"], "H-6J": ["YJ-12 x 2", "YJ-12 x 4", "YJ-83K x 6", "250-2 HD Bomb x 12 in Bay", "250-2 HD Bomb x 24 in Bay", "250-3 LD Bomb x 36", "KD-63 x 4", "KD-20 x 6", "KD-20 x 4", "KD-63 x 2, KD-20 x 4", "KD-63 x 2, KD-20 x 2"], "J-11A": ["FAB-100x36,R-73x2,ECM", "FAB-250x8,R-73x2,ECM", "FAB-500x8,R-73x2,ECM", "S-8KOMx80,FAB-250x4,R-73x2,ECM", "S-13x20,FAB-250x4,R-73x2,ECM", "S-25x4,FAB-500x4,R-73x2,ECM", "R-27ERx4,R-27ETx2,R-73x2,ECM", "R-77x6,R-73x2,ECM", "R-27ERx6,R-73x2,ECM", "R-77x4,R-27ETx2,R-73x2,ECM", "R-77x4,R-27ERx2,R-73x2,ECM", "BetAB-500ShPx6,R-73x2,ECM", "R-73x4,ECM", "R-77x2,R-27ETx2,R-73x2,ECM", "R-77x6,R-73x4", "R-77x2,R-27ETx2,R-27ERx2,R-73x2,ECM", "R-27ETx2,R-27ERx4,R-73x2,ECM", "S-8TsMx80,FAB-250x4,R-73x2,ECM", "S-8OFP2x80,FAB-250x4,R-73x2,ECM", "FAB-250x18,R-73x2,ECM", "2*S8-KOMx2, R-73x2, ECM", "2*S8-OFP2x2, R-73x2, ECM", "FAB-250x4, 2*FAB-500x2, R-73x2", "FAB-250x4, 2*FAB-250x2, R-73x2", "RBK-250 HEAT/APx2, RBK-250 HE/Fragx2, R-73x2"], "JF-17": ["PL-5Ex2, C802AKx2, 800L Tank", "PL-5Ex2, C-701 IRx2, 1100L Tank, 800L Tank", "PL-5Ex2, SD-10x2, 1100L Tankx2, WMD7", "PL-5Ex2, LD-10x2, 1100L Tankx2, WMD7", "PL-5Ex2, 800L Tank, WMD7", "PL-5Ex2, GBU-10x2, WMD7", "PL-5Ex2, 2*GBU-12x2, 800L Tank, WMD7", "PL-5Ex2, 2*Mk-82x2, Mk-83x2, 800L Tank", "PL-5Ex2, 1100L Tankx2, 800L Tank", "PL-5Ex2, WMD7, CM802AKGx2, 800L Tank, DL", "PL-5Ex2, C-701 CCDx2, 1100L Tank, 800L Tank", "PL-5Ex2, GBU-12x2, 1100L Tank, WMD7", "PL-5Ex2, 2*GBU-12x2, GBU-16x2, WMD7", "PL-5Ex2, 1100L Tankx2, WMD7", "PL-5Ex2, WMD7, 800L Tankx2, SPJ, 2*LD-10", "PL-5Ex2, LS-6x2, 1100L Tankx2, WMD7", "PL-5Ex2, C-701 IRx2, 1100L Tankx2, WMD7", "PL-5Ex2, GBU-12x2, 1100L Tankx2, WMD7", "PL-5Ex2, 2*LD-10x2, 1100L Tankx2, SPJ", "PL-5Ex2, LD-10x2, 1100L Tankx2, SPJ", "PL-5Ex2, 2*LD-10x2, LS-6x2, SPJ", "PL-5Ex2, 2*LD-10x2, GB-6-HEx2, SPJ", "PL-5Ex2, C-701 IRx2, 800L Tankx2, WMD7", "PL-5Ex2, C-701 CCDx2, 1100L Tankx2, WMD7", "PL-5Ex2, C-701 CCDx2, 800L Tankx2, WMD7", "PL-5Ex2, 2*GBU-12x2, 1100L Tank, WMD7", "PL-5Ex2, C-701 IRx2, 1100L Tank, WMD7", "PL-5Ex2, C-701 IRx2, 800L Tank, WMD7", "PL-5Ex2, C-701 CCDx2, 1100L Tank, WMD7", "PL-5Ex2, C-701 CCDx2, 800L Tank, WMD7", "PL-5Ex2, C-701 IRx2, LS-6x2, 800L Tank", "PL-5Ex2, C-701 IR/CCD, GB-6-HEx2, 800L Tank", "PL-5Ex2, C-701 IR/CCD, GB-6-SFWx2, 800L Tank", "PL-5Ex2, WMD7, GB-6-SFWx2, 800L Tank, BRM1", "PL-5Ex2, WMD7, GB-6-SFWx2, 800L Tank, GBU-12", "PL-5Ex2, 2*Mk-82SEx2, Mk-83x3", "PL-5Ex2, Mk-84x3", "PL-5Ex2, 2*Mk5x2, 800L Tank", "PL-5Ex2, Unguided 90mmx2, 800L Tank", "PL-5Ex2, 2*Mk5x2, Mk-83x3", "PL-5Ex2, BRM1x2, 1100L Tank, WMD7", "PL-5Ex2, 2x1100L Tank", "PL-5Ex2, SD-10x2, 2x1100L Tank", "PL-5Ex2, 2*SD-10x2, 2x1100L Tank", "PL-5Ex2, 800L Tank", "PL-5Ex2, SD-10x2, 800L Tank", "PL-5Ex2, 2*SD-10x2, 800L Tank", "PL-5Ex2, SD-10x2, SPJ", "PL-5Ex2, SPJ", "PL-5Ex2, 2*SD-10x2, SPJ", "PL-5Ex2", "PL-5Ex2, SD-10x2", "PL-5Ex2, 2*SD-10", "PL-5Ex2, SD-10x2, SPJ, 1100L Tankx2", "PL-5Ex2, 2*SD-10x2, 1100L Tankx2, 800L Tank", "PL-5Ex2, SD-10x2, 1100L Tankx2, 800L Tank", "PL-5Ex2, GBU-16x2, BRM1x2, WMD7", "PL-5Ex2, WMD7", "PL-5Ex2, 2*LD-10, GB-6x2, 2*SD-10, SPJ", "PL-5Ex2, C-701 CCDx2, SPJ", "PL-5Ex2, 2*LD-10, CM802AKGx2, 2*SD-10, DL", "PL-5Ex2, 2*MK-82x2, MK-83x2, MK-84", "PL-5Ex2, LS-6x2, GB-6x2, 800L Tank", "PL-5Ex2, 2*GBU-12x2, LS-6x2, WMD7", "PL-5Ex2, 2*GBU-12x2, GB-6x2, WMD7", "PL-5Ex2, 2*Type-200Ax2", "PL-5Ex2, Type-200Ax2", "PL-5Ex2, 2*LS6-250x2, 800L Tankx2, WMD7", "PL-5Ex2, 2*LS6-250x2, 800L Tank, 1100L Tankx2", "PL-5Ex2, 2*LS6-100x2, 1100L Tankx2, WMD7", "PL-5Ex2, 2*LS6-100x2, 800L Tankx2, WMD7"], "WingLoong-I": ["AKD-10 x 2"], "Christen Eagle II": ["Smoke - white"], "F-16C_50": ["AIM-120B*2, AIM-9M*4, FUEL*3", "AIM-120B*4, AIM-9M*2, FUEL*3", "AIM-120B*6, FUEL*3", "AIM-120C*2, AIM-9X*4, FUEL*2", "AIM-120C*4, AIM-9X*2, FUEL*3", "AIM-120C*4, AIM-9X*2, FUEL*3, TGP", "AIM-120C*4, AIM-9X*2, FUEL*2", "AIM-120C*6, FUEL*3", "AIM-120C*4, AIM-9X*2, FUEL*2, ECM", "AIM-120C*4, AIM-9X*2, FUEL*2, ECM, TGP", "AIM-120C*6, FUEL*2, ECM", "AIM-120C*6, FUEL*2, ECM, TGP", "AIM-120C*6, FUEL*2", "AIM-120C*6, FUEL*3, TGP", "AIM-120C*2, AIM-9X*2, AGM-65D*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, AGM-65H*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, AGM-65H*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, AGM-65D*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, CBU-97*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, MK-82*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, CBU-87*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, MK-82HD*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, CBU-103*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, CBU-105*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, MK-82*6, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, MK-82HD*6, FUEL*2, ECM, TGP", "AIM-120*2, AIM-9X*2, MK-82SE*4, FUEL*2, ECM, TGP", "AIM-120*2, AIM-9X*2, MK-82SE*6, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, MK-84*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, MK-82P*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-12*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-12*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-10*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-24*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-31-1B*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-31-3B*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-38*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-38*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, AGM-65K*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, AGM-65G*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, AGM-65G, AGM-65K, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, AGM-88C*2, FUEL*3, TGP, HTS", "AIM-120C*2, AIM-9X*2, AGM-88C*2, FUEL*2, ECM, TGP, HTS", "AIM-120C*2, AIM-9X*2, AGM-88C*4, ECM, TGP, HTS", "AIM-120C*4, AGM-88C*2, FUEL*3, TGP, HTS", "AIM-120C*4, AGM-88C*2, FUEL*2, ECM, TGP, HTS", "AIM-120C*4, AGM-88C*4, ECM, TGP, HTS", "AIM-120C*2, AIM-9X*2, MK-61*2, FUEL*2, ECM, TGP"], "F-5E-3": ["Mk-82LD*4,AIM-9P*2,Fuel 275", "AIM-9P*2, Fuel 275*3", "AIM-9P5*2, Fuel 275*3", "AIM-9P*2, Fuel 150*3", "AIM-9P5*2, Fuel 150*3", "Mk-82SE*4,AIM-9P*2,Fuel 275", "CBU-52B*4,AIM-9P*2,Fuel 275", "LAU-3 HE*4,AIM-9P*2,Fuel 275", "LAU-3 HEAT*4,AIM-9P*2,Fuel 275", "LAU-68 HE*4,AIM-9P*2,Fuel 275", "LAU-68 HEAT*4,AIM-9P*2,Fuel 275", "M-117*4,AIM-9P*2,Fuel 275", "GBU-12*4,AIM-9P*2,Fuel 275", "CBU-52B*5,AIM-9*2", "Mk-82LD*5,AIM-9*2", "Mk-82SE*5,AIM-9*2", "Mk-82LD*7,AIM-9P*2, Fuel 275*2", "Mk-82SE*7,AIM-9P*2, Fuel 275*2", "LAU-3 HE*2,Mk-82LD,AIM-9P*2,Fuel 275*2", "LAU-68 HE*2,Mk-82LD,AIM-9P*2,Fuel 275*2", "M-117*5,AIM-9*2", "AIM-9P*2, Fuel 275", "AIM-9P*2, Fuel 150", "AIM-9P5*2, Fuel 275", "AIM-9P5*2, Fuel 150", "AIM-9B*2, Fuel 275", "AIM-9B*2, Fuel 150", "AIM-9B*2, Fuel 275*3", "AIM-9B*2, Fuel 150*3", "AN/ASQ-T50, AIM-9P, Fuel 150", "AIM-9B*2", "AIM-9P*2", "AIM-9P5*2", "Antiship Mk82"], "F-5E": ["Mk-82LD*4,AIM-9P*2,Fuel 275", "AIM-9P*2, Fuel 275*3", "AIM-9P5*2, Fuel 275*3", "AIM-9P*2, Fuel 150*3", "AIM-9P5*2, Fuel 150*3", "Mk-82SE*4,AIM-9P*2,Fuel 275", "CBU-52B*4,AIM-9P*2,Fuel 275", "LAU-3 HE*4,AIM-9P*2,Fuel 275", "LAU-3 HEAT*4,AIM-9P*2,Fuel 275", "LAU-68 HE*4,AIM-9P*2,Fuel 275", "LAU-68 HEAT*4,AIM-9P*2,Fuel 275", "M-117*4,AIM-9P*2,Fuel 275", "GBU-12*4,AIM-9P*2,Fuel 275", "CBU-52B*5,AIM-9*2", "Mk-82LD*5,AIM-9*2", "Mk-82SE*5,AIM-9*2", "Mk-82LD*7,AIM-9P*2, Fuel 275*2", "Mk-82SE*7,AIM-9P*2, Fuel 275*2", "LAU-3 HE*2,Mk-82LD,AIM-9P*2,Fuel 275*2", "LAU-68 HE*2,Mk-82LD,AIM-9P*2,Fuel 275*2", "M-117*5,AIM-9*2", "AIM-9P*2, Fuel 275", "AIM-9P*2, Fuel 150", "AIM-9P5*2, Fuel 275", "AIM-9P5*2, Fuel 150", "AIM-9B*2, Fuel 275", "AIM-9B*2, Fuel 150", "AIM-9B*2, Fuel 275*3", "AIM-9B*2, Fuel 150*3", "AN/ASQ-T50, AIM-9P, Fuel 150", "AIM-9B*2", "AIM-9P*2", "AIM-9P5*2"], "F-86F Sabre": ["120gal Fuel*2", "200gal Fuel*2", "120gal Fuel*2, 200gal Fuel*2", "GAR-8*2", "120gal Fuel*2, GAR-8*2", "HVAR*16", "200gal Fuel*2, HVARx2*4", "AN-M64*2", "200gal Fuel*2, AN-M64*2", "M117*2"], "F-14A-135-GR": ["XT*2", "AIM-54A-MK47*6, AIM-9L*2, XT*2", "AIM-7F*6, AIM-9L*2, XT*2", "AIM-54A-MK47*4, AIM-7F*2, AIM-9L*2, XT*2", "AIM-54A-MK47*2, AIM-7F*1, AIM-9L*4, XT*2", "AIM-54A-MK47*4, AIM-9L*4, XT*2", "AIM-54A-MK47*4, AIM-9M*4, XT*2", "AIM-54A-MK60*4, AIM-9M*4, XT*2", "AIM-7F*4, AIM-9L*4, XT*2", "AIM-7F*4, AIM-9L*4, XT*2", "BDU-33*14", "BDU-33*12", "GBU-10*2", "GBU-12*4", "GBU-16*4", "GBU-24*2", "Mk-84*4", "Mk-83*4", "Mk-82*4", "Mk-82*14", "Mk-81*14", "Mk-20*4", "Mk-82AIR*4", "Zuni*12", "Zuni*28", "LUU-2*24", "AIM-54A-MK60*1, AIM-7F*1, AIM-9L*2, XT*2, Mk-82*2", "AIM-54A-MK60*1, AIM-7F*1, AIM-9L*2, XT*2, Mk-82*1", "AIM-54A-MK60*1, AIM-7F*1, AIM-9L*2, XT*2, Mk-20*2", "AIM-7M*1, AIM-9M*2, XT*2, GBU-12*2, LANTIRN", "AIM-7M*1, AIM-9M*2, XT*2, GBU-24*1, LANTIRN", "AIM-54A-MK60*1, AIM-7M*1, AIM-9M*2, XT*2, Mk-82*2, LANTIRN", "AIM-54A-MK60*1, AIM-7M*1, AIM-9M*2, XT*2, Mk-20*2, LANTIRN"], "F-14A-95-GR": ["AIM-54A-MK47*6, AIM-9L*2", "AIM-54A-MK47*6, AIM-9L*2", "AIM-54A-MK60*6, AIM-9L*2", "AIM-7F*6, AIM-9L*2", "AIM-7F*6, AIM-9L*2", "AIM-54A-MK47*4, AIM-7F*2, AIM-9L*2", "AIM-54A-MK47*4, AIM-7F*2, AIM-9L*2", "AIM-54A-MK60*4, AIM-7F*2, AIM-9L*2", "AIM-54A-MK47*2, AIM-7F*1, AIM-9L*4", "AIM-54A-MK47*2, AIM-7F*1, AIM-9L*4", "AIM-54A-MK60*2, AIM-7F*1, AIM-9L*4", "AIM-54A-MK47*4, AIM-9L*4", "AIM-54A-MK47*4, AIM-9L*4", "AIM-54A-MK60*4, AIM-9L*4", "AIM-7F*4, AIM-9L*4", "AIM-7F*4, AIM-9L*4", "AIM-54A-MK47*2, AIM-7F*3, AIM-9L*2", "AIM-54A-MK47*2, AIM-7F*3, AIM-9L*2", "AIM-54A-MK60*2, AIM-7F*3, AIM-9L*2", "BDU-33*14", "BDU-33*12", "GBU-10*2", "GBU-12*4", "GBU-16*4", "GBU-24*2", "Mk-84*4", "Mk-83*4", "Mk-82*4", "Mk-82*14", "Mk-81*14", "Mk-20*4", "Mk-82AIR*4", "Zuni*12", "Zuni*28", "LUU-2*24", "AIM-54A-MK60*1, AIM-7F*1, AIM-9L*2, Mk-82*2", "AIM-54A-MK60*1, AIM-7F*1, AIM-9L*2, Mk-82*1", "AIM-54A-MK60*1, AIM-7F*1, AIM-9L*2, Mk-20*2"], "F-14B": ["XT*2", "AIM-54A-MK47*6, AIM-9M*2, XT*2", "AIM-54A-MK47*6, AIM-9L*2, XT*2", "AIM-54A-MK60*6, AIM-9M*2, XT*2", "AIM-54C-MK47*6, AIM-9M*2, XT*2", "AIM-7M*6, AIM-9M*2, XT*2", "AIM-7M*6, AIM-9L*2, XT*2", "AIM-54A-MK47*4, AIM-7M*2, AIM-9M*2, XT*2", "AIM-54A-MK47*4, AIM-7M*2, AIM-9L*2, XT*2", "AIM-54A-MK60*4, AIM-7M*2, AIM-9M*2, XT*2", "AIM-54C-MK47*4, AIM-7M*2, AIM-9M*2, XT*2", "AIM-54A-MK47*2, AIM-7M*1, AIM-9M*2, AIM-9L*2, XT*2", "AIM-54A-MK47*2, AIM-7M*1, AIM-9M*4, XT*2", "AIM-54A-MK60*2, AIM-7M*1, AIM-9M*4, XT*2", "AIM-54C-MK47*2, AIM-7M*1, AIM-9M*4, XT*2", "AIM-54A-MK47*4, AIM-9M*2, AIM-9L*2, XT*2", "AIM-54A-MK47*4, AIM-9M*4, XT*2", "AIM-54A-MK60*4, AIM-9M*4, XT*2", "AIM-54C-MK47*4, AIM-9M*4, XT*2", "AIM-7M*4, AIM-9M*2, AIM-9L*2, XT*2", "AIM-7M*4, AIM-9L*4, XT*2", "AIM-54A-MK47*2, AIM-7M*3, AIM-9M*2, XT*2", "AIM-54A-MK47*2, AIM-7M*3, AIM-9M*2, XT*2", "AIM-54A-MK60*2, AIM-7M*3, AIM-9M*2, XT*2", "AIM-54C-MK47*2, AIM-7M*3, AIM-9M*2, XT*2", "BDU-33*14", "BDU-33*12", "GBU-10*2", "GBU-12*4", "GBU-16*4", "GBU-24*2", "Mk-84*4", "Mk-83*4", "Mk-82*4", "Mk-82*14", "Mk-81*14", "Mk-20*4", "Mk-82AIR*4", "Zuni*12", "Zuni*28", "LUU-2*24", "AIM-54A-MK60*1, AIM-7M*1, AIM-9M*2, XT*2, Mk-82*2", "AIM-54A-MK60*1, AIM-7M*1, AIM-9M*2, XT*2, Mk-82*1", "AIM-54A-MK60*1, AIM-7M*1, AIM-9M*2, XT*2, Mk-20*2", "AIM-7M*1, AIM-9M*2, XT*2, GBU-12*2, LANTIRN", "AIM-7M*1, AIM-9M*2, XT*2, GBU-24*1, LANTIRN", "AIM-54A-MK60*1, AIM-7M*1, AIM-9M*2, XT*2, Mk-82*2, LANTIRN", "AIM-54A-MK60*1, AIM-7M*1, AIM-9M*2, XT*2, Mk-20*2, LANTIRN"], "FA-18C_hornet": ["AIM-9M*6, AIM-7M*2, FUEL*3", "AIM-9M*6, AIM-7M*2, FUEL*2", "AIM-9M*2, MK-84*2, FUEL*2", "AIM-9M*2, MK-83*4, FUEL*2", "Carrier Landing", "AIM-9M*2, AIM-7M*4, FUEL*3", "AIM-9M*2, CBU-99*4, FUEL*2", "AIM-9M*2, MK-82SE*4, FUEL*2", "AIM-9M*2, MK-20*4, FUEL*2", "AIM-9M*2, MK-82*4, FUEL*2", "AIM-9M*2, AIM-7M*2, FUEL*2", "AIM-9M*2, MK-83*2, FUEL*2", "AIM-9M*2, ZUNI*4, FUEL*2", "AIM-9M*2, LAU-61*4, FUEL*2", "AIM-9M*2, LAU-68*4, FUEL*2", "AIM-9M*2, AIM-7M*2, FUEL*1", "AIM-9X*2, AIM-120C-5*1, GBU-31*4, ATFLIR, FUEL", "AIM-9X*2, AIM-120C-5*6, FUEL*3", "AIM-9X*2, AIM-120C-5*1, AGM-65D*4, ATFLIR, FUEL", "AIM-9X*2, AIM-120C-5*2, AGM-88C*2, FUEL", "AIM-9X*2, AIM-120C-5*1, GBU-38*4, GBU-12*4, ATFLIR, FUEL", "AIM-9X*2, AIM-120C-5*1, AGM-84E*2, DATALINK, ATFLIR, FUEL*2", "AIM-9M*2, AIM-120C-5*1, AGM-84D*4, ATFLIR, FUEL", "AIM-9M*2, ATFLIR, FUEL", "AIM-9M*2, ATFLIR, FUEL*2"], "I-16": ["6xRS-82", "2xFAB-100", "6xRS-82, 2xFAB-100", "6xRS-82, 2xDropTank-93L", "2xDropTank-93L"], "Ka-50": ["4xFAB-500", "2xFuel tank, 2xKMGU AP", "80xS-8 TsM", "2xFuel tank, 40xS-8", "80xS-8", "4xKMGU AT", "2xKMGU AP", "2xFuel tank, 12x9A4172", "2xFuel tank, 2xUPK-23", "12x9A4172, 40xS-8", "12x9A4172, 2xKMGU AT", "4xKMGU AP", "2xFAB-250, 2xFuel tank", "12x9A4172, 2xFAB-500", "20xS-13", "40xS-8", "12x9A4172, 2xUPK-23", "2xKMGU AT", "6x9A4172", "2xFuel tank, 2xKMGU AT", "4xFuel tank", "2xKMGU AP, 12x9A4172", "12x9A4172", "2xFuel tank", "40xS-8 TsM, 12x9A4172", "2xFAB-500", "40xS-8 TsM, 2xFuel tank", "4xUPK-23", "10xS-13", "40xS-8 TsM", "12x9A4172, 10xS-13", "2xFuel tank, 2xFAB-500", "2xFAB-250", "4xFAB-250", "2xFuel tank, 10xS-13", "2xFAB-250, 12x9A4172", "2xUPK-23"], "Ka-50_3": ["4xIgla", "2xKh-25ML, 10xS-13, 4xIgla", "12x9A4172, 40xS-8KOM, 4xIgla", "12x9A4172, 40xS-8OFP, 4xIgla", "12x9A4172, 40xS-13, 4xIgla", "80xS-8KOM, 4xIgla", "80xS-8OFP, 4xIgla", "20xS-20, 4xIgla", "4xUPK-23, 4xIgla", "10xS-13, 2xFAB-500, 4xIgla", "10xS-13, 2xFAB-250, 4xIgla", "80xS-8OM, 4xIgla", "80xS-8TsM, 4xIgla", "40xS-8OFP, 2xFuel, 4xIgla", "12x9A4172, 2xFuel, 4xIgla"], "L-39C": ["SAB-100x2", "R-3Sx2", "Smokes", "Central Smoke", "FAB-100x2", "S-5KOx32"], "L-39ZA": ["S-5KOx32", "S-5KOx64", "S-5KOx32, PTB-150x2", "S-5KOx32, PTB-350x2", "S-5KOx32, FAB-100x2", "OFAB-100 Jupiter x4, FAB-100x2", "FAB-100x2", "FAB-100x4", "OFAB-100 Jupiter x8", "FAB-100x2, PTB-150x2", "FAB-100x2, PTB-350x2", "PK-3x4", "PK-3x2, PTB-150x2", "R-60Mx2", "SAB-100x4", "R-3Sx2", "R-3Sx2, PK-3x2", "R-60Mx2, PK-3x2"], "M-2000C": ["Fox", "Fox / Magic (QRA)", "Alpha / S530D", "Fox / S530D / Magic", "Fox / S530D / Magic / Eclair", "Bravo", "Bravo / Magic", "Kilo", "Kilo / Magic", "Bravo / 4xMk-82 / Magic", "Bravo / GBU-12 / Magic", "Bravo / 2xGBU-12 / Magic", "Bravo / GBU-16 / Magic", "Bravo / GBU-24 / Magic", "Bravo / BAP-100 / Magic", "Bravo / 4xSnakeEye / Magic", "Fox / 4xMk-82 / Magic", "Kilo / 4xMk-82 / Magic"], "MB-339A": ["A - 2*320L TipTanks + 2*DEFA-553 GunPods + 2*Mk.83 + 2*Mk.81 ", "A - 2*320L TipTanks [Clean]", "Recon", "Training", "AA - 2*320L TipTanks + 2*DEFA-553 GunPods + 2*LAU-10(Zuni Rockets) [ARMADA]", "AM - 2*320L TipTanks + 2*AN/M3 GunPods + 2*330L Tanks + 2*LAU-3 (Hydra rockets)", "A - 2*500L TipTanks + 2*330L Tanks + Luggage Container [Ferry Long Range]", "A - 2*500L TipTanks + 4*Mk.82HD + 2*LR-25 (API Rockets)", "A - 2*320L TipTanks + 2*330L Tanks [Ferry Medium Range]", "A - 2*500L TipTanks + 2*AN/M3 GunPods + 2*Matra 155 + 2* Belouga", "Runway Interdiction", "A - 2*500L TipTanks + 2*DEFA-553 GunPods + 2*Mk.82LD + 2*LR-25 (API Rockets)", "A - 2*320L TipTanks + 2*DEFA-553 GunPods + 2*Mk.82LD Bombs + 2*LR-25(API Rockets)", "A - 2*320L TipTanks + 2*DEFA-553 GunPods + 2*Mk.82LD + 2*LR-25 (HEI Rockets)", "A - 2*320L TipTanks + 6*Mk.82LD", "Runway Interdiction (36*BAP-100)", "Anti - Light Armoured Vehicle (36*BAT-120 ABL)", "AP - 2*320L TipTanks + 2*DEFA-553 GunPods + 2*330L Tanks + 2*Matra 155 (SNEB rockets)"], "MB-339APAN": ["PAN - Smoke White", "PAN - Smoke White and Color Red", "PAN - Fuel External [RED SMOKE]", "PAN - Full Payload [RED SMOKE] + 2*320L TipTanks", "PAN - Full Payload [GREEN SMOKE] + 2*320L TipTanks", "PAN - Fuel External [GREEN SMOKE]", "PAN - Full Payload [RED SMOKE] + 2*500L TipTanks", "PAN - Smoke White and Color Green", "PAN - Full Payload [GREEN SMOKE] + 2*500L TipTanks"], "Mi-24P": ["2xB8V20 (S-8KOM)+8xATGM 9M114", "2xB8V20 ( S-8KOM)+4xATGM 9M114", "4xB8V20 (S-8KOM)+4xATGM 9M114", "2xB8V20 (S-8KOM)+2xBombs-250+4xATGM 9M114", "2xB8V20 (S-8OFP2)+4xATGM 9M114", "4xUB-32A (S-5KO)+4xATGM 9M114", "4xGUV-1 AP30+4xATGM 9M114", "2xGUV-1 AP30+4xATGM 9M114", "2xGUV-1 (GUN 12.7+2x7.62) +4xATGM 9M114", "2xKMGU (96 AO 2.5RT)+8xATGM 9M114", "2xB-13L+4xATGM 9M114", "2xS-24B+4xATGM 9M114", "4xS-24B+4xATGM 9M114", "2xBombs-500+4xATGM 9M114", "4xBombs-250+4ATGM 9M114", "2xRBK-500 (PTAB-1M)+4xATGM 9M114", "2xRBK-500U (OAB 2.5RT)+4xATGM 9M114", "4xRBK-250 (42 PTAB 2.5M) +4ATGM 9M114", "4xRBK-250-275 (150 AO-1SCh)+4ATGM 9M114", "4xPTB-450 Fuel tank"], "MiG-19P": ["PTB-760 x 2", "K-13A x 2, PTB-760 x 2", "K-13A x 2", "K-13A x 2, ORO-57K x 2, PTB-760 x 2", "ORO-57K x 2, PTB-760 x 2", "ORO-57K x 4", "ORO-57K x 2", "FAB-100M x 2, ORO-57K x 2", "FAB-250 x 2, ORO-57K x 2", "FAB-100M x 2", "FAB-250 x 2"], "MiG-21Bis": ["Patrol, long range", "Patrol, medium range", "Patrol, short range", "Hard targets, BOMBS", "Unknown or mixed targets, BOMBS + ROCKETS", "Soft targets, CLUSTERS + ROCKETS", "Soft targets, CLUSTERS", "Soft targets, scattered", "Few big targets, GROM + BOMBS", "Very hard target, PENETRATION", "Aerial attack, hard targets, CLUSTERS", "Hard targets, ROCKETS, PENETRATION", "Soft targets, ROCKETS, BLAST-FRAGMENTS", "Long range, MIX", "Long range, RADAR GUIDED MISSILES", "Long range, INFRA RED MISSILES", "Escort", "Escort, JAMMER", "Night, ILLUMINATOR", "Long range, JAMMER", "Soft targets, UPK + ROCKETS", "Soft targets, UPK + CLUSTERS", "Patrol, JAMMER", "NUCLEAR A", "NUCLEAR B", "Short range", "AEROBATIC"], "Mirage-F1B": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1BD": ["2*R550 Magic I, 2*S530, 1*Fuel Tank", "2*R550 Magic I", "2*R550 Magic I, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*S530, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1BE": ["2*AIM9-JULI, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*AIM9-JULI, R530IR", "2*R550 Magic I, R530EM", "2*AIM9-JULI, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*AIM9-J, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 LD", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*AIM-9JULI, 8*SAMP 250 HD", "2*AIM-9JULI, 8*SAMP 400 LD", "2*AIM-9JULI, 8*BLU107 Durandal"], "Mirage-F1BQ": ["2*R550 Magic I, 2*S530, 1*Fuel Tank", "2*R550 Magic I", "2*R550 Magic I, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*S530, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1C-200": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1C": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1CE": ["2*AIM9-JULI, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*AIM9-JULI, R530IR", "2*R550 Magic I, R530EM", "2*AIM9-JULI, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*AIM9-J, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 LD", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*AIM-9JULI, 8*SAMP 250 HD", "2*AIM-9JULI, 8*SAMP 400 LD", "2*AIM-9JULI, 8*BLU107 Durandal"], "Mirage-F1CG": ["2*AIM-9 JULI, 2*R530IR, 1*Fuel Tank", "4*AIM-9 JULI, 2*R530IR, 1*Fuel Tank", "2*AIM-9 JULI, 2*R530EM, 1*Fuel Tank", "2*AIM-9 JULI, R530IR", "2*AIM-9 JULI, 1*R530IR, 2*Fuel Tank", "2*AIM-9 JULI, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*AIM-9 JULI, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*AIM-9 JULI, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*AIM-9 JULI, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*AIM-9 JULI, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*AIM-9 JULI, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1CH": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1CJ": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1CK": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1CR": ["2*R550 Magic I, 2*S530, 1*Fuel Tank", "2*R550 Magic I", "2*R550 Magic I, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*S530, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1CT": ["2*R550 Magic I, 2*S530, 1*Fuel Tank", "2*R550 Magic I", "2*R550 Magic I, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*S530, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1CZ": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1DDA": ["2*R550 Magic I, 2*S530, 1*Fuel Tank", "2*R550 Magic I", "2*R550 Magic I, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*S530, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1ED": ["2*R550 Magic II, 2*S530, 1*Fuel Tank", "2*R550 Magic II", "2*R550 Magic II, 2*Fuel Tank", "2*R550 Magic II, 2*MATRA F4 SNEB251 (HE), 2*S530, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic II, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic II, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic II, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic II, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic II, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1EDA": ["2*R550 Magic I, 2*S530, 1*Fuel Tank", "2*R550 Magic I", "2*R550 Magic I, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*S530, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1EE": ["2*AIM9-JULI, 2*R530IR, 1*Fuel Tank", "2*AIM9-JULI, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*AIM9-JULI, R530EM", "2*R550 Magic I, R530IR", "2*AIM9-JULI, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*AIM9-J, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 LD", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*AIM-9JULI, 8*SAMP 250 HD", "2*AIM-9JULI, 8*SAMP 400 LD", "2*AIM-9JULI, 8*BLU107 Durandal"], "Mirage-F1EH": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1EQ": ["2*R550 Magic I, 2*S530, 1*Fuel Tank", "2*R550 Magic I", "2*R550 Magic I, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*S530, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1JA": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1M-CE": ["2*AIM9-JULI, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*AIM9-JULI, R530IR", "2*R550 Magic I, R530IR", "2*AIM9-JULI, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*AIM9-J, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 LD", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*AIM-9JULI, 8*SAMP 250 HD", "2*AIM-9JULI, 8*SAMP 400 LD", "2*AIM-9JULI, 8*BLU107 Durandal"], "Mirage-F1M-EE": ["2*AIM9-JULI, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*AIM9-JULI, R530IR", "2*R550 Magic I, R530IR", "2*AIM9-JULI, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*AIM9-J, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 LD", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*AIM-9JULI, 8*SAMP 250 HD", "2*AIM-9JULI, 8*SAMP 400 LD", "2*AIM-9JULI, 8*BLU107 Durandal"], "SA342L": ["M621, 8xSNEB68 EAP", "M621, 8xSNEB68 EAP, IR Deflector", "M621, 8xSNEB68 EAP, IR Deflector, Sand Filter"], "SA342M": ["HOT3x4", "IR Deflector", "Hot3x4, FAS, IR Deflector", "HOT3x2", "Hot3x4, IR Deflector", "Hot3x2, IR Deflector"], "SA342Minigun": ["IR Deflector", "IR Deflector, Sand Filter"], "SA342Mistral": ["Mistral x 4", "Mistral x 4, IR Deflector", "Mistral x 4, IR Deflector, Sand Filter"], "A-20G": ["500 lb GP bomb LD*4"], "Bf-109K-4": ["Fuel Tank", "SC250", "SC500"], "FW-190A8": ["Without pylon", "SC 50 * 4", "AB 250 (w/ SD 10A)", "AB 250 (w/ SD 2)", "AB 500 (w/ SD 10A)", "SC 250 L2", "SC 250 J", "SC 500 J", "SC 500 L2", "SD 250 Stg", "SD 500 A", "Fuel Tank 300 liters", "BR 21"], "FW-190D9": ["SC500", "Fuel Tank", "R4M", "BR 21"], "MosquitoFBMkVI": ["250 lb S.A.P*2; 500 lb S.A.P.*2", "500 lb GP Mk.V*2, 500 lb GP Short tail*2", "100 gal Drop tank*2, 500 lb MC Short tail*2", "RP-3 60lb SAP No2 Mk.I*8, 250 lb A.A.P.*2", "100 gal. Drop tank*2, 250 lb MC Mk.II, RP-3 60lb F No1 Mk.I*4", "500 lb GP Short tail*4"], "P-47D-30": ["AN-M65*2", "Fuel150*2", "AN-M64*2, Fuel110", "AN-M57*3"], "P-47D-30bl1": ["AN-M57*2", "AN-M64*2, Fuel110"], "P-47D-40": ["AN-M65*2", "Fuel150*2", "AN-M57*3", "AN-M64*2, Fuel110", "M8*6, AN-M57*2, Fuel110", "HVAR*10, Fuel110"], "P-51D-30-NA": ["Fuel75*2", "HVAR*6,Fuel75*2", "HVAR*6,M64*2", "HVAR*6", "M64*2", "HVAR*10", "Smokes"], "P-51D": ["Fuel75*2", "HVAR*6,Fuel75*2", "HVAR*6,M64*2", "HVAR*6", "M64*2", "HVAR*10", "Smokes"], "A-50": [], "AH-1W": ["14xHYDRA-70 WP", "38xHYDRA-70 WP", "8xBGM-71, 14xHYDRA-70", "8xBGM-71, 14xHYDRA-70 WP", "8xBGM-71, 38xHYDRA-70 WP", "14xHYDRA-70", "38xHYDRA-70", "8xAGM-114", "28xHYDRA-70", "8xBGM-71, 38xHYDRA-70", "8xAGM-114, 38xHYDRA-70 WP", "8xBGM-71", "8xAGM-114, 14xHYDRA-70 WP", "76xHYDRA-70", "8xAGM-114, 38xHYDRA-70", "8xAGM-114, 14xHYDRA-70"], "AH-64A": ["8xAGM-114", "38xHYDRA-70 WP", "76xHYDRA-70", "8xAGM-114, 38xHYDRA-70 WP", "38xHYDRA-70", "8xAGM-114, 38xHYDRA-70", "AGM-114K*16"], "AH-64D": ["76xHYDRA-70", "38xHYDRA-70", "38xHYDRA-70 WP", "8xAGM-114", "8xAGM-114, 38xHYDRA-70 WP", "8xAGM-114, 38xHYDRA-70", "AGM-114K*16"], "An-26B": [], "An-30M": [], "B-1B": ["Mk-82*84", "AGM-154*12", "GBU-38*48", "CBU-87*30", "CBU-97*30", "GBU-38*16, CBU-97*20", "Mk-84*24", "GBU-31*24", "GBU-31(V)3/B*24", "GBU-31*8, GBU-38*32"], "B-52H": ["Mk-84*18", "Mk 82*51", "Mk20*18", "AGM-86C*20", "AGM-84A*8"], "C-130": [], "C-17A": [], "CH-47D": [], "CH-53E": [], "E-2C": [], "E-3A": [], "F-117A": ["GBU-12*2", "GBU-10*2", "GBU-27*2"], "F-14A": ["AIM-9*2", "AIM-54C*6,AIM-9*2", "AIM-54C*4,AIM-9*2,AIM-7*2"], "F-15C": ["AIM-120B*4, AIM-7M*2, AIM-9M*2, Fuel*3", "AIM-9*2,AIM-120*6,Fuel", "AIM-9*4,AIM-120*4,Fuel*3", "AIM-9*4,AIM-120*4,Fuel", "AIM-9*2,AIM-120*2,AIM-7*4,Fuel*3", "AIM-9*2,AIM-120*6,Fuel*3", "AIM-9*4,AIM-7*4,Fuel", "AIM-120*8,Fuel", "AIM-9*4,AIM-7*4,Fuel*3", "AIM-120*8,Fuel*3", "AIM-9*2,AIM-120*2,AIM-7*4,Fuel"], "F-15E": ["AIM-120B*2,AIM-9M*2,FUEL*3,CBU-87*6,Mk-82AIR*6", "AIM-120B*2,AIM-9M*2,FUEL*3,CBU-97*12", "AIM-120B*2,AIM-9M*2,FUEL*3,Mk-82*12", "AIM-120B*4,AIM-120C*4,FUEL*3", "AIM-120B*2,AIM-9M*2,FUEL,GBU-31*4,AGM-65H,AGM-65D", "AIM-120B*2,AIM-9M*2,FUEL,CBU-103*2,GBU-12,GBU-38,AGM-154C*2", "AIM-120B*4,AIM-9M*4,FUEL*3", "AIM-120B*2,AIM-9M*2,AIM-120C*2,AIM-7M*2,FUEL*3", "AIM-120B*2,AIM-9M*2,FUEL,GBU-12*4,GBU-38*4,AGM-154C*2", "AIM-120B*2,AIM-9M*2,FUEL,GBU-31*4,AGM-154C*2", "AIM-120B*2,AIM-9M*2,AIM-7M*4,FUEL*3", "AIM-120B*2,AIM-9M*2,FUEL*3,Mk-84*8", "AIM-120B*2,AIM-9M*2,FUEL,AGM-154C*2", "AIM-120B*2,AIM-9M*2,FUEL,GBU-12*4,GBU-38*4,AGM-65D*2", "AIM-120B*2,AIM-9M*2,FUEL,GBU-12*4,GBU-38*4,AGM-65K*2", "AIM-120C*2,AIM-9M*4,AIM-7M*2,FUEL*3", "AIM-9M*4,AIM-7M*4,FUEL*3", "AIM-120C*2,AIM-9M*2,FUEL*3", "AIM-120B*2,AIM-9M*2,FUEL,Mk-84*8,AGM-154C*2", "AIM-120B*2,AIM-9M*2,FUEL*3,Mk-82AIR*12", "AIM-120B*2,AIM-9M*2,FUEL,GBU-12*2,GBU-38*2,AGM-154C*2", "AIM-120B*2,AIM-9M*2,FUEL,GBU-12*2,GBU-38*2,AGM-65H,AGM-65D", "AIM-120B*2,AIM-120C*4,AIM-9M*2,FUEL*3", "AIM-120B*2,AIM-9M*2,FUEL*3,Mk-82*6,Mk-82AIR*6", "AIM-120B*2,AIM-9M*2,FUEL,CBU-103*2,GBU-12,GBU-38,AGM-65H*2", "AIM-120B*2,AIM-9M*2,FUEL,AGM-65D*2", "AIM-120B*2,AIM-9M*2,FUEL*2,SUU-25*2,GBU-12,GBU-38", "AIM-120B*6,AIM-9M*2,FUEL*3", "AIM-120B*2,AIM-9M*2,FUEL,Mk-82AIR*12,AGM-154C*2", "AIM-120C*6,AIM-9M*2,FUEL*3", "GBU-31(V)3/B*5, AIM-120C*2, AIM-9M*2"], "F-16A MLU": ["Fuel*3", "AGM-88*2, AGM-65D*2, AIM-120B*2, ECM", "Mk-82*6,AIM-120*2,ECM,Fuel*2", "Mk-82*2,AIM-120*2,AIM-9*2,ECM,Fuel*2", "AGM88*2,AGM-65D*6,AIM-120*2,AIM-9*2,ECM", "AIM-120*2,GBU-10*2,ECM,Lantirn ,Fuel*2", "AIM-9*4,ECM", "Mk20*4,AIM-9*2,ECM,Fuel*2", "AIM-120*6,ECM", "AIM-120*4,AIM-9*2,ECM", "AGM88, AGM-65D, AIM-120*2,Fuel*2,ECM", "AGM-65D*2,AIM-120*2,ECM,Lantirn ,Fuel*2", "AIM-9*4,ECM,Fuel*2", "AIM-120*4,AIM-9*2,ECM,Fuel*2", "AGM-88*2,AIM-120*2,AIM-9*2,ECM,Fuel*2", "Mk-84*2,AIM-9*2,ECM,Fuel*2", "AIM-120*6,ECM,Fuel*2", "AGM-154*2,AIM-120*2,ECM,Lantirn ,Fuel*2", "AGM-88*2,AGM-65D*2,AIM-120B*2,AIM-9M*2,ECM", "Mk20*2,AIM-120*2,ECM,Fuel*2", "AIM-120*2,AIM-9*2,GBU-12*2,ECM,Lantirn ,Fuel*2", "AGM-65K*2,AIM-120*2,ECM,Lantirn ,Fuel*2", "AIM-120B*2_AIM-9M*2_AGM-119*4_ALQ-131"], "F-16A": ["AGM-88*2,AIM-120*2,AIM-9*2,ECM,Fuel*2", "Mk20*4,AIM-9*2,ECM,Fuel*2", "AIM-9*4,ECM,Fuel*2", "AGM-65D*2,AIM-120*2,ECM,Lantirn ,Fuel*2", "AIM-120*4,AIM-9*2,ECM,Fuel*2", "AGM88*2_AGM-65D*6_AIM-120*2_AIM-9*2_ECM", "AGM-65K*2,AIM-120*2,ECM,Lantirn ,Fuel*2", "AIM-120*2,AIM-9*2,GBU-12*2,ECM,Lantirn ,Fuel*2", "AIM-120*2,GBU-10*2,ECM,Lantirn ,Fuel*2", "AIM-120*6,ECM,Fuel*2", "AIM-120*6,ECM", "AIM-9*4,ECM", "Fuel*3", "Mk-84*2,AIM-9*2,ECM,Fuel*2", "AIM-120*4,AIM-9*2,ECM", "Mk-82*6,AIM-120*2,ECM,Fuel*2", "Mk-82*2,AIM-120*2,AIM-9*2,ECM,Fuel*2", "AGM-154*2,AIM-120*2,ECM,Lantirn ,Fuel*2", "Mk20*2,AIM-120*2,ECM,Fuel*2", "AGM-119*2,AIM-120B*2,AIM-9M*2,ALQ-184,Fuel*2"], "F-16C bl.50": ["AIM-120B*4, AIM-9M*2, Fuel", "AIM-120C*4, AIM-9M*2, Fuel", "AGM-65G*2, AIM-120C*2, AIM-9M*2, Fuel, ECM", "AGM-65D*6, AIM-120B*2, AIM-9M*2, ECM, Fuel", "Mk86*6, AIM-9M*4, ECM, Fuel", "CBU-97*4, AIM-9M*4, Fuel", "CBU-87*4, AIM-9M*4, Fuel", "AGM-65D*2, CBU-87*2, AIM-9M*4, Fuel", "AGM-65D*2, CBU-97*2, AIM-9M*4, Fuel", "Mk84*2, AIM-9M*4, ECM, Fuel", "GBU-31v1*2, AIM-9M*4, ECM, Fuel", "GBU-31v3*2, AIM-9M*4, ECM, Fuel", "GBU-31v1*2, Mk82*6, AIM-9M*4, Fuel", "Mk84*4, AIM-9M*4, Fuel", "Mk82*12, AIM-9M*4, Fuel", "AGM-154C*2, AIM-9M*4, ECM, Fuel"], "F-16C bl.52d": ["AGM-88*2, AGM-65D*2, AIM-120B*2, ECM,LIGHTNING", "Mk-82*6,AIM-120*2,ECM,Fuel*2,LIGHTNING", "AGM88*2,AGM-65D*6,AIM-120*2,AIM-9*2,ECM,LIGHTNING", "AGM-65D*4,AIM-120*2,ECM,Fuel*2,LIGHTNING", "AIM-120*2,GBU-31*2,ECM,Fuel*2,LIGHTNING", "AIM-120*2,GBU-31(v)*2,ECM,Fuel*2,LIGHTNING", "AGM-88*2,AIM-120*2,AIM-9*2,ECM,Fuel*2,LIGHTNING", "Copy AIM-120*2,GBU-38*2,ECM,Fuel*2,LIGHTNING", "AIM-120*2,GBU-10*2,ECM,Fuel*2,LIGHTNING", "Mk-84*2,AIM-120*2,ECM,Fuel*2,LIGHTNING", "AGM-154*2,AIM-120*2,ECM,Fuel*2,LIGHTNING", "Mk-82AIR*6,AIM-120*2,ECM,Fuel*2,LITENING", "CBU97*4,AIM120*2,ECM,Fuel*2,LITENING", "AGM-88*2,AGM-65D*2,AIM-120B*2,AIM-9M*2,ECM,LITENING", "CBU87*2,AIM-120*2,ECM,Fuel*2,LITENING", "AGM88, AGM-65D, AIM-120*2,Fuel*2,ECM,LITENING", "AIM-120*2,GBU-12*2,ECM,Fuel*2,LITENING", "AGM-65K*2,AIM-120*2,ECM,Lantirn ,Fuel*2,LITENING", "AGM-65G*4,AIM-120C*2,AIM-9M*2,ECM", "AIM-120C*4,AIM-9M*2,ECM,Fuel*2", "AIM-120B*4,AIM-9M*2,ECM,Fuel*2", "AIM-9M*4,Fuel*2", "AIM-120C*2,AIM-120B*2,AIM-9M*2,Fuel*3", "AIM-9P*4", "AIM-9M*2,ECM"], "F-4E": ["AIM-9*4,AIM-7*4", "AGM45*2_AGM-65D*4_AIM7*2_ECM", "AGM-45*2,AIM-7*2,Fuel*2,ECM", "Mk-82*18,AIM-7*2,ECM", "GBU-12*2,AIM-7*2,Fuel*2,ECM", "Mk20*12,AIM-7*2,ECM", "Mk-82*6,AIM-7*2,Fuel*2,ECM", "GBU-10*2,AIM-7*2,Fuel*2,ECM", "Mk20*6,AIM-7*2,Fuel*2,ECM", "AGM-45*4,AIM-7*2,ECM", "AGM-65K*4,AIM-7*2,Fuel*2,ECM", "Fuel*3", "AIM-9*4,AIM-7*4,Fuel*2", "Mk-84*2,AIM-7*2,ECM", "AGM-65K*4,AIM-7M*4,Fuel*3"], "F/A-18A": ["GBU-16*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AIM-9*6,Fuel", "Mk-84*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM-65D*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM88*4_AIM9*2_AIM7_FLIR Pod_Fuel", "AIM-9*4,Fuel*3", "LAU-10*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM-88*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "MK-82*8,AIM-9*2,AIM-7,FLIR Pod,Fuel", "MK-82*4,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AIM-9*4,AIM-7*2,Fuel*3", "AGM-65K*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "Fuel*3", "AGM88*2_AGM65D*2_AIM9*2_AIM7_FLIR Pod_Fuel", "GBU-12*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AIM-9*4,AIM-7*4,Fuel", "Mk20*4,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "GBU-10*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM-84A*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3"], "F/A-18C": ["AGM-62*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "GBU-10*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "GBU-12*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "Fuel*3", "Mk-84*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "GBU-16*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM-154*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AIM-120*4,AIM-9*2,Fuel*3", "AGM-65D*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM88*2_AGM65D*2_AIM9*2_AIM7_FLIR Pod_Fuel", "AGM88*4_AIM9*2_AIM7_FLIR Pod_Fuel", "AIM-9*2,AIM-7*6,Fuel", "Mk20*4,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AIM-120*6,AIM-9*2,Fuel", "LAU-10*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AIM-9*2,AIM-7*4,Fuel*3", "MK-82*8,AIM-9*2,AIM-7,FLIR Pod,Fuel", "AIM-120*2,AIM-9*2,AIM-7*2,Fuel*3", "AGM-88*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM-84E*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "MK-82*4,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM-84A*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AIM-9M*2,AGM-65D*2,Mk-82*4,FLIR Pod,Fuel", "AIM-120*4,AIM-9*2,AIM-7*2,Fuel", "AGM-65K*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3"], "IL-76MD": [], "IL-78M": [], "Ka-27": [], "Ka-52": ["APU-6 Vikhr-M*2, Kh-25ML*2", "APU-6 Vikhr-M*2", "B-8*4", "KMGU-2 (AO-2.5RT)*4", "B-8*2, APU-6 Vikhr-M*2", "FAB-500*2", "UB-13*2", "FAB-250*4", "Kh-25ML*2, R-73*2"], "KC-10A": [], "KC-135": [], "Mi-24V": ["2xFAB-500", "10xS-13", "2xFAB-250", "4x9M114, 2xFuel tank", "128xS-5", "80xS-8 TsM", "4x9M114, 40xS-8 TsM", "64xS-5", "8x9M114", "4x9M114, 80xS-8", "4x9M114, 128xS-5", "2xKMGU AP", "4xFuel tank", "4xUPK-23", "4x9M114, 10xS-13", "4x9M114, 80xS-8 TsM", "4x9M114", "80xS-8", "40xS-8 TsM", "8x9M114, 40xS-8 TsM", "8x9M114, 10xS-13", "2xFuel tank", "4x9M114, 4xUPK-23", "2xUPK-23", "8x9M114, 64xS-5", "8x9M114, 40xS-8", "20xS-13", "40xS-8", "8x9M114, 2xUPK-23"], "Mi-26": [], "Mi-28N": ["2xFAB-250", "4xFuel tank", "80xS-8", "4xKMGU AP", "4xUPK-23", "16x9M114, 10xS-13", "4xFAB-500", "16x9M114, 2xFAB-500", "40xS-8", "40xS-8 TsM", "2xKMGU AP", "2xUPK-23", "16x9M114, 2xUPK-23", "2xFAB-500", "16x9M114, 40xS-8", "16x9M114", "20xS-13", "16x9M114, 2xKMGU AP", "4xFAB-250", "4xKMGU AT", "16x9M114, 40xS-8 TsM", "80xS-8 TsM", "2xKMGU AT", "9x9M114", "2xFuel tank", "10xS-13", "2xFAB-250, 16x9M114", "16x9M114, 2xKMGU AT"], "Mi-8MT": ["4 x B8", "4 x B8 + 2GUV_AP-30 (GrL 30mm)", "2 x UPK +2 x B8", "2 xB8 + 2GUV_YaKB (MG-12.7+7.62)+ 2GUV_AP-30 (GrL 30mm)", "6 x FAB-100", "2 x B8 + 2 x UPK-23-250", "2 x UPK--23-250"], "MiG-15bis": ["2*FAB-50", "2*FAB-100M", "2*300L", "2*400L", "2*600L", "Fuel tank 300", "Fuel tank 400"], "MiG-23MLD": ["R-60M*4", "B-8*2,R-60M*2,Fuel-800", "UB-32*2,R-60M*2,Fuel-800", "R-24R*2,R-60M*4,Fuel-800", "R-24R,R-24T,R-60M*4,Fuel-800", "R-60M*4,Fuel-800", "FAB-500*2,R-60M*2,Fuel-800", "R-24R*2,R-60M*4", "FAB-250*2,R-60M*2,Fuel-800", "RBK-250*2,R-60M*2,Fuel-800", "RBK-500*2,R-60M*2,Fuel-800", "R-24R,R-24T,R-60M*4"], "MiG-25PD": ["R-40R*2,R-40T*2", "R-40R*4", "R-40R*2,R-60M*2"], "MiG-25RBT": ["FAB-500x2_60x2", "R-60M*2"], "MiG-27K": ["FAB-250*6,R-60M*2,Fuel", "BetAB-500ShP*2,FAB-250*2,R-60*2", "Kh-25MR*2,R-60M*2,Fuel", "Kh-29L*2,R-60M*2,Fuel", "B-8*4", "BetAB-500*2,FAB-500*2,R-60*2", "Kh-25MPU*2,R-60M*2,Fuel", "Kh-29T*2,R-60M*2,Fuel", "FAB-500*2,FAB-250*2,R-60M*2,Fuel", "Kh-25ML*2,R-60M*2,Fuel", "KAB-500*2,R-60M*2,Fuel", "RBK-500AO*2,RBK-250*2,R-60M*2", "UB-32*4", "Kh-29L*2,R-60*2,Fuel"], "MiG-29A": ["Fuel-1150*2,Fuel-1500", "RBK-500AO*4,R-73*2,Fuel", "FAB-250*4,R-73*2,Fuel", "B-8*4,R-73*2,Fuel", "R-60M*4,R-27R*2", "R-73*4,R-27R*2,Fuel-1500", "R-73*6,Fuel-1500", "R-60M*6,Fuel-1500", "S-24*4,R-73*2,Fuel", "FAB-500*4,R-73*2,Fuel", "R-60M*6", "BetAB-500*4,R-73*2,Fuel", "R-73*6", "R-73*2,R-60M*2,R-27R*2,Fuel-1500", "R-60M*4,R-27R*2,Fuel-1500", "RBK-250*4,R-73*2,Fuel", "R-73*4,R-27R*2", "R-73*2,R-60M*2,R-27R*2", "S-24*2,FAB-500*2,R-73*2,Fuel"], "MiG-29G": ["R-73*6,Fuel-1500", "R-73*4,R-27R*2,Fuel-1500", "R-73*2,R-60M*2,R-27R*2", "R-60M*4,R-27R*2,Fuel-1500", "R-73*6", "R-60M*4,R-27R*2", "R-73*4,R-27R*2", "Fuel-1150*2,Fuel-1500", "R-60M*6", "R-60M*6,Fuel-1500", "R-73*2,R-60M*2,R-27R*2,Fuel-1500"], "MiG-29S": ["R-73*2,R-60M*2,R-27R*2", "R-73*4,R-27R*2,Fuel-1500", "R-73*6,Fuel-1500", "R-60M*6,Fuel-1500", "S-24*4,R-73*2,Fuel", "FAB-500*4,R-73*2,Fuel", "BetAB-500*4,R-73*2,Fuel", "RBK-500AO*4,R-73*2,Fuel", "R-73*2,R-60M*2,R-27R*2,Fuel-1500", "R-77*2,R-73*2,Fuel-1500,Fuel-1150*2", "B-8*4,R-73*2,Fuel", "RBK-250*4,R-73*2,Fuel", "R-73*6", "Fuel-1150*2,Fuel-1500", "R-60M*6", "R-60M*4,R-27R*2", "R-73*4,R-27R*2", "R-77*4,R-73*2", "FAB-250*4,R-73*2,Fuel", "R-60M*4,R-27R*2,Fuel-1500", "R-77*4,R-73*2,Fuel-1500", "S-24*2,FAB-500*2,R-73*2,Fuel"], "MiG-31": ["R-40T*2,R-33*4", "R-40T,R-33*4,R-40R", "R-40R*2,R-33*4", "R-60M*4,R-33*4"], "Mirage 2000-5": ["R 550*2,MICA IR*4", "R 550*2,MICA IR*2,MICA AR*2,Fuel*3", "R 550*2,MICA AR*4,Fuel*3", "R 550*2,SUPER 530F*2,Fuel", "Fuel*3", "R 550*2,MICA IR*4,Fuel*3", "R 550*2,MICA AR*4", "R 550*2,SUPER 530F*2"], "MQ-9 Reaper": ["GBU-12*4", "GBU-38*4", "AGM-114K*8,GBU-38*2", "AGM-114K*12"], "OH-58D": ["2xAGM-114, 7xHYDRA-70", "4xAGM-114", "M-3, 7xHYDRA-70", "2xAGM-114, M-3", "14xHYDRA-70", "14xHYDRA-70 WP"], "RQ-1A Predator": ["AGM-114K*2"], "S-3B": ["AGM-84A*2, Mk-82*2", "AGM-84E*2", "AGM-65D, AGM-65K, Mk20*4", "AGM-65D, AGM-65K, Mk82*4", "Mk82*10", "Mk84*2, Mk82*4", "ZUNI Mk71*8, Mk20*4"], "SH-3W": [], "SH-60B": ["AGM-119"], "Su-17M4": ["UB-32*4,R-60M*2,FAB-250*4", "FAB-100*24,R-60M*2", "UB-32*4,R-60M*2,Fuel*2", "B-8*4,R-60M*2,FAB-250*4", "Kh-29L*2,R-60M*2,Fuel*2", "B-8*4,R-60M*2,Fuel*2", "Kh-29T*2,R-60M*2,Fuel*2", "BetAB-500*6,R-60M*2", "Kh-25MR*4,R-60M*2,Fuel*2", "S-24*4,R-60M*2,Fuel*2", "Kh25MPU*2_Kh25ML*2_,R60M*2_Fuel*2", "Kh58*2_Kh25MPU*2_R60M*2_Fuel*2", "FAB-250*16,R-60M*2", "Kh-25ML*4,R-60M*2,Fuel*2", "RBK-500AO*4,SPPU-22*2,R-60M*2", "S-24*4,R-60M*2,FAB-250*4", "Fuel*4", "FAB-500*6,R-60M*2", "Kh-25ML*2,Kh-29L*2,R-60*2"], "Su-24M": ["UB-13*4,FAB-500*2", "Kh-31A*2,R-60M*2,Fuel", "UB-13*4", "KAB-500*4,R-60M*2", "S-25*2,Fuel*3", "Kh31P*2_Kh25ML*2_L-081", "B-8*2,Fuel*3", "FAB-1500*2,R-60M*2", "S-24*4", "BetAB-500*4,R-60M*2", "Kh-25ML*4", "Kh-25MR*4", "FAB-100*24", "Kh-31A*2,R-60M*2", "UB-13*2,Fuel*3", "B-8*2,Fuel*2", "Kh58*2_Kh25ML*2_L-081", "RBK-250*8", "UB-32*4", "Kh-29L*2,R-60M*2", "S-24*2,Fuel*3", "Kh25MPU*2_Kh25ML*2_L-081", "FAB-500*4,R-60M*2", "FAB-250*8", "Fuel*3", "RBK-500AO*4,R-60M*2", "KAB-1500*2,R-60M*2,Fuel", "UB-32*4,FAB-250*4", "Kh-29T*2,R-60M*2", "UB-32*2,Fuel*3", "Kh-59M*2,R-60M*2,Fuel", "S-25*4", "B-8*6"], "Su-24MR": ["SHPIL,ETHER,R-60M*2", "Fuel*2", "TANGAZH,ETHER,R-60M*2,Fuel*2", "TANGAZH,ETHER,R-60M*2", "SHPIL,ETHER,R-60M*2,Fuel*2"], "Su-25": ["RBK-250*2,S-8KOM*80,R-60M*2,Fuel*2", "FAB-250*4,UB-13*2,R-60M*2,SPPU-22*2", "S-25L*6,UB-13*2,R-60M*2", "S-25*6,SPPU-22*2,R-60M*2", "2-25L*2, KH-25ML*2, RBK-500*2, B-8MI*2, R-60M*2", "S-8KOM*120,R-60M*2,Fuel*2", "FAB-250*4,S-25*2,R-60M*2,Fuel*2", "RBK-500AO*4,S-8KOM*40,R-60M*2,Fuel*2", "FAB-250*2,SPPU-22*2,SAB-100*4,R-60M*2", "RBK-500AO*6,R-60M*2,Fuel*2", "RBK-250*8,R-60M*2", "Kh-29L*2,Kh-25ML*4,R-60M*2", "RBK-250*4,S-8KOM*80,R-60M*2", "FAB-250*4,UB-13*2,R-60M*2,Fuel*2", "S-8TsM*160,R-60*2", "Kh-25ML*4,R-60M*2,Fuel*2", "BetAB-500ShP*8,R-60M*2", "SAB-100*8,R-60*2", "Kh-29L*2,Kh-25ML*4,S-25L*2,R-60M*2", "FAB-500*6,R-60M*2,Fuel*2", "Kh-29L*2,Kh-25ML*2,R-60M*2,Fuel*2", "Kh-29L*2,R-60M*2,Fuel*2", "FAB-100*32,R-60M*2", "FAB-100*16,R-60M*2,Fuel*2", "FAB-250*6,R-60M*2,Fuel*2", "BetAB-500*6,R-60M*2,Fuel*2", "S-25*6,R-60M*2,Fuel*2", "UB-13*6,R-60M*2,Fuel*2", "Kh-25*4,Kh-29T*2,R-60*2", "S-25L*6,R-60*2,Fuel*2"], "Su-25T": ["FAB-250*4,SPPU-22*2,SAB-100*2,R-60M*2", "Kh-29L*2,Kh-25ML*4,R-73*2,Mercury LLTV Pod,MPS-410", "KAB-500Kr*2,Kh-25ML*2,R-73*2,MPS-410,Fuel*2", "RBK-500AO*4,UB-32*2,R-60M*2,Fuel*2", "BetAB-500ShP*8,R-60M*2", "UB-13*6,R-60M*2,Fuel*2", "Kh-29T*2,R-73*2,Fuel*2,MPS-410", "Kh58*2_Kh25ML*4_R73*2_L-081_MPS-410", "FAB-250*4,UB-13*2,R-60M*2,Fuel*2", "KH-29T*2, VIKHR*2, ECM", "Kh-29T*2,Kh-25ML*4,R-73*2,MPS-410", "FAB-250*4,UB-13*2,R-60M*2,SPPU-22*2", "FAB-500*6,R-60M*2,Fuel*2", "Fuel*4", "APU-8 Vikhr-M*2,Kh-25ML,R-73*2,SPPU-22*2,Mercury LLTV Pod,MPS-410", "S-8KOM*120,R-60M*2,Fuel*2", "KMGU-2 (PTAB-2.5KO)*8,R-60M*2", "FAB-250*6,R-60M*2,Fuel*2", "Kh-29L*2,R-73*2,Fuel*2,Mercury LLTV Pod,MPS-410", "FAB-100*32,R-60M*2", "RBK-250*8,R-60M*2", "S-25L*6,UB-13*2,R-60M*2", "FAB-250*4,S-25*2,R-60M*2,Fuel*2", "S-25*2,SPPU-22*4,R-60M*2,R-73*2", "KMGU-2 (AO-2.5RT)*8,R-60M*2", "APU-8 Vikhr-M*2,S-25L*2,R-73*2,SPPU-22*2,Mercury LLTV Pod,MPS-410", "S-25*6,R-60M*2,Fuel*2", "RBK-500AO*6,R-60M*2,Fuel*2", "Kh58*2_Kh25MPU*2_Kh25ML*2_R73*2_L-081_MPS-410", "RBK-250*4,UB-32*4,R-60M*2", "Kh25MPU*4_R73*2_Fuel*2_L-081_MPS-410", "BetAB-500*6,R-60M*2,Fuel*2", "RBK-250*2,UB-32*4,R-60M*2,Fuel*2", "FAB-100*16,R-60M*2,Fuel*2", "Kh-29L*2,Kh-25ML*4,R-73*2,ECM"], "Su-25TM": ["BetAB-500ShP*6,R-73*2,ECM", "APU-8 Vikhr-M*2,R-60M*2,R-73*2,SPPU-22*2,Mercury LLTV Pod", "Kh-29T*2,Kh-25ML*2,R-73*2,Fuel*2,ECM", "Kh-58*2_Kh-25MPU*4_R-73*2_L-081_MPS410", "S-25L*6,UB-13*2,R-60M*2", "Kh-35*2_R-73*2_Fuel*2_MPS410_Kopyo-25", "Kh-31A*2_R-73*2_Fuel*2_MPS410_Kopyo-25", "Fuel*4", "BetAB-500*6,R-60M*2,Fuel*2", "KAB-500Kr*2,Kh-25ML*2,R-73*2,Fuel*2,ECM", "Kh-29L*2,R-73*2,Fuel*2,Mercury LLTV Pod,ECM", "UB-13*6,R-60M*2,Fuel*2", "S-25*2,SPPU-22*4,R-60M*2,R-73*2", "Kh-31P*2_Kh-25ML*4_R-73*2_L-081_MPS410", "UB-32*6,R-60M*2,Fuel*2", "FAB-100*16,R-60M*2,Fuel*2", "FAB-250*6,R-60M*2,Fuel*2", "FAB-500*6,R-60M*2,Fuel*2", "Kh-25MPU*4_R-73*2_Fuel*2_L-081_MPS410", "S-25*6,R-60M*2,Fuel*2", "RBK-500AO*4,UB-32*2,R-60M*2,Fuel*2", "FAB-250*4,UB-13*2,R-60M*2,SPPU-22*2", "Kh-31P*2_Kh-25MPU*4_R-73*2_L-081_MPS410", "RBK-500AO*6,R-60M*2,Fuel*2", "FAB-100*32,R-60M*2", "RBK-250*2,UB-32*4,R-60M*2,Fuel*2", "RBK-250*8,R-60M*2", "APU-8 Vikhr-M*2,R-73*2,SPPU-22*2,Mercury LLTV Pod,ECM", "RBK-250*4,UB-32*4,R-60M*2", "FAB-250*4,SPPU-22*2,SAB-100*2,R-60M*2", "FAB-250*4,S-25*2,R-60M*2,Fuel*2", "FAB-250*4,UB-13*2,R-60M*2,Fuel*2"], "Su-27": ["R-73*4,R-27ER*4,R-27ET*2", "KMGU-2 (AO-2.5RT)*5,R-73*2,ECM", "BetAB-500ShP*6,R-73*2,ECM", "KMGU-2 (PTAB-2.5KO)*5,R-73*2,ECM", "R-73*2,R-27ER*6,ECM", "R-73*6", "S-13*10,RBK-500AO*2,FAB-500*2,R-73*2,ECM", "R-73*4,R-27ER*6", "R-73*2,R-27ER*4,R-27ET*2,ECM", "R-73*4,ECM", "ECM", "FAB-500*6,R-73*2,ECM", "S-25*2,FAB-500*4,R-73*4", "S-25*4, FAB-500*4, R-73*2, ECM", "CAS S-8KOM Rockets + RBK-500 PTAB1", "CAS S-8OFP Rockets + FAB-500 Bombs", "CAS S-8OFP Rockets", "CAS S-8OFP Rockets + FAB-100 Bombs", "CAS S-8KOM Rockets + FAB-100 Bombs", "CAS S-13 Rockets", "CAS S-8KOM Rockets + FAB-250 Bombs", "CAS S-8KOM Rockets + RBK-250 PTAB2.5", "CAS S-8KOM Rockets", "CAS S-8KOM Rockets + FAB-500 Bombs", "CAS S-8KOM Rockets + RBK-500 PTAB10", "CAS S-8KOM Rockets + KMGU PTAB", " CAS S-25 Rockets", "CAS S-25 Rockets + FAB-500 Bombs"], "Su-30": ["R-73*2,R-77*6,ECM", "R-73*2,R-27T*2,R-27R*4", "RBK-500AO*6,R-73*2,ECM", "Kh-31P*2,Kh-31A*2,R-73*2,R-77*2,ECM", "R-73*4,R-27T*2,R-27R*4", "R-73*2,R-77*2,Kh-35*2,ECM", "Kh-35*2,Kh-31P*2,R-73*2,R-77*2,ECM", "FAB-250*4,B-8*2,R-73*2,ECM", "ECM", "KAB-1500*2,R-73*2,R-77*2,ECM", "RBK-250*6,R-73*2,ECM", "R-73*4,R-77*6", "FAB-250*4,S-25*2,R-73*2,ECM", "R-73*2,R-27R*2,R-27ER*4,ECM", "R-73*2,R-27T*2,R-27ER*2,R-77*2,ECM", "FAB-1500*2,R-73*2,R-77*2,ECM", "R-73*4,R-27T*2,R-27ER*2,R-77*2", "Kh-59M*2,R-73*2,R-77*2,ECM", "FAB-500*6,R-73*2,ECM", "R-73*4,R-27R*2,R-27ER*4", "Kh-29L*4,R-73*2,R-77*2,ECM", "BetAB-500*6,R-73*2,ECM", "R-73*4", "FAB-250*4,UB-13*2,R-73*2,ECM", "R-73*2,R-77*4,R-27ER*2,ECM", "KAB-500*4,R-73*2,R-77*2,ECM", "FAB-250*6,R-73*2,ECM", "R-73*4,R-77*4,R-27ER*2", "Kh-29T*4,R-73*2,R-77*2,ECM", "Kh-31P*2,Kh-31A*2,R-73*2,R-77*2,ECM", "Kh-31P*4,R-73*2,R-77*2,ECM"], "Su-33": ["RBK-250*6,R-73*2,R-27R*2,ECM", "R-73*4", "R-73*4,R-27R*2,R-27ER*6", "R-73*2,R-27ET*2,R-27ER*6,ECM", "R-73*4,R-27ET*2,R-27ER*6", "FAB-250*6,R-73*2,R-27R*2,ECM", "R-73*2,R-27R*2,R-27ER*6,ECM", "ECM", "BetAB-500*6,R-73*2,R-27R*2,ECM", "RBK-500AO*6,R-73*2,R-27R*2,ECM", "UB-13*4,FAB-250*4,R-73*2,ECM", "S-25*4,FAB-250*4,R-73*2,ECM", "FAB-500*6,R-73*2,R-27R*2,ECM", "B-8*4,FAB-250*4,R-73*2,ECM", "S-25*4,FAB-500*4,R-73*4", "CAS S-8KOM rockets + FAB500", "CAS S-8OFP rockets + FAB500", "CAS S-13 Rockets + FAB500", "CAS S-13 Rockets + FAB100", "CAS S-8KOM rockets + FAB250", "CAS S-25 Rockets + FAB500", "CAS S-8KOM rockets + RBK500 PTAB10", "CAS S-8KOM rockets + RBK500 PTAB1"], "Su-34": ["UB-13*4,FAB-250*4,R-73*2,ECM", "FAB-100*28,R-73*2,ECM", "BetAB-500*8,R-73*2,ECM", "Kh-29L*4,R-73*2,R-77*2,ECM", "KAB-500*4,R-73*2,R-77*2,ECM", "RBK-250 PTAB-2.5M*8,R-73*2,ECM", "FAB-250*8,R-73*2,ECM", "ECM", "Kh-29T*4,R-73*2,R-77*2,ECM", "RBK-500 PTAB-10-5*8,R-73*2,ECM", "FAB-1500*3,R-73*2,R-77*2,ECM", "Kh-59M*2,R-73*2,R-77*2,ECM", "B-8*6,R-73*2,R-27R*2,ECM", "FAB-500*8,R-73*2,ECM", "KAB-1500*2,R-73*2,R-77*2,ECM", "Kh-29T*4,R-73*2,R-27R*2,ECM", "Kh-31A*4,Kh-31P*2,R-73*2,R-27R*2,ECM", "Kh-31A*6,R-73*2,R-27R*2,ECM", "Kh-31P*4,R-73*2,R-27R*2,ECM", "Kh-29L*4,R-73*2,R-27R*2,ECM"], "Tornado GR4": ["AIM-9M*2, Fuel*2, ECM", "ALARM*4, Fuel*2, ECM", "GBU-16*2, AIM-9M*2, Fuel*2, ECM", "BL755*4, AIM-9M*2, Fuel*2, ECM", "Sea Eagle*2, AIM-9M*2, Fuel*2, ECM"], "Tornado IDS": ["Kormoran*2,AIM-9*2,Fuel*2", "GBU-16*2,AIM-9*2,Fuel*2", "Fuel*2", "AGM-88*4,AIM-9*2,ECM", "AGM-88*2,AIM-9*2,Fuel*2,ECM", "Kormoran*4,AIM-9*2", "Kormoran*2,AIM-9*2,AGM-88*2", "Mk-82*4,AIM-9*2,Fuel*2"], "Tu-142": ["Kh-35*6"], "Tu-160": ["Kh-65*12"], "Tu-22M3": ["Kh-22N", "Kh-22N*2", "FAB-250*69", "FAB-500*33", "FAB-500*33, FAB-250*36", "FAB-250*33"], "Tu-95MS": ["Kh-65*6"], "UH-1H": ["M134 Minigun*2, XM158*2"], "UH-60A": []} \ No newline at end of file diff --git a/www/js/Map/SelectionScroll.js b/www/js/Map/SelectionScroll.js deleted file mode 100644 index 2a71ac26..00000000 --- a/www/js/Map/SelectionScroll.js +++ /dev/null @@ -1,43 +0,0 @@ -class SelectionScroll -{ - constructor(x, y, options, callback) - { - if (options.length > 1) - { - this._x = x; - this._y = y; - this._options = options; - - /* Create the container of the scroll */ - this._container = document.createElement("div"); - this._container.id = 'selection-scroll-container'; - this._container.style.left = this._x + "px"; - this._container.style.top = this._y + "px"; - document.getElementById("map-container").appendChild(this._container); - - for (let optionID in this._options) - { - var node = document.createElement("div"); - node.classList.add("selection-scroll-element"); - node.appendChild(document.createTextNode(this._options[optionID])); - this._container.appendChild(node); - node.addEventListener('click', () => callback(this._options[optionID])) - } - - window.setTimeout(() => this._show(), 100); - } - } - - remove() - { - document.getElementById("map-container").removeChild(this._container); - } - - _show() - { - this._container.style.width = 220 + "px"; - this._container.style.height = 220 + "px"; - this._container.style.left = this._x - 110 + "px"; - this._container.style.top = this._y - 110 + "px"; - } -} \ No newline at end of file diff --git a/www/js/Map/SelectionWheel.js b/www/js/Map/SelectionWheel.js deleted file mode 100644 index 66a241b0..00000000 --- a/www/js/Map/SelectionWheel.js +++ /dev/null @@ -1,100 +0,0 @@ -class SelectionWheel -{ - constructor(x, y, options) - { - if (options.length > 1) - { - this._x = x; - this._y = y; - this._options = options; - this._angularSize = 360 / this._options.length; - - /* Create the container of the wheel */ - this._container = document.createElement("div"); - this._container.id = 'selection-wheel-container'; - this._container.style.left = this._x + "px"; - this._container.style.top = this._y + "px"; - document.getElementById("map-container").appendChild(this._container); - - /* Create the wheel itself */ - this._wheel = document.createElement("div"); - this._wheel.id = 'selection-wheel'; - this._container.appendChild(this._wheel); - - /* Create the buttons */ - this._buttons = []; - for (let id in this._options) - { - var button = document.createElement("div"); - button.classList.add("selection-wheel-button"); - button.style.left = this._x - 25 + "px"; - button.style.top = this._y - 25 + "px"; - button.addEventListener('click', (e) => this._options[id].callback(e)); - this._container.appendChild(button); - this._buttons.push(button); - - var image = document.createElement("img"); - image.classList.add("selection-wheel-image"); - image.src = `img/buttons/${this._options[id].src}` - image.title = this._options[id].tooltip; - if ('tint' in this._options[id]) - { - button.style.setProperty('background-color', this._options[id].tint); - image.style.opacity = 0; - } - button.appendChild(image); - } - - /* Show the coalition switch if requested */ - this._switchLabel = document.createElement("label"); - this._switchLabel.classList.add("switch"); - this._switchLabel.innerHTML = ` ` - this._container.appendChild(this._switchLabel); - document.getElementById("coalition-switch").addEventListener('change', (e) => this._onSwitch(e)) - - if (map.getActiveCoalition() == "red") - { - document.getElementById("coalition-switch").checked = true; - } - - window.setTimeout(() => this._show(), 100); - } - } - - remove() - { - this._container.removeChild(this._wheel); - document.getElementById("map-container").removeChild(this._container); - } - - _show() - { - this._container.style.width = 220 + "px"; - this._container.style.height = 220 + "px"; - this._container.style.left = this._x - 110 + "px"; - this._container.style.top = this._y - 110 + "px"; - - var r = 80; - for (let id in this._buttons) - { - var angle = parseInt(id) * this._angularSize; - this._buttons[id].style.opacity = 1; - this._buttons[id].style.left = this._x + r * Math.sin(deg2rad(angle)) - 25 + "px"; - this._buttons[id].style.top = this._y - r * Math.cos(deg2rad(angle)) - 25 + "px"; - } - - this._switchLabel.style.opacity = 1; - } - - _onSwitch(e) - { - if (e.currentTarget.checked) { - document.documentElement.style.setProperty('--normal', getComputedStyle(this._container).getPropertyValue("--red")); - map.setActiveCoalition("red"); - } else { - document.documentElement.style.setProperty('--normal', getComputedStyle(this._container).getPropertyValue("--blue")); - map.setActiveCoalition("blue"); - } - } -} - diff --git a/www/js/Other/MissionData.js b/www/js/Other/MissionData.js deleted file mode 100644 index b1daae89..00000000 --- a/www/js/Other/MissionData.js +++ /dev/null @@ -1,67 +0,0 @@ -class MissionData -{ - constructor() - { - this._bullseye = undefined; - this._bullseyeMarker = undefined; - this._airbasesMarkers = {}; - } - - update(data) - { - this._bullseye = data.missionData.bullseye; - this._unitsData = data.missionData.unitsData; - this._airbases = data.missionData.airbases; - this._drawBullseye(); - this._drawAirbases(); - } - - getUnitData(ID) - { - if (ID in this._unitsData) - { - return this._unitsData[ID]; - } - else - { - return undefined; - } - } - - _drawBullseye() - { - if (this._bullseyeMarker === undefined) - { - this._bullseyeMarker = new L.Marker([this._bullseye.lat, this._bullseye.lng]).addTo(map.getMap()); - } - else - { - this._bullseyeMarker.setLatLng(new L.LatLng(this._bullseye.lat, this._bullseye.lng)); - } - } - - _drawAirbases() - { - for (let idx in this._airbases) - { - var airbase = this._airbases[idx] - if (this._airbasesMarkers[idx] === undefined) - { - this._airbasesMarkers[idx] = new L.Marker.AirbaseMarker(new L.LatLng(airbase.lat, airbase.lng), {name: airbase.callsign}).addTo(map.getMap()); - this._airbasesMarkers[idx].on('click', (e) => this._onAirbaseClick(e)); - } - else - { - this._airbasesMarkers[idx].setCoalitionID(airbase.coalition); - this._airbasesMarkers[idx].setLatLng(new L.LatLng(airbase.lat, airbase.lng)); - } - } - } - - _onAirbaseClick(e) - { - e.airbaseName = e.sourceTarget.options.name; - e.coalitionID = e.sourceTarget.coalitionID; - map.spawnFromAirbase(e); - } -} \ No newline at end of file diff --git a/www/js/Panels/ActionPanel.js b/www/js/Panels/ActionPanel.js deleted file mode 100644 index d0d8b67b..00000000 --- a/www/js/Panels/ActionPanel.js +++ /dev/null @@ -1,30 +0,0 @@ -class ActionPanel -{ - constructor(id) - { - this._panel = document.getElementById(id); - - this._attackButton = new PanelButton(this._panel, "img/buttons/attack.png", "Attack unit"); - this._bombButton = new PanelButton(this._panel, "img/buttons/bomb.png", "Precision bombing"); - this._carpetButton = new PanelButton(this._panel, "img/buttons/carpet.png", "Carpet bombing"); - this._landButton = new PanelButton(this._panel, "img/buttons/land.png", "Land here"); - this._formationButton = new PanelButton(this._panel, "img/buttons/formation.png", "Create formation"); - - this._attackButton.addCallback(() => map.setState("ATTACK")); - this._bombButton.addCallback(() => map.setState("BOMB")); - this._carpetButton.addCallback(() => map.setState("CARPET_BOMB")); - this._landButton.addCallback(() => map.setState("LAND")); - this._formationButton.addCallback(() => map.setState("FORMATION")); - - this.setEnabled(false); - } - - setEnabled(enabled) - { - this._attackButton.setEnabled(enabled); - this._bombButton.setEnabled(false); - this._carpetButton.setEnabled(false); - this._landButton.setEnabled(false); - this._formationButton.setEnabled(enabled); - } -} diff --git a/www/js/Panels/PanelButton.js b/www/js/Panels/PanelButton.js deleted file mode 100644 index fcf9df09..00000000 --- a/www/js/Panels/PanelButton.js +++ /dev/null @@ -1,82 +0,0 @@ -class PanelButton -{ - constructor(parent, icon, tooltip) - { - this._div = document.createElement("div"); - this.setIcon(icon, tooltip); - this.setSlashed(false); - - this._div.classList.add("panel-button"); - parent.appendChild(this._div); - - this.setEnabled(true); - - this._div.onclick = () => this._onClick(); - this._callbacks = []; - } - - setEnabled(enabled) - { - this._enabled = enabled; - if (enabled) - { - this._div.classList.remove("panel-button-disabled"); - } - else - { - this._div.classList.add("panel-button-disabled"); - } - } - - addCallback(callback) - { - this._callbacks.push(callback); - } - - clearCallbacks() - { - this._callbacks = []; - } - - setIcon(icon, tooltip) - { - if (icon.includes("png")) - { - this._baseIcon = ``; - } - else - { - this._baseIcon = ``; - } - this._div.innerHTML = this._baseIcon; - } - - setSubicon(subicon) - { - this._baseIcon = `
${this._baseIcon}
`; - this._div.innerHTML = this._baseIcon; - } - - setSlashed(slashed) - { - if (slashed) - { - this._div.innerHTML = `
${this._baseIcon}
`; - } - else - { - this._div.innerHTML = this._baseIcon; - } - } - - _onClick() - { - if (this._enabled) - { - for (let callback in this._callbacks) - { - this._callbacks[callback](); - } - } - } -} \ No newline at end of file diff --git a/www/js/Panels/SettingsPanel.js b/www/js/Panels/SettingsPanel.js deleted file mode 100644 index a72463ae..00000000 --- a/www/js/Panels/SettingsPanel.js +++ /dev/null @@ -1,86 +0,0 @@ -class SettingsPanel -{ - constructor(id) - { - this._panel = document.getElementById(id); - - /* Create all buttons, disabled by default */ - this._humanIcon = "fa-user"; - this._AIIcon = "fa-desktop"; - this._weaponsIcon = "fa-bomb"; - this._labelsIcon = "fa-font"; - this._deadIcon = "fa-skull"; - - this._humanButton = new PanelButton(this._panel, this._humanIcon, "Player visibility"); - this._AIButton = new PanelButton(this._panel, this._AIIcon, "AI visibility"); - this._weaponsButton = new PanelButton(this._panel, this._weaponsIcon, "Weapons visibility"); - this._deadAliveButton = new PanelButton(this._panel, this._deadIcon, "Dead units visibility"); - - this._humanButton.addCallback(() => this._onHumanButton()); - this._AIButton.addCallback(() => this._onAIButton()); - this._weaponsButton.addCallback(() => this._onWeaponsButton()); - this._deadAliveButton.addCallback(() => this._cycleDeadAlive()); - - this._human = "labels"; - this._humanButton.setSubicon(this._labelsIcon); - this._AI = "marker"; - this._weapons = "marker"; - this._deadAlive = "both"; - } - - getSettings() - { - return {'human': this._human, 'AI': this._AI, 'weapons': this._weapons, 'deadAlive': this._deadAlive} - } - - _onHumanButton() - { - this._human = this._cycleVisibility(this._humanButton, this._human, this._humanIcon); - } - - _onAIButton() - { - this._AI = this._cycleVisibility(this._AIButton, this._AI, this._AIIcon); - } - - _onWeaponsButton() - { - this._weapons = this._cycleVisibility(this._weaponsButton, this._weapons, this._weaponsIcon); - } - - _cycleVisibility(button, variable, icon) - { - if (variable === "labels") - { - variable = "marker"; - button.setIcon(icon); - button.setSlashed(false); - } - else if (variable === "marker") - { - variable = "none"; - button.setSlashed(true); - } - else - { - variable = "labels"; - button.setSubicon(this._labelsIcon); - button.setSlashed(false); - } - return variable; - } - - _cycleDeadAlive() - { - if (this._deadAlive === "both") - { - this._deadAlive = "alive"; - this._deadAliveButton.setSlashed(true); - } - else - { - this._deadAlive = "both"; - this._deadAliveButton.setSlashed(false); - } - } -} diff --git a/www/js/Panels/UnitControlPanel.js b/www/js/Panels/UnitControlPanel.js deleted file mode 100644 index 6c155dcb..00000000 --- a/www/js/Panels/UnitControlPanel.js +++ /dev/null @@ -1,35 +0,0 @@ -class UnitControlPanel -{ - constructor(id) - { - this._panel = document.getElementById(id); - - /* Create all buttons, disabled by default */ - //this._moveButton = new PanelButton(this._panel, "fa-play"); - //this._stopButton = new PanelButton(this._panel, "fa-pause"); - this._slowButton = new PanelButton(this._panel, "fa-angle-right", "Decelerate"); - this._fastButton = new PanelButton(this._panel, "fa-angle-double-right", "Accelerate"); - this._descendButton = new PanelButton(this._panel, "fa-arrow-down", "Descend"); - this._climbButton = new PanelButton(this._panel, "fa-arrow-up", "Climb"); - //this._repeatButton = new PanelButton(this._panel, "fa-undo"); - - this.setEnabled(false); - - //this._moveButton.addCallback(unitsManager.selectedUnitsMove); - //this._stopButton.addCallback(() => unitsManager.selectedUnitsChangeSpeed('stop')); - this._slowButton.addCallback(() => unitsManager.selectedUnitsChangeSpeed('slow')); - this._fastButton.addCallback(() => unitsManager.selectedUnitsChangeSpeed('fast')); - this._descendButton.addCallback(() => unitsManager.selectedUnitsChangeAltitude('descend')); - this._climbButton.addCallback(() => unitsManager.selectedUnitsChangeAltitude('climb')); - } - - setEnabled(enabled) - { - //this._moveButton.setEnabled(true); - //this._stopButton.setEnabled(true); - this._slowButton.setEnabled(enabled); - this._fastButton.setEnabled(enabled); - this._descendButton.setEnabled(enabled); - this._climbButton.setEnabled(enabled); - } -} diff --git a/www/package-lock.json b/www/package-lock.json new file mode 100644 index 00000000..5b9418cb --- /dev/null +++ b/www/package-lock.json @@ -0,0 +1,1524 @@ +{ + "name": "olympus", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "olympus", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@types/leaflet": "^1.9.0", + "express": "^4.18.2", + "leaflet": "^1.9.3" + }, + "devDependencies": { + "@types/express": "^4.17.15", + "@types/node": "^18.11.18", + "ts-node": "^10.9.1", + "typescript": "^4.9.4" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz", + "integrity": "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.31", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.32", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.32.tgz", + "integrity": "sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.10", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", + "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" + }, + "node_modules/@types/leaflet": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.0.tgz", + "integrity": "sha512-7LeOSj7EloC5UcyOMo+1kc3S1UT3MjJxwqsMT1d2PTyvQz53w0Y0oSSk9nwZnOZubCmBvpSNGceucxiq+ZPEUw==", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "dev": true, + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/leaflet": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.3.tgz", + "integrity": "sha512-iB2cR9vAkDOu5l3HAay2obcUHZ7xwUBBjph8+PGtmW/2lYhbLizWtG7nTeYht36WfOslixQF9D/uSIzhZgGMfQ==" + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + } + }, + "dependencies": { + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.15.tgz", + "integrity": "sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.31", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.32", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.32.tgz", + "integrity": "sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/geojson": { + "version": "7946.0.10", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", + "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" + }, + "@types/leaflet": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.0.tgz", + "integrity": "sha512-7LeOSj7EloC5UcyOMo+1kc3S1UT3MjJxwqsMT1d2PTyvQz53w0Y0oSSk9nwZnOZubCmBvpSNGceucxiq+ZPEUw==", + "requires": { + "@types/geojson": "*" + } + }, + "@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true + }, + "@types/node": { + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", + "dev": true + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "dev": true, + "requires": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "leaflet": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.3.tgz", + "integrity": "sha512-iB2cR9vAkDOu5l3HAay2obcUHZ7xwUBBjph8+PGtmW/2lYhbLizWtG7nTeYht36WfOslixQF9D/uSIzhZgGMfQ==" + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + } + } +} diff --git a/www/package.json b/www/package.json new file mode 100644 index 00000000..af494ee2 --- /dev/null +++ b/www/package.json @@ -0,0 +1,24 @@ +{ + "name": "olympus", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "npm run build && npm run dev", + "build": "npm run clean && npm run mkdir && npm run build:html && npm run build:css && npm run build:js", + "dev": "webpack-dev-server --inline --hot --content-base build --history-api-fallback" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@types/leaflet": "^1.9.0", + "express": "^4.18.2", + "leaflet": "^1.9.3" + }, + "devDependencies": { + "@types/express": "^4.17.15", + "@types/node": "^18.11.18", + "ts-node": "^10.9.1", + "typescript": "^4.9.4" + } +} diff --git a/www/js/DCS/DCSCommands.js b/www/src/DCS/DCSCommands.ts similarity index 89% rename from www/js/DCS/DCSCommands.js rename to www/src/DCS/DCSCommands.ts index ca29c51b..8d7b141f 100644 --- a/www/js/DCS/DCSCommands.js +++ b/www/src/DCS/DCSCommands.ts @@ -1,4 +1,6 @@ -function spawnSmoke(color, latlng) +import { ConvertDDToDMS } from 'Other/Utils.js' + +export function spawnSmoke(color, latlng) { var xhr = new XMLHttpRequest(); xhr.open("PUT", RESTaddress); @@ -15,7 +17,7 @@ function spawnSmoke(color, latlng) xhr.send(JSON.stringify(data)); } -function spawnGroundUnit(type, latlng, coalition) +export function spawnGroundUnit(type, latlng, coalition) { var xhr = new XMLHttpRequest(); xhr.open("PUT", RESTaddress); @@ -32,7 +34,7 @@ function spawnGroundUnit(type, latlng, coalition) xhr.send(JSON.stringify(data)); } -function spawnAircraft(type, latlng, coalition, payloadName = "", airbaseName = "") +export function spawnAircraft(type, latlng, coalition, payloadName = "", airbaseName = "") { var xhr = new XMLHttpRequest(); xhr.open("PUT", RESTaddress); @@ -49,7 +51,7 @@ function spawnAircraft(type, latlng, coalition, payloadName = "", airbaseName = xhr.send(JSON.stringify(data)); } -function attackUnit(ID, targetID) +export function attackUnit(ID, targetID) { var xhr = new XMLHttpRequest(); xhr.open("PUT", RESTaddress); @@ -66,7 +68,7 @@ function attackUnit(ID, targetID) xhr.send(JSON.stringify(data)); } -function cloneUnit(ID) +export function cloneUnit(ID) { var xhr = new XMLHttpRequest(); xhr.open("PUT", RESTaddress); diff --git a/www/src/DCS/payloadNames.ts b/www/src/DCS/payloadNames.ts new file mode 100644 index 00000000..c9b62547 --- /dev/null +++ b/www/src/DCS/payloadNames.ts @@ -0,0 +1 @@ +export var payloadNames = {"A-10A": ["MK-84*2 , LAU-68*2 , AGM-65K*2", "LAU-68-MK5*6", "AGM-65K*2,Mk20*6,AIM-9*2,ECM", "Mk-82*6,AIM-9*2,ECM", "Mk20*6,AIM-9*2,ECM", "AGM-65D*4,AIM-9*2,ECM", "AGM-65K, AGM-65D", "ECM", "Mk-82*6, Mk-84*2", "Mk20*8", "AGM-65K*2,Mk-84*2,AIM-9*2,ECM", "AGM-65K*2,Mk-82*6,AIM-9*2,ECM", "Mk-84*2,AIM-9*2,ECM", "AGM-65K*2,Mk84*2,Mk82*4,AIM-9M*2,ECM", "AGM-65H*6,Mk82*10,AIM-9M*2,ECM"], "A-10C": ["LAU-68 42 rkt M156 WP, AIM-9*2, ECM", "AGM-65D*4, CBU-97*2, CBU-87*2, TGP, ECM, AIM-9*2", "LAU-131 98 rkt M156 WP, AIM-9*2,ECM", "SUU-25*9,AIM-9*2,ECM", "AGM-65D*4, CBU-97*4,TGP, ECM, AIM-9*2", "Mk-82AIR*8,AIM-9*2,ECM", "MK-84*2,LAU-68*2,AGM-65K*2", "BDU-33*6, TGM-65H, TGM-65D, TGP, BDU-50LGB*2, CAP-9*1", "Mk-82*6,Mk-84*2,AIM-9*2,ECM", "Mk-84*4,AIM-9*2,ECM", "Mk-82*8,AIM-9*2,ECM", "BDU-33*12, TGP, CAP-9*1", "AGM-65D*4,Mk-82AIR*2,CBU-87*2,AIM-9M*2,ECM,TGP", "AGM-65D*4,GBU-12*2,GBU-38,Mk-82,AIM-9,TGP,ECM", "AGM-65D*2, AGM-65H*2, CBU-97*2, CBU-87*2, TGP, ECM, AIM-9*2", "BDU-50HD*6,Mk1*7,TGP, CAP-9*1", "AGM-65H*4, CBU-97*4,TGP, ECM, AIM-9*2", "AGM-65D*2,AGM-65H*2,Mk-82AIR*2,CBU-87*2,AIM-9M*2,ECM,TGP", "AGM-65K*2,GBU-38*4,AIM-9*2,TGP,ECM", "BDU-33*6, TGP, CAP-9*1", "AGM-65D*2,AGM-65H*2,GBU-12*2,GBU-38*2,AIM-9*2,TGP,ECM,MK151*7", "TGP", "BDU-33*6, TGP, CAP-9*1, BDU-50LD*2", "GBU-12*6,GBU-10*2,TGP, AIM-9*2", "TGP, CBU-87*3, M151*28, AIM-9*2, ECM", "AGM-65D*4,Mk-82*6,CBU-87*2,TGP,AIM-9*2,Mk151*7", "PGM- GBU-10*2,GBU-12*4,AIM-9*2,TGP,ECM", "AGM-65D*4,TGP, ECM, AIM-9*2", "TGP, CAP-9*1, CATM-65K*1, TGM-65G*1", "AGM-65G*2,GBU-31*2,AIM-9*2,TGP,ECM", "TGP, M151*14, Mk-82*2, Mk-82AIR*2, AIM-9*2, ECM", "PGM- GBU-10*4, AGM-65K*2,AIM-9*2,TGP,ECM", "AGM-65D*2,AGM-65H*2,Mk-82AIR*6,CBU-87*2,Mk151*7,AIM-9*2,TGP,ECM", "GBU-31*2,GBU-38*2, AGM-65H*2, AIM-9*2,TGP, ECM", "CBU-103*4, M151*14, AIM-9*2, ECM", "CBU-87*4, M151*42, AIM-9*2, ECM", "AGM-65D*6, CBU-97*4,TGP, ECM, AIM-9*2", "CBU-87*2, M151*14, MK-82AIR*6, AIM-9*2,ECM", "AGM-65D*4, CBU-105*4,TGP, ECM, AIM-9*2", "BDU-50HD*2,BDU-50LGB*2,TGP, CAP-9*1", "CBU-87*4, M151*28, AIM-9*2,ECM", "M151*98, Mk-82*2,AIM-9*2,ECM", "AGM-65D*2,AGM-65H*2,GBU-12,GBU-38,MK82*3,MK82AIR*3,MK5*7,TGP,AM-9*2", "TGP, M151*42, Mk-82*6, Mk-82AIR*6, AIM-9*2, ECM", "TGP, M151*84, Mk-82*2,AIM-9*2, ECM", "BDU-50LD*2, BDU-50HD*2,CATM-65K, TGM-65G, TGP, CAP-9*1", "TGP, M151*49, Mk-82*2, CBU-87*2, AIM-9*2, ECM", "TGP, CAP-9*1, BDU-50LGB*4", "GBU-12*14,TGP, AIM-9*2", "AGM-65D*3, AGM-65H*3, CBU-97*4,TGP, ECM, AIM-9*2", "AGM-65D*2,AGM-65H*2,Mk-82AIR*2,CBU-97*2,AIM-9M*2,TGP,ECM", "AGM-65D*4, CBU-105*2,CBU-97*2, TGP, ECM, AIM-9*2", "AGM-65D*2,Mk-82*6,AIM-9*2,ECM", "AGM-65D*2,AGM-65H*2,TGP, ECM, AIM-9*2", "GBU-38*4,GBU-31*2,TGP, AIM-9*2", "AGM-65D*4,GBU-12*2,GBU-38*2,AIM-9*2,TGP,ECM,MK5*7", "AGM-65G,AGM-65K,GBU-10*2,AIM-9*2,TGP,ECM", "AGM-65G,AGM-65D,Mk-82*7,AIM-9*2,ECM", "GBU-31*2,GBU-38*4,AIM-9*2,TGP,ECM, AIM-9*2", "AGM-65K*2,GBU-12*8,AIM-9M*2.ECM,TGP", "AGM-65D*6,GBU-12*4,AIM-9M*2,ECM,TGP"], "A-10C_2": ["LAU-68 42 rkt M156 WP, AIM-9*2, ECM", "AGM-65D*4, CBU-97*2, CBU-87*2, TGP, ECM, AIM-9*2", "LAU-131 98 rkt M156 WP, AIM-9*2,ECM", "SUU-25*9,AIM-9*2,ECM", "AGM-65D*4, CBU-97*4,TGP, ECM, AIM-9*2", "Mk-82AIR*8,AIM-9*2,ECM", "MK-84*2,LAU-68*2,AGM-65K*2", "BDU-33*6, TGM-65H, TGM-65D, TGP, BDU-50LGB*2, CAP-9*1", "Mk-82*6,Mk-84*2,AIM-9*2,ECM", "Mk-84*4,AIM-9*2,ECM", "Mk-82*8,AIM-9*2,ECM", "BDU-33*12, TGP, CAP-9*1", "AGM-65D*4,Mk-82AIR*2,CBU-87*2,AIM-9M*2,ECM,TGP", "AGM-65D*4,GBU-12*2,GBU-38,Mk-82,AIM-9,TGP,ECM", "AGM-65D*2, AGM-65H*2, CBU-97*2, CBU-87*2, TGP, ECM, AIM-9*2", "BDU-50HD*6,Mk1*7,TGP, CAP-9*1", "AGM-65H*4, CBU-97*4,TGP, ECM, AIM-9*2", "AGM-65D*2,AGM-65H*2,Mk-82AIR*2,CBU-87*2,AIM-9M*2,ECM,TGP", "AGM-65K*2,GBU-38*4,AIM-9*2,TGP,ECM", "BDU-33*6, TGP, CAP-9*1", "AGM-65D*2,AGM-65H*2,GBU-12*2,GBU-38*2,AIM-9*2,TGP,ECM,MK151*7", "TGP", "BDU-33*6, TGP, CAP-9*1, BDU-50LD*2", "GBU-12*6,GBU-10*2,TGP, AIM-9*2", "TGP, CBU-87*3, M151*28, AIM-9*2, ECM", "AGM-65D*4,Mk-82*6,CBU-87*2,TGP,AIM-9*2,Mk151*7", "PGM- GBU-10*2,GBU-12*4,AIM-9*2,TGP,ECM", "AGM-65D*4,TGP, ECM, AIM-9*2", "TGP, CAP-9*1, CATM-65K*1, TGM-65G*1", "AGM-65G*2,GBU-31*2,AIM-9*2,TGP,ECM", "TGP, M151*14, Mk-82*2, Mk-82AIR*2, AIM-9*2, ECM", "PGM- GBU-10*4, AGM-65K*2,AIM-9*2,TGP,ECM", "AGM-65D*2,AGM-65H*2,Mk-82AIR*6,CBU-87*2,Mk151*7,AIM-9*2,TGP,ECM", "GBU-31*2,GBU-38*2, AGM-65H*2, AIM-9*2,TGP, ECM", "CBU-103*4, M151*14, AIM-9*2, ECM", "CBU-87*4, M151*42, AIM-9*2, ECM", "AGM-65D*6, CBU-97*4,TGP, ECM, AIM-9*2", "CBU-87*2, M151*14, MK-82AIR*6, AIM-9*2,ECM", "AGM-65D*4, CBU-105*4,TGP, ECM, AIM-9*2", "BDU-50HD*2,BDU-50LGB*2,TGP, CAP-9*1", "CBU-87*4, M151*28, AIM-9*2,ECM", "M151*98, Mk-82*2,AIM-9*2,ECM", "AGM-65D*2,AGM-65H*2,GBU-12,GBU-38,MK82*3,MK82AIR*3,MK5*7,TGP,AM-9*2", "TGP, M151*42, Mk-82*6, Mk-82AIR*6, AIM-9*2, ECM", "TGP, M151*84, Mk-82*2,AIM-9*2, ECM", "BDU-50LD*2, BDU-50HD*2,CATM-65K, TGM-65G, TGP, CAP-9*1", "TGP, M151*49, Mk-82*2, CBU-87*2, AIM-9*2, ECM", "TGP, CAP-9*1, BDU-50LGB*4", "GBU-12*14,TGP, AIM-9*2", "AGM-65D*3, AGM-65H*3, CBU-97*4,TGP, ECM, AIM-9*2", "AGM-65D*2,AGM-65H*2,Mk-82AIR*2,CBU-97*2,AIM-9M*2,TGP,ECM", "AGM-65D*4, CBU-105*2,CBU-97*2, TGP, ECM, AIM-9*2", "AGM-65D*2,Mk-82*6,AIM-9*2,ECM", "AGM-65D*2,AGM-65H*2,TGP, ECM, AIM-9*2", "GBU-38*4,GBU-31*2,TGP, AIM-9*2", "AGM-65D*4,GBU-12*2,GBU-38*2,AIM-9*2,TGP,ECM,MK5*7", "AGM-65G,AGM-65K,GBU-10*2,AIM-9*2,TGP,ECM", "AGM-65G,AGM-65D,Mk-82*7,AIM-9*2,ECM", "GBU-31*2,GBU-38*4,AIM-9*2,TGP,ECM, AIM-9*2", "AGM-65K*2,GBU-12*8,AIM-9M*2.ECM,TGP", "AGM-65D*6,GBU-12*4,AIM-9M*2,ECM,TGP", "AGM-65E*2,Mk-82AIR*2,CBU-97*2,AIM-9M*2,ECM,TGP", "AGM-65E*2,CBU-97*4,AIM-9M*2,ECM,TGP", "AGM-65E*2,CBU-97*4,AIM-9M*2,ECM,M151 APKWS*7,TGP", "AGM-65E*2,CBU-105*4,AIM-9M*2,ECM,M151 APKWS*7,TGP", "Mk-82*4,Mk-8AIR*4,AIM-9*2,ECM", "Mk-82*20,AIM-9*2,ECM", "Mk-82*6,AIM-9*2,TGP,ECM", "Mk-84*6,AIM-9*2,TGP,ECM", "Mk-82AIR*6,Mk-8AIR*4,M151*1,TGP,AIM-9*2,ECM", "GBU-38*4,M151 APKWS*7,AGM-65D*1,AGM-65H*1,TGP,AIM-9*2,ECM", "GBU-38*4,M151 APKWS*7,AGM-65E*2,TGP,AIM-9*2,ECM", "GBU-12*4,M151 APKWS*7,AGM-65E*2,TGP,AIM-9*2,ECM", "GBU-12*2,GBU-38*2,M151 APKWS*7,AGM-65E*2,TGP,AIM-9*2,ECM", "GBU-10*2,M151 APKWS*7,AGM-65E*2,TGP,AIM-9*2,ECM", "GBU-31*2,M151 APKWS*7,AGM-65E*2,TGP,AIM-9*2,ECM", "GBU-54*4,M151 APKWS*7,AGM-65E*2,TGP,AIM-9*2,ECM", "GBU-54*4,M151 APKWS*7,AGM-65D*4,TGP,AIM-9*2,ECM"], "AH-64D_BLK_II": ["4 * Fuel Tank 230 gal", "2 * M261: M151 (6PD), 2 * Hellfire station: 4*AGM-114K", "4 * Hellfire station: 4*AGM-114K", "4 * M261: M151 (6PD)", "2 * M261: M151 (6PD), 2 * Fuel Tank 230 gal", "2 * Fuel Tank 230 gal, 2 * Hellfire station: 4*AGM-114K", "2 * M261: A/B - M151 (6PD), E - M274 (6SK), 2 * Hellfire station: 4*AGM-114K", "2 * M261: A/B - M151 (6PD), E - M257 (6IL), 2 * Hellfire station: 4*AGM-114K", "2 * M261: C - M257 (6IL), D/E - M151 (6PD), 2 * Hellfire station: 4*AGM-114K", "2 * M261: C - M274 (6SK), D/E - M151 (6PD), 2 * Hellfire station: 4*AGM-114K"], "AJS37": ["Battlefield Air Interdiction: RB-75*4, RB-24J*2, XT", "Anti-ship: RB-04E*2, RB-74*2, XT", "Anti-ship (Heavy Mav): RB-75T*4, XT", "Hard Target (Countermeasures): RB-05, XT, KB, U22", "Hard Target (MAV): RB-75T*2, RB-74*2, XT", "Ferry Flight: XT", "CAS (75 GUN): RB-75*2, AKAN", "CAP: RB-74*4, XT", "Countermeasures Escort: U/22A, KB", "Strike: BK90 (MJ1)*2, RB-74*2, XT", "CAS: AKAN, RB-05A", "CAP (6 AAM): RB-74*4, RB-24J*2, XT", "Rocket Half Load HE: ARAK HE*2, RB-74*2, XT", "CAP / Intecept: RB-05A*2, RB-74*2, XT", "Bombs Low-drag: SB71LD*16, RB-24J*2, XT", "SEAD: RB-75T*2, U22/A, KB, XT", "Anti-Ship (Modern): RB-15F*2, RB-74*2, XT", "New Payload", "CAP (AJ37): RB-24J*2", "ECM Escort Anti-ship: RB-04E, KB, RB-74*2, XT", "Bombs High-drag: SB71HD*16, XT, RB-24J", "Anti-ship (Light Mav): RB-75*4, XT", "Rocket Full Load HE: ARAK HE*4, RB-24J, XT", "Illumination: LYSB*8, XT", "Anti-ship (RB05): RB-05A*2, RB-74*2, XT", "CAP (Gun): AKAN*2, RB-74*2, XT", "Hard Target: RB-05A*2, RB-74*2, XT", "RB-05*2, XT", "CAS: ARAK M70 HE*4, XT", "Runway Strike: SB71HD*16, RB-24J, XT"], "AV8BNA": ["H-L-H 2", "AFAC 1", "AS 1", "H-M-H 3", "Interdiction 1 (H-H-H-H)", "Interdiction 2 (H-H-H-H)", "AFAC 3", "Interdiction 3 (H-L-L-H)", "H-M-H 1", "H-L-H 1", "PGM 2 (H-H-H-H)", "L-L-L 1", "AFAC 2", "H-M-H 2", "Area Suppression", "Rockets 1", "AS 2", "Helo Escort 1", "PGM 1 (H-H-H-H)", "Helo Escort 2", "PGM 3 (H-H-H-H)", "Anti Armor", "RA 1 (H-M-M-H)", "Stand Off 1", "Stand Off 2", "Stand Off 3", "Iron Hand 1", "Iron Hand 2"], "C-101CC": ["2*AIM-9P, DEFA 553 CANNON (I)", "2*AIM-9M, DEFA 553 CANNON (I)", "2*AIM-9P, DEFA 533 CANNON (II)", "2*AIM-9P, AN-M3 CANNON (IV)", "2*R.550 MAGIC, DEFA 553 CANNON", "2*AIM-9M, AN-M3 CANNON (III)", "2*AIM-9P, DEFA 553 CANNON", "2*R.550 MAGIC, DEFA 553 CANNON (III)", "2*AIM-9P, 2*BELOUGA, DEFA 553 CANNON", "2*AIM9-P, 2*SEA EAGLE, DEFA-553 CANNON", "2*AIM-9M 2*SEA EAGLE, AN-M3 CANNON", "2*AIM-9M, AN-M3 CANNON", "2*BELOUGA,2*BDU-33, DEFA-553 CANNON", "2* SEA EAGLE, DEFA-553 CANNON", "2*AIM-9P, 2*BR-250,2*MK-82, DEFA 553 CANNON", "2*R.550 MAGIC, 2*SEA EAGLE , DEFA-553 CANNON", "2*R.550 MAGIC, DEFA 553 CANNON (IV)", "2*BELOUGA, 2*BR-500, DEFA 553 CANNON", "2*AIM-9M, DEFA 553 CANNON (IV)", "2*R.550 MAGIC, AN-M3 CANNON (II)", "2*R550 Magic, DEFA 553 CANNON (I)", "2*AIM-9M ,2*BELOUGA,2*BIN-200, AN-M3 CANNON", "2*AIM-9M, 2*LAU 68, 2*MK-82, DEFA 553 CANNON", "2*AIM-9P, AN-M3 CANNON (III)", "2*AIM-9M, DEFA 533 CANNON (II)", "2*R.550 MAGIC, 2*BR-250, 2*BDU-33, DEFA 553 CANNON"], "C-101EB": ["Smoke System: White Smoke", "Smoke System: White Smoke+Red Colorant", "Smoke System: White Smoke+Yellow Colorant"], "H-6J": ["YJ-12 x 2", "YJ-12 x 4", "YJ-83K x 6", "250-2 HD Bomb x 12 in Bay", "250-2 HD Bomb x 24 in Bay", "250-3 LD Bomb x 36", "KD-63 x 4", "KD-20 x 6", "KD-20 x 4", "KD-63 x 2, KD-20 x 4", "KD-63 x 2, KD-20 x 2"], "J-11A": ["FAB-100x36,R-73x2,ECM", "FAB-250x8,R-73x2,ECM", "FAB-500x8,R-73x2,ECM", "S-8KOMx80,FAB-250x4,R-73x2,ECM", "S-13x20,FAB-250x4,R-73x2,ECM", "S-25x4,FAB-500x4,R-73x2,ECM", "R-27ERx4,R-27ETx2,R-73x2,ECM", "R-77x6,R-73x2,ECM", "R-27ERx6,R-73x2,ECM", "R-77x4,R-27ETx2,R-73x2,ECM", "R-77x4,R-27ERx2,R-73x2,ECM", "BetAB-500ShPx6,R-73x2,ECM", "R-73x4,ECM", "R-77x2,R-27ETx2,R-73x2,ECM", "R-77x6,R-73x4", "R-77x2,R-27ETx2,R-27ERx2,R-73x2,ECM", "R-27ETx2,R-27ERx4,R-73x2,ECM", "S-8TsMx80,FAB-250x4,R-73x2,ECM", "S-8OFP2x80,FAB-250x4,R-73x2,ECM", "FAB-250x18,R-73x2,ECM", "2*S8-KOMx2, R-73x2, ECM", "2*S8-OFP2x2, R-73x2, ECM", "FAB-250x4, 2*FAB-500x2, R-73x2", "FAB-250x4, 2*FAB-250x2, R-73x2", "RBK-250 HEAT/APx2, RBK-250 HE/Fragx2, R-73x2"], "JF-17": ["PL-5Ex2, C802AKx2, 800L Tank", "PL-5Ex2, C-701 IRx2, 1100L Tank, 800L Tank", "PL-5Ex2, SD-10x2, 1100L Tankx2, WMD7", "PL-5Ex2, LD-10x2, 1100L Tankx2, WMD7", "PL-5Ex2, 800L Tank, WMD7", "PL-5Ex2, GBU-10x2, WMD7", "PL-5Ex2, 2*GBU-12x2, 800L Tank, WMD7", "PL-5Ex2, 2*Mk-82x2, Mk-83x2, 800L Tank", "PL-5Ex2, 1100L Tankx2, 800L Tank", "PL-5Ex2, WMD7, CM802AKGx2, 800L Tank, DL", "PL-5Ex2, C-701 CCDx2, 1100L Tank, 800L Tank", "PL-5Ex2, GBU-12x2, 1100L Tank, WMD7", "PL-5Ex2, 2*GBU-12x2, GBU-16x2, WMD7", "PL-5Ex2, 1100L Tankx2, WMD7", "PL-5Ex2, WMD7, 800L Tankx2, SPJ, 2*LD-10", "PL-5Ex2, LS-6x2, 1100L Tankx2, WMD7", "PL-5Ex2, C-701 IRx2, 1100L Tankx2, WMD7", "PL-5Ex2, GBU-12x2, 1100L Tankx2, WMD7", "PL-5Ex2, 2*LD-10x2, 1100L Tankx2, SPJ", "PL-5Ex2, LD-10x2, 1100L Tankx2, SPJ", "PL-5Ex2, 2*LD-10x2, LS-6x2, SPJ", "PL-5Ex2, 2*LD-10x2, GB-6-HEx2, SPJ", "PL-5Ex2, C-701 IRx2, 800L Tankx2, WMD7", "PL-5Ex2, C-701 CCDx2, 1100L Tankx2, WMD7", "PL-5Ex2, C-701 CCDx2, 800L Tankx2, WMD7", "PL-5Ex2, 2*GBU-12x2, 1100L Tank, WMD7", "PL-5Ex2, C-701 IRx2, 1100L Tank, WMD7", "PL-5Ex2, C-701 IRx2, 800L Tank, WMD7", "PL-5Ex2, C-701 CCDx2, 1100L Tank, WMD7", "PL-5Ex2, C-701 CCDx2, 800L Tank, WMD7", "PL-5Ex2, C-701 IRx2, LS-6x2, 800L Tank", "PL-5Ex2, C-701 IR/CCD, GB-6-HEx2, 800L Tank", "PL-5Ex2, C-701 IR/CCD, GB-6-SFWx2, 800L Tank", "PL-5Ex2, WMD7, GB-6-SFWx2, 800L Tank, BRM1", "PL-5Ex2, WMD7, GB-6-SFWx2, 800L Tank, GBU-12", "PL-5Ex2, 2*Mk-82SEx2, Mk-83x3", "PL-5Ex2, Mk-84x3", "PL-5Ex2, 2*Mk5x2, 800L Tank", "PL-5Ex2, Unguided 90mmx2, 800L Tank", "PL-5Ex2, 2*Mk5x2, Mk-83x3", "PL-5Ex2, BRM1x2, 1100L Tank, WMD7", "PL-5Ex2, 2x1100L Tank", "PL-5Ex2, SD-10x2, 2x1100L Tank", "PL-5Ex2, 2*SD-10x2, 2x1100L Tank", "PL-5Ex2, 800L Tank", "PL-5Ex2, SD-10x2, 800L Tank", "PL-5Ex2, 2*SD-10x2, 800L Tank", "PL-5Ex2, SD-10x2, SPJ", "PL-5Ex2, SPJ", "PL-5Ex2, 2*SD-10x2, SPJ", "PL-5Ex2", "PL-5Ex2, SD-10x2", "PL-5Ex2, 2*SD-10", "PL-5Ex2, SD-10x2, SPJ, 1100L Tankx2", "PL-5Ex2, 2*SD-10x2, 1100L Tankx2, 800L Tank", "PL-5Ex2, SD-10x2, 1100L Tankx2, 800L Tank", "PL-5Ex2, GBU-16x2, BRM1x2, WMD7", "PL-5Ex2, WMD7", "PL-5Ex2, 2*LD-10, GB-6x2, 2*SD-10, SPJ", "PL-5Ex2, C-701 CCDx2, SPJ", "PL-5Ex2, 2*LD-10, CM802AKGx2, 2*SD-10, DL", "PL-5Ex2, 2*MK-82x2, MK-83x2, MK-84", "PL-5Ex2, LS-6x2, GB-6x2, 800L Tank", "PL-5Ex2, 2*GBU-12x2, LS-6x2, WMD7", "PL-5Ex2, 2*GBU-12x2, GB-6x2, WMD7", "PL-5Ex2, 2*Type-200Ax2", "PL-5Ex2, Type-200Ax2", "PL-5Ex2, 2*LS6-250x2, 800L Tankx2, WMD7", "PL-5Ex2, 2*LS6-250x2, 800L Tank, 1100L Tankx2", "PL-5Ex2, 2*LS6-100x2, 1100L Tankx2, WMD7", "PL-5Ex2, 2*LS6-100x2, 800L Tankx2, WMD7"], "WingLoong-I": ["AKD-10 x 2"], "Christen Eagle II": ["Smoke - white"], "F-16C_50": ["AIM-120B*2, AIM-9M*4, FUEL*3", "AIM-120B*4, AIM-9M*2, FUEL*3", "AIM-120B*6, FUEL*3", "AIM-120C*2, AIM-9X*4, FUEL*2", "AIM-120C*4, AIM-9X*2, FUEL*3", "AIM-120C*4, AIM-9X*2, FUEL*3, TGP", "AIM-120C*4, AIM-9X*2, FUEL*2", "AIM-120C*6, FUEL*3", "AIM-120C*4, AIM-9X*2, FUEL*2, ECM", "AIM-120C*4, AIM-9X*2, FUEL*2, ECM, TGP", "AIM-120C*6, FUEL*2, ECM", "AIM-120C*6, FUEL*2, ECM, TGP", "AIM-120C*6, FUEL*2", "AIM-120C*6, FUEL*3, TGP", "AIM-120C*2, AIM-9X*2, AGM-65D*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, AGM-65H*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, AGM-65H*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, AGM-65D*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, CBU-97*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, MK-82*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, CBU-87*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, MK-82HD*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, CBU-103*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, CBU-105*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, MK-82*6, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, MK-82HD*6, FUEL*2, ECM, TGP", "AIM-120*2, AIM-9X*2, MK-82SE*4, FUEL*2, ECM, TGP", "AIM-120*2, AIM-9X*2, MK-82SE*6, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, MK-84*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, MK-82P*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-12*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-12*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-10*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-24*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-31-1B*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-31-3B*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-38*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, GBU-38*4, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, AGM-65K*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, AGM-65G*2, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, AGM-65G, AGM-65K, FUEL*2, ECM, TGP", "AIM-120C*2, AIM-9X*2, AGM-88C*2, FUEL*3, TGP, HTS", "AIM-120C*2, AIM-9X*2, AGM-88C*2, FUEL*2, ECM, TGP, HTS", "AIM-120C*2, AIM-9X*2, AGM-88C*4, ECM, TGP, HTS", "AIM-120C*4, AGM-88C*2, FUEL*3, TGP, HTS", "AIM-120C*4, AGM-88C*2, FUEL*2, ECM, TGP, HTS", "AIM-120C*4, AGM-88C*4, ECM, TGP, HTS", "AIM-120C*2, AIM-9X*2, MK-61*2, FUEL*2, ECM, TGP"], "F-5E-3": ["Mk-82LD*4,AIM-9P*2,Fuel 275", "AIM-9P*2, Fuel 275*3", "AIM-9P5*2, Fuel 275*3", "AIM-9P*2, Fuel 150*3", "AIM-9P5*2, Fuel 150*3", "Mk-82SE*4,AIM-9P*2,Fuel 275", "CBU-52B*4,AIM-9P*2,Fuel 275", "LAU-3 HE*4,AIM-9P*2,Fuel 275", "LAU-3 HEAT*4,AIM-9P*2,Fuel 275", "LAU-68 HE*4,AIM-9P*2,Fuel 275", "LAU-68 HEAT*4,AIM-9P*2,Fuel 275", "M-117*4,AIM-9P*2,Fuel 275", "GBU-12*4,AIM-9P*2,Fuel 275", "CBU-52B*5,AIM-9*2", "Mk-82LD*5,AIM-9*2", "Mk-82SE*5,AIM-9*2", "Mk-82LD*7,AIM-9P*2, Fuel 275*2", "Mk-82SE*7,AIM-9P*2, Fuel 275*2", "LAU-3 HE*2,Mk-82LD,AIM-9P*2,Fuel 275*2", "LAU-68 HE*2,Mk-82LD,AIM-9P*2,Fuel 275*2", "M-117*5,AIM-9*2", "AIM-9P*2, Fuel 275", "AIM-9P*2, Fuel 150", "AIM-9P5*2, Fuel 275", "AIM-9P5*2, Fuel 150", "AIM-9B*2, Fuel 275", "AIM-9B*2, Fuel 150", "AIM-9B*2, Fuel 275*3", "AIM-9B*2, Fuel 150*3", "AN/ASQ-T50, AIM-9P, Fuel 150", "AIM-9B*2", "AIM-9P*2", "AIM-9P5*2", "Antiship Mk82"], "F-5E": ["Mk-82LD*4,AIM-9P*2,Fuel 275", "AIM-9P*2, Fuel 275*3", "AIM-9P5*2, Fuel 275*3", "AIM-9P*2, Fuel 150*3", "AIM-9P5*2, Fuel 150*3", "Mk-82SE*4,AIM-9P*2,Fuel 275", "CBU-52B*4,AIM-9P*2,Fuel 275", "LAU-3 HE*4,AIM-9P*2,Fuel 275", "LAU-3 HEAT*4,AIM-9P*2,Fuel 275", "LAU-68 HE*4,AIM-9P*2,Fuel 275", "LAU-68 HEAT*4,AIM-9P*2,Fuel 275", "M-117*4,AIM-9P*2,Fuel 275", "GBU-12*4,AIM-9P*2,Fuel 275", "CBU-52B*5,AIM-9*2", "Mk-82LD*5,AIM-9*2", "Mk-82SE*5,AIM-9*2", "Mk-82LD*7,AIM-9P*2, Fuel 275*2", "Mk-82SE*7,AIM-9P*2, Fuel 275*2", "LAU-3 HE*2,Mk-82LD,AIM-9P*2,Fuel 275*2", "LAU-68 HE*2,Mk-82LD,AIM-9P*2,Fuel 275*2", "M-117*5,AIM-9*2", "AIM-9P*2, Fuel 275", "AIM-9P*2, Fuel 150", "AIM-9P5*2, Fuel 275", "AIM-9P5*2, Fuel 150", "AIM-9B*2, Fuel 275", "AIM-9B*2, Fuel 150", "AIM-9B*2, Fuel 275*3", "AIM-9B*2, Fuel 150*3", "AN/ASQ-T50, AIM-9P, Fuel 150", "AIM-9B*2", "AIM-9P*2", "AIM-9P5*2"], "F-86F Sabre": ["120gal Fuel*2", "200gal Fuel*2", "120gal Fuel*2, 200gal Fuel*2", "GAR-8*2", "120gal Fuel*2, GAR-8*2", "HVAR*16", "200gal Fuel*2, HVARx2*4", "AN-M64*2", "200gal Fuel*2, AN-M64*2", "M117*2"], "F-14A-135-GR": ["XT*2", "AIM-54A-MK47*6, AIM-9L*2, XT*2", "AIM-7F*6, AIM-9L*2, XT*2", "AIM-54A-MK47*4, AIM-7F*2, AIM-9L*2, XT*2", "AIM-54A-MK47*2, AIM-7F*1, AIM-9L*4, XT*2", "AIM-54A-MK47*4, AIM-9L*4, XT*2", "AIM-54A-MK47*4, AIM-9M*4, XT*2", "AIM-54A-MK60*4, AIM-9M*4, XT*2", "AIM-7F*4, AIM-9L*4, XT*2", "AIM-7F*4, AIM-9L*4, XT*2", "BDU-33*14", "BDU-33*12", "GBU-10*2", "GBU-12*4", "GBU-16*4", "GBU-24*2", "Mk-84*4", "Mk-83*4", "Mk-82*4", "Mk-82*14", "Mk-81*14", "Mk-20*4", "Mk-82AIR*4", "Zuni*12", "Zuni*28", "LUU-2*24", "AIM-54A-MK60*1, AIM-7F*1, AIM-9L*2, XT*2, Mk-82*2", "AIM-54A-MK60*1, AIM-7F*1, AIM-9L*2, XT*2, Mk-82*1", "AIM-54A-MK60*1, AIM-7F*1, AIM-9L*2, XT*2, Mk-20*2", "AIM-7M*1, AIM-9M*2, XT*2, GBU-12*2, LANTIRN", "AIM-7M*1, AIM-9M*2, XT*2, GBU-24*1, LANTIRN", "AIM-54A-MK60*1, AIM-7M*1, AIM-9M*2, XT*2, Mk-82*2, LANTIRN", "AIM-54A-MK60*1, AIM-7M*1, AIM-9M*2, XT*2, Mk-20*2, LANTIRN"], "F-14A-95-GR": ["AIM-54A-MK47*6, AIM-9L*2", "AIM-54A-MK47*6, AIM-9L*2", "AIM-54A-MK60*6, AIM-9L*2", "AIM-7F*6, AIM-9L*2", "AIM-7F*6, AIM-9L*2", "AIM-54A-MK47*4, AIM-7F*2, AIM-9L*2", "AIM-54A-MK47*4, AIM-7F*2, AIM-9L*2", "AIM-54A-MK60*4, AIM-7F*2, AIM-9L*2", "AIM-54A-MK47*2, AIM-7F*1, AIM-9L*4", "AIM-54A-MK47*2, AIM-7F*1, AIM-9L*4", "AIM-54A-MK60*2, AIM-7F*1, AIM-9L*4", "AIM-54A-MK47*4, AIM-9L*4", "AIM-54A-MK47*4, AIM-9L*4", "AIM-54A-MK60*4, AIM-9L*4", "AIM-7F*4, AIM-9L*4", "AIM-7F*4, AIM-9L*4", "AIM-54A-MK47*2, AIM-7F*3, AIM-9L*2", "AIM-54A-MK47*2, AIM-7F*3, AIM-9L*2", "AIM-54A-MK60*2, AIM-7F*3, AIM-9L*2", "BDU-33*14", "BDU-33*12", "GBU-10*2", "GBU-12*4", "GBU-16*4", "GBU-24*2", "Mk-84*4", "Mk-83*4", "Mk-82*4", "Mk-82*14", "Mk-81*14", "Mk-20*4", "Mk-82AIR*4", "Zuni*12", "Zuni*28", "LUU-2*24", "AIM-54A-MK60*1, AIM-7F*1, AIM-9L*2, Mk-82*2", "AIM-54A-MK60*1, AIM-7F*1, AIM-9L*2, Mk-82*1", "AIM-54A-MK60*1, AIM-7F*1, AIM-9L*2, Mk-20*2"], "F-14B": ["XT*2", "AIM-54A-MK47*6, AIM-9M*2, XT*2", "AIM-54A-MK47*6, AIM-9L*2, XT*2", "AIM-54A-MK60*6, AIM-9M*2, XT*2", "AIM-54C-MK47*6, AIM-9M*2, XT*2", "AIM-7M*6, AIM-9M*2, XT*2", "AIM-7M*6, AIM-9L*2, XT*2", "AIM-54A-MK47*4, AIM-7M*2, AIM-9M*2, XT*2", "AIM-54A-MK47*4, AIM-7M*2, AIM-9L*2, XT*2", "AIM-54A-MK60*4, AIM-7M*2, AIM-9M*2, XT*2", "AIM-54C-MK47*4, AIM-7M*2, AIM-9M*2, XT*2", "AIM-54A-MK47*2, AIM-7M*1, AIM-9M*2, AIM-9L*2, XT*2", "AIM-54A-MK47*2, AIM-7M*1, AIM-9M*4, XT*2", "AIM-54A-MK60*2, AIM-7M*1, AIM-9M*4, XT*2", "AIM-54C-MK47*2, AIM-7M*1, AIM-9M*4, XT*2", "AIM-54A-MK47*4, AIM-9M*2, AIM-9L*2, XT*2", "AIM-54A-MK47*4, AIM-9M*4, XT*2", "AIM-54A-MK60*4, AIM-9M*4, XT*2", "AIM-54C-MK47*4, AIM-9M*4, XT*2", "AIM-7M*4, AIM-9M*2, AIM-9L*2, XT*2", "AIM-7M*4, AIM-9L*4, XT*2", "AIM-54A-MK47*2, AIM-7M*3, AIM-9M*2, XT*2", "AIM-54A-MK47*2, AIM-7M*3, AIM-9M*2, XT*2", "AIM-54A-MK60*2, AIM-7M*3, AIM-9M*2, XT*2", "AIM-54C-MK47*2, AIM-7M*3, AIM-9M*2, XT*2", "BDU-33*14", "BDU-33*12", "GBU-10*2", "GBU-12*4", "GBU-16*4", "GBU-24*2", "Mk-84*4", "Mk-83*4", "Mk-82*4", "Mk-82*14", "Mk-81*14", "Mk-20*4", "Mk-82AIR*4", "Zuni*12", "Zuni*28", "LUU-2*24", "AIM-54A-MK60*1, AIM-7M*1, AIM-9M*2, XT*2, Mk-82*2", "AIM-54A-MK60*1, AIM-7M*1, AIM-9M*2, XT*2, Mk-82*1", "AIM-54A-MK60*1, AIM-7M*1, AIM-9M*2, XT*2, Mk-20*2", "AIM-7M*1, AIM-9M*2, XT*2, GBU-12*2, LANTIRN", "AIM-7M*1, AIM-9M*2, XT*2, GBU-24*1, LANTIRN", "AIM-54A-MK60*1, AIM-7M*1, AIM-9M*2, XT*2, Mk-82*2, LANTIRN", "AIM-54A-MK60*1, AIM-7M*1, AIM-9M*2, XT*2, Mk-20*2, LANTIRN"], "FA-18C_hornet": ["AIM-9M*6, AIM-7M*2, FUEL*3", "AIM-9M*6, AIM-7M*2, FUEL*2", "AIM-9M*2, MK-84*2, FUEL*2", "AIM-9M*2, MK-83*4, FUEL*2", "Carrier Landing", "AIM-9M*2, AIM-7M*4, FUEL*3", "AIM-9M*2, CBU-99*4, FUEL*2", "AIM-9M*2, MK-82SE*4, FUEL*2", "AIM-9M*2, MK-20*4, FUEL*2", "AIM-9M*2, MK-82*4, FUEL*2", "AIM-9M*2, AIM-7M*2, FUEL*2", "AIM-9M*2, MK-83*2, FUEL*2", "AIM-9M*2, ZUNI*4, FUEL*2", "AIM-9M*2, LAU-61*4, FUEL*2", "AIM-9M*2, LAU-68*4, FUEL*2", "AIM-9M*2, AIM-7M*2, FUEL*1", "AIM-9X*2, AIM-120C-5*1, GBU-31*4, ATFLIR, FUEL", "AIM-9X*2, AIM-120C-5*6, FUEL*3", "AIM-9X*2, AIM-120C-5*1, AGM-65D*4, ATFLIR, FUEL", "AIM-9X*2, AIM-120C-5*2, AGM-88C*2, FUEL", "AIM-9X*2, AIM-120C-5*1, GBU-38*4, GBU-12*4, ATFLIR, FUEL", "AIM-9X*2, AIM-120C-5*1, AGM-84E*2, DATALINK, ATFLIR, FUEL*2", "AIM-9M*2, AIM-120C-5*1, AGM-84D*4, ATFLIR, FUEL", "AIM-9M*2, ATFLIR, FUEL", "AIM-9M*2, ATFLIR, FUEL*2"], "I-16": ["6xRS-82", "2xFAB-100", "6xRS-82, 2xFAB-100", "6xRS-82, 2xDropTank-93L", "2xDropTank-93L"], "Ka-50": ["4xFAB-500", "2xFuel tank, 2xKMGU AP", "80xS-8 TsM", "2xFuel tank, 40xS-8", "80xS-8", "4xKMGU AT", "2xKMGU AP", "2xFuel tank, 12x9A4172", "2xFuel tank, 2xUPK-23", "12x9A4172, 40xS-8", "12x9A4172, 2xKMGU AT", "4xKMGU AP", "2xFAB-250, 2xFuel tank", "12x9A4172, 2xFAB-500", "20xS-13", "40xS-8", "12x9A4172, 2xUPK-23", "2xKMGU AT", "6x9A4172", "2xFuel tank, 2xKMGU AT", "4xFuel tank", "2xKMGU AP, 12x9A4172", "12x9A4172", "2xFuel tank", "40xS-8 TsM, 12x9A4172", "2xFAB-500", "40xS-8 TsM, 2xFuel tank", "4xUPK-23", "10xS-13", "40xS-8 TsM", "12x9A4172, 10xS-13", "2xFuel tank, 2xFAB-500", "2xFAB-250", "4xFAB-250", "2xFuel tank, 10xS-13", "2xFAB-250, 12x9A4172", "2xUPK-23"], "Ka-50_3": ["4xIgla", "2xKh-25ML, 10xS-13, 4xIgla", "12x9A4172, 40xS-8KOM, 4xIgla", "12x9A4172, 40xS-8OFP, 4xIgla", "12x9A4172, 40xS-13, 4xIgla", "80xS-8KOM, 4xIgla", "80xS-8OFP, 4xIgla", "20xS-20, 4xIgla", "4xUPK-23, 4xIgla", "10xS-13, 2xFAB-500, 4xIgla", "10xS-13, 2xFAB-250, 4xIgla", "80xS-8OM, 4xIgla", "80xS-8TsM, 4xIgla", "40xS-8OFP, 2xFuel, 4xIgla", "12x9A4172, 2xFuel, 4xIgla"], "L-39C": ["SAB-100x2", "R-3Sx2", "Smokes", "Central Smoke", "FAB-100x2", "S-5KOx32"], "L-39ZA": ["S-5KOx32", "S-5KOx64", "S-5KOx32, PTB-150x2", "S-5KOx32, PTB-350x2", "S-5KOx32, FAB-100x2", "OFAB-100 Jupiter x4, FAB-100x2", "FAB-100x2", "FAB-100x4", "OFAB-100 Jupiter x8", "FAB-100x2, PTB-150x2", "FAB-100x2, PTB-350x2", "PK-3x4", "PK-3x2, PTB-150x2", "R-60Mx2", "SAB-100x4", "R-3Sx2", "R-3Sx2, PK-3x2", "R-60Mx2, PK-3x2"], "M-2000C": ["Fox", "Fox / Magic (QRA)", "Alpha / S530D", "Fox / S530D / Magic", "Fox / S530D / Magic / Eclair", "Bravo", "Bravo / Magic", "Kilo", "Kilo / Magic", "Bravo / 4xMk-82 / Magic", "Bravo / GBU-12 / Magic", "Bravo / 2xGBU-12 / Magic", "Bravo / GBU-16 / Magic", "Bravo / GBU-24 / Magic", "Bravo / BAP-100 / Magic", "Bravo / 4xSnakeEye / Magic", "Fox / 4xMk-82 / Magic", "Kilo / 4xMk-82 / Magic"], "MB-339A": ["A - 2*320L TipTanks + 2*DEFA-553 GunPods + 2*Mk.83 + 2*Mk.81 ", "A - 2*320L TipTanks [Clean]", "Recon", "Training", "AA - 2*320L TipTanks + 2*DEFA-553 GunPods + 2*LAU-10(Zuni Rockets) [ARMADA]", "AM - 2*320L TipTanks + 2*AN/M3 GunPods + 2*330L Tanks + 2*LAU-3 (Hydra rockets)", "A - 2*500L TipTanks + 2*330L Tanks + Luggage Container [Ferry Long Range]", "A - 2*500L TipTanks + 4*Mk.82HD + 2*LR-25 (API Rockets)", "A - 2*320L TipTanks + 2*330L Tanks [Ferry Medium Range]", "A - 2*500L TipTanks + 2*AN/M3 GunPods + 2*Matra 155 + 2* Belouga", "Runway Interdiction", "A - 2*500L TipTanks + 2*DEFA-553 GunPods + 2*Mk.82LD + 2*LR-25 (API Rockets)", "A - 2*320L TipTanks + 2*DEFA-553 GunPods + 2*Mk.82LD Bombs + 2*LR-25(API Rockets)", "A - 2*320L TipTanks + 2*DEFA-553 GunPods + 2*Mk.82LD + 2*LR-25 (HEI Rockets)", "A - 2*320L TipTanks + 6*Mk.82LD", "Runway Interdiction (36*BAP-100)", "Anti - Light Armoured Vehicle (36*BAT-120 ABL)", "AP - 2*320L TipTanks + 2*DEFA-553 GunPods + 2*330L Tanks + 2*Matra 155 (SNEB rockets)"], "MB-339APAN": ["PAN - Smoke White", "PAN - Smoke White and Color Red", "PAN - Fuel External [RED SMOKE]", "PAN - Full Payload [RED SMOKE] + 2*320L TipTanks", "PAN - Full Payload [GREEN SMOKE] + 2*320L TipTanks", "PAN - Fuel External [GREEN SMOKE]", "PAN - Full Payload [RED SMOKE] + 2*500L TipTanks", "PAN - Smoke White and Color Green", "PAN - Full Payload [GREEN SMOKE] + 2*500L TipTanks"], "Mi-24P": ["2xB8V20 (S-8KOM)+8xATGM 9M114", "2xB8V20 ( S-8KOM)+4xATGM 9M114", "4xB8V20 (S-8KOM)+4xATGM 9M114", "2xB8V20 (S-8KOM)+2xBombs-250+4xATGM 9M114", "2xB8V20 (S-8OFP2)+4xATGM 9M114", "4xUB-32A (S-5KO)+4xATGM 9M114", "4xGUV-1 AP30+4xATGM 9M114", "2xGUV-1 AP30+4xATGM 9M114", "2xGUV-1 (GUN 12.7+2x7.62) +4xATGM 9M114", "2xKMGU (96 AO 2.5RT)+8xATGM 9M114", "2xB-13L+4xATGM 9M114", "2xS-24B+4xATGM 9M114", "4xS-24B+4xATGM 9M114", "2xBombs-500+4xATGM 9M114", "4xBombs-250+4ATGM 9M114", "2xRBK-500 (PTAB-1M)+4xATGM 9M114", "2xRBK-500U (OAB 2.5RT)+4xATGM 9M114", "4xRBK-250 (42 PTAB 2.5M) +4ATGM 9M114", "4xRBK-250-275 (150 AO-1SCh)+4ATGM 9M114", "4xPTB-450 Fuel tank"], "MiG-19P": ["PTB-760 x 2", "K-13A x 2, PTB-760 x 2", "K-13A x 2", "K-13A x 2, ORO-57K x 2, PTB-760 x 2", "ORO-57K x 2, PTB-760 x 2", "ORO-57K x 4", "ORO-57K x 2", "FAB-100M x 2, ORO-57K x 2", "FAB-250 x 2, ORO-57K x 2", "FAB-100M x 2", "FAB-250 x 2"], "MiG-21Bis": ["Patrol, long range", "Patrol, medium range", "Patrol, short range", "Hard targets, BOMBS", "Unknown or mixed targets, BOMBS + ROCKETS", "Soft targets, CLUSTERS + ROCKETS", "Soft targets, CLUSTERS", "Soft targets, scattered", "Few big targets, GROM + BOMBS", "Very hard target, PENETRATION", "Aerial attack, hard targets, CLUSTERS", "Hard targets, ROCKETS, PENETRATION", "Soft targets, ROCKETS, BLAST-FRAGMENTS", "Long range, MIX", "Long range, RADAR GUIDED MISSILES", "Long range, INFRA RED MISSILES", "Escort", "Escort, JAMMER", "Night, ILLUMINATOR", "Long range, JAMMER", "Soft targets, UPK + ROCKETS", "Soft targets, UPK + CLUSTERS", "Patrol, JAMMER", "NUCLEAR A", "NUCLEAR B", "Short range", "AEROBATIC"], "Mirage-F1B": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1BD": ["2*R550 Magic I, 2*S530, 1*Fuel Tank", "2*R550 Magic I", "2*R550 Magic I, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*S530, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1BE": ["2*AIM9-JULI, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*AIM9-JULI, R530IR", "2*R550 Magic I, R530EM", "2*AIM9-JULI, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*AIM9-J, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 LD", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*AIM-9JULI, 8*SAMP 250 HD", "2*AIM-9JULI, 8*SAMP 400 LD", "2*AIM-9JULI, 8*BLU107 Durandal"], "Mirage-F1BQ": ["2*R550 Magic I, 2*S530, 1*Fuel Tank", "2*R550 Magic I", "2*R550 Magic I, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*S530, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1C-200": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1C": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1CE": ["2*AIM9-JULI, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*AIM9-JULI, R530IR", "2*R550 Magic I, R530EM", "2*AIM9-JULI, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*AIM9-J, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 LD", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*AIM-9JULI, 8*SAMP 250 HD", "2*AIM-9JULI, 8*SAMP 400 LD", "2*AIM-9JULI, 8*BLU107 Durandal"], "Mirage-F1CG": ["2*AIM-9 JULI, 2*R530IR, 1*Fuel Tank", "4*AIM-9 JULI, 2*R530IR, 1*Fuel Tank", "2*AIM-9 JULI, 2*R530EM, 1*Fuel Tank", "2*AIM-9 JULI, R530IR", "2*AIM-9 JULI, 1*R530IR, 2*Fuel Tank", "2*AIM-9 JULI, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*AIM-9 JULI, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*AIM-9 JULI, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*AIM-9 JULI, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*AIM-9 JULI, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*AIM-9 JULI, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1CH": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1CJ": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1CK": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1CR": ["2*R550 Magic I, 2*S530, 1*Fuel Tank", "2*R550 Magic I", "2*R550 Magic I, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*S530, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1CT": ["2*R550 Magic I, 2*S530, 1*Fuel Tank", "2*R550 Magic I", "2*R550 Magic I, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*S530, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1CZ": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1DDA": ["2*R550 Magic I, 2*S530, 1*Fuel Tank", "2*R550 Magic I", "2*R550 Magic I, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*S530, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1ED": ["2*R550 Magic II, 2*S530, 1*Fuel Tank", "2*R550 Magic II", "2*R550 Magic II, 2*Fuel Tank", "2*R550 Magic II, 2*MATRA F4 SNEB251 (HE), 2*S530, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic II, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic II, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic II, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic II, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic II, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1EDA": ["2*R550 Magic I, 2*S530, 1*Fuel Tank", "2*R550 Magic I", "2*R550 Magic I, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*S530, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1EE": ["2*AIM9-JULI, 2*R530IR, 1*Fuel Tank", "2*AIM9-JULI, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*AIM9-JULI, R530EM", "2*R550 Magic I, R530IR", "2*AIM9-JULI, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*AIM9-J, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 LD", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*AIM-9JULI, 8*SAMP 250 HD", "2*AIM-9JULI, 8*SAMP 400 LD", "2*AIM-9JULI, 8*BLU107 Durandal"], "Mirage-F1EH": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1EQ": ["2*R550 Magic I, 2*S530, 1*Fuel Tank", "2*R550 Magic I", "2*R550 Magic I, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*S530, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1JA": ["2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530EM, 1*Fuel Tank", "2*R550 Magic I, R530IR", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 LD", "2*R550_Magic_1, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550_Magic_1, 8*SAMP 250 HD", "2*R550_Magic_1, 8*SAMP 400 LD", "2*R550_Magic_1, 8*BLU107 Durandal"], "Mirage-F1M-CE": ["2*AIM9-JULI, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*AIM9-JULI, R530IR", "2*R550 Magic I, R530IR", "2*AIM9-JULI, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*AIM9-J, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 LD", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*AIM-9JULI, 8*SAMP 250 HD", "2*AIM-9JULI, 8*SAMP 400 LD", "2*AIM-9JULI, 8*BLU107 Durandal"], "Mirage-F1M-EE": ["2*AIM9-JULI, 2*R530IR, 1*Fuel Tank", "2*R550 Magic I, 2*R530IR, 1*Fuel Tank", "2*AIM9-JULI, R530IR", "2*R550 Magic I, R530IR", "2*AIM9-JULI, 1*R530IR, 2*Fuel Tank", "2*R550 Magic I, 1*R530IR, 2*Fuel Tank", "2*AIM9-J, 2*MATRA F4 SNEB251 (HE), 2*R530IR, 1*Fuel Tank", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 LD", "2*AIM-9J, 2*Fuel Tank, 4*SAMP 400 HD", "2*R550 Magic I, 4*MATRA F1 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB253 (Shaped Charge), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 4*MATRA F4 SNEB256 (AP), 1*Fuel Tank", "2*R550 Magic I, 2*SAMP 250 HD, 2 MATRA F1 SNEB256 (AP), 1*Fuel Tank", "2*AIM-9JULI, 8*SAMP 250 HD", "2*AIM-9JULI, 8*SAMP 400 LD", "2*AIM-9JULI, 8*BLU107 Durandal"], "SA342L": ["M621, 8xSNEB68 EAP", "M621, 8xSNEB68 EAP, IR Deflector", "M621, 8xSNEB68 EAP, IR Deflector, Sand Filter"], "SA342M": ["HOT3x4", "IR Deflector", "Hot3x4, FAS, IR Deflector", "HOT3x2", "Hot3x4, IR Deflector", "Hot3x2, IR Deflector"], "SA342Minigun": ["IR Deflector", "IR Deflector, Sand Filter"], "SA342Mistral": ["Mistral x 4", "Mistral x 4, IR Deflector", "Mistral x 4, IR Deflector, Sand Filter"], "A-20G": ["500 lb GP bomb LD*4"], "Bf-109K-4": ["Fuel Tank", "SC250", "SC500"], "FW-190A8": ["Without pylon", "SC 50 * 4", "AB 250 (w/ SD 10A)", "AB 250 (w/ SD 2)", "AB 500 (w/ SD 10A)", "SC 250 L2", "SC 250 J", "SC 500 J", "SC 500 L2", "SD 250 Stg", "SD 500 A", "Fuel Tank 300 liters", "BR 21"], "FW-190D9": ["SC500", "Fuel Tank", "R4M", "BR 21"], "MosquitoFBMkVI": ["250 lb S.A.P*2; 500 lb S.A.P.*2", "500 lb GP Mk.V*2, 500 lb GP Short tail*2", "100 gal Drop tank*2, 500 lb MC Short tail*2", "RP-3 60lb SAP No2 Mk.I*8, 250 lb A.A.P.*2", "100 gal. Drop tank*2, 250 lb MC Mk.II, RP-3 60lb F No1 Mk.I*4", "500 lb GP Short tail*4"], "P-47D-30": ["AN-M65*2", "Fuel150*2", "AN-M64*2, Fuel110", "AN-M57*3"], "P-47D-30bl1": ["AN-M57*2", "AN-M64*2, Fuel110"], "P-47D-40": ["AN-M65*2", "Fuel150*2", "AN-M57*3", "AN-M64*2, Fuel110", "M8*6, AN-M57*2, Fuel110", "HVAR*10, Fuel110"], "P-51D-30-NA": ["Fuel75*2", "HVAR*6,Fuel75*2", "HVAR*6,M64*2", "HVAR*6", "M64*2", "HVAR*10", "Smokes"], "P-51D": ["Fuel75*2", "HVAR*6,Fuel75*2", "HVAR*6,M64*2", "HVAR*6", "M64*2", "HVAR*10", "Smokes"], "A-50": [], "AH-1W": ["14xHYDRA-70 WP", "38xHYDRA-70 WP", "8xBGM-71, 14xHYDRA-70", "8xBGM-71, 14xHYDRA-70 WP", "8xBGM-71, 38xHYDRA-70 WP", "14xHYDRA-70", "38xHYDRA-70", "8xAGM-114", "28xHYDRA-70", "8xBGM-71, 38xHYDRA-70", "8xAGM-114, 38xHYDRA-70 WP", "8xBGM-71", "8xAGM-114, 14xHYDRA-70 WP", "76xHYDRA-70", "8xAGM-114, 38xHYDRA-70", "8xAGM-114, 14xHYDRA-70"], "AH-64A": ["8xAGM-114", "38xHYDRA-70 WP", "76xHYDRA-70", "8xAGM-114, 38xHYDRA-70 WP", "38xHYDRA-70", "8xAGM-114, 38xHYDRA-70", "AGM-114K*16"], "AH-64D": ["76xHYDRA-70", "38xHYDRA-70", "38xHYDRA-70 WP", "8xAGM-114", "8xAGM-114, 38xHYDRA-70 WP", "8xAGM-114, 38xHYDRA-70", "AGM-114K*16"], "An-26B": [], "An-30M": [], "B-1B": ["Mk-82*84", "AGM-154*12", "GBU-38*48", "CBU-87*30", "CBU-97*30", "GBU-38*16, CBU-97*20", "Mk-84*24", "GBU-31*24", "GBU-31(V)3/B*24", "GBU-31*8, GBU-38*32"], "B-52H": ["Mk-84*18", "Mk 82*51", "Mk20*18", "AGM-86C*20", "AGM-84A*8"], "C-130": [], "C-17A": [], "CH-47D": [], "CH-53E": [], "E-2C": [], "E-3A": [], "F-117A": ["GBU-12*2", "GBU-10*2", "GBU-27*2"], "F-14A": ["AIM-9*2", "AIM-54C*6,AIM-9*2", "AIM-54C*4,AIM-9*2,AIM-7*2"], "F-15C": ["AIM-120B*4, AIM-7M*2, AIM-9M*2, Fuel*3", "AIM-9*2,AIM-120*6,Fuel", "AIM-9*4,AIM-120*4,Fuel*3", "AIM-9*4,AIM-120*4,Fuel", "AIM-9*2,AIM-120*2,AIM-7*4,Fuel*3", "AIM-9*2,AIM-120*6,Fuel*3", "AIM-9*4,AIM-7*4,Fuel", "AIM-120*8,Fuel", "AIM-9*4,AIM-7*4,Fuel*3", "AIM-120*8,Fuel*3", "AIM-9*2,AIM-120*2,AIM-7*4,Fuel"], "F-15E": ["AIM-120B*2,AIM-9M*2,FUEL*3,CBU-87*6,Mk-82AIR*6", "AIM-120B*2,AIM-9M*2,FUEL*3,CBU-97*12", "AIM-120B*2,AIM-9M*2,FUEL*3,Mk-82*12", "AIM-120B*4,AIM-120C*4,FUEL*3", "AIM-120B*2,AIM-9M*2,FUEL,GBU-31*4,AGM-65H,AGM-65D", "AIM-120B*2,AIM-9M*2,FUEL,CBU-103*2,GBU-12,GBU-38,AGM-154C*2", "AIM-120B*4,AIM-9M*4,FUEL*3", "AIM-120B*2,AIM-9M*2,AIM-120C*2,AIM-7M*2,FUEL*3", "AIM-120B*2,AIM-9M*2,FUEL,GBU-12*4,GBU-38*4,AGM-154C*2", "AIM-120B*2,AIM-9M*2,FUEL,GBU-31*4,AGM-154C*2", "AIM-120B*2,AIM-9M*2,AIM-7M*4,FUEL*3", "AIM-120B*2,AIM-9M*2,FUEL*3,Mk-84*8", "AIM-120B*2,AIM-9M*2,FUEL,AGM-154C*2", "AIM-120B*2,AIM-9M*2,FUEL,GBU-12*4,GBU-38*4,AGM-65D*2", "AIM-120B*2,AIM-9M*2,FUEL,GBU-12*4,GBU-38*4,AGM-65K*2", "AIM-120C*2,AIM-9M*4,AIM-7M*2,FUEL*3", "AIM-9M*4,AIM-7M*4,FUEL*3", "AIM-120C*2,AIM-9M*2,FUEL*3", "AIM-120B*2,AIM-9M*2,FUEL,Mk-84*8,AGM-154C*2", "AIM-120B*2,AIM-9M*2,FUEL*3,Mk-82AIR*12", "AIM-120B*2,AIM-9M*2,FUEL,GBU-12*2,GBU-38*2,AGM-154C*2", "AIM-120B*2,AIM-9M*2,FUEL,GBU-12*2,GBU-38*2,AGM-65H,AGM-65D", "AIM-120B*2,AIM-120C*4,AIM-9M*2,FUEL*3", "AIM-120B*2,AIM-9M*2,FUEL*3,Mk-82*6,Mk-82AIR*6", "AIM-120B*2,AIM-9M*2,FUEL,CBU-103*2,GBU-12,GBU-38,AGM-65H*2", "AIM-120B*2,AIM-9M*2,FUEL,AGM-65D*2", "AIM-120B*2,AIM-9M*2,FUEL*2,SUU-25*2,GBU-12,GBU-38", "AIM-120B*6,AIM-9M*2,FUEL*3", "AIM-120B*2,AIM-9M*2,FUEL,Mk-82AIR*12,AGM-154C*2", "AIM-120C*6,AIM-9M*2,FUEL*3", "GBU-31(V)3/B*5, AIM-120C*2, AIM-9M*2"], "F-16A MLU": ["Fuel*3", "AGM-88*2, AGM-65D*2, AIM-120B*2, ECM", "Mk-82*6,AIM-120*2,ECM,Fuel*2", "Mk-82*2,AIM-120*2,AIM-9*2,ECM,Fuel*2", "AGM88*2,AGM-65D*6,AIM-120*2,AIM-9*2,ECM", "AIM-120*2,GBU-10*2,ECM,Lantirn ,Fuel*2", "AIM-9*4,ECM", "Mk20*4,AIM-9*2,ECM,Fuel*2", "AIM-120*6,ECM", "AIM-120*4,AIM-9*2,ECM", "AGM88, AGM-65D, AIM-120*2,Fuel*2,ECM", "AGM-65D*2,AIM-120*2,ECM,Lantirn ,Fuel*2", "AIM-9*4,ECM,Fuel*2", "AIM-120*4,AIM-9*2,ECM,Fuel*2", "AGM-88*2,AIM-120*2,AIM-9*2,ECM,Fuel*2", "Mk-84*2,AIM-9*2,ECM,Fuel*2", "AIM-120*6,ECM,Fuel*2", "AGM-154*2,AIM-120*2,ECM,Lantirn ,Fuel*2", "AGM-88*2,AGM-65D*2,AIM-120B*2,AIM-9M*2,ECM", "Mk20*2,AIM-120*2,ECM,Fuel*2", "AIM-120*2,AIM-9*2,GBU-12*2,ECM,Lantirn ,Fuel*2", "AGM-65K*2,AIM-120*2,ECM,Lantirn ,Fuel*2", "AIM-120B*2_AIM-9M*2_AGM-119*4_ALQ-131"], "F-16A": ["AGM-88*2,AIM-120*2,AIM-9*2,ECM,Fuel*2", "Mk20*4,AIM-9*2,ECM,Fuel*2", "AIM-9*4,ECM,Fuel*2", "AGM-65D*2,AIM-120*2,ECM,Lantirn ,Fuel*2", "AIM-120*4,AIM-9*2,ECM,Fuel*2", "AGM88*2_AGM-65D*6_AIM-120*2_AIM-9*2_ECM", "AGM-65K*2,AIM-120*2,ECM,Lantirn ,Fuel*2", "AIM-120*2,AIM-9*2,GBU-12*2,ECM,Lantirn ,Fuel*2", "AIM-120*2,GBU-10*2,ECM,Lantirn ,Fuel*2", "AIM-120*6,ECM,Fuel*2", "AIM-120*6,ECM", "AIM-9*4,ECM", "Fuel*3", "Mk-84*2,AIM-9*2,ECM,Fuel*2", "AIM-120*4,AIM-9*2,ECM", "Mk-82*6,AIM-120*2,ECM,Fuel*2", "Mk-82*2,AIM-120*2,AIM-9*2,ECM,Fuel*2", "AGM-154*2,AIM-120*2,ECM,Lantirn ,Fuel*2", "Mk20*2,AIM-120*2,ECM,Fuel*2", "AGM-119*2,AIM-120B*2,AIM-9M*2,ALQ-184,Fuel*2"], "F-16C bl.50": ["AIM-120B*4, AIM-9M*2, Fuel", "AIM-120C*4, AIM-9M*2, Fuel", "AGM-65G*2, AIM-120C*2, AIM-9M*2, Fuel, ECM", "AGM-65D*6, AIM-120B*2, AIM-9M*2, ECM, Fuel", "Mk86*6, AIM-9M*4, ECM, Fuel", "CBU-97*4, AIM-9M*4, Fuel", "CBU-87*4, AIM-9M*4, Fuel", "AGM-65D*2, CBU-87*2, AIM-9M*4, Fuel", "AGM-65D*2, CBU-97*2, AIM-9M*4, Fuel", "Mk84*2, AIM-9M*4, ECM, Fuel", "GBU-31v1*2, AIM-9M*4, ECM, Fuel", "GBU-31v3*2, AIM-9M*4, ECM, Fuel", "GBU-31v1*2, Mk82*6, AIM-9M*4, Fuel", "Mk84*4, AIM-9M*4, Fuel", "Mk82*12, AIM-9M*4, Fuel", "AGM-154C*2, AIM-9M*4, ECM, Fuel"], "F-16C bl.52d": ["AGM-88*2, AGM-65D*2, AIM-120B*2, ECM,LIGHTNING", "Mk-82*6,AIM-120*2,ECM,Fuel*2,LIGHTNING", "AGM88*2,AGM-65D*6,AIM-120*2,AIM-9*2,ECM,LIGHTNING", "AGM-65D*4,AIM-120*2,ECM,Fuel*2,LIGHTNING", "AIM-120*2,GBU-31*2,ECM,Fuel*2,LIGHTNING", "AIM-120*2,GBU-31(v)*2,ECM,Fuel*2,LIGHTNING", "AGM-88*2,AIM-120*2,AIM-9*2,ECM,Fuel*2,LIGHTNING", "Copy AIM-120*2,GBU-38*2,ECM,Fuel*2,LIGHTNING", "AIM-120*2,GBU-10*2,ECM,Fuel*2,LIGHTNING", "Mk-84*2,AIM-120*2,ECM,Fuel*2,LIGHTNING", "AGM-154*2,AIM-120*2,ECM,Fuel*2,LIGHTNING", "Mk-82AIR*6,AIM-120*2,ECM,Fuel*2,LITENING", "CBU97*4,AIM120*2,ECM,Fuel*2,LITENING", "AGM-88*2,AGM-65D*2,AIM-120B*2,AIM-9M*2,ECM,LITENING", "CBU87*2,AIM-120*2,ECM,Fuel*2,LITENING", "AGM88, AGM-65D, AIM-120*2,Fuel*2,ECM,LITENING", "AIM-120*2,GBU-12*2,ECM,Fuel*2,LITENING", "AGM-65K*2,AIM-120*2,ECM,Lantirn ,Fuel*2,LITENING", "AGM-65G*4,AIM-120C*2,AIM-9M*2,ECM", "AIM-120C*4,AIM-9M*2,ECM,Fuel*2", "AIM-120B*4,AIM-9M*2,ECM,Fuel*2", "AIM-9M*4,Fuel*2", "AIM-120C*2,AIM-120B*2,AIM-9M*2,Fuel*3", "AIM-9P*4", "AIM-9M*2,ECM"], "F-4E": ["AIM-9*4,AIM-7*4", "AGM45*2_AGM-65D*4_AIM7*2_ECM", "AGM-45*2,AIM-7*2,Fuel*2,ECM", "Mk-82*18,AIM-7*2,ECM", "GBU-12*2,AIM-7*2,Fuel*2,ECM", "Mk20*12,AIM-7*2,ECM", "Mk-82*6,AIM-7*2,Fuel*2,ECM", "GBU-10*2,AIM-7*2,Fuel*2,ECM", "Mk20*6,AIM-7*2,Fuel*2,ECM", "AGM-45*4,AIM-7*2,ECM", "AGM-65K*4,AIM-7*2,Fuel*2,ECM", "Fuel*3", "AIM-9*4,AIM-7*4,Fuel*2", "Mk-84*2,AIM-7*2,ECM", "AGM-65K*4,AIM-7M*4,Fuel*3"], "F/A-18A": ["GBU-16*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AIM-9*6,Fuel", "Mk-84*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM-65D*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM88*4_AIM9*2_AIM7_FLIR Pod_Fuel", "AIM-9*4,Fuel*3", "LAU-10*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM-88*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "MK-82*8,AIM-9*2,AIM-7,FLIR Pod,Fuel", "MK-82*4,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AIM-9*4,AIM-7*2,Fuel*3", "AGM-65K*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "Fuel*3", "AGM88*2_AGM65D*2_AIM9*2_AIM7_FLIR Pod_Fuel", "GBU-12*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AIM-9*4,AIM-7*4,Fuel", "Mk20*4,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "GBU-10*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM-84A*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3"], "F/A-18C": ["AGM-62*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "GBU-10*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "GBU-12*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "Fuel*3", "Mk-84*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "GBU-16*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM-154*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AIM-120*4,AIM-9*2,Fuel*3", "AGM-65D*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM88*2_AGM65D*2_AIM9*2_AIM7_FLIR Pod_Fuel", "AGM88*4_AIM9*2_AIM7_FLIR Pod_Fuel", "AIM-9*2,AIM-7*6,Fuel", "Mk20*4,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AIM-120*6,AIM-9*2,Fuel", "LAU-10*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AIM-9*2,AIM-7*4,Fuel*3", "MK-82*8,AIM-9*2,AIM-7,FLIR Pod,Fuel", "AIM-120*2,AIM-9*2,AIM-7*2,Fuel*3", "AGM-88*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM-84E*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "MK-82*4,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AGM-84A*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3", "AIM-9M*2,AGM-65D*2,Mk-82*4,FLIR Pod,Fuel", "AIM-120*4,AIM-9*2,AIM-7*2,Fuel", "AGM-65K*2,AIM-9*2,AIM-7,FLIR Pod,Fuel*3"], "IL-76MD": [], "IL-78M": [], "Ka-27": [], "Ka-52": ["APU-6 Vikhr-M*2, Kh-25ML*2", "APU-6 Vikhr-M*2", "B-8*4", "KMGU-2 (AO-2.5RT)*4", "B-8*2, APU-6 Vikhr-M*2", "FAB-500*2", "UB-13*2", "FAB-250*4", "Kh-25ML*2, R-73*2"], "KC-10A": [], "KC-135": [], "Mi-24V": ["2xFAB-500", "10xS-13", "2xFAB-250", "4x9M114, 2xFuel tank", "128xS-5", "80xS-8 TsM", "4x9M114, 40xS-8 TsM", "64xS-5", "8x9M114", "4x9M114, 80xS-8", "4x9M114, 128xS-5", "2xKMGU AP", "4xFuel tank", "4xUPK-23", "4x9M114, 10xS-13", "4x9M114, 80xS-8 TsM", "4x9M114", "80xS-8", "40xS-8 TsM", "8x9M114, 40xS-8 TsM", "8x9M114, 10xS-13", "2xFuel tank", "4x9M114, 4xUPK-23", "2xUPK-23", "8x9M114, 64xS-5", "8x9M114, 40xS-8", "20xS-13", "40xS-8", "8x9M114, 2xUPK-23"], "Mi-26": [], "Mi-28N": ["2xFAB-250", "4xFuel tank", "80xS-8", "4xKMGU AP", "4xUPK-23", "16x9M114, 10xS-13", "4xFAB-500", "16x9M114, 2xFAB-500", "40xS-8", "40xS-8 TsM", "2xKMGU AP", "2xUPK-23", "16x9M114, 2xUPK-23", "2xFAB-500", "16x9M114, 40xS-8", "16x9M114", "20xS-13", "16x9M114, 2xKMGU AP", "4xFAB-250", "4xKMGU AT", "16x9M114, 40xS-8 TsM", "80xS-8 TsM", "2xKMGU AT", "9x9M114", "2xFuel tank", "10xS-13", "2xFAB-250, 16x9M114", "16x9M114, 2xKMGU AT"], "Mi-8MT": ["4 x B8", "4 x B8 + 2GUV_AP-30 (GrL 30mm)", "2 x UPK +2 x B8", "2 xB8 + 2GUV_YaKB (MG-12.7+7.62)+ 2GUV_AP-30 (GrL 30mm)", "6 x FAB-100", "2 x B8 + 2 x UPK-23-250", "2 x UPK--23-250"], "MiG-15bis": ["2*FAB-50", "2*FAB-100M", "2*300L", "2*400L", "2*600L", "Fuel tank 300", "Fuel tank 400"], "MiG-23MLD": ["R-60M*4", "B-8*2,R-60M*2,Fuel-800", "UB-32*2,R-60M*2,Fuel-800", "R-24R*2,R-60M*4,Fuel-800", "R-24R,R-24T,R-60M*4,Fuel-800", "R-60M*4,Fuel-800", "FAB-500*2,R-60M*2,Fuel-800", "R-24R*2,R-60M*4", "FAB-250*2,R-60M*2,Fuel-800", "RBK-250*2,R-60M*2,Fuel-800", "RBK-500*2,R-60M*2,Fuel-800", "R-24R,R-24T,R-60M*4"], "MiG-25PD": ["R-40R*2,R-40T*2", "R-40R*4", "R-40R*2,R-60M*2"], "MiG-25RBT": ["FAB-500x2_60x2", "R-60M*2"], "MiG-27K": ["FAB-250*6,R-60M*2,Fuel", "BetAB-500ShP*2,FAB-250*2,R-60*2", "Kh-25MR*2,R-60M*2,Fuel", "Kh-29L*2,R-60M*2,Fuel", "B-8*4", "BetAB-500*2,FAB-500*2,R-60*2", "Kh-25MPU*2,R-60M*2,Fuel", "Kh-29T*2,R-60M*2,Fuel", "FAB-500*2,FAB-250*2,R-60M*2,Fuel", "Kh-25ML*2,R-60M*2,Fuel", "KAB-500*2,R-60M*2,Fuel", "RBK-500AO*2,RBK-250*2,R-60M*2", "UB-32*4", "Kh-29L*2,R-60*2,Fuel"], "MiG-29A": ["Fuel-1150*2,Fuel-1500", "RBK-500AO*4,R-73*2,Fuel", "FAB-250*4,R-73*2,Fuel", "B-8*4,R-73*2,Fuel", "R-60M*4,R-27R*2", "R-73*4,R-27R*2,Fuel-1500", "R-73*6,Fuel-1500", "R-60M*6,Fuel-1500", "S-24*4,R-73*2,Fuel", "FAB-500*4,R-73*2,Fuel", "R-60M*6", "BetAB-500*4,R-73*2,Fuel", "R-73*6", "R-73*2,R-60M*2,R-27R*2,Fuel-1500", "R-60M*4,R-27R*2,Fuel-1500", "RBK-250*4,R-73*2,Fuel", "R-73*4,R-27R*2", "R-73*2,R-60M*2,R-27R*2", "S-24*2,FAB-500*2,R-73*2,Fuel"], "MiG-29G": ["R-73*6,Fuel-1500", "R-73*4,R-27R*2,Fuel-1500", "R-73*2,R-60M*2,R-27R*2", "R-60M*4,R-27R*2,Fuel-1500", "R-73*6", "R-60M*4,R-27R*2", "R-73*4,R-27R*2", "Fuel-1150*2,Fuel-1500", "R-60M*6", "R-60M*6,Fuel-1500", "R-73*2,R-60M*2,R-27R*2,Fuel-1500"], "MiG-29S": ["R-73*2,R-60M*2,R-27R*2", "R-73*4,R-27R*2,Fuel-1500", "R-73*6,Fuel-1500", "R-60M*6,Fuel-1500", "S-24*4,R-73*2,Fuel", "FAB-500*4,R-73*2,Fuel", "BetAB-500*4,R-73*2,Fuel", "RBK-500AO*4,R-73*2,Fuel", "R-73*2,R-60M*2,R-27R*2,Fuel-1500", "R-77*2,R-73*2,Fuel-1500,Fuel-1150*2", "B-8*4,R-73*2,Fuel", "RBK-250*4,R-73*2,Fuel", "R-73*6", "Fuel-1150*2,Fuel-1500", "R-60M*6", "R-60M*4,R-27R*2", "R-73*4,R-27R*2", "R-77*4,R-73*2", "FAB-250*4,R-73*2,Fuel", "R-60M*4,R-27R*2,Fuel-1500", "R-77*4,R-73*2,Fuel-1500", "S-24*2,FAB-500*2,R-73*2,Fuel"], "MiG-31": ["R-40T*2,R-33*4", "R-40T,R-33*4,R-40R", "R-40R*2,R-33*4", "R-60M*4,R-33*4"], "Mirage 2000-5": ["R 550*2,MICA IR*4", "R 550*2,MICA IR*2,MICA AR*2,Fuel*3", "R 550*2,MICA AR*4,Fuel*3", "R 550*2,SUPER 530F*2,Fuel", "Fuel*3", "R 550*2,MICA IR*4,Fuel*3", "R 550*2,MICA AR*4", "R 550*2,SUPER 530F*2"], "MQ-9 Reaper": ["GBU-12*4", "GBU-38*4", "AGM-114K*8,GBU-38*2", "AGM-114K*12"], "OH-58D": ["2xAGM-114, 7xHYDRA-70", "4xAGM-114", "M-3, 7xHYDRA-70", "2xAGM-114, M-3", "14xHYDRA-70", "14xHYDRA-70 WP"], "RQ-1A Predator": ["AGM-114K*2"], "S-3B": ["AGM-84A*2, Mk-82*2", "AGM-84E*2", "AGM-65D, AGM-65K, Mk20*4", "AGM-65D, AGM-65K, Mk82*4", "Mk82*10", "Mk84*2, Mk82*4", "ZUNI Mk71*8, Mk20*4"], "SH-3W": [], "SH-60B": ["AGM-119"], "Su-17M4": ["UB-32*4,R-60M*2,FAB-250*4", "FAB-100*24,R-60M*2", "UB-32*4,R-60M*2,Fuel*2", "B-8*4,R-60M*2,FAB-250*4", "Kh-29L*2,R-60M*2,Fuel*2", "B-8*4,R-60M*2,Fuel*2", "Kh-29T*2,R-60M*2,Fuel*2", "BetAB-500*6,R-60M*2", "Kh-25MR*4,R-60M*2,Fuel*2", "S-24*4,R-60M*2,Fuel*2", "Kh25MPU*2_Kh25ML*2_,R60M*2_Fuel*2", "Kh58*2_Kh25MPU*2_R60M*2_Fuel*2", "FAB-250*16,R-60M*2", "Kh-25ML*4,R-60M*2,Fuel*2", "RBK-500AO*4,SPPU-22*2,R-60M*2", "S-24*4,R-60M*2,FAB-250*4", "Fuel*4", "FAB-500*6,R-60M*2", "Kh-25ML*2,Kh-29L*2,R-60*2"], "Su-24M": ["UB-13*4,FAB-500*2", "Kh-31A*2,R-60M*2,Fuel", "UB-13*4", "KAB-500*4,R-60M*2", "S-25*2,Fuel*3", "Kh31P*2_Kh25ML*2_L-081", "B-8*2,Fuel*3", "FAB-1500*2,R-60M*2", "S-24*4", "BetAB-500*4,R-60M*2", "Kh-25ML*4", "Kh-25MR*4", "FAB-100*24", "Kh-31A*2,R-60M*2", "UB-13*2,Fuel*3", "B-8*2,Fuel*2", "Kh58*2_Kh25ML*2_L-081", "RBK-250*8", "UB-32*4", "Kh-29L*2,R-60M*2", "S-24*2,Fuel*3", "Kh25MPU*2_Kh25ML*2_L-081", "FAB-500*4,R-60M*2", "FAB-250*8", "Fuel*3", "RBK-500AO*4,R-60M*2", "KAB-1500*2,R-60M*2,Fuel", "UB-32*4,FAB-250*4", "Kh-29T*2,R-60M*2", "UB-32*2,Fuel*3", "Kh-59M*2,R-60M*2,Fuel", "S-25*4", "B-8*6"], "Su-24MR": ["SHPIL,ETHER,R-60M*2", "Fuel*2", "TANGAZH,ETHER,R-60M*2,Fuel*2", "TANGAZH,ETHER,R-60M*2", "SHPIL,ETHER,R-60M*2,Fuel*2"], "Su-25": ["RBK-250*2,S-8KOM*80,R-60M*2,Fuel*2", "FAB-250*4,UB-13*2,R-60M*2,SPPU-22*2", "S-25L*6,UB-13*2,R-60M*2", "S-25*6,SPPU-22*2,R-60M*2", "2-25L*2, KH-25ML*2, RBK-500*2, B-8MI*2, R-60M*2", "S-8KOM*120,R-60M*2,Fuel*2", "FAB-250*4,S-25*2,R-60M*2,Fuel*2", "RBK-500AO*4,S-8KOM*40,R-60M*2,Fuel*2", "FAB-250*2,SPPU-22*2,SAB-100*4,R-60M*2", "RBK-500AO*6,R-60M*2,Fuel*2", "RBK-250*8,R-60M*2", "Kh-29L*2,Kh-25ML*4,R-60M*2", "RBK-250*4,S-8KOM*80,R-60M*2", "FAB-250*4,UB-13*2,R-60M*2,Fuel*2", "S-8TsM*160,R-60*2", "Kh-25ML*4,R-60M*2,Fuel*2", "BetAB-500ShP*8,R-60M*2", "SAB-100*8,R-60*2", "Kh-29L*2,Kh-25ML*4,S-25L*2,R-60M*2", "FAB-500*6,R-60M*2,Fuel*2", "Kh-29L*2,Kh-25ML*2,R-60M*2,Fuel*2", "Kh-29L*2,R-60M*2,Fuel*2", "FAB-100*32,R-60M*2", "FAB-100*16,R-60M*2,Fuel*2", "FAB-250*6,R-60M*2,Fuel*2", "BetAB-500*6,R-60M*2,Fuel*2", "S-25*6,R-60M*2,Fuel*2", "UB-13*6,R-60M*2,Fuel*2", "Kh-25*4,Kh-29T*2,R-60*2", "S-25L*6,R-60*2,Fuel*2"], "Su-25T": ["FAB-250*4,SPPU-22*2,SAB-100*2,R-60M*2", "Kh-29L*2,Kh-25ML*4,R-73*2,Mercury LLTV Pod,MPS-410", "KAB-500Kr*2,Kh-25ML*2,R-73*2,MPS-410,Fuel*2", "RBK-500AO*4,UB-32*2,R-60M*2,Fuel*2", "BetAB-500ShP*8,R-60M*2", "UB-13*6,R-60M*2,Fuel*2", "Kh-29T*2,R-73*2,Fuel*2,MPS-410", "Kh58*2_Kh25ML*4_R73*2_L-081_MPS-410", "FAB-250*4,UB-13*2,R-60M*2,Fuel*2", "KH-29T*2, VIKHR*2, ECM", "Kh-29T*2,Kh-25ML*4,R-73*2,MPS-410", "FAB-250*4,UB-13*2,R-60M*2,SPPU-22*2", "FAB-500*6,R-60M*2,Fuel*2", "Fuel*4", "APU-8 Vikhr-M*2,Kh-25ML,R-73*2,SPPU-22*2,Mercury LLTV Pod,MPS-410", "S-8KOM*120,R-60M*2,Fuel*2", "KMGU-2 (PTAB-2.5KO)*8,R-60M*2", "FAB-250*6,R-60M*2,Fuel*2", "Kh-29L*2,R-73*2,Fuel*2,Mercury LLTV Pod,MPS-410", "FAB-100*32,R-60M*2", "RBK-250*8,R-60M*2", "S-25L*6,UB-13*2,R-60M*2", "FAB-250*4,S-25*2,R-60M*2,Fuel*2", "S-25*2,SPPU-22*4,R-60M*2,R-73*2", "KMGU-2 (AO-2.5RT)*8,R-60M*2", "APU-8 Vikhr-M*2,S-25L*2,R-73*2,SPPU-22*2,Mercury LLTV Pod,MPS-410", "S-25*6,R-60M*2,Fuel*2", "RBK-500AO*6,R-60M*2,Fuel*2", "Kh58*2_Kh25MPU*2_Kh25ML*2_R73*2_L-081_MPS-410", "RBK-250*4,UB-32*4,R-60M*2", "Kh25MPU*4_R73*2_Fuel*2_L-081_MPS-410", "BetAB-500*6,R-60M*2,Fuel*2", "RBK-250*2,UB-32*4,R-60M*2,Fuel*2", "FAB-100*16,R-60M*2,Fuel*2", "Kh-29L*2,Kh-25ML*4,R-73*2,ECM"], "Su-25TM": ["BetAB-500ShP*6,R-73*2,ECM", "APU-8 Vikhr-M*2,R-60M*2,R-73*2,SPPU-22*2,Mercury LLTV Pod", "Kh-29T*2,Kh-25ML*2,R-73*2,Fuel*2,ECM", "Kh-58*2_Kh-25MPU*4_R-73*2_L-081_MPS410", "S-25L*6,UB-13*2,R-60M*2", "Kh-35*2_R-73*2_Fuel*2_MPS410_Kopyo-25", "Kh-31A*2_R-73*2_Fuel*2_MPS410_Kopyo-25", "Fuel*4", "BetAB-500*6,R-60M*2,Fuel*2", "KAB-500Kr*2,Kh-25ML*2,R-73*2,Fuel*2,ECM", "Kh-29L*2,R-73*2,Fuel*2,Mercury LLTV Pod,ECM", "UB-13*6,R-60M*2,Fuel*2", "S-25*2,SPPU-22*4,R-60M*2,R-73*2", "Kh-31P*2_Kh-25ML*4_R-73*2_L-081_MPS410", "UB-32*6,R-60M*2,Fuel*2", "FAB-100*16,R-60M*2,Fuel*2", "FAB-250*6,R-60M*2,Fuel*2", "FAB-500*6,R-60M*2,Fuel*2", "Kh-25MPU*4_R-73*2_Fuel*2_L-081_MPS410", "S-25*6,R-60M*2,Fuel*2", "RBK-500AO*4,UB-32*2,R-60M*2,Fuel*2", "FAB-250*4,UB-13*2,R-60M*2,SPPU-22*2", "Kh-31P*2_Kh-25MPU*4_R-73*2_L-081_MPS410", "RBK-500AO*6,R-60M*2,Fuel*2", "FAB-100*32,R-60M*2", "RBK-250*2,UB-32*4,R-60M*2,Fuel*2", "RBK-250*8,R-60M*2", "APU-8 Vikhr-M*2,R-73*2,SPPU-22*2,Mercury LLTV Pod,ECM", "RBK-250*4,UB-32*4,R-60M*2", "FAB-250*4,SPPU-22*2,SAB-100*2,R-60M*2", "FAB-250*4,S-25*2,R-60M*2,Fuel*2", "FAB-250*4,UB-13*2,R-60M*2,Fuel*2"], "Su-27": ["R-73*4,R-27ER*4,R-27ET*2", "KMGU-2 (AO-2.5RT)*5,R-73*2,ECM", "BetAB-500ShP*6,R-73*2,ECM", "KMGU-2 (PTAB-2.5KO)*5,R-73*2,ECM", "R-73*2,R-27ER*6,ECM", "R-73*6", "S-13*10,RBK-500AO*2,FAB-500*2,R-73*2,ECM", "R-73*4,R-27ER*6", "R-73*2,R-27ER*4,R-27ET*2,ECM", "R-73*4,ECM", "ECM", "FAB-500*6,R-73*2,ECM", "S-25*2,FAB-500*4,R-73*4", "S-25*4, FAB-500*4, R-73*2, ECM", "CAS S-8KOM Rockets + RBK-500 PTAB1", "CAS S-8OFP Rockets + FAB-500 Bombs", "CAS S-8OFP Rockets", "CAS S-8OFP Rockets + FAB-100 Bombs", "CAS S-8KOM Rockets + FAB-100 Bombs", "CAS S-13 Rockets", "CAS S-8KOM Rockets + FAB-250 Bombs", "CAS S-8KOM Rockets + RBK-250 PTAB2.5", "CAS S-8KOM Rockets", "CAS S-8KOM Rockets + FAB-500 Bombs", "CAS S-8KOM Rockets + RBK-500 PTAB10", "CAS S-8KOM Rockets + KMGU PTAB", " CAS S-25 Rockets", "CAS S-25 Rockets + FAB-500 Bombs"], "Su-30": ["R-73*2,R-77*6,ECM", "R-73*2,R-27T*2,R-27R*4", "RBK-500AO*6,R-73*2,ECM", "Kh-31P*2,Kh-31A*2,R-73*2,R-77*2,ECM", "R-73*4,R-27T*2,R-27R*4", "R-73*2,R-77*2,Kh-35*2,ECM", "Kh-35*2,Kh-31P*2,R-73*2,R-77*2,ECM", "FAB-250*4,B-8*2,R-73*2,ECM", "ECM", "KAB-1500*2,R-73*2,R-77*2,ECM", "RBK-250*6,R-73*2,ECM", "R-73*4,R-77*6", "FAB-250*4,S-25*2,R-73*2,ECM", "R-73*2,R-27R*2,R-27ER*4,ECM", "R-73*2,R-27T*2,R-27ER*2,R-77*2,ECM", "FAB-1500*2,R-73*2,R-77*2,ECM", "R-73*4,R-27T*2,R-27ER*2,R-77*2", "Kh-59M*2,R-73*2,R-77*2,ECM", "FAB-500*6,R-73*2,ECM", "R-73*4,R-27R*2,R-27ER*4", "Kh-29L*4,R-73*2,R-77*2,ECM", "BetAB-500*6,R-73*2,ECM", "R-73*4", "FAB-250*4,UB-13*2,R-73*2,ECM", "R-73*2,R-77*4,R-27ER*2,ECM", "KAB-500*4,R-73*2,R-77*2,ECM", "FAB-250*6,R-73*2,ECM", "R-73*4,R-77*4,R-27ER*2", "Kh-29T*4,R-73*2,R-77*2,ECM", "Kh-31P*2,Kh-31A*2,R-73*2,R-77*2,ECM", "Kh-31P*4,R-73*2,R-77*2,ECM"], "Su-33": ["RBK-250*6,R-73*2,R-27R*2,ECM", "R-73*4", "R-73*4,R-27R*2,R-27ER*6", "R-73*2,R-27ET*2,R-27ER*6,ECM", "R-73*4,R-27ET*2,R-27ER*6", "FAB-250*6,R-73*2,R-27R*2,ECM", "R-73*2,R-27R*2,R-27ER*6,ECM", "ECM", "BetAB-500*6,R-73*2,R-27R*2,ECM", "RBK-500AO*6,R-73*2,R-27R*2,ECM", "UB-13*4,FAB-250*4,R-73*2,ECM", "S-25*4,FAB-250*4,R-73*2,ECM", "FAB-500*6,R-73*2,R-27R*2,ECM", "B-8*4,FAB-250*4,R-73*2,ECM", "S-25*4,FAB-500*4,R-73*4", "CAS S-8KOM rockets + FAB500", "CAS S-8OFP rockets + FAB500", "CAS S-13 Rockets + FAB500", "CAS S-13 Rockets + FAB100", "CAS S-8KOM rockets + FAB250", "CAS S-25 Rockets + FAB500", "CAS S-8KOM rockets + RBK500 PTAB10", "CAS S-8KOM rockets + RBK500 PTAB1"], "Su-34": ["UB-13*4,FAB-250*4,R-73*2,ECM", "FAB-100*28,R-73*2,ECM", "BetAB-500*8,R-73*2,ECM", "Kh-29L*4,R-73*2,R-77*2,ECM", "KAB-500*4,R-73*2,R-77*2,ECM", "RBK-250 PTAB-2.5M*8,R-73*2,ECM", "FAB-250*8,R-73*2,ECM", "ECM", "Kh-29T*4,R-73*2,R-77*2,ECM", "RBK-500 PTAB-10-5*8,R-73*2,ECM", "FAB-1500*3,R-73*2,R-77*2,ECM", "Kh-59M*2,R-73*2,R-77*2,ECM", "B-8*6,R-73*2,R-27R*2,ECM", "FAB-500*8,R-73*2,ECM", "KAB-1500*2,R-73*2,R-77*2,ECM", "Kh-29T*4,R-73*2,R-27R*2,ECM", "Kh-31A*4,Kh-31P*2,R-73*2,R-27R*2,ECM", "Kh-31A*6,R-73*2,R-27R*2,ECM", "Kh-31P*4,R-73*2,R-27R*2,ECM", "Kh-29L*4,R-73*2,R-27R*2,ECM"], "Tornado GR4": ["AIM-9M*2, Fuel*2, ECM", "ALARM*4, Fuel*2, ECM", "GBU-16*2, AIM-9M*2, Fuel*2, ECM", "BL755*4, AIM-9M*2, Fuel*2, ECM", "Sea Eagle*2, AIM-9M*2, Fuel*2, ECM"], "Tornado IDS": ["Kormoran*2,AIM-9*2,Fuel*2", "GBU-16*2,AIM-9*2,Fuel*2", "Fuel*2", "AGM-88*4,AIM-9*2,ECM", "AGM-88*2,AIM-9*2,Fuel*2,ECM", "Kormoran*4,AIM-9*2", "Kormoran*2,AIM-9*2,AGM-88*2", "Mk-82*4,AIM-9*2,Fuel*2"], "Tu-142": ["Kh-35*6"], "Tu-160": ["Kh-65*12"], "Tu-22M3": ["Kh-22N", "Kh-22N*2", "FAB-250*69", "FAB-500*33", "FAB-500*33, FAB-250*36", "FAB-250*33"], "Tu-95MS": ["Kh-65*6"], "UH-1H": ["M134 Minigun*2, XM158*2"], "UH-60A": []} \ No newline at end of file diff --git a/www/js/Map/Map.js b/www/src/Map/Map.ts similarity index 55% rename from www/js/Map/Map.js rename to www/src/Map/Map.ts index 5db4471d..177374bf 100644 --- a/www/js/Map/Map.js +++ b/www/src/Map/Map.ts @@ -1,88 +1,106 @@ -class Map +import { map, tileLayer } from 'leaflet' +import { SelectionWheel } from './SelectionWheel.js'; +import { SelectionScroll } from './SelectionScroll.js'; +import { spawnAircraft, spawnGroundUnit, spawnSmoke } from '../DCS/DCSCommands.js'; +import { payloadNames } from '../DCS/payloadNames.js'; + +export class Map { + #state : string; + #map : any; // TODO Fix, has same name of global variable + #selectionWheel : SelectionWheel; + #selectionScroll: SelectionScroll; + #activeCoalition: string; + constructor() { - this._state = "IDLE"; + this.#state = "IDLE"; - this._map = L.map('map', {doubleClickZoom: false}).setView([37.23, -115.8], 12); + this.#map = map('map', {doubleClickZoom: false}).setView([37.23, -115.8], 12); - L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', { + tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', { attribution: 'Tiles © Esri — Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community' - }).addTo(this._map); + }).addTo(this.#map); // Register event handles - this._map.on('contextmenu', (e) => this._onContextMenu(e)); - this._map.on('click', (e) => this._onClick(e)); - this._map.on('dblclick', (e) => this._onDoubleClick(e)); - this._map.on('movestart', () => {this.removeSelectionWheel(); this.removeSelectionScroll();}); - this._map.on('zoomstart', () => {this.removeSelectionWheel(); this.removeSelectionScroll();}); - this._map.on('selectionend', (e) => unitsManager.selectFromBounds(e.selectionBounds)); - this._map.on('keyup', (e) => unitsManager.handleKeyEvent(e)); + this.#map.on('contextmenu', (e) => this.#onContextMenu(e)); + this.#map.on('click', (e) => this.#onClick(e)); + this.#map.on('dblclick', (e) => this.#onDoubleClick(e)); + this.#map.on('movestart', () => {this.removeSelectionWheel(); this.removeSelectionScroll();}); + this.#map.on('zoomstart', () => {this.removeSelectionWheel(); this.removeSelectionScroll();}); + this.#map.on('selectionend', (e) => unitsManager.selectFromBounds(e.selectionBounds)); + this.#map.on('keyup', (e) => unitsManager.handleKeyEvent(e)); - this._map._container.classList.add("action-cursor"); + this.#map._container.classList.add("action-cursor"); this.setState("IDLE"); - this._selectionWheel = undefined; - this._selectionScroll = undefined; + this.#selectionWheel = undefined; + this.#selectionScroll = undefined; - /* Edit the default zoom box effect to use it as a multiple units selection */ - L.Map.BoxZoom.prototype._onMouseUp = function (e) { + // TODO + /* Edit the default zoom box effect to use it as a multiple units selection + Map.BoxZoom.prototype._onMouseUp = function (e) { if ((e.which !== 1) && (e.button !== 1)) { return; } - this._finish(); + this.#finish(); - if (!this._moved) { return; } + if (!this.#moved) { return; } // Postpone to next JS tick so internal click event handling // still see it as "moved". - setTimeout(L.bind(this._resetState, this), 0); + setTimeout(L.bind(this.#resetState, this), 0); var bounds = new L.LatLngBounds( - this._map.containerPointToLatLng(this._startPoint), - this._map.containerPointToLatLng(this._point)); + this.#map.containerPointToLatLng(this.#startPoint), + this.#map.containerPointToLatLng(this.#point)); - this._map.fire('selectionend', {selectionBounds: bounds}); + this.#map.fire('selectionend', {selectionBounds: bounds}); } + */ - this._activeCoalition = "blue"; + this.#activeCoalition = "blue"; } getMap() { - return this._map; + return this.#map; } /* State machine */ setState(newState) { - this._state = newState; + this.#state = newState; var cursorElements = document.getElementsByClassName("action-cursor"); - for (let item of cursorElements) + for (let idx in cursorElements) { + var item = cursorElements[idx]; item.classList.remove("move-cursor-enabled", "attack-cursor-enabled", "formation-cursor-enabled"); } - if (this._state === "IDLE") + if (this.#state === "IDLE") { } - else if (this._state === "MOVE_UNIT") + else if (this.#state === "MOVE_UNIT") { - for (let item of cursorElements) + for (let idx in cursorElements) { + var item = cursorElements[idx]; item.classList.add("move-cursor-enabled"); } } - else if (this._state === "ATTACK") + else if (this.#state === "ATTACK") { - for (let item of cursorElements) + for (let idx in cursorElements) { + var item = cursorElements[idx]; item.classList.add("attack-cursor-enabled"); } } - else if (this._state === "FORMATION") + else if (this.#state === "FORMATION") { - for (let item of cursorElements) + for (let idx in cursorElements) { + var item = cursorElements[idx]; item.classList.add("formation-cursor-enabled"); } } @@ -90,23 +108,23 @@ class Map getState() { - return this._state; + return this.#state; } /* Set the active coalition (for persistency) */ setActiveCoalition(coalition) { - this._activeCoalition = coalition; + this.#activeCoalition = coalition; } getActiveCoalition() { - return this._activeCoalition; + return this.#activeCoalition; } /* Event handlers */ // Right click - _onContextMenu(e) + #onContextMenu(e) { this.setState("IDLE"); unitsManager.deselectAllUnits(); @@ -114,15 +132,15 @@ class Map this.removeSelectionScroll(); } - _onClick(e) + #onClick(e) { this.removeSelectionWheel(); this.removeSelectionScroll(); - if (this._state === "IDLE") + if (this.#state === "IDLE") { } - else if (this._state === "MOVE_UNIT") + else if (this.#state === "MOVE_UNIT") { if (!e.originalEvent.ctrlKey) { @@ -132,81 +150,84 @@ class Map } } - _onDoubleClick(e) + #onDoubleClick(e) { - if (this._state == 'IDLE') + if (this.#state == 'IDLE') { var options = [ - {'tooltip': 'Air unit', 'src': 'spawnAir.png', 'callback': () => this._aircraftSpawnMenu(e)}, - {'tooltip': 'Ground unit', 'src': 'spawnGround.png', 'callback': () => this._groundUnitSpawnMenu(e)}, - {'tooltip': 'Smoke', 'src': 'spawnSmoke.png', 'callback': () => this._smokeSpawnMenu(e)}, - {'tooltip': 'Explosion', 'src': 'spawnExplosion.png', 'callback': () => this._explosionSpawnMenu(e)} + {'tooltip': 'Air unit', 'src': 'spawnAir.png', 'callback': () => this.#aircraftSpawnMenu(e)}, + {'tooltip': 'Ground unit', 'src': 'spawnGround.png', 'callback': () => this.#groundUnitSpawnMenu(e)}, + {'tooltip': 'Smoke', 'src': 'spawnSmoke.png', 'callback': () => this.#smokeSpawnMenu(e)}, + {'tooltip': 'Explosion', 'src': 'spawnExplosion.png', 'callback': () => this.#explosionSpawnMenu(e)} ] - this._selectionWheel = new SelectionWheel(e.originalEvent.x, e.originalEvent.y, options); + this.showSelectionWheel(e, options, true); } } + showSelectionWheel(e, options, coalition) + { + this.removeSelectionWheel(); + this.removeSelectionScroll(); + this.#selectionWheel = new SelectionWheel(e.originalEvent.x, e.originalEvent.y, options, coalition); + } + /* Selection wheel and selection scroll functions */ removeSelectionWheel() { - if (this._selectionWheel !== undefined) + if (this.#selectionWheel !== undefined) { - this._selectionWheel.remove(); - this._selectionWheel = undefined; + this.#selectionWheel.remove(); + this.#selectionWheel = undefined; } } removeSelectionScroll() { - if (this._selectionScroll !== undefined) + if (this.#selectionScroll !== undefined) { - this._selectionScroll.remove(); - this._selectionScroll = undefined; + this.#selectionScroll.remove(); + this.#selectionScroll = undefined; } } /* Show unit selection for air units */ spawnFromAirbase(e) { - this._selectAircraft(e); + this.#selectAircraft(e, undefined); } /* Spawn a new ground unit selection wheel */ - _aircraftSpawnMenu(e) + #aircraftSpawnMenu(e) { - this.removeSelectionWheel(); - this.removeSelectionScroll(); var options = [ - {'coalition': true, 'tooltip': 'CAP', 'src': 'spawnCAP.png', 'callback': () => this._selectAircraft(e, "CAP")}, - {'coalition': true, 'tooltip': 'CAS', 'src': 'spawnCAS.png', 'callback': () => this._selectAircraft(e, "CAS")}, - {'coalition': true, 'tooltip': 'Tanker', 'src': 'spawnTanker.png', 'callback': () => this._selectAircraft(e, "tanker")}, - {'coalition': true, 'tooltip': 'AWACS', 'src': 'spawnAWACS.png', 'callback': () => this._selectAircraft(e, "awacs")}, - {'coalition': true, 'tooltip': 'Strike', 'src': 'spawnStrike.png', 'callback': () => this._selectAircraft(e, "strike")}, - {'coalition': true, 'tooltip': 'Drone', 'src': 'spawnDrone.png', 'callback': () => this._selectAircraft(e, "drone")}, - {'coalition': true, 'tooltip': 'Transport', 'src': 'spawnTransport.png','callback': () => this._selectAircraft(e, "transport")}, + {'coalition': true, 'tooltip': 'CAP', 'src': 'spawnCAP.png', 'callback': () => this.#selectAircraft(e, "CAP")}, + {'coalition': true, 'tooltip': 'CAS', 'src': 'spawnCAS.png', 'callback': () => this.#selectAircraft(e, "CAS")}, + {'coalition': true, 'tooltip': 'Tanker', 'src': 'spawnTanker.png', 'callback': () => this.#selectAircraft(e, "tanker")}, + {'coalition': true, 'tooltip': 'AWACS', 'src': 'spawnAWACS.png', 'callback': () => this.#selectAircraft(e, "awacs")}, + {'coalition': true, 'tooltip': 'Strike', 'src': 'spawnStrike.png', 'callback': () => this.#selectAircraft(e, "strike")}, + {'coalition': true, 'tooltip': 'Drone', 'src': 'spawnDrone.png', 'callback': () => this.#selectAircraft(e, "drone")}, + {'coalition': true, 'tooltip': 'Transport', 'src': 'spawnTransport.png','callback': () => this.#selectAircraft(e, "transport")}, ] - this._selectionWheel = new SelectionWheel(e.originalEvent.x, e.originalEvent.y, options); + this.showSelectionWheel(e, options, true); } /* Spawn a new ground unit selection wheel */ - _groundUnitSpawnMenu(e) + #groundUnitSpawnMenu(e) { - this.removeSelectionWheel(); - this.removeSelectionScroll(); var options = [ - {'coalition': true, 'tooltip': 'Howitzer', 'src': 'spawnHowitzer.png', 'callback': () => this._selectGroundUnit(e, "Howitzers")}, - {'coalition': true, 'tooltip': 'SAM', 'src': 'spawnSAM.png', 'callback': () => this._selectGroundUnit(e, "SAM")}, - {'coalition': true, 'tooltip': 'IFV', 'src': 'spawnIFV.png', 'callback': () => this._selectGroundUnit(e, "IFV")}, - {'coalition': true, 'tooltip': 'Tank', 'src': 'spawnTank.png', 'callback': () => this._selectGroundUnit(e, "Tanks")}, - {'coalition': true, 'tooltip': 'MLRS', 'src': 'spawnMLRS.png', 'callback': () => this._selectGroundUnit(e, "MLRS")}, - {'coalition': true, 'tooltip': 'Radar', 'src': 'spawnRadar.png', 'callback': () => this._selectGroundUnit(e, "Radar")}, - {'coalition': true, 'tooltip': 'Unarmed', 'src': 'spawnUnarmed.png', 'callback': () => this._selectGroundUnit(e, "Unarmed")} + {'coalition': true, 'tooltip': 'Howitzer', 'src': 'spawnHowitzer.png', 'callback': () => this.#selectGroundUnit(e, "Howitzers")}, + {'coalition': true, 'tooltip': 'SAM', 'src': 'spawnSAM.png', 'callback': () => this.#selectGroundUnit(e, "SAM")}, + {'coalition': true, 'tooltip': 'IFV', 'src': 'spawnIFV.png', 'callback': () => this.#selectGroundUnit(e, "IFV")}, + {'coalition': true, 'tooltip': 'Tank', 'src': 'spawnTank.png', 'callback': () => this.#selectGroundUnit(e, "Tanks")}, + {'coalition': true, 'tooltip': 'MLRS', 'src': 'spawnMLRS.png', 'callback': () => this.#selectGroundUnit(e, "MLRS")}, + {'coalition': true, 'tooltip': 'Radar', 'src': 'spawnRadar.png', 'callback': () => this.#selectGroundUnit(e, "Radar")}, + {'coalition': true, 'tooltip': 'Unarmed', 'src': 'spawnUnarmed.png', 'callback': () => this.#selectGroundUnit(e, "Unarmed")} ] - this._selectionWheel = new SelectionWheel(e.originalEvent.x, e.originalEvent.y, options); + this.showSelectionWheel(e, options, true); } /* Spawn smoke selection wheel */ - _smokeSpawnMenu(e) + #smokeSpawnMenu(e) { this.removeSelectionWheel(); this.removeSelectionScroll(); @@ -217,36 +238,36 @@ class Map {'tooltip': 'Green smoke', 'src': 'spawnSmoke.png', 'callback': () => {this.removeSelectionWheel(); this.removeSelectionScroll(); spawnSmoke('green', e.latlng)}, 'tint': 'green'}, {'tooltip': 'Orange smoke', 'src': 'spawnSmoke.png', 'callback': () => {this.removeSelectionWheel(); this.removeSelectionScroll(); spawnSmoke('orange', e.latlng)}, 'tint': 'orange'}, ] - this._selectionWheel = new SelectionWheel(e.originalEvent.x, e.originalEvent.y, options); + this.showSelectionWheel(e, options, true); } /* Spawn an explosion selection wheel (TODO) */ - _explosionSpawnMenu(e) + #explosionSpawnMenu(e) { this.removeSelectionWheel(); this.removeSelectionScroll(); var options = [ ] - this._selectionWheel = new SelectionWheel(e.originalEvent.x, e.originalEvent.y, options); + this.showSelectionWheel(e, options, true); } /* Show unit selection for air units */ - _selectAircraft(e, group) + #selectAircraft(e, group) { this.removeSelectionWheel(); this.removeSelectionScroll(); var options = unitTypes.air[group]; options.sort(); - this._selectionScroll = new SelectionScroll(e.originalEvent.x, e.originalEvent.y, options, (unitType) => { + this.#selectionScroll = new SelectionScroll(e.originalEvent.x, e.originalEvent.y, options, (unitType) => { this.removeSelectionWheel(); this.removeSelectionScroll(); - this._unitSelectPayload(unitType, e); + this.#unitSelectPayload(unitType, e); }); } /* Show weapon selection for air units */ - _unitSelectPayload(unitType, e) + #unitSelectPayload(unitType, e) { this.removeSelectionWheel(); this.removeSelectionScroll(); @@ -255,29 +276,29 @@ class Map if (options != undefined && options.length > 0) { options.sort(); - this._selectionScroll = new SelectionScroll(e.originalEvent.x, e.originalEvent.y, options, (payloadName) => { + this.#selectionScroll = new SelectionScroll(e.originalEvent.x, e.originalEvent.y, options, (payloadName) => { this.removeSelectionWheel(); this.removeSelectionScroll(); - spawnAircraft(unitType, e.latlng, this._activeCoalition, payloadName, e.airbaseName); + spawnAircraft(unitType, e.latlng, this.#activeCoalition, payloadName, e.airbaseName); }); } else { - spawnAircraft(unitType, e.latlng, this._activeCoalition); + spawnAircraft(unitType, e.latlng, this.#activeCoalition); } } /* Show unit selection for ground units */ - _selectGroundUnit(e, group) + #selectGroundUnit(e, group) { this.removeSelectionWheel(); this.removeSelectionScroll(); var options = unitTypes.vehicles[group]; options.sort(); - this._selectionScroll = new SelectionScroll(e.originalEvent.x, e.originalEvent.y, options, (type) => { + this.#selectionScroll = new SelectionScroll(e.originalEvent.x, e.originalEvent.y, options, (type) => { this.removeSelectionWheel(); this.removeSelectionScroll(); - spawnGroundUnit(type, e.latlng, this._activeCoalition); + spawnGroundUnit(type, e.latlng, this.#activeCoalition); }); } } \ No newline at end of file diff --git a/www/src/Map/SelectionScroll.ts b/www/src/Map/SelectionScroll.ts new file mode 100644 index 00000000..dd807d79 --- /dev/null +++ b/www/src/Map/SelectionScroll.ts @@ -0,0 +1,48 @@ +export class SelectionScroll +{ + #x : number; + #y : number; + #options : any; // TODO declare interface + #container : HTMLElement; + + constructor(x, y, options, callback) + { + if (options.length > 1) + { + this.#x = x; + this.#y = y; + this.#options = options; + + /* Create the container of the scroll */ + this.#container = document.createElement("div"); + this.#container.id = 'selection-scroll-container'; + this.#container.style.left = this.#x + "px"; + this.#container.style.top = this.#y + "px"; + document.getElementById("map-container").appendChild(this.#container); + + for (let optionID in this.#options) + { + var node = document.createElement("div"); + node.classList.add("selection-scroll-element"); + node.appendChild(document.createTextNode(this.#options[optionID])); + this.#container.appendChild(node); + node.addEventListener('click', () => callback(this.#options[optionID])) + } + + window.setTimeout(() => this.#show(), 100); + } + } + + remove() + { + document.getElementById("map-container").removeChild(this.#container); + } + + #show() + { + this.#container.style.width = 220 + "px"; + this.#container.style.height = 220 + "px"; + this.#container.style.left = this.#x - 110 + "px"; + this.#container.style.top = this.#y - 110 + "px"; + } +} \ No newline at end of file diff --git a/www/src/Map/SelectionWheel.ts b/www/src/Map/SelectionWheel.ts new file mode 100644 index 00000000..0c5ad65a --- /dev/null +++ b/www/src/Map/SelectionWheel.ts @@ -0,0 +1,130 @@ +import { deg2rad } from 'Other/Utils.js' + +export class SelectionWheel +{ + #x : number; + #y : number; + #options : any; // TODO declare interface + #angularSize : number; + + #container : HTMLElement; + #wheel : HTMLElement; + #buttons : HTMLElement[]; + #switchLabel : HTMLLabelElement; + + constructor(x, y, options, coalition) + { + if (options.length > 1) + { + this.#x = x; + this.#y = y; + this.#options = options; + this.#angularSize = 360 / this.#options.length; + + /* Create the container of the wheel */ + this.#container = document.createElement("div"); + this.#container.id = 'selection-wheel-container'; + this.#container.style.left = this.#x + "px"; + this.#container.style.top = this.#y + "px"; + document.getElementById("map-container").appendChild(this.#container); + + /* Create the wheel itself */ + this.#wheel = document.createElement("div"); + this.#wheel.id = 'selection-wheel'; + this.#container.appendChild(this.#wheel); + + /* Create the buttons */ + this.#buttons = []; + for (let id in this.#options) + { + var button = document.createElement("div"); + button.classList.add("selection-wheel-button"); + button.style.left = this.#x - 25 + "px"; + button.style.top = this.#y - 25 + "px"; + button.addEventListener('click', (e) => this.#options[id].callback(e)); + this.#container.appendChild(button); + this.#buttons.push(button); + + var image = document.createElement("img"); + image.classList.add("selection-wheel-image"); + image.src = `img/buttons/${this.#options[id].src}` + image.title = this.#options[id].tooltip; + if ('tint' in this.#options[id]) + { + button.style.setProperty('background-color', this.#options[id].tint); + image.style.opacity = "0"; + } + button.appendChild(image); + } + + /* Show the coalition switch if requested */ + if (coalition) + { + this.#switchLabel = document.createElement("label"); + this.#switchLabel.classList.add("switch"); + this.#switchLabel.innerHTML = ` ` + this.#container.appendChild(this.#switchLabel); + document.getElementById("coalition-switch").addEventListener('change', (e) => this.#onSwitch(e)) + + if (map.getActiveCoalition() == "red") + { + document.documentElement.style.setProperty('--normal', getComputedStyle(this.#container).getPropertyValue("--red")); + (document.getElementById("coalition-switch")).checked = true; + } + else + { + document.documentElement.style.setProperty('--normal', getComputedStyle(this.#container).getPropertyValue("--blue")); + } + } + else + { + document.documentElement.style.setProperty('--normal', getComputedStyle(this.#container).getPropertyValue("--dark")); + } + + window.setTimeout(() => this.#show(), 100); + } + } + + remove() + { + if (this.#container != undefined) + { + this.#container.removeChild(this.#wheel); + document.getElementById("map-container").removeChild(this.#container); + } + } + + #show() + { + this.#container.style.width = 220 + "px"; + this.#container.style.height = 220 + "px"; + this.#container.style.left = this.#x - 110 + "px"; + this.#container.style.top = this.#y - 110 + "px"; + + var r = 80; + for (let id in this.#buttons) + { + var angle = parseInt(id) * this.#angularSize; + this.#buttons[id].style.opacity = "1"; + this.#buttons[id].style.left = this.#x + r * Math.sin(deg2rad(angle)) - 25 + "px"; + this.#buttons[id].style.top = this.#y - r * Math.cos(deg2rad(angle)) - 25 + "px"; + } + + if (this.#switchLabel != undefined) + { + this.#switchLabel.style.opacity = "1"; + } + } + + #onSwitch(e) + { + if (e.currentTarget.checked) { + document.documentElement.style.setProperty('--normal', getComputedStyle(this.#container).getPropertyValue("--red")); + map.setActiveCoalition("red"); + } else { + document.documentElement.style.setProperty('--normal', getComputedStyle(this.#container).getPropertyValue("--blue")); + map.setActiveCoalition("blue"); + } + } +} + diff --git a/www/js/Other/AirbaseMarker.js b/www/src/Other/AirbaseMarker.js similarity index 100% rename from www/js/Other/AirbaseMarker.js rename to www/src/Other/AirbaseMarker.js diff --git a/www/src/Other/MissionData.ts b/www/src/Other/MissionData.ts new file mode 100644 index 00000000..5cb810fc --- /dev/null +++ b/www/src/Other/MissionData.ts @@ -0,0 +1,77 @@ +import { Marker, LatLng } from "leaflet"; + +export class MissionData +{ + #bullseye : any; //TODO declare interface + #bullseyeMarker : Marker; + #airbasesMarkers: {[name: string]: Marker}; + #unitsData : any; //TODO declare interface + #airbases : any; //TODO declare interface + + constructor() + { + this.#bullseye = undefined; + this.#bullseyeMarker = undefined; + this.#airbasesMarkers = {}; + } + + update(data) + { + this.#bullseye = data.missionData.bullseye; + this.#unitsData = data.missionData.unitsData; + this.#airbases = data.missionData.airbases; + this.#drawBullseye(); + this.#drawAirbases(); + } + + getUnitData(ID) + { + if (ID in this.#unitsData) + { + return this.#unitsData[ID]; + } + else + { + return undefined; + } + } + + #drawBullseye() + { + if (this.#bullseyeMarker === undefined) + { + this.#bullseyeMarker = new Marker([this.#bullseye.lat, this.#bullseye.lng]).addTo(map.getMap()); + } + else + { + this.#bullseyeMarker.setLatLng(new LatLng(this.#bullseye.lat, this.#bullseye.lng)); + } + } + + #drawAirbases() + { + for (let idx in this.#airbases) + { + var airbase = this.#airbases[idx] + if (this.#airbasesMarkers[idx] === undefined) + { + // @ts-ignore TODO: find a good way to extend markers in typescript + this.#airbasesMarkers[idx] = new L.Marker.AirbaseMarker(new L.LatLng(airbase.lat, airbase.lng), {name: airbase.callsign}).addTo(map.getMap()); + this.#airbasesMarkers[idx].on('click', (e) => this.#onAirbaseClick(e)); + } + else + { + // @ts-ignore TODO: find a good way to extend markers in typescript + this.#airbasesMarkers[idx].setCoalitionID(airbase.coalition); + this.#airbasesMarkers[idx].setLatLng(new LatLng(airbase.lat, airbase.lng)); + } + } + } + + #onAirbaseClick(e) + { + e.airbaseName = e.sourceTarget.options.name; + e.coalitionID = e.sourceTarget.coalitionID; + map.spawnFromAirbase(e); + } +} \ No newline at end of file diff --git a/www/js/Other/Utils.js b/www/src/Other/Utils.ts similarity index 53% rename from www/js/Other/Utils.js rename to www/src/Other/Utils.ts index 76fcf07b..acf4cf5c 100644 --- a/www/js/Other/Utils.js +++ b/www/src/Other/Utils.ts @@ -1,4 +1,4 @@ -function distance(lat1, lon1, lat2, lon2) +export function distance(lat1, lon1, lat2, lon2) { const R = 6371e3; // metres const φ1 = deg2rad(lat1); // φ, λ in radians @@ -14,7 +14,7 @@ function distance(lat1, lon1, lat2, lon2) return d; } -function bearing(lat1, lon1, lat2, lon2) +export function bearing(lat1, lon1, lat2, lon2) { const φ1 = deg2rad(lat1); // φ, λ in radians const φ2 = deg2rad(lat2); @@ -28,49 +28,9 @@ function bearing(lat1, lon1, lat2, lon2) return brng; } -function latlng2xy(lat, lon) -{ - const latBulls = missionData.bullseye.lat; - const lonBulls = missionData.bullseye.lng; - const d = distance(latBulls, lonBulls, lat, lon); - const brng = bearing(latBulls, lonBulls, lat, lon); - const x = d * Math.cos(deg2rad(brng)); - const y = d * Math.sin(deg2rad(brng)); - - xy = {}; - xy.x = x; - xy.y = y; - - return xy; -} - -function xy2latlng(x, y) -{ - const xBulls = missionData.bullseye.x; - const yBulls = missionData.bullseye.y; - const latBulls = missionData.bullseye.lat; - const lonBulls = missionData.bullseye.lng; - - const R = 6371e3; // metres - const φ1 = deg2rad(latBulls); // φ, λ in radians - const λ1 = deg2rad(lonBulls); // φ, λ in radians - - const d = Math.sqrt(Math.pow(x - xBulls, 2) + Math.pow(y - yBulls, 2)); - const brng = -rad2deg(Math.atan2(y - yBulls, x - xBulls)); - - const φ2 = Math.asin(Math.sin(φ1)*Math.cos(d/R) + Math.cos(φ1)*Math.sin(d/R)*Math.cos(brng)); - const λ2 = λ1 + Math.atan2(Math.sin(brng)*Math.sin(d/R)*Math.cos(φ1), Math.cos(d/R)-Math.sin(φ1)*Math.sin(φ2)); - - latlng = {}; - latlng.lat = rad2deg(φ2); - latlng.lng = rad2deg(λ2); - - return latlng; -} - const zeroPad = (num, places) => String(num).padStart(places, '0') -function ConvertDDToDMS(D, lng) +export function ConvertDDToDMS(D, lng) { var dir = D < 0 ? (lng ? "W" : "S") : lng ? "E" : "N"; var deg = 0 | (D < 0 ? (D = -D) : D); @@ -84,13 +44,13 @@ function ConvertDDToDMS(D, lng) return dir + zeroPad(deg, 2) + "°" + zeroPad(min, 2) + "'" + zeroPad(sec, 2) + "." + zeroPad(dec, 2) + "\""; } -function deg2rad(deg) +export function deg2rad(deg) { var pi = Math.PI; return deg * (pi/180); } -function rad2deg(rad) +export function rad2deg(rad) { var pi = Math.PI; return rad / (pi/180); diff --git a/www/js/Panels/FormationControlPanel.js b/www/src/Panels/FormationControlPanel.ts similarity index 60% rename from www/js/Panels/FormationControlPanel.js rename to www/src/Panels/FormationControlPanel.ts index 922fe07c..33e0fdd4 100644 --- a/www/js/Panels/FormationControlPanel.js +++ b/www/src/Panels/FormationControlPanel.ts @@ -1,10 +1,14 @@ -class FormationControlPanel +export class FormationControlPanel { + #panel : HTMLElement; + #formations : string[]; + #editing : boolean; + constructor(id) { - this._panel = document.getElementById(id); + this.#panel = document.getElementById(id); - this._formations = ["", "Echelon", "Line abreast", "Box", "Trail", "Finger tip", "Tactical line abreast", "Fluid four", "Spread four"]; + this.#formations = ["", "Echelon", "Line abreast", "Box", "Trail", "Finger tip", "Tactical line abreast", "Fluid four", "Spread four"]; } update(selectedUnits) @@ -12,24 +16,24 @@ class FormationControlPanel if (selectedUnits.length == 1) { // Don't update if user is editing - if (selectedUnits[0].leader && !this._editing) + if (selectedUnits[0].leader && !this.#editing) { - this._panel.style.bottom = "15px"; - this._showFormationControls(selectedUnits[0]); + this.#panel.style.bottom = "15px"; + this.#showFormationControls(selectedUnits[0]); } } else { - this._panel.style.bottom = (-this._panel.offsetHeight - 2) + "px"; - this._showFormationControls(); // Empty, cleans the panel + this.#panel.style.bottom = (-this.#panel.offsetHeight - 2) + "px"; + this.#showFormationControls(undefined); // Empty, cleans the panel } } - _showFormationControls(selectedUnit) + #showFormationControls(selectedUnit) { if (selectedUnit !== undefined) { - this._panel.innerHTML = ` + this.#panel.innerHTML = `
@@ -57,24 +61,24 @@ class FormationControlPanel `; - var select = document.getElementById("formation-type-select"); - for(var i = 0; i < this._formations.length; i++) { - var opt = this._formations[i]; + var select: HTMLSelectElement = document.getElementById("formation-type-select"); + for(var i = 0; i < this.#formations.length; i++) { + var opt = this.#formations[i]; var el = document.createElement("option"); el.textContent = opt; el.value = opt; select.appendChild(el); } - select.addEventListener("focus", () => this._editing = true) - select.addEventListener("blur", () => this._editing = false) - object.addEventListener("change", () => leader.setformation()); + select.addEventListener("focus", () => this.#editing = true) + select.addEventListener("blur", () => this.#editing = false) + //select.addEventListener("change", () => leader.setformation()); select.value = selectedUnit.formation; } else { - this._panel.innerHTML = ``; + this.#panel.innerHTML = ``; } } } diff --git a/www/src/Panels/PanelButton.ts b/www/src/Panels/PanelButton.ts new file mode 100644 index 00000000..1e838341 --- /dev/null +++ b/www/src/Panels/PanelButton.ts @@ -0,0 +1,87 @@ +export class PanelButton +{ + #div : HTMLElement; + #enabled : boolean; + #callbacks : any[]; // TODO how to set type callables? + #baseIconHTML : string; + + constructor(parent, icon, tooltip) + { + this.#div = document.createElement("div"); + this.setIcon(icon, tooltip); + this.setSlashed(false); + + this.#div.classList.add("panel-button"); + parent.appendChild(this.#div); + + this.setEnabled(true); + + this.#div.onclick = () => this.#onClick(); + this.#callbacks = []; + } + + setEnabled(enabled) + { + this.#enabled = enabled; + if (enabled) + { + this.#div.classList.remove("panel-button-disabled"); + } + else + { + this.#div.classList.add("panel-button-disabled"); + } + } + + addCallback(callback) + { + this.#callbacks.push(callback); + } + + clearCallbacks() + { + this.#callbacks = []; + } + + setIcon(icon, tooltip) + { + if (icon.includes("png")) + { + this.#baseIconHTML = ``; + } + else + { + this.#baseIconHTML = ``; + } + this.#div.innerHTML = this.#baseIconHTML; + } + + setSubicon(subicon) + { + this.#baseIconHTML = `
${this.#baseIconHTML}
`; + this.#div.innerHTML = this.#baseIconHTML; + } + + setSlashed(slashed) + { + if (slashed) + { + this.#div.innerHTML = `
${this.#baseIconHTML}
`; + } + else + { + this.#div.innerHTML = this.#baseIconHTML; + } + } + + #onClick() + { + if (this.#enabled) + { + for (let callback in this.#callbacks) + { + this.#callbacks[callback](); + } + } + } +} \ No newline at end of file diff --git a/www/src/Panels/SettingsPanel.ts b/www/src/Panels/SettingsPanel.ts new file mode 100644 index 00000000..b3a6eb64 --- /dev/null +++ b/www/src/Panels/SettingsPanel.ts @@ -0,0 +1,106 @@ +import { PanelButton } from "./PanelButton.js"; + +export class SettingsPanel +{ + #panel : HTMLElement; + + #humanIcon : string; + #AIIcon : string; + #weaponsIcon : string; + #labelsIcon : string; + #deadIcon : string; + + #humanButton : PanelButton; + #AIButton : PanelButton; + #weaponsButton : PanelButton; + #deadAliveButton : PanelButton; + + #human : string; + #AI : string; + #weapons : string; + #deadAlive : string; + + constructor(id) + { + this.#panel = document.getElementById(id); + + /* Create all buttons, disabled by default */ + this.#humanIcon = "fa-user"; + this.#AIIcon = "fa-desktop"; + this.#weaponsIcon = "fa-bomb"; + this.#labelsIcon = "fa-font"; + this.#deadIcon = "fa-skull"; + + this.#humanButton = new PanelButton(this.#panel, this.#humanIcon, "Player visibility"); + this.#AIButton = new PanelButton(this.#panel, this.#AIIcon, "AI visibility"); + this.#weaponsButton = new PanelButton(this.#panel, this.#weaponsIcon, "Weapons visibility"); + this.#deadAliveButton = new PanelButton(this.#panel, this.#deadIcon, "Dead units visibility"); + + this.#humanButton.addCallback(() => this.#onHumanButton()); + this.#AIButton.addCallback(() => this.#onAIButton()); + this.#weaponsButton.addCallback(() => this.#onWeaponsButton()); + this.#deadAliveButton.addCallback(() => this.#cycleDeadAlive()); + + this.#human = "labels"; + this.#humanButton.setSubicon(this.#labelsIcon); + this.#AI = "marker"; + this.#weapons = "marker"; + this.#deadAlive = "both"; + } + + getSettings() + { + return {'human': this.#human, 'AI': this.#AI, 'weapons': this.#weapons, 'deadAlive': this.#deadAlive} + } + + #onHumanButton() + { + this.#human = this.#cycleVisibility(this.#humanButton, this.#human, this.#humanIcon); + } + + #onAIButton() + { + this.#AI = this.#cycleVisibility(this.#AIButton, this.#AI, this.#AIIcon); + } + + #onWeaponsButton() + { + this.#weapons = this.#cycleVisibility(this.#weaponsButton, this.#weapons, this.#weaponsIcon); + } + + #cycleVisibility(button, variable, icon) + { + if (variable === "labels") + { + variable = "marker"; + button.setIcon(icon); + button.setSlashed(false); + } + else if (variable === "marker") + { + variable = "none"; + button.setSlashed(true); + } + else + { + variable = "labels"; + button.setSubicon(this.#labelsIcon); + button.setSlashed(false); + } + return variable; + } + + #cycleDeadAlive() + { + if (this.#deadAlive === "both") + { + this.#deadAlive = "alive"; + this.#deadAliveButton.setSlashed(true); + } + else + { + this.#deadAlive = "both"; + this.#deadAliveButton.setSlashed(false); + } + } +} diff --git a/www/src/Panels/UnitControlPanel.ts b/www/src/Panels/UnitControlPanel.ts new file mode 100644 index 00000000..823ef85d --- /dev/null +++ b/www/src/Panels/UnitControlPanel.ts @@ -0,0 +1,43 @@ +import { PanelButton } from "./PanelButton.js"; + +export class UnitControlPanel +{ + #panel : HTMLElement; + #slowButton : PanelButton; + #fastButton : PanelButton; + #descendButton : PanelButton; + #climbButton : PanelButton; + + constructor(id) + { + this.#panel = document.getElementById(id); + + /* Create all buttons, disabled by default */ + //this.#moveButton = new PanelButton(this.#panel, "fa-play"); + //this.#stopButton = new PanelButton(this.#panel, "fa-pause"); + this.#slowButton = new PanelButton(this.#panel, "fa-angle-right", "Decelerate"); + this.#fastButton = new PanelButton(this.#panel, "fa-angle-double-right", "Accelerate"); + this.#descendButton = new PanelButton(this.#panel, "fa-arrow-down", "Descend"); + this.#climbButton = new PanelButton(this.#panel, "fa-arrow-up", "Climb"); + //this.#repeatButton = new PanelButton(this.#panel, "fa-undo"); + + this.setEnabled(false); + + //this.#moveButton.addCallback(unitsManager.selectedUnitsMove); + //this.#stopButton.addCallback(() => unitsManager.selectedUnitsChangeSpeed('stop')); + this.#slowButton.addCallback(() => unitsManager.selectedUnitsChangeSpeed('slow')); + this.#fastButton.addCallback(() => unitsManager.selectedUnitsChangeSpeed('fast')); + this.#descendButton.addCallback(() => unitsManager.selectedUnitsChangeAltitude('descend')); + this.#climbButton.addCallback(() => unitsManager.selectedUnitsChangeAltitude('climb')); + } + + setEnabled(enabled) + { + //this.#moveButton.setEnabled(true); + //this.#stopButton.setEnabled(true); + this.#slowButton.setEnabled(enabled); + this.#fastButton.setEnabled(enabled); + this.#descendButton.setEnabled(enabled); + this.#climbButton.setEnabled(enabled); + } +} diff --git a/www/js/Panels/UnitInfoPanel.js b/www/src/Panels/UnitInfoPanel.ts similarity index 89% rename from www/js/Panels/UnitInfoPanel.js rename to www/src/Panels/UnitInfoPanel.ts index 20f46ed2..7d158f1c 100644 --- a/www/js/Panels/UnitInfoPanel.js +++ b/www/src/Panels/UnitInfoPanel.ts @@ -1,25 +1,29 @@ -class UnitInfoPanel +import { ConvertDDToDMS, rad2deg } from 'Other/Utils.js' + +export class UnitInfoPanel { + #panel: HTMLElement; + constructor(id) { - this._panel = document.getElementById(id); + this.#panel = document.getElementById(id); } update(selectedUnits) { if (selectedUnits.length == 1) { - this._panel.style.bottom = "15px"; - this._showUnitData(selectedUnits[0]); + this.#panel.style.bottom = "15px"; + this.#showUnitData(selectedUnits[0]); } else { - this._panel.style.bottom = (-this._panel.offsetHeight - 2) + "px"; - this._showUnitData(); // Empty, cleans the panel + this.#panel.style.bottom = (-this.#panel.offsetHeight - 2) + "px"; + this.#showUnitData(undefined); // Empty, cleans the panel } } - _showUnitData(selectedUnit) + #showUnitData(selectedUnit) { if (selectedUnit !== undefined) { @@ -39,7 +43,7 @@ class UnitInfoPanel } } - this._panel.innerHTML = ` + this.#panel.innerHTML = `
@@ -135,7 +139,7 @@ class UnitInfoPanel } else { - this._panel.innerHTML = ``; + this.#panel.innerHTML = ``; } } } \ No newline at end of file diff --git a/www/js/Units/Unit.js b/www/src/Units/Unit.ts similarity index 65% rename from www/js/Units/Unit.js rename to www/src/Units/Unit.ts index 7729304b..2897286a 100644 --- a/www/js/Units/Unit.js +++ b/www/src/Units/Unit.ts @@ -1,26 +1,59 @@ -class Unit +import { Marker, LatLng, Polyline } from 'leaflet'; +import { ConvertDDToDMS } from 'Other/Utils.js' +import { showMessage } from 'index.js' +import { attackUnit } from 'DCS/DCSCommands.js' + +export class Unit { + ID : number; + selectable : boolean; + // @ts-ignore TODO: find a good way to extend markers in typescript + marker : L.Marker.UnitMarker; + leader : boolean; + wingman : boolean; + wingmen : Unit[]; + formation : string; + name : string; + unitName : string; + groupName : string; + latitude : number; + longitude : number; + altitude : number; + heading : number; + coalitionID : number; + alive : boolean; + speed : number; + currentTask : string; + type : JSON; + flags : JSON; + activePath : JSON; + missionData : JSON; + + #selected : boolean; + #preventClick : boolean; + #pathMarkers : Marker[]; + #pathPolyline : Polyline; + #targetsPolylines : Polyline[]; + #timer : number; + constructor(ID, marker) { this.ID = ID; this.selectable = true; - // The marker is set by the inherited class this.marker = marker; - this.marker.on('click', (e) => this.onClick(e)); - - this._selected = false; - - this._pathMarkers = []; - - this._pathPolyline = new L.Polyline([], {color: '#2d3e50', weight: 3, opacity: 0.5, smoothFactor: 1}); - this._pathPolyline.addTo(map.getMap()); - - this._targetsPolylines = []; - + this.marker.on('click', (e) => this.#onClick(e)); + this.marker.on('dblclick', (e) => this.#onDoubleClick(e)); this.leader = true; this.wingmen = []; this.formation = undefined; + + this.#selected = false; + this.#preventClick = false; + this.#pathMarkers = []; + this.#pathPolyline = new Polyline([], {color: '#2d3e50', weight: 3, opacity: 0.5, smoothFactor: 1}); + this.#pathPolyline.addTo(map.getMap()); + this.#targetsPolylines = []; } update(response) @@ -55,8 +88,8 @@ class Unit this.missionData = missionData.getUnitData(this.ID) - this.setSelected(this.getSelected() & this.alive) - this.drawMarker(); + this.setSelected(this.getSelected() && this.alive) + this.drawMarker({}); if (this.getSelected() && this.activePath != undefined) { this.drawPath(); @@ -80,9 +113,9 @@ class Unit setSelected(selected) { // Only alive units can be selected. Some units are not selectable (weapons) - if ((this.alive || !selected) && this.selectable && this._selected != selected) + if ((this.alive || !selected) && this.selectable && this.#selected != selected) { - this._selected = selected; + this.#selected = selected; this.marker.setSelected(selected); unitsManager.onUnitSelection(); } @@ -90,7 +123,7 @@ class Unit getSelected() { - return this._selected; + return this.#selected; } addDestination(latlng) @@ -127,24 +160,40 @@ class Unit this.activePath = undefined; } - onClick(e) + #onClick(e) { - if (map.getState() === 'IDLE' || map.getState() === 'MOVE_UNIT' || e.originalEvent.ctrlKey) - { - if (!e.originalEvent.ctrlKey) - { - unitsManager.deselectAllUnits(); + this.#timer = setTimeout(() => { + if (!this.#preventClick) { + if (map.getState() === 'IDLE' || map.getState() === 'MOVE_UNIT' || e.originalEvent.ctrlKey) + { + if (!e.originalEvent.ctrlKey) + { + unitsManager.deselectAllUnits(); + } + this.setSelected(true); + } } - this.setSelected(true); - } - else if (map.getState() === 'ATTACK') + this.#preventClick = false; + }, 200); + } + + #onDoubleClick(e) + { + clearTimeout(this.#timer); + this.#preventClick = true; + + var options = [ + {'tooltip': 'Attack', 'src': 'attack.png', 'callback': () => {map.removeSelectionWheel(); unitsManager.attackUnit(this.ID);}}, + {'tooltip': 'Go to tanker', 'src': 'tanker.png', 'callback': () => {map.removeSelectionWheel(); showMessage("Function not implemented yet");}}, + {'tooltip': 'RTB', 'src': 'rtb.png', 'callback': () => {map.removeSelectionWheel(); showMessage("Function not implemented yet");}} + ] + + if (!this.leader && !this.wingman) { - unitsManager.attackUnit(this.ID); - } - else if (map.getState() === 'FORMATION') - { - unitsManager.createFormation(this.ID); + options.push({'tooltip': 'Create formation', 'src': 'formation.png', 'callback': () => {map.removeSelectionWheel(); unitsManager.createFormation(this.ID);}}); } + + map.showSelectionWheel(e, options, false); } drawMarker(settings) @@ -170,7 +219,7 @@ class Unit // Draw the marker var zIndex = this.marker.getZIndex(); - var newLatLng = new L.LatLng(this.latitude, this.longitude); + var newLatLng = new LatLng(this.latitude, this.longitude); this.marker.setLatLng(newLatLng); this.marker.setAngle(this.heading); this.marker.setZIndex(zIndex); @@ -183,53 +232,53 @@ class Unit drawPath() { var _points = []; - _points.push(new L.LatLng(this.latitude, this.longitude)); + _points.push(new LatLng(this.latitude, this.longitude)); // Add markers if missing - while (this._pathMarkers.length < Object.keys(this.activePath).length) + while (this.#pathMarkers.length < Object.keys(this.activePath).length) { - var marker = L.marker([0, 0]).addTo(map.getMap()); - this._pathMarkers.push(marker); + var marker = new Marker([0, 0]).addTo(map.getMap()); + this.#pathMarkers.push(marker); } // Remove markers if too many - while (this._pathMarkers.length > Object.keys(this.activePath).length) + while (this.#pathMarkers.length > Object.keys(this.activePath).length) { - map.getMap().removeLayer(this._pathMarkers[this._pathMarkers.length - 1]); - this._pathMarkers.splice(this._pathMarkers.length - 1, 1) + map.getMap().removeLayer(this.#pathMarkers[this.#pathMarkers.length - 1]); + this.#pathMarkers.splice(this.#pathMarkers.length - 1, 1) } // Update the position of the existing markers (to avoid creating markers uselessly) for (let WP in this.activePath) { var destination = this.activePath[WP]; - this._pathMarkers[parseInt(WP) - 1].setLatLng([destination.lat, destination.lng]); - _points.push(new L.LatLng(destination.lat, destination.lng)); - this._pathPolyline.setLatLngs(_points); + this.#pathMarkers[parseInt(WP) - 1].setLatLng([destination.lat, destination.lng]); + _points.push(new LatLng(destination.lat, destination.lng)); + this.#pathPolyline.setLatLngs(_points); } } clearPath() { - for (let WP in this._pathMarkers) + for (let WP in this.#pathMarkers) { - map.getMap().removeLayer(this._pathMarkers[WP]); + map.getMap().removeLayer(this.#pathMarkers[WP]); } - this._pathMarkers = []; - this._pathPolyline.setLatLngs([]); + this.#pathMarkers = []; + this.#pathPolyline.setLatLngs([]); } drawTargets() { - for (let typeIndex in this.missionData.targets) + for (let typeIndex in this.missionData['targets']) { - for (let index in this.missionData.targets[typeIndex]) + for (let index in this.missionData['targets'][typeIndex]) { - var targetData = this.missionData.targets[typeIndex][index]; + var targetData = this.missionData['targets'][typeIndex][index]; var target = unitsManager.getUnitByID(targetData.object["id_"]) if (target != undefined){ - var startLatLng = new L.LatLng(this.latitude, this.longitude) - var endLatLng = new L.LatLng(target.latitude, target.longitude) + var startLatLng = new LatLng(this.latitude, this.longitude) + var endLatLng = new LatLng(target.latitude, target.longitude) var color; if (typeIndex === "radar") @@ -248,9 +297,9 @@ class Unit { color = "#FFFFFF"; } - var targetPolyline = new L.Polyline([startLatLng, endLatLng], {color: color, weight: 3, opacity: 1, smoothFactor: 1}); + var targetPolyline = new Polyline([startLatLng, endLatLng], {color: color, weight: 3, opacity: 1, smoothFactor: 1}); targetPolyline.addTo(map.getMap()); - this._targetsPolylines.push(targetPolyline) + this.#targetsPolylines.push(targetPolyline) } } } @@ -258,9 +307,9 @@ class Unit clearTargets() { - for (let index in this._targetsPolylines) + for (let index in this.#targetsPolylines) { - map.getMap().removeLayer(this._targetsPolylines[index]) + map.getMap().removeLayer(this.#targetsPolylines[index]) } } @@ -303,7 +352,7 @@ class Unit xhr.setRequestHeader("Content-Type", "application/json"); xhr.onreadystatechange = () => { if (xhr.readyState === 4) { - console.log(this.unitName + " altitude change request: " + speedChange); + console.log(this.unitName + " altitude change request: " + altitudeChange); } }; @@ -350,11 +399,11 @@ class Unit } } -class AirUnit extends Unit +export class AirUnit extends Unit { drawMarker() { - if (this.flags.Human) + if (this.flags['Human']) { super.drawMarker(settingsPanel.getSettings().human); } @@ -365,10 +414,11 @@ class AirUnit extends Unit } } -class Aircraft extends AirUnit +export class Aircraft extends AirUnit { constructor(ID, data) { + // @ts-ignore TODO: find a good way to extend markers in typescript var marker = new L.Marker.UnitMarker.AirUnitMarker.AircraftMarker({ riseOnHover: true, unitName: data.unitName, @@ -380,10 +430,11 @@ class Aircraft extends AirUnit } } -class Helicopter extends AirUnit +export class Helicopter extends AirUnit { constructor(ID, data) { + // @ts-ignore TODO: find a good way to extend markers in typescript var marker = new L.Marker.UnitMarker.AirUnitMarker.HelicopterMarker({ riseOnHover: true, unitName: data.unitName, @@ -395,10 +446,11 @@ class Helicopter extends AirUnit } } -class GroundUnit extends Unit +export class GroundUnit extends Unit { constructor(ID, data) { + // @ts-ignore TODO: find a good way to extend markers in typescript var marker = new L.Marker.UnitMarker.GroundMarker({ riseOnHover: true, unitName: data.unitName, @@ -415,10 +467,11 @@ class GroundUnit extends Unit } } -class NavyUnit extends Unit +export class NavyUnit extends Unit { constructor(ID, data) { + // @ts-ignore TODO: find a good way to extend markers in typescript var marker = new L.Marker.UnitMarker.NavyMarker({ riseOnHover: true, unitName: data.unitName, @@ -435,7 +488,7 @@ class NavyUnit extends Unit } } -class Weapon extends Unit +export class Weapon extends Unit { constructor(ID, data) { @@ -449,16 +502,17 @@ class Weapon extends Unit super.drawMarker(settingsPanel.getSettings().weapons); } - onClick(e) + #onClick(e) { // Weapons can not be clicked } } -class Missile extends Weapon +export class Missile extends Weapon { constructor(ID, data) { + // @ts-ignore TODO: find a good way to extend markers in typescript var marker = new L.Marker.UnitMarker.WeaponMarker.MissileMarker({ riseOnHover: true, unitName: "", @@ -470,10 +524,11 @@ class Missile extends Weapon } } -class Bomb extends Weapon +export class Bomb extends Weapon { constructor(ID, data) { + // @ts-ignore TODO: find a good way to extend markers in typescript var marker = new L.Marker.UnitMarker.WeaponMarker.BombMarker({ riseOnHover: true, unitName: "", diff --git a/www/js/Units/UnitMarker.js b/www/src/Units/UnitMarker.js similarity index 100% rename from www/js/Units/UnitMarker.js rename to www/src/Units/UnitMarker.js diff --git a/www/js/Units/UnitsManager.js b/www/src/Units/UnitsManager.ts similarity index 65% rename from www/js/Units/UnitsManager.js rename to www/src/Units/UnitsManager.ts index 4be0e428..8ed02072 100644 --- a/www/js/Units/UnitsManager.js +++ b/www/src/Units/UnitsManager.ts @@ -1,9 +1,17 @@ -class UnitsManager +import { Unit } from 'Unit.js' +import { LatLng } from 'leaflet'; +import { cloneUnit } from 'DCS/DCSCommands.js' +import { showMessage } from 'index.js'; + +export class UnitsManager { + #units: { [ID: number]: Unit}; + #copiedUnits: Unit[]; + constructor() { - this._units = {}; - this._copiedUnits = []; + this.#units = {}; + this.#copiedUnits = []; } addUnit(ID, data) @@ -12,13 +20,13 @@ class UnitsManager var constructor = eval(data.category); if (constructor != undefined) { - this._units[ID] = new constructor(ID, data); + this.#units[ID] = new constructor(ID, data); } } getUnitByID(ID) { - return this._units[ID]; + return this.#units[ID]; } removeUnit(ID) @@ -28,9 +36,9 @@ class UnitsManager deselectAllUnits() { - for (let ID in this._units) + for (let ID in this.#units) { - this._units[ID].setSelected(false); + this.#units[ID].setSelected(false); } } @@ -39,11 +47,11 @@ class UnitsManager for (let ID in data["units"]) { // Create the unit if missing from the local array, then update the data. Drawing is handled by leaflet. - if (!(ID in this._units)) + if (!(ID in this.#units)) { this.addUnit(parseInt(ID), data["units"][ID]); } - this._units[ID].update(data["units"][ID]); + this.#units[ID].update(data["units"][ID]); } } @@ -53,25 +61,23 @@ class UnitsManager { map.setState("MOVE_UNIT"); unitControlPanel.setEnabled(true); - actionPanel.setEnabled(true); } else { map.setState("IDLE"); unitControlPanel.setEnabled(false); - actionPanel.setEnabled(false); } } selectFromBounds(bounds) { this.deselectAllUnits(); - for (let ID in this._units) + for (let ID in this.#units) { - var latlng = new L.LatLng(this._units[ID].latitude, this._units[ID].longitude); + var latlng = new LatLng(this.#units[ID].latitude, this.#units[ID].longitude); if (bounds.contains(latlng)) { - this._units[ID].setSelected(true); + this.#units[ID].setSelected(true); } } } @@ -79,11 +85,11 @@ class UnitsManager getSelectedUnits() { var selectedUnits = []; - for (let ID in this._units) + for (let ID in this.#units) { - if (this._units[ID].getSelected()) + if (this.#units[ID].getSelected()) { - selectedUnits.push(this._units[ID]); + selectedUnits.push(this.#units[ID]); } } return selectedUnits; @@ -94,7 +100,12 @@ class UnitsManager var selectedUnits = this.getSelectedUnits(); for (let idx in selectedUnits) { - selectedUnits[idx].addDestination(latlng); + var commandedUnit = selectedUnits[idx]; + if (selectedUnits[idx].wingman) + { + commandedUnit = this.getLeader(selectedUnits[idx].ID); + } + commandedUnit.addDestination(latlng); } } @@ -103,7 +114,12 @@ class UnitsManager var selectedUnits = this.getSelectedUnits(); for (let idx in selectedUnits) { - selectedUnits[idx].clearDestinations(); + var commandedUnit = selectedUnits[idx]; + if (selectedUnits[idx].wingman) + { + commandedUnit = this.getLeader(selectedUnits[idx].ID); + } + commandedUnit.clearDestinations(); } } @@ -144,14 +160,14 @@ class UnitsManager copyUnits() { - this._copiedUnits = this.getSelectedUnits(); + this.#copiedUnits = this.getSelectedUnits(); } pasteUnits() { - for (let idx in this._copiedUnits) + for (let idx in this.#copiedUnits) { - var unit = this._copiedUnits[idx]; + var unit = this.#copiedUnits[idx]; cloneUnit(unit.ID); } } @@ -161,7 +177,13 @@ class UnitsManager var selectedUnits = this.getSelectedUnits(); for (let idx in selectedUnits) { - selectedUnits[idx].attackUnit(ID); + // If a unit is a wingman, send the command to its leader + var commandedUnit = selectedUnits[idx]; + if (selectedUnits[idx].wingman) + { + commandedUnit = this.getLeader(selectedUnits[idx].ID); + } + commandedUnit.attackUnit(ID); } } @@ -183,10 +205,12 @@ class UnitsManager } else { + /* TODO if (selectedUnits[idx].category !== this.getUnitByID(ID).category) { showMessage("All units must be of the same category to create a formation."); } + */ if (selectedUnits[idx].ID != ID) { wingmenIDs.push(selectedUnits[idx].ID); @@ -203,28 +227,19 @@ class UnitsManager } } - getUnitsByFormationID(formationID) + getLeader(ID) { - var formationUnits = []; - for (let ID in this._units) - { - if (this._units[ID].formationID == formationID) - { - formationUnits.push(this._units[ID]); - } - } - return formationUnits; - } - - getLeaderByFormationID(formationID) - { - var formationUnits = this.getUnitsByFormationID(formationID); - for (let unit of formationUnits) + for (let idx in this.#units) { + var unit = this.#units[idx]; if (unit.leader) { - return unit; + if (unit.wingmen.includes(this.getUnitByID(ID))) + { + return unit; + } } } + showMessage("Error: no leader found for this unit") } } \ No newline at end of file diff --git a/www/js/Units/unitTypes.js b/www/src/Units/unitTypes.ts similarity index 99% rename from www/js/Units/unitTypes.js rename to www/src/Units/unitTypes.ts index 6c35b4c7..e1ed09b1 100644 --- a/www/js/Units/unitTypes.js +++ b/www/src/Units/unitTypes.ts @@ -1,5 +1,6 @@ -var unitTypes = {}; + +var unitTypes: any = {}; /* NAVY */ unitTypes.navy = {}; unitTypes.navy.blue = [ diff --git a/www/src/globals.d.ts b/www/src/globals.d.ts new file mode 100644 index 00000000..a2546a91 --- /dev/null +++ b/www/src/globals.d.ts @@ -0,0 +1,18 @@ +import {MissionData} from './Other/MissionData.js' +import {UnitsManager} from './Units/UnitsManager.js' +import {UnitControlPanel} from './Panels/UnitControlPanel.js' +import {UnitInfoPanel} from './Panels/UnitInfoPanel.js' +import {FormationControlPanel} from './Panels/FormationControlPanel.js' +import {SettingsPanel} from './Panels/SettingsPanel.js' +import {Map} from './Map/Map.js' + +declare global { + var missionData: MissionData; + var settingsPanel: SettingsPanel; + var unitsManager: UnitsManager; + var unitInfoPanel: UnitInfoPanel; + var unitControlPanel: UnitControlPanel; + var formationControlPanel: FormationControlPanel; + var map: Map; + var RESTaddress: string; +} \ No newline at end of file diff --git a/www/js/index.ts b/www/src/index.ts similarity index 63% rename from www/js/index.ts rename to www/src/index.ts index 38117e01..24cd3888 100644 --- a/www/js/index.ts +++ b/www/src/index.ts @@ -1,12 +1,12 @@ -var missionData; -var settingsPanel; -var unitsManager; -var unitInfoPanel; -var unitControlPanel; -var unitActionPanel; -var formationControlPanel; -var map; -var RESTaddress = "http://localhost:30000/restdemo"; +import {MissionData} from './Other/MissionData.js' +import {UnitsManager} from './Units/UnitsManager.js' +import {UnitControlPanel} from './Panels/UnitControlPanel.js' +import {UnitInfoPanel} from './Panels/UnitInfoPanel.js' +import {FormationControlPanel} from './Panels/FormationControlPanel.js' +import {SettingsPanel} from './Panels/SettingsPanel.js' +import {Map} from './Map/Map.js' + +RESTaddress = "http://localhost:30000/restdemo"; function setup() { @@ -18,8 +18,7 @@ function setup() unitControlPanel = new UnitControlPanel("unit-control-panel"); formationControlPanel = new FormationControlPanel("formation-control-panel"); settingsPanel = new SettingsPanel("settings-panel"); - actionPanel = new ActionPanel("action-panel") - map = new Map(); + map = new Map(); // Main update rate. 250ms is minimum time, equal to server update time. setInterval(() => update(), 250); @@ -30,7 +29,6 @@ function resize() var unitControlPanelHeight = document.getElementById("header").offsetHeight; document.getElementById("map").style.height = `${window.innerHeight - unitControlPanelHeight - 10}px`; document.getElementById("unit-control-panel").style.left = `${window.innerWidth / 2 - document.getElementById("unit-control-panel").offsetWidth / 2}px` - document.getElementById("action-panel").style.top = `${window.innerHeight / 2 - document.getElementById("action-panel").offsetHeight / 2}px` document.getElementById("snackbar").style.left = `${window.innerWidth / 2 - document.getElementById("snackbar").offsetWidth / 2}px` } @@ -59,33 +57,7 @@ function update() window.onload = setup; window.onresize = resize; -window.console = { - log: function(str){ - if (str !== this.lastMessage) - { - var node = document.createElement("div"); - node.classList.add("log-message"); - node.appendChild(document.createTextNode("> " + str)); - document.getElementById("log").appendChild(node); - this.lastMessage = str - } - }, - - error: function(str){ - if (str !== this.lastMessage) - { - var node = document.createElement("div"); - node.classList.add("error-message"); - node.appendChild(document.createTextNode("> *** " + str + "***")); - document.getElementById("log").appendChild(node); - this.lastMessage = str - } - }, - - lastMessage: "none" -} - -function showMessage(message) +export function showMessage(message) { // Get the snackbar DIV var x = document.getElementById("snackbar"); @@ -96,5 +68,4 @@ function showMessage(message) // After 3 seconds, remove the show class from DIV setTimeout(function(){ x.className = x.className.replace("show", ""); }, 3000); - } \ No newline at end of file diff --git a/www/tsconfig.json b/www/tsconfig.json index 8de604d3..63901a01 100644 --- a/www/tsconfig.json +++ b/www/tsconfig.json @@ -1,11 +1,22 @@ { "compilerOptions": { - "outDir": "./dist", - "allowJs": true, - "target": "es5" + "typeRoots": ["node_modules/@types"], + "outDir": "./js", + "target": "es2018", + "lib": [ + "es2018", + "dom" + ], + "types": [ + "leaflet", + "geojson" + ] }, - "include": [ - "./js/*", - "./js/**/*" + "include": [ + "src/**/*", + "src/*" + ], + "exclude": [ + "node_modules" ] -} \ No newline at end of file + } \ No newline at end of file