class AbilityId(enum.Enum):
    NULL_NULL = 0
    SMART = 1
    TAUNT_TAUNT = 2
    STOP_STOP = 4
    STOP_HOLDFIRESPECIAL = 5
    STOP_CHEER = 6
    STOP_DANCE = 7
    HOLDFIRE_STOPSPECIAL = 10
    HOLDFIRE_HOLDFIRE = 11
    MOVE = 16
    PATROL = 17
    HOLDPOSITION = 18
    SCAN_MOVE = 19
    MOVE_TURN = 20
    BEACON_CANCEL = 21
    BEACON_BEACONMOVE = 22
    ATTACK_ATTACK = 23
    ATTACK_ATTACKTOWARDS = 24
    ATTACK_ATTACKBARRAGE = 25
    EFFECT_SPRAY_TERRAN = 26
    EFFECT_SPRAY_ZERG = 28
    EFFECT_SPRAY_PROTOSS = 30
    EFFECT_SALVAGE = 32
    CORRUPTION_CORRUPTIONABILITY = 34
    CORRUPTION_CANCEL = 35
    BEHAVIOR_HOLDFIREON_GHOST = 36
    BEHAVIOR_HOLDFIREOFF_GHOST = 38
    MORPHTOINFESTEDTERRAN_INFESTEDTERRANS = 40
    EXPLODE_EXPLODE = 42
    RESEARCH_INTERCEPTORGRAVITONCATAPULT = 44
    FLEETBEACONRESEARCH_RESEARCHINTERCEPTORLAUNCHSPEEDUPGRADE = 45
    RESEARCH_PHOENIXANIONPULSECRYSTALS = 46
    FLEETBEACONRESEARCH_TEMPESTRANGEUPGRADE = 47
    FUNGALGROWTH_FUNGALGROWTH = 74
    GUARDIANSHIELD_GUARDIANSHIELD = 76
    EFFECT_REPAIR_MULE = 78
    MORPHZERGLINGTOBANELING_BANELING = 80
    NEXUSTRAINMOTHERSHIP_MOTHERSHIP = 110
    FEEDBACK_FEEDBACK = 140
    MASSRECALL_MASSRECALL = 142
    PLACEPOINTDEFENSEDRONE_POINTDEFENSEDRONE = 144
    HALLUCINATION_ARCHON = 146
    HALLUCINATION_COLOSSUS = 148
    HALLUCINATION_HIGHTEMPLAR = 150
    HALLUCINATION_IMMORTAL = 152
    HALLUCINATION_PHOENIX = 154
    HALLUCINATION_PROBE = 156
    HALLUCINATION_STALKER = 158
    HALLUCINATION_VOIDRAY = 160
    HALLUCINATION_WARPPRISM = 162
    HALLUCINATION_ZEALOT = 164
    HARVEST_GATHER_MULE = 166
    HARVEST_RETURN_MULE = 167
    SEEKERMISSILE_HUNTERSEEKERMISSILE = 169
    CALLDOWNMULE_CALLDOWNMULE = 171
    GRAVITONBEAM_GRAVITONBEAM = 173
    CANCEL_GRAVITONBEAM = 174
    BUILDINPROGRESSNYDUSCANAL_CANCEL = 176
    SIPHON_SIPHON = 177
    SIPHON_CANCEL = 178
    LEECH_LEECH = 179
    SPAWNCHANGELING_SPAWNCHANGELING = 181
    DISGUISEASZEALOT_ZEALOT = 183
    DISGUISEASMARINEWITHSHIELD_MARINE = 185
    DISGUISEASMARINEWITHOUTSHIELD_MARINE = 187
    DISGUISEASZERGLINGWITHWINGS_ZERGLING = 189
    DISGUISEASZERGLINGWITHOUTWINGS_ZERGLING = 191
    PHASESHIFT_PHASESHIFT = 193
    RALLY_BUILDING = 195
    RALLY_MORPHING_UNIT = 199
    RALLY_COMMANDCENTER = 203
    RALLY_NEXUS = 207
    RALLY_HATCHERY_UNITS = 211
    RALLY_HATCHERY_WORKERS = 212
    RESEARCH_GLIALREGENERATION = 216
    RESEARCH_TUNNELINGCLAWS = 217
    ROACHWARRENRESEARCH_ROACHSUPPLY = 218
    SAPSTRUCTURE_SAPSTRUCTURE = 245
    INFESTEDTERRANS_INFESTEDTERRANS = 247
    NEURALPARASITE_NEURALPARASITE = 249
    CANCEL_NEURALPARASITE = 250
    EFFECT_INJECTLARVA = 251
    EFFECT_STIM_MARAUDER = 253
    SUPPLYDROP_SUPPLYDROP = 255
    _250MMSTRIKECANNONS_250MMSTRIKECANNONS = 257
    _250MMSTRIKECANNONS_CANCEL = 258
    TEMPORALRIFT_TEMPORALRIFT = 259
    EFFECT_CHRONOBOOST = 261
    ULTRALISKCAVERNRESEARCH_EVOLVEANABOLICSYNTHESIS2 = 263
    RESEARCH_CHITINOUSPLATING = 265
    WORMHOLETRANSIT_WORMHOLETRANSIT = 293
    HARVEST_GATHER_SCV = 295
    HARVEST_RETURN_SCV = 296
    HARVEST_GATHER_PROBE = 298
    HARVEST_RETURN_PROBE = 299
    ATTACKWARPPRISM_ATTACKWARPPRISM = 301
    ATTACKWARPPRISM_ATTACKTOWARDS = 302
    ATTACKWARPPRISM_ATTACKBARRAGE = 303
    CANCEL_QUEUE1 = 304
    CANCELSLOT_QUEUE1 = 305
    CANCEL_QUEUE5 = 306
    CANCELSLOT_QUEUE5 = 307
    CANCEL_QUEUECANCELTOSELECTION = 308
    CANCELSLOT_QUEUECANCELTOSELECTION = 309
    QUE5LONGBLEND_CANCEL = 310
    QUE5LONGBLEND_CANCELSLOT = 311
    CANCEL_QUEUEADDON = 312
    CANCELSLOT_ADDON = 313
    CANCEL_BUILDINPROGRESS = 314
    HALT_BUILDING = 315
    EFFECT_REPAIR_SCV = 316
    TERRANBUILD_COMMANDCENTER = 318
    TERRANBUILD_SUPPLYDEPOT = 319
    TERRANBUILD_REFINERY = 320
    TERRANBUILD_BARRACKS = 321
    TERRANBUILD_ENGINEERINGBAY = 322
    TERRANBUILD_MISSILETURRET = 323
    TERRANBUILD_BUNKER = 324
    TERRANBUILD_SENSORTOWER = 326
    TERRANBUILD_GHOSTACADEMY = 327
    TERRANBUILD_FACTORY = 328
    TERRANBUILD_STARPORT = 329
    TERRANBUILD_ARMORY = 331
    TERRANBUILD_FUSIONCORE = 333
    HALT_TERRANBUILD = 348
    RAVENBUILD_AUTOTURRET = 349
    RAVENBUILD_CANCEL = 379
    EFFECT_STIM_MARINE = 380
    BEHAVIOR_CLOAKON_GHOST = 382
    BEHAVIOR_CLOAKOFF_GHOST = 383
    SNIPE_SNIPE = 384
    MEDIVACHEAL_HEAL = 386
    SIEGEMODE_SIEGEMODE = 388
    UNSIEGE_UNSIEGE = 390
    BEHAVIOR_CLOAKON_BANSHEE = 392
    BEHAVIOR_CLOAKOFF_BANSHEE = 393
    LOAD_MEDIVAC = 394
    UNLOADALLAT_MEDIVAC = 396
    SCANNERSWEEP_SCAN = 399
    YAMATO_YAMATOGUN = 401
    MORPH_VIKINGASSAULTMODE = 403
    MORPH_VIKINGFIGHTERMODE = 405
    LOAD_BUNKER = 407
    UNLOADALL_BUNKER = 408
    UNLOADALL_COMMANDCENTER = 413
    LOADALL_COMMANDCENTER = 416
    LIFT_COMMANDCENTER = 417
    LAND_COMMANDCENTER = 419
    BUILD_TECHLAB_BARRACKS = 421
    BUILD_REACTOR_BARRACKS = 422
    CANCEL_BARRACKSADDON = 451
    LIFT_BARRACKS = 452
    BUILD_TECHLAB_FACTORY = 454
    BUILD_REACTOR_FACTORY = 455
    CANCEL_FACTORYADDON = 484
    LIFT_FACTORY = 485
    BUILD_TECHLAB_STARPORT = 487
    BUILD_REACTOR_STARPORT = 488
    CANCEL_STARPORTADDON = 517
    LIFT_STARPORT = 518
    LAND_FACTORY = 520
    LAND_STARPORT = 522
    COMMANDCENTERTRAIN_SCV = 524
    LAND_BARRACKS = 554
    MORPH_SUPPLYDEPOT_LOWER = 556
    MORPH_SUPPLYDEPOT_RAISE = 558
    BARRACKSTRAIN_MARINE = 560
    BARRACKSTRAIN_REAPER = 561
    BARRACKSTRAIN_GHOST = 562
    BARRACKSTRAIN_MARAUDER = 563
    FACTORYTRAIN_SIEGETANK = 591
    FACTORYTRAIN_THOR = 594
    FACTORYTRAIN_HELLION = 595
    TRAIN_HELLBAT = 596
    TRAIN_CYCLONE = 597
    FACTORYTRAIN_WIDOWMINE = 614
    STARPORTTRAIN_MEDIVAC = 620
    STARPORTTRAIN_BANSHEE = 621
    STARPORTTRAIN_RAVEN = 622
    STARPORTTRAIN_BATTLECRUISER = 623
    STARPORTTRAIN_VIKINGFIGHTER = 624
    STARPORTTRAIN_LIBERATOR = 626
    RESEARCH_HISECAUTOTRACKING = 650
    RESEARCH_TERRANSTRUCTUREARMORUPGRADE = 651
    ENGINEERINGBAYRESEARCH_TERRANINFANTRYWEAPONSLEVEL1 = 652
    ENGINEERINGBAYRESEARCH_TERRANINFANTRYWEAPONSLEVEL2 = 653
    ENGINEERINGBAYRESEARCH_TERRANINFANTRYWEAPONSLEVEL3 = 654
    RESEARCH_NEOSTEELFRAME = 655
    ENGINEERINGBAYRESEARCH_TERRANINFANTRYARMORLEVEL1 = 656
    ENGINEERINGBAYRESEARCH_TERRANINFANTRYARMORLEVEL2 = 657
    ENGINEERINGBAYRESEARCH_TERRANINFANTRYARMORLEVEL3 = 658
    MERCCOMPOUNDRESEARCH_REAPERSPEED = 683
    BUILD_NUKE = 710
    BARRACKSTECHLABRESEARCH_STIMPACK = 730
    RESEARCH_COMBATSHIELD = 731
    RESEARCH_CONCUSSIVESHELLS = 732
    RESEARCH_INFERNALPREIGNITER = 761
    FACTORYTECHLABRESEARCH_RESEARCHTRANSFORMATIONSERVOS = 763
    RESEARCH_DRILLINGCLAWS = 764
    FACTORYTECHLABRESEARCH_RESEARCHLOCKONRANGEUPGRADE = 765
    RESEARCH_SMARTSERVOS = 766
    FACTORYTECHLABRESEARCH_RESEARCHARMORPIERCINGROCKETS = 767
    RESEARCH_CYCLONERAPIDFIRELAUNCHERS = 768
    FACTORYTECHLABRESEARCH_CYCLONERESEARCHLOCKONDAMAGEUPGRADE = 769
    RESEARCH_BANSHEECLOAKINGFIELD = 790
    STARPORTTECHLABRESEARCH_RESEARCHMEDIVACENERGYUPGRADE = 792
    RESEARCH_RAVENCORVIDREACTOR = 793
    STARPORTTECHLABRESEARCH_RESEARCHSEEKERMISSILE = 796
    STARPORTTECHLABRESEARCH_RESEARCHDURABLEMATERIALS = 797
    RESEARCH_BANSHEEHYPERFLIGHTROTORS = 799
    STARPORTTECHLABRESEARCH_RESEARCHLIBERATORAGMODE = 800
    STARPORTTECHLABRESEARCH_RESEARCHRAPIDDEPLOYMENT = 802
    RESEARCH_RAVENRECALIBRATEDEXPLOSIVES = 803
    RESEARCH_HIGHCAPACITYFUELTANKS = 804
    RESEARCH_ADVANCEDBALLISTICS = 805
    STARPORTTECHLABRESEARCH_RAVENRESEARCHENHANCEDMUNITIONS = 806
    RESEARCH_PERSONALCLOAKING = 820
    GHOSTACADEMYRESEARCH_RESEARCHGHOSTENERGYUPGRADE = 821
    ARMORYRESEARCH_TERRANVEHICLEPLATINGLEVEL1 = 852
    ARMORYRESEARCH_TERRANVEHICLEPLATINGLEVEL2 = 853
    ARMORYRESEARCH_TERRANVEHICLEPLATINGLEVEL3 = 854
    ARMORYRESEARCH_TERRANVEHICLEWEAPONSLEVEL1 = 855
    ARMORYRESEARCH_TERRANVEHICLEWEAPONSLEVEL2 = 856
    ARMORYRESEARCH_TERRANVEHICLEWEAPONSLEVEL3 = 857
    ARMORYRESEARCH_TERRANSHIPPLATINGLEVEL1 = 858
    ARMORYRESEARCH_TERRANSHIPPLATINGLEVEL2 = 859
    ARMORYRESEARCH_TERRANSHIPPLATINGLEVEL3 = 860
    ARMORYRESEARCH_TERRANSHIPWEAPONSLEVEL1 = 861
    ARMORYRESEARCH_TERRANSHIPWEAPONSLEVEL2 = 862
    ARMORYRESEARCH_TERRANSHIPWEAPONSLEVEL3 = 863
    ARMORYRESEARCH_TERRANVEHICLEANDSHIPPLATINGLEVEL1 = 864
    ARMORYRESEARCH_TERRANVEHICLEANDSHIPPLATINGLEVEL2 = 865
    ARMORYRESEARCH_TERRANVEHICLEANDSHIPPLATINGLEVEL3 = 866
    PROTOSSBUILD_NEXUS = 880
    PROTOSSBUILD_PYLON = 881
    PROTOSSBUILD_ASSIMILATOR = 882
    PROTOSSBUILD_GATEWAY = 883
    PROTOSSBUILD_FORGE = 884
    PROTOSSBUILD_FLEETBEACON = 885
    PROTOSSBUILD_TWILIGHTCOUNCIL = 886
    PROTOSSBUILD_PHOTONCANNON = 887
    PROTOSSBUILD_STARGATE = 889
    PROTOSSBUILD_TEMPLARARCHIVE = 890
    PROTOSSBUILD_DARKSHRINE = 891
    PROTOSSBUILD_ROBOTICSBAY = 892
    PROTOSSBUILD_ROBOTICSFACILITY = 893
    PROTOSSBUILD_CYBERNETICSCORE = 894
    BUILD_SHIELDBATTERY = 895
    PROTOSSBUILD_CANCEL = 910
    LOAD_WARPPRISM = 911
    UNLOADALL_WARPPRISM = 912
    UNLOADALLAT_WARPPRISM = 913
    GATEWAYTRAIN_ZEALOT = 916
    GATEWAYTRAIN_STALKER = 917
    GATEWAYTRAIN_HIGHTEMPLAR = 919
    GATEWAYTRAIN_DARKTEMPLAR = 920
    GATEWAYTRAIN_SENTRY = 921
    TRAIN_ADEPT = 922
    STARGATETRAIN_PHOENIX = 946
    STARGATETRAIN_CARRIER = 948
    STARGATETRAIN_VOIDRAY = 950
    STARGATETRAIN_ORACLE = 954
    STARGATETRAIN_TEMPEST = 955
    ROBOTICSFACILITYTRAIN_WARPPRISM = 976
    ROBOTICSFACILITYTRAIN_OBSERVER = 977
    ROBOTICSFACILITYTRAIN_COLOSSUS = 978
    ROBOTICSFACILITYTRAIN_IMMORTAL = 979
    TRAIN_DISRUPTOR = 994
    NEXUSTRAIN_PROBE = 1006
    PSISTORM_PSISTORM = 1036
    CANCEL_HANGARQUEUE5 = 1038
    CANCELSLOT_HANGARQUEUE5 = 1039
    BROODLORDQUEUE2_CANCEL = 1040
    BROODLORDQUEUE2_CANCELSLOT = 1041
    BUILD_INTERCEPTORS = 1042
    FORGERESEARCH_PROTOSSGROUNDWEAPONSLEVEL1 = 1062
    FORGERESEARCH_PROTOSSGROUNDWEAPONSLEVEL2 = 1063
    FORGERESEARCH_PROTOSSGROUNDWEAPONSLEVEL3 = 1064
    FORGERESEARCH_PROTOSSGROUNDARMORLEVEL1 = 1065
    FORGERESEARCH_PROTOSSGROUNDARMORLEVEL2 = 1066
    FORGERESEARCH_PROTOSSGROUNDARMORLEVEL3 = 1067
    FORGERESEARCH_PROTOSSSHIELDSLEVEL1 = 1068
    FORGERESEARCH_PROTOSSSHIELDSLEVEL2 = 1069
    FORGERESEARCH_PROTOSSSHIELDSLEVEL3 = 1070
    RESEARCH_GRAVITICBOOSTER = 1093
    RESEARCH_GRAVITICDRIVE = 1094
    RESEARCH_EXTENDEDTHERMALLANCE = 1097
    ROBOTICSBAYRESEARCH_RESEARCHIMMORTALREVIVE = 1099
    RESEARCH_PSISTORM = 1126
    ZERGBUILD_HATCHERY = 1152
    ZERGBUILD_CREEPTUMOR = 1153
    ZERGBUILD_EXTRACTOR = 1154
    ZERGBUILD_SPAWNINGPOOL = 1155
    ZERGBUILD_EVOLUTIONCHAMBER = 1156
    ZERGBUILD_HYDRALISKDEN = 1157
    ZERGBUILD_SPIRE = 1158
    ZERGBUILD_ULTRALISKCAVERN = 1159
    ZERGBUILD_INFESTATIONPIT = 1160
    ZERGBUILD_NYDUSNETWORK = 1161
    ZERGBUILD_BANELINGNEST = 1162
    BUILD_LURKERDEN = 1163
    ZERGBUILD_ROACHWARREN = 1165
    ZERGBUILD_SPINECRAWLER = 1166
    ZERGBUILD_SPORECRAWLER = 1167
    ZERGBUILD_CANCEL = 1182
    HARVEST_GATHER_DRONE = 1183
    HARVEST_RETURN_DRONE = 1184
    RESEARCH_ZERGMELEEWEAPONSLEVEL1 = 1186
    RESEARCH_ZERGMELEEWEAPONSLEVEL2 = 1187
    RESEARCH_ZERGMELEEWEAPONSLEVEL3 = 1188
    RESEARCH_ZERGGROUNDARMORLEVEL1 = 1189
    RESEARCH_ZERGGROUNDARMORLEVEL2 = 1190
    RESEARCH_ZERGGROUNDARMORLEVEL3 = 1191
    RESEARCH_ZERGMISSILEWEAPONSLEVEL1 = 1192
    RESEARCH_ZERGMISSILEWEAPONSLEVEL2 = 1193
    RESEARCH_ZERGMISSILEWEAPONSLEVEL3 = 1194
    UPGRADETOLAIR_LAIR = 1216
    CANCEL_MORPHLAIR = 1217
    UPGRADETOHIVE_HIVE = 1218
    CANCEL_MORPHHIVE = 1219
    UPGRADETOGREATERSPIRE_GREATERSPIRE = 1220
    CANCEL_MORPHGREATERSPIRE = 1221
    RESEARCH_PNEUMATIZEDCARAPACE = 1223
    LAIRRESEARCH_EVOLVEVENTRALSACKS = 1224
    RESEARCH_BURROW = 1225
    RESEARCH_ZERGLINGADRENALGLANDS = 1252
    RESEARCH_ZERGLINGMETABOLICBOOST = 1253
    RESEARCH_GROOVEDSPINES = 1282
    RESEARCH_MUSCULARAUGMENTS = 1283
    HYDRALISKDENRESEARCH_RESEARCHLURKERRANGE = 1286
    RESEARCH_ZERGFLYERATTACKLEVEL1 = 1312
    RESEARCH_ZERGFLYERATTACKLEVEL2 = 1313
    RESEARCH_ZERGFLYERATTACKLEVEL3 = 1314
    RESEARCH_ZERGFLYERARMORLEVEL1 = 1315
    RESEARCH_ZERGFLYERARMORLEVEL2 = 1316
    RESEARCH_ZERGFLYERARMORLEVEL3 = 1317
    LARVATRAIN_DRONE = 1342
    LARVATRAIN_ZERGLING = 1343
    LARVATRAIN_OVERLORD = 1344
    LARVATRAIN_HYDRALISK = 1345
    LARVATRAIN_MUTALISK = 1346
    LARVATRAIN_ULTRALISK = 1348
    LARVATRAIN_ROACH = 1351
    LARVATRAIN_INFESTOR = 1352
    LARVATRAIN_CORRUPTOR = 1353
    LARVATRAIN_VIPER = 1354
    TRAIN_SWARMHOST = 1356
    MORPHTOBROODLORD_BROODLORD = 1372
    CANCEL_MORPHBROODLORD = 1373
    BURROWDOWN_BANELING = 1374
    BURROWBANELINGDOWN_CANCEL = 1375
    BURROWUP_BANELING = 1376
    BURROWDOWN_DRONE = 1378
    BURROWDRONEDOWN_CANCEL = 1379
    BURROWUP_DRONE = 1380
    BURROWDOWN_HYDRALISK = 1382
    BURROWHYDRALISKDOWN_CANCEL = 1383
    BURROWUP_HYDRALISK = 1384
    BURROWDOWN_ROACH = 1386
    BURROWROACHDOWN_CANCEL = 1387
    BURROWUP_ROACH = 1388
    BURROWDOWN_ZERGLING = 1390
    BURROWZERGLINGDOWN_CANCEL = 1391
    BURROWUP_ZERGLING = 1392
    BURROWDOWN_INFESTORTERRAN = 1394
    BURROWUP_INFESTORTERRAN = 1396
    REDSTONELAVACRITTERBURROW_BURROWDOWN = 1398
    REDSTONELAVACRITTERINJUREDBURROW_BURROWDOWN = 1400
    REDSTONELAVACRITTERUNBURROW_BURROWUP = 1402
    REDSTONELAVACRITTERINJUREDUNBURROW_BURROWUP = 1404
    LOAD_OVERLORD = 1406
    UNLOADALLAT_OVERLORD = 1408
    MERGEABLE_CANCEL = 1411
    WARPABLE_CANCEL = 1412
    WARPGATETRAIN_ZEALOT = 1413
    WARPGATETRAIN_STALKER = 1414
    WARPGATETRAIN_HIGHTEMPLAR = 1416
    WARPGATETRAIN_DARKTEMPLAR = 1417
    WARPGATETRAIN_SENTRY = 1418
    TRAINWARP_ADEPT = 1419
    BURROWDOWN_QUEEN = 1433
    BURROWQUEENDOWN_CANCEL = 1434
    BURROWUP_QUEEN = 1435
    LOAD_NYDUSNETWORK = 1437
    UNLOADALL_NYDASNETWORK = 1438
    EFFECT_BLINK_STALKER = 1442
    BURROWDOWN_INFESTOR = 1444
    BURROWINFESTORDOWN_CANCEL = 1445
    BURROWUP_INFESTOR = 1446
    MORPH_OVERSEER = 1448
    CANCEL_MORPHOVERSEER = 1449
    UPGRADETOPLANETARYFORTRESS_PLANETARYFORTRESS = 1450
    CANCEL_MORPHPLANETARYFORTRESS = 1451
    RESEARCH_PATHOGENGLANDS = 1454
    RESEARCH_NEURALPARASITE = 1455
    INFESTATIONPITRESEARCH_RESEARCHLOCUSTLIFETIMEINCREASE = 1456
    RESEARCH_CENTRIFUGALHOOKS = 1482
    BURROWDOWN_ULTRALISK = 1512
    BURROWUP_ULTRALISK = 1514
    UPGRADETOORBITAL_ORBITALCOMMAND = 1516
    CANCEL_MORPHORBITAL = 1517
    MORPH_WARPGATE = 1518
    UPGRADETOWARPGATE_CANCEL = 1519
    MORPH_GATEWAY = 1520
    MORPHBACKTOGATEWAY_CANCEL = 1521
    LIFT_ORBITALCOMMAND = 1522
    LAND_ORBITALCOMMAND = 1524
    FORCEFIELD_FORCEFIELD = 1526
    FORCEFIELD_CANCEL = 1527
    MORPH_WARPPRISMPHASINGMODE = 1528
    PHASINGMODE_CANCEL = 1529
    MORPH_WARPPRISMTRANSPORTMODE = 1530
    TRANSPORTMODE_CANCEL = 1531
    RESEARCH_BATTLECRUISERWEAPONREFIT = 1532
    CYBERNETICSCORERESEARCH_PROTOSSAIRWEAPONSLEVEL1 = 1562
    CYBERNETICSCORERESEARCH_PROTOSSAIRWEAPONSLEVEL2 = 1563
    CYBERNETICSCORERESEARCH_PROTOSSAIRWEAPONSLEVEL3 = 1564
    CYBERNETICSCORERESEARCH_PROTOSSAIRARMORLEVEL1 = 1565
    CYBERNETICSCORERESEARCH_PROTOSSAIRARMORLEVEL2 = 1566
    CYBERNETICSCORERESEARCH_PROTOSSAIRARMORLEVEL3 = 1567
    RESEARCH_WARPGATE = 1568
    CYBERNETICSCORERESEARCH_RESEARCHHALLUCINATION = 1571
    RESEARCH_CHARGE = 1592
    RESEARCH_BLINK = 1593
    RESEARCH_ADEPTRESONATINGGLAIVES = 1594
    TACNUKESTRIKE_NUKECALLDOWN = 1622
    CANCEL_NUKE = 1623
    SALVAGEBUNKERREFUND_SALVAGE = 1624
    SALVAGEBUNKER_SALVAGE = 1626
    EMP_EMP = 1628
    VORTEX_VORTEX = 1630
    TRAINQUEEN_QUEEN = 1632
    BURROWCREEPTUMORDOWN_BURROWDOWN = 1662
    TRANSFUSION_TRANSFUSION = 1664
    BARRACKSTECHLABMORPH_TECHLABBARRACKS = 1668
    FACTORYTECHLABMORPH_TECHLABFACTORY = 1670
    STARPORTTECHLABMORPH_TECHLABSTARPORT = 1672
    BARRACKSREACTORMORPH_REACTOR = 1676
    FACTORYREACTORMORPH_REACTOR = 1678
    STARPORTREACTORMORPH_REACTOR = 1680
    ATTACK_REDIRECT = 1682
    EFFECT_STIM_MARINE_REDIRECT = 1683
    EFFECT_STIM_MARAUDER_REDIRECT = 1684
    BURROWEDSTOP_STOPROACHBURROWED = 1685
    BURROWEDSTOP_HOLDFIRESPECIAL = 1686
    STOP_REDIRECT = 1691
    BEHAVIOR_GENERATECREEPON = 1692
    BEHAVIOR_GENERATECREEPOFF = 1693
    BUILD_CREEPTUMOR_QUEEN = 1694
    QUEENBUILD_CANCEL = 1724
    SPINECRAWLERUPROOT_SPINECRAWLERUPROOT = 1725
    SPINECRAWLERUPROOT_CANCEL = 1726
    SPORECRAWLERUPROOT_SPORECRAWLERUPROOT = 1727
    SPORECRAWLERUPROOT_CANCEL = 1728
    SPINECRAWLERROOT_SPINECRAWLERROOT = 1729
    CANCEL_SPINECRAWLERROOT = 1730
    SPORECRAWLERROOT_SPORECRAWLERROOT = 1731
    CANCEL_SPORECRAWLERROOT = 1732
    BUILD_CREEPTUMOR_TUMOR = 1733
    CANCEL_CREEPTUMOR = 1763
    BUILDAUTOTURRET_AUTOTURRET = 1764
    MORPH_ARCHON = 1766
    ARCHON_WARP_TARGET = 1767
    BUILD_NYDUSWORM = 1768
    BUILDNYDUSCANAL_SUMMONNYDUSCANALATTACKER = 1769
    BUILDNYDUSCANAL_CANCEL = 1798
    EFFECT_CHARGE = 1819
    HERDINTERACT_HERD = 1821
    FRENZY_FRENZY = 1823
    CONTAMINATE_CONTAMINATE = 1825
    INFESTEDTERRANSLAYEGG_INFESTEDTERRANS = 1829
    CANCEL_QUEUEPASIVE = 1831
    CANCELSLOT_QUEUEPASSIVE = 1832
    CANCEL_QUEUEPASSIVECANCELTOSELECTION = 1833
    CANCELSLOT_QUEUEPASSIVECANCELTOSELECTION = 1834
    MORPHTOGHOSTALTERNATE_MOVE = 1835
    MORPHTOGHOSTNOVA_MOVE = 1837
    DIGESTERCREEPSPRAY_DIGESTERCREEPSPRAY = 1839
    MORPHTOCOLLAPSIBLETERRANTOWERDEBRIS_CANCEL = 1842
    MORPHTOCOLLAPSIBLETERRANTOWERDEBRISRAMPLEFT_CANCEL = 1844
    MORPHTOCOLLAPSIBLETERRANTOWERDEBRISRAMPRIGHT_CANCEL = 1846
    MORPH_MOTHERSHIP = 1847
    CANCEL_MORPHMOTHERSHIP = 1848
    MOTHERSHIPSTASIS_MOTHERSHIPSTASIS = 1849
    CANCEL_MOTHERSHIPSTASIS = 1850
    MOTHERSHIPCOREWEAPON_MOTHERSHIPSTASIS = 1851
    NEXUSTRAINMOTHERSHIPCORE_MOTHERSHIPCORE = 1853
    MOTHERSHIPCORETELEPORT_MOTHERSHIPCORETELEPORT = 1883
    SALVAGEDRONEREFUND_SALVAGE = 1885
    SALVAGEDRONE_SALVAGE = 1887
    SALVAGEZERGLINGREFUND_SALVAGE = 1889
    SALVAGEZERGLING_SALVAGE = 1891
    SALVAGEQUEENREFUND_SALVAGE = 1893
    SALVAGEQUEEN_SALVAGE = 1895
    SALVAGEROACHREFUND_SALVAGE = 1897
    SALVAGEROACH_SALVAGE = 1899
    SALVAGEBANELINGREFUND_SALVAGE = 1901
    SALVAGEBANELING_SALVAGE = 1903
    SALVAGEHYDRALISKREFUND_SALVAGE = 1905
    SALVAGEHYDRALISK_SALVAGE = 1907
    SALVAGEINFESTORREFUND_SALVAGE = 1909
    SALVAGEINFESTOR_SALVAGE = 1911
    SALVAGESWARMHOSTREFUND_SALVAGE = 1913
    SALVAGESWARMHOST_SALVAGE = 1915
    SALVAGEULTRALISKREFUND_SALVAGE = 1917
    SALVAGEULTRALISK_SALVAGE = 1919
    DIGESTERTRANSPORT_LOADDIGESTER = 1921
    SPECTRESHIELD_SPECTRESHIELD = 1926
    XELNAGAHEALINGSHRINE_XELNAGAHEALINGSHRINE = 1928
    NEXUSINVULNERABILITY_NEXUSINVULNERABILITY = 1930
    NEXUSPHASESHIFT_NEXUSPHASESHIFT = 1932
    SPAWNCHANGELINGTARGET_SPAWNCHANGELING = 1934
    QUEENLAND_QUEENLAND = 1936
    QUEENFLY_QUEENFLY = 1938
    ORACLECLOAKFIELD_ORACLECLOAKFIELD = 1940
    FLYERSHIELD_FLYERSHIELD = 1942
    LOCUSTTRAIN_SWARMHOST = 1944
    EFFECT_MASSRECALL_MOTHERSHIPCORE = 1974
    SINGLERECALL_SINGLERECALL = 1976
    MORPH_HELLION = 1978
    RESTORESHIELDS_RESTORESHIELDS = 1980
    SCRYER_SCRYER = 1982
    LEECHRESOURCES_CANCEL = 1987
    SNIPEDOT_SNIPEDOT = 1988
    SWARMHOSTSPAWNLOCUSTS_LOCUSTMP = 1990
    CLONE_CLONE = 1992
    BUILDINGSHIELD_BUILDINGSHIELD = 1994
    MORPHTOCOLLAPSIBLEROCKTOWERDEBRIS_CANCEL = 1997
    MORPH_HELLBAT = 1998
    BUILDINGSTASIS_BUILDINGSTASIS = 2000
    MAXIUMTHRUST_MAXIMUMTHRUST = 2006
    BURROWDOWN_SWARMHOST = 2014
    MORPHTOSWARMHOSTBURROWEDMP_CANCEL = 2015
    BURROWUP_SWARMHOST = 2016
    SPAWNINFESTEDTERRAN_LOCUSTMP = 2018
    ATTACKPROTOSSBUILDING_ATTACKBUILDING = 2048
    ATTACKPROTOSSBUILDING_ATTACKTOWARDS = 2049
    ATTACKPROTOSSBUILDING_ATTACKBARRAGE = 2050
    BURROWEDBANELINGSTOP_STOPROACHBURROWED = 2051
    BURROWEDBANELINGSTOP_HOLDFIRESPECIAL = 2052
    STOP_BUILDING = 2057
    STOPPROTOSSBUILDING_HOLDFIRE = 2058
    STOPPROTOSSBUILDING_CHEER = 2059
    STOPPROTOSSBUILDING_DANCE = 2060
    BLINDINGCLOUD_BLINDINGCLOUD = 2063
    EYESTALK_EYESTALK = 2065
    EYESTALK_CANCEL = 2066
    EFFECT_ABDUCT = 2067
    VIPERCONSUME_VIPERCONSUME = 2069
    VIPERCONSUMEMINERALS_VIPERCONSUME = 2071
    VIPERCONSUMESTRUCTURE_VIPERCONSUME = 2073
    CANCEL_PROTOSSBUILDINGQUEUE = 2075
    PROTOSSBUILDINGQUEUE_CANCELSLOT = 2076
    QUE8_CANCEL = 2077
    QUE8_CANCELSLOT = 2078
    TESTZERG_CANCEL = 2080
    BEHAVIOR_BUILDINGATTACKON = 2081
    BEHAVIOR_BUILDINGATTACKOFF = 2082
    PICKUPSCRAPSMALL_PICKUPSCRAPSMALL = 2083
    PICKUPSCRAPMEDIUM_PICKUPSCRAPMEDIUM = 2085
    PICKUPSCRAPLARGE_PICKUPSCRAPLARGE = 2087
    PICKUPPALLETGAS_PICKUPPALLETGAS = 2089
    PICKUPPALLETMINERALS_PICKUPPALLETMINERALS = 2091
    MASSIVEKNOCKOVER_MASSIVEKNOCKOVER = 2093
    BURROWDOWN_WIDOWMINE = 2095
    WIDOWMINEBURROW_CANCEL = 2096
    BURROWUP_WIDOWMINE = 2097
    WIDOWMINEATTACK_WIDOWMINEATTACK = 2099
    TORNADOMISSILE_TORNADOMISSILE = 2101
    MOTHERSHIPCOREENERGIZE_MOTHERSHIPCOREENERGIZE = 2102
    MOTHERSHIPCOREENERGIZE_CANCEL = 2103
    LURKERASPECTMPFROMHYDRALISKBURROWED_LURKERMPFROMHYDRALISKBURROWED = 2104
    LURKERASPECTMPFROMHYDRALISKBURROWED_CANCEL = 2105
    LURKERASPECTMP_LURKERMP = 2106
    LURKERASPECTMP_CANCEL = 2107
    BURROWDOWN_LURKER = 2108
    BURROWLURKERMPDOWN_CANCEL = 2109
    BURROWUP_LURKER = 2110
    MORPH_LURKERDEN = 2112
    CANCEL_MORPHLURKERDEN = 2113
    HALLUCINATION_ORACLE = 2114
    EFFECT_MEDIVACIGNITEAFTERBURNERS = 2116
    EXTENDINGBRIDGENEWIDE8OUT_BRIDGEEXTEND = 2118
    EXTENDINGBRIDGENEWIDE8_BRIDGERETRACT = 2120
    EXTENDINGBRIDGENWWIDE8OUT_BRIDGEEXTEND = 2122
    EXTENDINGBRIDGENWWIDE8_BRIDGERETRACT = 2124
    EXTENDINGBRIDGENEWIDE10OUT_BRIDGEEXTEND = 2126
    EXTENDINGBRIDGENEWIDE10_BRIDGERETRACT = 2128
    EXTENDINGBRIDGENWWIDE10OUT_BRIDGEEXTEND = 2130
    EXTENDINGBRIDGENWWIDE10_BRIDGERETRACT = 2132
    EXTENDINGBRIDGENEWIDE12OUT_BRIDGEEXTEND = 2134
    EXTENDINGBRIDGENEWIDE12_BRIDGERETRACT = 2136
    EXTENDINGBRIDGENWWIDE12OUT_BRIDGEEXTEND = 2138
    EXTENDINGBRIDGENWWIDE12_BRIDGERETRACT = 2140
    INVULNERABILITYSHIELD_INVULNERABILITYSHIELD = 2142
    CRITTERFLEE_CRITTERFLEE = 2144
    ORACLEREVELATION_ORACLEREVELATION = 2146
    ORACLEREVELATIONMODE_ORACLEREVELATIONMODE = 2148
    ORACLEREVELATIONMODE_CANCEL = 2149
    ORACLENORMALMODE_ORACLENORMALMODE = 2150
    ORACLENORMALMODE_CANCEL = 2151
    MORPHTOCOLLAPSIBLEROCKTOWERDEBRISRAMPRIGHT_CANCEL = 2153
    MORPHTOCOLLAPSIBLEROCKTOWERDEBRISRAMPLEFT_CANCEL = 2155
    VOIDSIPHON_VOIDSIPHON = 2156
    ULTRALISKWEAPONCOOLDOWN_ULTRALISKWEAPONCOOLDOWN = 2158
    MOTHERSHIPCOREPURIFYNEXUSCANCEL_CANCEL = 2160
    EFFECT_PHOTONOVERCHARGE = 2162
    XELNAGA_CAVERNS_DOORE_XELNAGA_CAVERNS_DOORDEFAULTCLOSE = 2164
    XELNAGA_CAVERNS_DOOREOPENED_XELNAGA_CAVERNS_DOORDEFAULTCLOSE = 2166
    XELNAGA_CAVERNS_DOORN_XELNAGA_CAVERNS_DOORDEFAULTCLOSE = 2168
    XELNAGA_CAVERNS_DOORNE_XELNAGA_CAVERNS_DOORDEFAULTCLOSE = 2170
    XELNAGA_CAVERNS_DOORNEOPENED_XELNAGA_CAVERNS_DOORDEFAULTOPEN = 2172
    XELNAGA_CAVERNS_DOORNOPENED_XELNAGA_CAVERNS_DOORDEFAULTOPEN = 2174
    XELNAGA_CAVERNS_DOORNW_XELNAGA_CAVERNS_DOORDEFAULTCLOSE = 2176
    XELNAGA_CAVERNS_DOORNWOPENED_XELNAGA_CAVERNS_DOORDEFAULTOPEN = 2178
    XELNAGA_CAVERNS_DOORS_XELNAGA_CAVERNS_DOORDEFAULTCLOSE = 2180
    XELNAGA_CAVERNS_DOORSE_XELNAGA_CAVERNS_DOORDEFAULTCLOSE = 2182
    XELNAGA_CAVERNS_DOORSEOPENED_XELNAGA_CAVERNS_DOORDEFAULTOPEN = 2184
    XELNAGA_CAVERNS_DOORSOPENED_XELNAGA_CAVERNS_DOORDEFAULTOPEN = 2186
    XELNAGA_CAVERNS_DOORSW_XELNAGA_CAVERNS_DOORDEFAULTCLOSE = 2188
    XELNAGA_CAVERNS_DOORSWOPENED_XELNAGA_CAVERNS_DOORDEFAULTOPEN = 2190
    XELNAGA_CAVERNS_DOORW_XELNAGA_CAVERNS_DOORDEFAULTCLOSE = 2192
    XELNAGA_CAVERNS_DOORWOPENED_XELNAGA_CAVERNS_DOORDEFAULTOPEN = 2194
    XELNAGA_CAVERNS_FLOATING_BRIDGENE8OUT_BRIDGEEXTEND = 2196
    XELNAGA_CAVERNS_FLOATING_BRIDGENE8_BRIDGERETRACT = 2198
    XELNAGA_CAVERNS_FLOATING_BRIDGENW8OUT_BRIDGEEXTEND = 2200
    XELNAGA_CAVERNS_FLOATING_BRIDGENW8_BRIDGERETRACT = 2202
    XELNAGA_CAVERNS_FLOATING_BRIDGENE10OUT_BRIDGEEXTEND = 2204
    XELNAGA_CAVERNS_FLOATING_BRIDGENE10_BRIDGERETRACT = 2206
    XELNAGA_CAVERNS_FLOATING_BRIDGENW10OUT_BRIDGEEXTEND = 2208
    XELNAGA_CAVERNS_FLOATING_BRIDGENW10_BRIDGERETRACT = 2210
    XELNAGA_CAVERNS_FLOATING_BRIDGENE12OUT_BRIDGEEXTEND = 2212
    XELNAGA_CAVERNS_FLOATING_BRIDGENE12_BRIDGERETRACT = 2214
    XELNAGA_CAVERNS_FLOATING_BRIDGENW12OUT_BRIDGEEXTEND = 2216
    XELNAGA_CAVERNS_FLOATING_BRIDGENW12_BRIDGERETRACT = 2218
    XELNAGA_CAVERNS_FLOATING_BRIDGEH8OUT_BRIDGEEXTEND = 2220
    XELNAGA_CAVERNS_FLOATING_BRIDGEH8_BRIDGERETRACT = 2222
    XELNAGA_CAVERNS_FLOATING_BRIDGEV8OUT_BRIDGEEXTEND = 2224
    XELNAGA_CAVERNS_FLOATING_BRIDGEV8_BRIDGERETRACT = 2226
    XELNAGA_CAVERNS_FLOATING_BRIDGEH10OUT_BRIDGEEXTEND = 2228
    XELNAGA_CAVERNS_FLOATING_BRIDGEH10_BRIDGERETRACT = 2230
    XELNAGA_CAVERNS_FLOATING_BRIDGEV10OUT_BRIDGEEXTEND = 2232
    XELNAGA_CAVERNS_FLOATING_BRIDGEV10_BRIDGERETRACT = 2234
    XELNAGA_CAVERNS_FLOATING_BRIDGEH12OUT_BRIDGEEXTEND = 2236
    XELNAGA_CAVERNS_FLOATING_BRIDGEH12_BRIDGERETRACT = 2238
    XELNAGA_CAVERNS_FLOATING_BRIDGEV12OUT_BRIDGEEXTEND = 2240
    XELNAGA_CAVERNS_FLOATING_BRIDGEV12_BRIDGERETRACT = 2242
    EFFECT_TIMEWARP = 2244
    SNOWREFINERY_TERRAN_EXTENDINGBRIDGENESHORT8OUT_BRIDGEEXTEND = 2246
    SNOWREFINERY_TERRAN_EXTENDINGBRIDGENESHORT8_BRIDGERETRACT = 2248
    SNOWREFINERY_TERRAN_EXTENDINGBRIDGENWSHORT8OUT_BRIDGEEXTEND = 2250
    SNOWREFINERY_TERRAN_EXTENDINGBRIDGENWSHORT8_BRIDGERETRACT = 2252
    SNOWREFINERY_TERRAN_EXTENDINGBRIDGENESHORT10OUT_BRIDGEEXTEND = 2254
    SNOWREFINERY_TERRAN_EXTENDINGBRIDGENESHORT10_BRIDGERETRACT = 2256
    SNOWREFINERY_TERRAN_EXTENDINGBRIDGENWSHORT10OUT_BRIDGEEXTEND = 2258
    SNOWREFINERY_TERRAN_EXTENDINGBRIDGENWSHORT10_BRIDGERETRACT = 2260
    ARMORYRESEARCHSWARM_TERRANVEHICLEANDSHIPWEAPONSLEVEL1 = 2294
    ARMORYRESEARCHSWARM_TERRANVEHICLEANDSHIPWEAPONSLEVEL2 = 2295
    ARMORYRESEARCHSWARM_TERRANVEHICLEANDSHIPWEAPONSLEVEL3 = 2296
    ARMORYRESEARCHSWARM_TERRANVEHICLEANDSHIPPLATINGLEVEL1 = 2297
    ARMORYRESEARCHSWARM_TERRANVEHICLEANDSHIPPLATINGLEVEL2 = 2298
    ARMORYRESEARCHSWARM_TERRANVEHICLEANDSHIPPLATINGLEVEL3 = 2299
    CAUSTICSPRAY_CAUSTICSPRAY = 2324
    ORACLECLOAKINGFIELDTARGETED_ORACLECLOAKINGFIELDTARGETED = 2326
    EFFECT_IMMORTALBARRIER = 2328
    MORPHTORAVAGER_RAVAGER = 2330
    CANCEL_MORPHRAVAGER = 2331
    MORPH_LURKER = 2332
    CANCEL_MORPHLURKER = 2333
    ORACLEPHASESHIFT_ORACLEPHASESHIFT = 2334
    RELEASEINTERCEPTORS_RELEASEINTERCEPTORS = 2336
    EFFECT_CORROSIVEBILE = 2338
    BURROWDOWN_RAVAGER = 2340
    BURROWRAVAGERDOWN_CANCEL = 2341
    BURROWUP_RAVAGER = 2342
    PURIFICATIONNOVA_PURIFICATIONNOVA = 2344
    EFFECT_PURIFICATIONNOVA = 2346
    IMPALE_IMPALE = 2348
    LOCKON_LOCKON = 2350
    LOCKONAIR_LOCKONAIR = 2352
    CANCEL_LOCKON = 2354
    CORRUPTIONBOMB_CORRUPTIONBOMB = 2356
    CORRUPTIONBOMB_CANCEL = 2357
    EFFECT_TACTICALJUMP = 2358
    OVERCHARGE_OVERCHARGE = 2360
    MORPH_THORHIGHIMPACTMODE = 2362
    THORAPMODE_CANCEL = 2363
    MORPH_THOREXPLOSIVEMODE = 2364
    CANCEL_MORPHTHOREXPLOSIVEMODE = 2365
    LIGHTOFAIUR_LIGHTOFAIUR = 2366
    EFFECT_MASSRECALL_MOTHERSHIP = 2368
    LOAD_NYDUSWORM = 2370
    UNLOADALL_NYDUSWORM = 2371
    BEHAVIOR_PULSARBEAMON = 2375
    BEHAVIOR_PULSARBEAMOFF = 2376
    PULSARBEAM_RIPFIELD = 2377
    PULSARCANNON_PULSARCANNON = 2379
    VOIDSWARMHOSTSPAWNLOCUST_VOIDSWARMHOSTSPAWNLOCUST = 2381
    LOCUSTMPFLYINGMORPHTOGROUND_LOCUSTMPFLYINGSWOOP = 2383
    LOCUSTMPMORPHTOAIR_LOCUSTMPFLYINGSWOOP = 2385
    EFFECT_LOCUSTSWOOP = 2387
    HALLUCINATION_DISRUPTOR = 2389
    HALLUCINATION_ADEPT = 2391
    EFFECT_VOIDRAYPRISMATICALIGNMENT = 2393
    AIURLIGHTBRIDGENE8OUT_BRIDGEEXTEND = 2397
    AIURLIGHTBRIDGENE8_BRIDGERETRACT = 2399
    AIURLIGHTBRIDGENE10OUT_BRIDGEEXTEND = 2401
    AIURLIGHTBRIDGENE10_BRIDGERETRACT = 2403
    AIURLIGHTBRIDGENE12OUT_BRIDGEEXTEND = 2405
    AIURLIGHTBRIDGENE12_BRIDGERETRACT = 2407
    AIURLIGHTBRIDGENW8OUT_BRIDGEEXTEND = 2409
    AIURLIGHTBRIDGENW8_BRIDGERETRACT = 2411
    AIURLIGHTBRIDGENW10OUT_BRIDGEEXTEND = 2413
    AIURLIGHTBRIDGENW10_BRIDGERETRACT = 2415
    AIURLIGHTBRIDGENW12OUT_BRIDGEEXTEND = 2417
    AIURLIGHTBRIDGENW12_BRIDGERETRACT = 2419
    AIURTEMPLEBRIDGENE8OUT_BRIDGEEXTEND = 2421
    AIURTEMPLEBRIDGENE8_BRIDGERETRACT = 2423
    AIURTEMPLEBRIDGENE10OUT_BRIDGEEXTEND = 2425
    AIURTEMPLEBRIDGENE10_BRIDGERETRACT = 2427
    AIURTEMPLEBRIDGENE12OUT_BRIDGEEXTEND = 2429
    AIURTEMPLEBRIDGENE12_BRIDGERETRACT = 2431
    AIURTEMPLEBRIDGENW8OUT_BRIDGEEXTEND = 2433
    AIURTEMPLEBRIDGENW8_BRIDGERETRACT = 2435
    AIURTEMPLEBRIDGENW10OUT_BRIDGEEXTEND = 2437
    AIURTEMPLEBRIDGENW10_BRIDGERETRACT = 2439
    AIURTEMPLEBRIDGENW12OUT_BRIDGEEXTEND = 2441
    AIURTEMPLEBRIDGENW12_BRIDGERETRACT = 2443
    SHAKURASLIGHTBRIDGENE8OUT_BRIDGEEXTEND = 2445
    SHAKURASLIGHTBRIDGENE8_BRIDGERETRACT = 2447
    SHAKURASLIGHTBRIDGENE10OUT_BRIDGEEXTEND = 2449
    SHAKURASLIGHTBRIDGENE10_BRIDGERETRACT = 2451
    SHAKURASLIGHTBRIDGENE12OUT_BRIDGEEXTEND = 2453
    SHAKURASLIGHTBRIDGENE12_BRIDGERETRACT = 2455
    SHAKURASLIGHTBRIDGENW8OUT_BRIDGEEXTEND = 2457
    SHAKURASLIGHTBRIDGENW8_BRIDGERETRACT = 2459
    SHAKURASLIGHTBRIDGENW10OUT_BRIDGEEXTEND = 2461
    SHAKURASLIGHTBRIDGENW10_BRIDGERETRACT = 2463
    SHAKURASLIGHTBRIDGENW12OUT_BRIDGEEXTEND = 2465
    SHAKURASLIGHTBRIDGENW12_BRIDGERETRACT = 2467
    VOIDMPIMMORTALREVIVEREBUILD_IMMORTAL = 2469
    VOIDMPIMMORTALREVIVEDEATH_IMMORTAL = 2471
    ARBITERMPSTASISFIELD_ARBITERMPSTASISFIELD = 2473
    ARBITERMPRECALL_ARBITERMPRECALL = 2475
    CORSAIRMPDISRUPTIONWEB_CORSAIRMPDISRUPTIONWEB = 2477
    MORPHTOGUARDIANMP_MORPHTOGUARDIANMP = 2479
    MORPHTOGUARDIANMP_CANCEL = 2480
    MORPHTODEVOURERMP_MORPHTODEVOURERMP = 2481
    MORPHTODEVOURERMP_CANCEL = 2482
    DEFILERMPCONSUME_DEFILERMPCONSUME = 2483
    DEFILERMPDARKSWARM_DEFILERMPDARKSWARM = 2485
    DEFILERMPPLAGUE_DEFILERMPPLAGUE = 2487
    DEFILERMPBURROW_BURROWDOWN = 2489
    DEFILERMPBURROW_CANCEL = 2490
    DEFILERMPUNBURROW_BURROWUP = 2491
    QUEENMPENSNARE_QUEENMPENSNARE = 2493
    QUEENMPSPAWNBROODLINGS_QUEENMPSPAWNBROODLINGS = 2495
    QUEENMPINFESTCOMMANDCENTER_QUEENMPINFESTCOMMANDCENTER = 2497
    LIGHTNINGBOMB_LIGHTNINGBOMB = 2499
    GRAPPLE_GRAPPLE = 2501
    ORACLESTASISTRAP_ORACLEBUILDSTASISTRAP = 2503
    BUILD_STASISTRAP = 2505
    CANCEL_STASISTRAP = 2535
    ORACLESTASISTRAPACTIVATE_ACTIVATESTASISWARD = 2536
    SELFREPAIR_SELFREPAIR = 2538
    SELFREPAIR_CANCEL = 2539
    AGGRESSIVEMUTATION_AGGRESSIVEMUTATION = 2540
    PARASITICBOMB_PARASITICBOMB = 2542
    ADEPTPHASESHIFT_ADEPTPHASESHIFT = 2544
    PURIFICATIONNOVAMORPH_PURIFICATIONNOVA = 2546
    PURIFICATIONNOVAMORPHBACK_PURIFICATIONNOVA = 2548
    BEHAVIOR_HOLDFIREON_LURKER = 2550
    BEHAVIOR_HOLDFIREOFF_LURKER = 2552
    LIBERATORMORPHTOAG_LIBERATORAGMODE = 2554
    LIBERATORMORPHTOAA_LIBERATORAAMODE = 2556
    MORPH_LIBERATORAGMODE = 2558
    MORPH_LIBERATORAAMODE = 2560
    TIMESTOP_TIMESTOP = 2562
    TIMESTOP_CANCEL = 2563
    AIURLIGHTBRIDGEABANDONEDNE8OUT_BRIDGEEXTEND = 2564
    AIURLIGHTBRIDGEABANDONEDNE8_BRIDGERETRACT = 2566
    AIURLIGHTBRIDGEABANDONEDNE10OUT_BRIDGEEXTEND = 2568
    AIURLIGHTBRIDGEABANDONEDNE10_BRIDGERETRACT = 2570
    AIURLIGHTBRIDGEABANDONEDNE12OUT_BRIDGEEXTEND = 2572
    AIURLIGHTBRIDGEABANDONEDNE12_BRIDGERETRACT = 2574
    AIURLIGHTBRIDGEABANDONEDNW8OUT_BRIDGEEXTEND = 2576
    AIURLIGHTBRIDGEABANDONEDNW8_BRIDGERETRACT = 2578
    AIURLIGHTBRIDGEABANDONEDNW10OUT_BRIDGEEXTEND = 2580
    AIURLIGHTBRIDGEABANDONEDNW10_BRIDGERETRACT = 2582
    AIURLIGHTBRIDGEABANDONEDNW12OUT_BRIDGEEXTEND = 2584
    AIURLIGHTBRIDGEABANDONEDNW12_BRIDGERETRACT = 2586
    KD8CHARGE_KD8CHARGE = 2588
    PENETRATINGSHOT_PENETRATINGSHOT = 2590
    CLOAKINGDRONE_CLOAKINGDRONE = 2592
    CANCEL_ADEPTPHASESHIFT = 2594
    CANCEL_ADEPTSHADEPHASESHIFT = 2596
    SLAYNELEMENTALGRAB_SLAYNELEMENTALGRAB = 2598
    MORPHTOCOLLAPSIBLEPURIFIERTOWERDEBRIS_CANCEL = 2601
    PORTCITY_BRIDGE_UNITNE8OUT_BRIDGEEXTEND = 2602
    PORTCITY_BRIDGE_UNITNE8_BRIDGERETRACT = 2604
    PORTCITY_BRIDGE_UNITSE8OUT_BRIDGEEXTEND = 2606
    PORTCITY_BRIDGE_UNITSE8_BRIDGERETRACT = 2608
    PORTCITY_BRIDGE_UNITNW8OUT_BRIDGEEXTEND = 2610
    PORTCITY_BRIDGE_UNITNW8_BRIDGERETRACT = 2612
    PORTCITY_BRIDGE_UNITSW8OUT_BRIDGEEXTEND = 2614
    PORTCITY_BRIDGE_UNITSW8_BRIDGERETRACT = 2616
    PORTCITY_BRIDGE_UNITNE10OUT_BRIDGEEXTEND = 2618
    PORTCITY_BRIDGE_UNITNE10_BRIDGERETRACT = 2620
    PORTCITY_BRIDGE_UNITSE10OUT_BRIDGEEXTEND = 2622
    PORTCITY_BRIDGE_UNITSE10_BRIDGERETRACT = 2624
    PORTCITY_BRIDGE_UNITNW10OUT_BRIDGEEXTEND = 2626
    PORTCITY_BRIDGE_UNITNW10_BRIDGERETRACT = 2628
    PORTCITY_BRIDGE_UNITSW10OUT_BRIDGEEXTEND = 2630
    PORTCITY_BRIDGE_UNITSW10_BRIDGERETRACT = 2632
    PORTCITY_BRIDGE_UNITNE12OUT_BRIDGEEXTEND = 2634
    PORTCITY_BRIDGE_UNITNE12_BRIDGERETRACT = 2636
    PORTCITY_BRIDGE_UNITSE12OUT_BRIDGEEXTEND = 2638
    PORTCITY_BRIDGE_UNITSE12_BRIDGERETRACT = 2640
    PORTCITY_BRIDGE_UNITNW12OUT_BRIDGEEXTEND = 2642
    PORTCITY_BRIDGE_UNITNW12_BRIDGERETRACT = 2644
    PORTCITY_BRIDGE_UNITSW12OUT_BRIDGEEXTEND = 2646
    PORTCITY_BRIDGE_UNITSW12_BRIDGERETRACT = 2648
    PORTCITY_BRIDGE_UNITN8OUT_BRIDGEEXTEND = 2650
    PORTCITY_BRIDGE_UNITN8_BRIDGERETRACT = 2652
    PORTCITY_BRIDGE_UNITS8OUT_BRIDGEEXTEND = 2654
    PORTCITY_BRIDGE_UNITS8_BRIDGERETRACT = 2656
    PORTCITY_BRIDGE_UNITE8OUT_BRIDGEEXTEND = 2658
    PORTCITY_BRIDGE_UNITE8_BRIDGERETRACT = 2660
    PORTCITY_BRIDGE_UNITW8OUT_BRIDGEEXTEND = 2662
    PORTCITY_BRIDGE_UNITW8_BRIDGERETRACT = 2664
    PORTCITY_BRIDGE_UNITN10OUT_BRIDGEEXTEND = 2666
    PORTCITY_BRIDGE_UNITN10_BRIDGERETRACT = 2668
    PORTCITY_BRIDGE_UNITS10OUT_BRIDGEEXTEND = 2670
    PORTCITY_BRIDGE_UNITS10_BRIDGERETRACT = 2672
    PORTCITY_BRIDGE_UNITE10OUT_BRIDGEEXTEND = 2674
    PORTCITY_BRIDGE_UNITE10_BRIDGERETRACT = 2676
    PORTCITY_BRIDGE_UNITW10OUT_BRIDGEEXTEND = 2678
    PORTCITY_BRIDGE_UNITW10_BRIDGERETRACT = 2680
    PORTCITY_BRIDGE_UNITN12OUT_BRIDGEEXTEND = 2682
    PORTCITY_BRIDGE_UNITN12_BRIDGERETRACT = 2684
    PORTCITY_BRIDGE_UNITS12OUT_BRIDGEEXTEND = 2686
    PORTCITY_BRIDGE_UNITS12_BRIDGERETRACT = 2688
    PORTCITY_BRIDGE_UNITE12OUT_BRIDGEEXTEND = 2690
    PORTCITY_BRIDGE_UNITE12_BRIDGERETRACT = 2692
    PORTCITY_BRIDGE_UNITW12OUT_BRIDGEEXTEND = 2694
    PORTCITY_BRIDGE_UNITW12_BRIDGERETRACT = 2696
    TEMPESTDISRUPTIONBLAST_TEMPESTDISRUPTIONBLAST = 2698
    CANCEL_TEMPESTDISRUPTIONBLAST = 2699
    EFFECT_SHADOWSTRIDE = 2700
    EFFECT_SPAWNLOCUSTS = 2704
    LOCUSTMPFLYINGSWOOPATTACK_LOCUSTMPFLYINGSWOOP = 2706
    MORPH_OVERLORDTRANSPORT = 2708
    CANCEL_MORPHOVERLORDTRANSPORT = 2709
    EFFECT_GHOSTSNIPE = 2714
    PURIFYMORPHPYLON_MOTHERSHIPCOREWEAPON = 2716
    PURIFYMORPHPYLONBACK_MOTHERSHIPCOREWEAPON = 2718
    RESEARCH_SHADOWSTRIKE = 2720
    HEAL_MEDICHEAL = 2750
    LURKERASPECT_LURKER = 2752
    LURKERASPECT_CANCEL = 2753
    BURROWLURKERDOWN_BURROWDOWN = 2754
    BURROWLURKERDOWN_CANCEL = 2755
    BURROWLURKERUP_BURROWUP = 2756
    D8CHARGE_D8CHARGE = 2758
    DEFENSIVEMATRIX_DEFENSIVEMATRIX = 2760
    MISSILEPODS_MISSILEPODS = 2762
    LOKIMISSILEPODS_MISSILEPODS = 2764
    HUTTRANSPORT_HUTLOAD = 2766
    HUTTRANSPORT_HUTUNLOADALL = 2767
    LEVIATHANSPAWNBROODLORD_SPAWNBROODLORD = 2773
    SS_CARRIERBOSSATTACKLAUNCH_SS_SHOOTING = 2775
    SS_CARRIERSPAWNINTERCEPTOR_SS_CARRIERSPAWNINTERCEPTOR = 2777
    SS_CARRIERBOSSATTACKTARGET_SS_SHOOTING = 2779
    SS_FIGHTERBOMB_SS_FIGHTERBOMB = 2781
    SS_PHOENIXSHOOTING_SS_SHOOTING = 2785
    SS_BATTLECRUISERMISSILEATTACK_SS_SHOOTING = 2789
    SS_LEVIATHANSPAWNBOMBS_SS_LEVIATHANSPAWNBOMBS = 2791
    SS_BATTLECRUISERHUNTERSEEKERATTACK_SS_SHOOTING = 2793
    SS_LEVIATHANTENTACLEATTACKL1NODELAY_SS_LEVIATHANTENTACLEATTACKL1NODELAY = 2797
    SS_LEVIATHANTENTACLEATTACKL2NODELAY_SS_LEVIATHANTENTACLEATTACKL2NODELAY = 2799
    SS_LEVIATHANTENTACLEATTACKR1NODELAY_SS_LEVIATHANTENTACLEATTACKR1NODELAY = 2801
    SS_LEVIATHANTENTACLEATTACKR2NODELAY_SS_LEVIATHANTENTACLEATTACKR2NODELAY = 2803
    SS_SCIENCEVESSELTELEPORT_ZERATULBLINK = 2805
    SS_TERRATRONBEAMATTACK_SS_TERRATRONBEAMATTACK = 2807
    SS_TERRATRONSAWATTACK_SS_TERRATRONSAWATTACK = 2809
    SS_WRAITHATTACK_SS_SHOOTING = 2811
    SS_SWARMGUARDIANATTACK_SS_SHOOTING = 2813
    SS_SCOUTATTACK_SS_SHOOTING = 2819
    SS_INTERCEPTORATTACK_SS_SHOOTING = 2821
    SS_CORRUPTORATTACK_SS_SHOOTING = 2823
    SS_LEVIATHANTENTACLEATTACKL2_SS_LEVIATHANTENTACLEATTACKL2 = 2825
    SS_LEVIATHANTENTACLEATTACKR1_SS_LEVIATHANTENTACLEATTACKR1 = 2827
    SS_LEVIATHANTENTACLEATTACKL1_SS_LEVIATHANTENTACLEATTACKL1 = 2829
    SS_LEVIATHANTENTACLEATTACKR2_SS_LEVIATHANTENTACLEATTACKR2 = 2831
    SS_SCIENCEVESSELATTACK_SS_SHOOTING = 2833
    LURKERASPECTFROMHYDRALISKBURROWED_LURKERFROMHYDRALISKBURROWED = 2836
    LURKERASPECTFROMHYDRALISKBURROWED_CANCEL = 2837
    UPGRADETOLURKERDEN_LURKERDEN = 2838
    UPGRADETOLURKERDEN_CANCEL = 2839
    ADVANCEDCONSTRUCTION_CANCEL = 2841
    BUILDINPROGRESSNONCANCELLABLE_CANCEL = 2843
    INFESTEDVENTSPAWNCORRUPTOR_SPAWNCORRUPTOR = 2844
    INFESTEDVENTSPAWNBROODLORD_SPAWNBROODLORD = 2846
    IRRADIATE_IRRADIATE = 2848
    IRRADIATE_CANCEL = 2849
    INFESTEDVENTSPAWNMUTALISK_LEVIATHANSPAWNMUTALISK = 2850
    MAKEVULTURESPIDERMINES_SPIDERMINEREPLENISH = 2852
    MEDIVACDOUBLEBEAMHEAL_HEAL = 2872
    MINDCONTROL_MINDCONTROL = 2874
    OBLITERATE_OBLITERATE = 2876
    VOODOOSHIELD_VOODOOSHIELD = 2878
    RELEASEMINION_RELEASEMINION = 2880
    ULTRASONICPULSE_ULTRASONICPULSE = 2882
    ARCHIVESEAL_ARCHIVESEAL = 2884
    ARTANISVORTEX_VORTEX = 2886
    ARTANISWORMHOLETRANSIT_WORMHOLETRANSIT = 2888
    BUNKERATTACK_BUNKERATTACK = 2890
    BUNKERATTACK_ATTACKTOWARDS = 2891
    BUNKERATTACK_ATTACKBARRAGE = 2892
    BUNKERSTOP_STOPBUNKER = 2893
    BUNKERSTOP_HOLDFIRESPECIAL = 2894
    CANCELTERRAZINEHARVEST_CANCEL = 2899
    LEVIATHANSPAWNMUTALISK_LEVIATHANSPAWNMUTALISK = 2901
    PARKCOLONISTVEHICLE_PARKCOLONISTVEHICLE = 2903
    STARTCOLONISTVEHICLE_STARTCOLONISTVEHICLE = 2905
    CONSUMPTION_CONSUMPTION = 2907
    CONSUMEDNA_CONSUMEDNA = 2909
    EGGPOP_EGGPOP = 2911
    EXPERIMENTALPLASMAGUN_EXPERIMENTALPLASMAGUN = 2913
    GATHERSPECIALOBJECT_GATHERSPECIALOBJECT = 2915
    LOKIUNDOCK_LIFT = 2919
    MINDBLAST_MINDBLAST = 2921
    MORPHTOINFESTEDCIVILIAN_MORPHTOINFESTEDCIVILIAN = 2923
    QUEENSHOCKWAVE_QUEENSHOCKWAVE = 2925
    TAURENOUTHOUSELIFTOFF_TAURENOUTHOUSEFLY = 2927
    TAURENOUTHOUSETRANSPORT_LOADTAURENOUTHOUSE = 2929
    TAURENOUTHOUSETRANSPORT_UNLOADTAURENOUTHOUSE = 2930
    TYCHUS03OMEGASTORM_OMEGASTORM = 2934
    RAYNORSNIPE_RAYNORSNIPE = 2936
    BONESHEAL_BONESHEAL = 2938
    BONESTOSSGRENADE_TOSSGRENADETYCHUS = 2940
    HERCULESTRANSPORT_MEDIVACLOAD = 2942
    HERCULESTRANSPORT_MEDIVACUNLOADALL = 2944
    SPECOPSDROPSHIPTRANSPORT_MEDIVACLOAD = 2947
    SPECOPSDROPSHIPTRANSPORT_MEDIVACUNLOADALL = 2949
    DUSKWINGBANSHEECLOAKINGFIELD_CLOAKONBANSHEE = 2952
    DUSKWINGBANSHEECLOAKINGFIELD_CLOAKOFF = 2953
    HYPERIONYAMATOSPECIAL_HYPERIONYAMATOGUN = 2954
    INFESTABLEHUTTRANSPORT_HUTLOAD = 2956
    INFESTABLEHUTTRANSPORT_HUTUNLOADALL = 2957
    DUTCHPLACETURRET_DUTCHPLACETURRET = 2961
    BURROWINFESTEDCIVILIANDOWN_BURROWDOWN = 2963
    BURROWINFESTEDCIVILIANUP_BURROWUP = 2965
    SELENDISHANGAR_INTERCEPTOR = 2967
    SIEGEBREAKERSIEGE_SIEGEMODE = 2989
    SIEGEBREAKERUNSIEGE_UNSIEGE = 2991
    SOULCHANNEL_CANCEL = 2994
    SENTRYGUNBURROW_BURROWTURRET = 2999
    SENTRYGUNUNBURROW_UNBURROWTURRET = 3001
    GRAVITONPRISON_GRAVITONPRISON = 3005
    IMPLOSION_IMPLOSION = 3007
    OMEGASTORM_OMEGASTORM = 3009
    PSIONICSHOCKWAVE_PSIONICSHOCKWAVE = 3011
    HYBRIDFAOESTUN_HYBRIDFAOESTUN = 3013
    SUMMONMERCENARIES_HIREKELMORIANMINERS = 3015
    SUMMONMERCENARIES_HIREDEVILDOGS = 3016
    SUMMONMERCENARIES_HIRESPARTANCOMPANY = 3017
    SUMMONMERCENARIES_HIREHAMMERSECURITIES = 3018
    SUMMONMERCENARIES_HIRESIEGEBREAKERS = 3019
    SUMMONMERCENARIES_HIREHELSANGELS = 3020
    SUMMONMERCENARIES_HIREDUSKWING = 3021
    SUMMONMERCENARIES_HIREDUKESREVENGE = 3022
    SUMMONMERCENARIESPH_HIREKELMORIANMINERSPH = 3045
    ENERGYNOVA_ENERGYNOVA = 3075
    THEMOROSDEVICE_THEMOROSDEVICE = 3077
    TOSSGRENADE_TOSSGRENADE = 3079
    VOIDSEEKERTRANSPORT_MEDIVACLOAD = 3081
    VOIDSEEKERTRANSPORT_MEDIVACUNLOADALL = 3083
    TERRANBUILDDROP_SUPPLYDEPOTDROP = 3086
    TERRANBUILDDROP_CANCEL = 3116
    ODINNUCLEARSTRIKE_ODINNUKECALLDOWN = 3117
    ODINNUCLEARSTRIKE_CANCEL = 3118
    ODINWRECKAGE_ODIN = 3119
    RESEARCHLABTRANSPORT_HUTLOAD = 3121
    RESEARCHLABTRANSPORT_HUTUNLOADALL = 3122
    COLONYSHIPTRANSPORT_MEDIVACLOAD = 3126
    COLONYSHIPTRANSPORT_MEDIVACUNLOADALL = 3128
    COLONYINFESTATION_COLONYINFESTATION = 3131
    DOMINATION_DOMINATION = 3133
    DOMINATION_CANCEL = 3134
    KARASSPLASMASURGE_KARASSPLASMASURGE = 3135
    KARASSPSISTORM_PSISTORM = 3137
    HYBRIDBLINK_ZERATULBLINK = 3139
    HYBRIDCPLASMABLAST_HYBRIDCPLASMABLAST = 3141
    HEROARMNUKE_NUKEARM = 3143
    HERONUCLEARSTRIKE_NUKECALLDOWN = 3163
    HERONUCLEARSTRIKE_CANCEL = 3164
    ODINBARRAGE_ODINBARRAGE = 3165
    ODINBARRAGE_CANCEL = 3166
    PURIFIERTOGGLEPOWER_PURIFIERPOWERDOWN = 3167
    PURIFIERTOGGLEPOWER_PURIFIERPOWERUP = 3168
    PHASEMINEBLAST_PHASEMINEBLAST = 3169
    VOIDSEEKERPHASEMINEBLAST_PHASEMINEBLAST = 3171
    TRANSPORTTRUCKTRANSPORT_TRANSPORTTRUCKLOAD = 3173
    TRANSPORTTRUCKTRANSPORT_TRANSPORTTRUCKUNLOADALL = 3174
    VAL03QUEENOFBLADESBURROW_BURROWDOWN = 3178
    VAL03QUEENOFBLADESDEEPTUNNEL_DEEPTUNNEL = 3180
    VAL03QUEENOFBLADESUNBURROW_BURROWUP = 3182
    LOKIYAMATO_LOKIYAMATOGUN = 3188
    DUKESREVENGEYAMATO_YAMATOGUN = 3190
    ZERATULBLINK_ZERATULBLINK = 3192
    ROGUEGHOSTCLOAK_CLOAKONSPECTRE = 3194
    ROGUEGHOSTCLOAK_CLOAKOFF = 3195
    VULTURESPIDERMINES_SPIDERMINE = 3196
    VULTUREQUEUE3_CANCEL = 3198
    VULTUREQUEUE3_CANCELSLOT = 3199
    SUPERWARPGATETRAIN_ZEALOT = 3200
    SUPERWARPGATETRAIN_STALKER = 3201
    SUPERWARPGATETRAIN_IMMORTAL = 3202
    SUPERWARPGATETRAIN_HIGHTEMPLAR = 3203
    SUPERWARPGATETRAIN_DARKTEMPLAR = 3204
    SUPERWARPGATETRAIN_SENTRY = 3205
    SUPERWARPGATETRAIN_CARRIER = 3206
    SUPERWARPGATETRAIN_PHOENIX = 3207
    SUPERWARPGATETRAIN_VOIDRAY = 3208
    SUPERWARPGATETRAIN_ARCHON = 3209
    SUPERWARPGATETRAIN_WARPINZERATUL = 3210
    SUPERWARPGATETRAIN_WARPINURUN = 3211
    SUPERWARPGATETRAIN_WARPINMOHANDAR = 3212
    SUPERWARPGATETRAIN_WARPINSELENDIS = 3213
    SUPERWARPGATETRAIN_WARPINSCOUT = 3214
    SUPERWARPGATETRAIN_COLOSSUS = 3215
    SUPERWARPGATETRAIN_WARPPRISM = 3216
    BURROWOMEGALISKDOWN_BURROWDOWN = 3220
    BURROWOMEGALISKUP_BURROWUP = 3222
    BURROWINFESTEDABOMINATIONDOWN_BURROWDOWN = 3224
    BURROWINFESTEDABOMINATIONUP_BURROWUP = 3226
    BURROWHUNTERKILLERDOWN_BURROWDOWN = 3228
    BURROWHUNTERKILLERDOWN_CANCEL = 3229
    BURROWHUNTERKILLERUP_BURROWUP = 3230
    NOVASNIPE_NOVASNIPE = 3232
    VORTEXPURIFIER_VORTEX = 3234
    TALDARIMVORTEX_VORTEX = 3236
    PURIFIERPLANETCRACKER_PLANETCRACKER = 3238
    BURROWINFESTEDTERRANCAMPAIGNDOWN_BURROWDOWN = 3240
    BURROWINFESTEDTERRANCAMPAIGNUP_BURROWUP = 3242
    INFESTEDMONSTERTRAIN_INFESTEDCIVILIAN = 3244
    INFESTEDMONSTERTRAIN_INFESTEDTERRANCAMPAIGN = 3245
    INFESTEDMONSTERTRAIN_INFESTEDABOMINATION = 3246
    BIODOMETRANSPORT_BIODOMELOAD = 3274
    BIODOMETRANSPORT_BIODOMEUNLOADALL = 3275
    ATTACKALLOWSINVULNERABLE_ATTACKALLOWSINVULNERABLE = 3295
    ATTACKALLOWSINVULNERABLE_ATTACKTOWARDS = 3296
    ATTACKALLOWSINVULNERABLE_ATTACKBARRAGE = 3297
    ZERATULSTUN_ZERATULSTUN = 3298
    WRAITHCLOAK_CLOAKOFF = 3301
    BARRACKSTECHREACTORMORPH_TECHLABBARRACKS = 3304
    FACTORYTECHREACTORMORPH_TECHLABFACTORY = 3306
    STARPORTTECHREACTORMORPH_TECHLABSTARPORT = 3308
    SS_FIGHTERSHOOTING_SS_SHOOTING = 3310
    RAYNORC4_PLANTC4CHARGE = 3312
    DUKESREVENGEDEFENSIVEMATRIX_DEFENSIVEMATRIX = 3314
    DUKESREVENGEMISSILEPODS_MISSILEPODS = 3316
    THORWRECKAGE_THOR = 3318
    _330MMBARRAGECANNONS_330MMBARRAGECANNONS = 3320
    _330MMBARRAGECANNONS_CANCEL = 3321
    THORREBORN_THOR = 3322
    THORREBORN_CANCEL = 3323
    SPECTRENUKE_SPECTRENUKECALLDOWN = 3324
    SPECTRENUKE_CANCEL = 3325
    SPECTRENUKESILOARMMAGAZINE_SPECTRENUKEARM = 3327
    COLONISTSHIPLIFTOFF_LIFT = 3346
    COLONISTSHIPLAND_LAND = 3348
    BIODOMECOMMANDLIFTOFF_LIFT = 3350
    BIODOMECOMMANDLAND_LAND = 3352
    HERCULESLIFTOFF_LIFT = 3354
    HERCULESLAND_HERCULESLAND = 3356
    LIGHTBRIDGEOFF_LIGHTBRIDGEOFF = 3358
    LIGHTBRIDGEON_LIGHTBRIDGEON = 3360
    LIBRARYDOWN_LIBRARYDOWN = 3362
    LIBRARYUP_LIBRARYUP = 3364
    TEMPLEDOORDOWN_TEMPLEDOORDOWN = 3366
    TEMPLEDOORUP_TEMPLEDOORUP = 3368
    TEMPLEDOORDOWNURDL_TEMPLEDOORDOWNURDL = 3370
    TEMPLEDOORUPURDL_TEMPLEDOORUPURDL = 3372
    PSYTROUSOXIDE_PSYTROUSOXIDEON = 3374
    PSYTROUSOXIDE_PSYTROUSOXIDEOFF = 3375
    BIOPLASMIDDISCHARGE_BIOPLASMIDDISCHARGE = 3378
    WRECKINGCREWASSAULTMODE_ASSAULTMODE = 3380
    WRECKINGCREWFIGHTERMODE_FIGHTERMODE = 3382
    BIOSTASIS_BIOSTASIS = 3384
    COLONISTTRANSPORTTRANSPORT_COLONISTTRANSPORTLOAD = 3386
    COLONISTTRANSPORTTRANSPORT_COLONISTTRANSPORTUNLOADALL = 3387
    DROPTOSUPPLYDEPOT_RAISE = 3391
    REFINERYTOAUTOMATEDREFINERY_RAISE = 3393
    HELIOSCRASHMORPH_CRASHMORPH = 3395
    NANOREPAIR_HEAL = 3397
    PICKUP_PICKUP = 3399
    PICKUPARCADE_PICKUP = 3401
    PICKUPGAS100_PICKUPGAS100 = 3403
    PICKUPMINERALS100_PICKUPMINERALS100 = 3405
    TAURENSTIMPACK_STIM = 3423
    TESTREVIVE_SCV = 3474
    TESTINTERACT_DESIGNATE = 3514
    CLIFFDOOROPEN0_SPACEPLATFORMDOOROPEN = 3515
    CLIFFDOORCLOSE0_SPACEPLATFORMDOORCLOSE = 3517
    CLIFFDOOROPEN1_SPACEPLATFORMDOOROPEN = 3519
    CLIFFDOORCLOSE1_SPACEPLATFORMDOORCLOSE = 3521
    DESTRUCTIBLEGATEDIAGONALBLURLOWERED_GATEOPEN = 3523
    DESTRUCTIBLEGATEDIAGONALULBRLOWERED_GATEOPEN = 3525
    DESTRUCTIBLEGATESTRAIGHTHORIZONTALBFLOWERED_GATEOPEN = 3527
    DESTRUCTIBLEGATESTRAIGHTHORIZONTALLOWERED_GATEOPEN = 3529
    DESTRUCTIBLEGATESTRAIGHTVERTICALLFLOWERED_GATEOPEN = 3531
    DESTRUCTIBLEGATESTRAIGHTVERTICALLOWERED_GATEOPEN = 3533
    DESTRUCTIBLEGATEDIAGONALBLUR_GATECLOSE = 3535
    DESTRUCTIBLEGATEDIAGONALULBR_GATECLOSE = 3537
    DESTRUCTIBLEGATESTRAIGHTHORIZONTALBF_GATECLOSE = 3539
    DESTRUCTIBLEGATESTRAIGHTHORIZONTAL_GATECLOSE = 3541
    DESTRUCTIBLEGATESTRAIGHTVERTICALLF_GATECLOSE = 3543
    DESTRUCTIBLEGATESTRAIGHTVERTICAL_GATECLOSE = 3545
    TESTLEARN_TESTLEARN = 3547
    TESTLEVELEDSPELL_YAMATOGUN = 3567
    METALGATEDIAGONALBLURLOWERED_GATEOPEN = 3569
    METALGATEDIAGONALULBRLOWERED_GATEOPEN = 3571
    METALGATESTRAIGHTHORIZONTALBFLOWERED_GATEOPEN = 3573
    METALGATESTRAIGHTHORIZONTALLOWERED_GATEOPEN = 3575
    METALGATESTRAIGHTVERTICALLFLOWERED_GATEOPEN = 3577
    METALGATESTRAIGHTVERTICALLOWERED_GATEOPEN = 3579
    METALGATEDIAGONALBLUR_GATECLOSE = 3581
    METALGATEDIAGONALULBR_GATECLOSE = 3583
    METALGATESTRAIGHTHORIZONTALBF_GATECLOSE = 3585
    METALGATESTRAIGHTHORIZONTAL_GATECLOSE = 3587
    METALGATESTRAIGHTVERTICALLF_GATECLOSE = 3589
    METALGATESTRAIGHTVERTICAL_GATECLOSE = 3591
    SECURITYGATEDIAGONALBLURLOWERED_GATEOPEN = 3593
    SECURITYGATEDIAGONALULBRLOWERED_GATEOPEN = 3595
    SECURITYGATESTRAIGHTHORIZONTALBFLOWERED_GATEOPEN = 3597
    SECURITYGATESTRAIGHTHORIZONTALLOWERED_GATEOPEN = 3599
    SECURITYGATESTRAIGHTVERTICALLFLOWERED_GATEOPEN = 3601
    SECURITYGATESTRAIGHTVERTICALLOWERED_GATEOPEN = 3603
    SECURITYGATEDIAGONALBLUR_GATECLOSE = 3605
    SECURITYGATEDIAGONALULBR_GATECLOSE = 3607
    SECURITYGATESTRAIGHTHORIZONTALBF_GATECLOSE = 3609
    SECURITYGATESTRAIGHTHORIZONTAL_GATECLOSE = 3611
    SECURITYGATESTRAIGHTVERTICALLF_GATECLOSE = 3613
    SECURITYGATESTRAIGHTVERTICAL_GATECLOSE = 3615
    CHANGESHRINETERRAN_CHANGESHRINETERRAN = 3617
    CHANGESHRINEPROTOSS_CHANGESHRINEPROTOSS = 3619
    SPECTREHOLDFIRE_SPECTREHOLDFIRE = 3621
    SPECTREWEAPONSFREE_WEAPONSFREE = 3623
    GWALEARN_TESTLEARN = 3626
    LIGHTBRIDGEOFFTOPRIGHT_LIGHTBRIDGEOFF = 3647
    LIGHTBRIDGEONTOPRIGHT_LIGHTBRIDGEON = 3649
    TESTHEROGRAB_GRABZERGLING = 3651
    TESTHEROTHROW_THROWZERGLING = 3653
    TESTHERODEBUGMISSILEABILITY_TESTHERODEBUGMISSILEABILITY = 3655
    TESTHERODEBUGTRACKINGABILITY_TESTHERODEBUGTRACKINGABILITY = 3657
    TESTHERODEBUGTRACKINGABILITY_CANCEL = 3658
    CANCEL = 3659
    HALT = 3660
    BURROWDOWN = 3661
    BURROWUP = 3662
    LOADALL = 3663
    UNLOADALL = 3664
    STOP = 3665
    HARVEST_GATHER = 3666
    HARVEST_RETURN = 3667
    LOAD = 3668
    UNLOADALLAT = 3669
    UNLOADUNIT = 3670
    CANCEL_LAST = 3671
    CANCEL_SLOT = 3672
    RALLY_UNITS = 3673
    ATTACK = 3674
    EFFECT_STIM = 3675
    BEHAVIOR_CLOAKON = 3676
    BEHAVIOR_CLOAKOFF = 3677
    LAND = 3678
    LIFT = 3679
    MORPH_ROOT = 3680
    MORPH_UPROOT = 3681
    BUILD_TECHLAB = 3682
    BUILD_REACTOR = 3683
    EFFECT_SPRAY = 3684
    EFFECT_REPAIR = 3685
    EFFECT_MASSRECALL = 3686
    EFFECT_BLINK = 3687
    BEHAVIOR_HOLDFIREON = 3688
    BEHAVIOR_HOLDFIREOFF = 3689
    RALLY_WORKERS = 3690
    BUILD_CREEPTUMOR = 3691
    RESEARCH_PROTOSSAIRARMOR = 3692
    RESEARCH_PROTOSSAIRWEAPONS = 3693
    RESEARCH_PROTOSSGROUNDARMOR = 3694
    RESEARCH_PROTOSSGROUNDWEAPONS = 3695
    RESEARCH_PROTOSSSHIELDS = 3696
    RESEARCH_TERRANINFANTRYARMOR = 3697
    RESEARCH_TERRANINFANTRYWEAPONS = 3698
    RESEARCH_TERRANSHIPWEAPONS = 3699
    RESEARCH_TERRANVEHICLEANDSHIPPLATING = 3700
    RESEARCH_TERRANVEHICLEWEAPONS = 3701
    RESEARCH_ZERGFLYERARMOR = 3702
    RESEARCH_ZERGFLYERATTACK = 3703
    RESEARCH_ZERGGROUNDARMOR = 3704
    RESEARCH_ZERGMELEEWEAPONS = 3705
    RESEARCH_ZERGMISSILEWEAPONS = 3706
    VOIDRAYSWARMDAMAGEBOOSTCANCEL_CANCEL = 3707
    RESEARCH_ADAPTIVETALONS = 3709
    MORPH_OBSERVERMODE = 3739
    MORPH_SURVEILLANCEMODE = 3741
    MORPH_OVERSIGHTMODE = 3743
    MORPH_OVERSEERMODE = 3745
    EFFECT_INTERFERENCEMATRIX = 3747
    EFFECT_REPAIRDRONE = 3749
    EFFECT_REPAIR_REPAIRDRONE = 3751
    EFFECT_ANTIARMORMISSILE = 3753
    EFFECT_CHRONOBOOSTENERGYCOST = 3755
    EFFECT_MASSRECALL_NEXUS = 3757
    NEXUSSHIELDRECHARGE_NEXUSSHIELDRECHARGE = 3759
    NEXUSSHIELDRECHARGEONPYLON_NEXUSSHIELDRECHARGEONPYLON = 3761
    INFESTORENSNARE_INFESTORENSNARE = 3763
    EFFECT_RESTORE = 3765
    NEXUSSHIELDOVERCHARGE_NEXUSSHIELDOVERCHARGE = 3767
    NEXUSSHIELDOVERCHARGEOFF_NEXUSSHIELDOVERCHARGEOFF = 3769
    BATTLECRUISERATTACK_ATTACK = 3771
    BATTLECRUISERATTACK_ATTACKTOWARDS = 3772
    BATTLECRUISERATTACK_ATTACKBARRAGE = 3773
    BATTLECRUISERATTACKEVALUATOR_MOTHERSHIPCOREATTACK = 3774
    BATTLECRUISERMOVE_MOVE = 3776
    BATTLECRUISERMOVE_MOVEPATROL = 3777
    BATTLECRUISERMOVE_MOVEHOLDPOSITION = 3778
    BATTLECRUISERMOVE_ACQUIREMOVE = 3779
    BATTLECRUISERMOVE_TURN = 3780
    BATTLECRUISERSTOPEVALUATOR_STOP = 3781
    BATTLECRUISERSTOP_STOP = 3783
    BATTLECRUISERSTOP_HOLDFIRE = 3784
    BATTLECRUISERSTOP_CHEER = 3785
    BATTLECRUISERSTOP_DANCE = 3786
    VIPERPARASITICBOMBRELAY_PARASITICBOMB = 3789
    PARASITICBOMBRELAYDODGE_PARASITICBOMB = 3791 class UnitTypeId(enum.Enum):
    NOTAUNIT = 0
    SYSTEM_SNAPSHOT_DUMMY = 1
    BALL = 2
    STEREOSCOPICOPTIONSUNIT = 3
    COLOSSUS = 4
    TECHLAB = 5
    REACTOR = 6
    INFESTORTERRAN = 7
    BANELINGCOCOON = 8
    BANELING = 9
    MOTHERSHIP = 10
    POINTDEFENSEDRONE = 11
    CHANGELING = 12
    CHANGELINGZEALOT = 13
    CHANGELINGMARINESHIELD = 14
    CHANGELINGMARINE = 15
    CHANGELINGZERGLINGWINGS = 16
    CHANGELINGZERGLING = 17
    COMMANDCENTER = 18
    SUPPLYDEPOT = 19
    REFINERY = 20
    BARRACKS = 21
    ENGINEERINGBAY = 22
    MISSILETURRET = 23
    BUNKER = 24
    SENSORTOWER = 25
    GHOSTACADEMY = 26
    FACTORY = 27
    STARPORT = 28
    ARMORY = 29
    FUSIONCORE = 30
    AUTOTURRET = 31
    SIEGETANKSIEGED = 32
    SIEGETANK = 33
    VIKINGASSAULT = 34
    VIKINGFIGHTER = 35
    COMMANDCENTERFLYING = 36
    BARRACKSTECHLAB = 37
    BARRACKSREACTOR = 38
    FACTORYTECHLAB = 39
    FACTORYREACTOR = 40
    STARPORTTECHLAB = 41
    STARPORTREACTOR = 42
    FACTORYFLYING = 43
    STARPORTFLYING = 44
    SCV = 45
    BARRACKSFLYING = 46
    SUPPLYDEPOTLOWERED = 47
    MARINE = 48
    REAPER = 49
    GHOST = 50
    MARAUDER = 51
    THOR = 52
    HELLION = 53
    MEDIVAC = 54
    BANSHEE = 55
    RAVEN = 56
    BATTLECRUISER = 57
    NUKE = 58
    NEXUS = 59
    PYLON = 60
    ASSIMILATOR = 61
    GATEWAY = 62
    FORGE = 63
    FLEETBEACON = 64
    TWILIGHTCOUNCIL = 65
    PHOTONCANNON = 66
    STARGATE = 67
    TEMPLARARCHIVE = 68
    DARKSHRINE = 69
    ROBOTICSBAY = 70
    ROBOTICSFACILITY = 71
    CYBERNETICSCORE = 72
    ZEALOT = 73
    STALKER = 74
    HIGHTEMPLAR = 75
    DARKTEMPLAR = 76
    SENTRY = 77
    PHOENIX = 78
    CARRIER = 79
    VOIDRAY = 80
    WARPPRISM = 81
    OBSERVER = 82
    IMMORTAL = 83
    PROBE = 84
    INTERCEPTOR = 85
    HATCHERY = 86
    CREEPTUMOR = 87
    EXTRACTOR = 88
    SPAWNINGPOOL = 89
    EVOLUTIONCHAMBER = 90
    HYDRALISKDEN = 91
    SPIRE = 92
    ULTRALISKCAVERN = 93
    INFESTATIONPIT = 94
    NYDUSNETWORK = 95
    BANELINGNEST = 96
    ROACHWARREN = 97
    SPINECRAWLER = 98
    SPORECRAWLER = 99
    LAIR = 100
    HIVE = 101
    GREATERSPIRE = 102
    EGG = 103
    DRONE = 104
    ZERGLING = 105
    OVERLORD = 106
    HYDRALISK = 107
    MUTALISK = 108
    ULTRALISK = 109
    ROACH = 110
    INFESTOR = 111
    CORRUPTOR = 112
    BROODLORDCOCOON = 113
    BROODLORD = 114
    BANELINGBURROWED = 115
    DRONEBURROWED = 116
    HYDRALISKBURROWED = 117
    ROACHBURROWED = 118
    ZERGLINGBURROWED = 119
    INFESTORTERRANBURROWED = 120
    REDSTONELAVACRITTERBURROWED = 121
    REDSTONELAVACRITTERINJUREDBURROWED = 122
    REDSTONELAVACRITTER = 123
    REDSTONELAVACRITTERINJURED = 124
    QUEENBURROWED = 125
    QUEEN = 126
    INFESTORBURROWED = 127
    OVERLORDCOCOON = 128
    OVERSEER = 129
    PLANETARYFORTRESS = 130
    ULTRALISKBURROWED = 131
    ORBITALCOMMAND = 132
    WARPGATE = 133
    ORBITALCOMMANDFLYING = 134
    FORCEFIELD = 135
    WARPPRISMPHASING = 136
    CREEPTUMORBURROWED = 137
    CREEPTUMORQUEEN = 138
    SPINECRAWLERUPROOTED = 139
    SPORECRAWLERUPROOTED = 140
    ARCHON = 141
    NYDUSCANAL = 142
    BROODLINGESCORT = 143
    GHOSTALTERNATE = 144
    GHOSTNOVA = 145
    RICHMINERALFIELD = 146
    RICHMINERALFIELD750 = 147
    URSADON = 148
    XELNAGATOWER = 149
    INFESTEDTERRANSEGG = 150
    LARVA = 151
    REAPERPLACEHOLDER = 152
    MARINEACGLUESCREENDUMMY = 153
    FIREBATACGLUESCREENDUMMY = 154
    MEDICACGLUESCREENDUMMY = 155
    MARAUDERACGLUESCREENDUMMY = 156
    VULTUREACGLUESCREENDUMMY = 157
    SIEGETANKACGLUESCREENDUMMY = 158
    VIKINGACGLUESCREENDUMMY = 159
    BANSHEEACGLUESCREENDUMMY = 160
    BATTLECRUISERACGLUESCREENDUMMY = 161
    ORBITALCOMMANDACGLUESCREENDUMMY = 162
    BUNKERACGLUESCREENDUMMY = 163
    BUNKERUPGRADEDACGLUESCREENDUMMY = 164
    MISSILETURRETACGLUESCREENDUMMY = 165
    HELLBATACGLUESCREENDUMMY = 166
    GOLIATHACGLUESCREENDUMMY = 167
    CYCLONEACGLUESCREENDUMMY = 168
    WRAITHACGLUESCREENDUMMY = 169
    SCIENCEVESSELACGLUESCREENDUMMY = 170
    HERCULESACGLUESCREENDUMMY = 171
    THORACGLUESCREENDUMMY = 172
    PERDITIONTURRETACGLUESCREENDUMMY = 173
    FLAMINGBETTYACGLUESCREENDUMMY = 174
    DEVASTATIONTURRETACGLUESCREENDUMMY = 175
    BLASTERBILLYACGLUESCREENDUMMY = 176
    SPINNINGDIZZYACGLUESCREENDUMMY = 177
    ZERGLINGKERRIGANACGLUESCREENDUMMY = 178
    RAPTORACGLUESCREENDUMMY = 179
    QUEENCOOPACGLUESCREENDUMMY = 180
    HYDRALISKACGLUESCREENDUMMY = 181
    HYDRALISKLURKERACGLUESCREENDUMMY = 182
    MUTALISKBROODLORDACGLUESCREENDUMMY = 183
    BROODLORDACGLUESCREENDUMMY = 184
    ULTRALISKACGLUESCREENDUMMY = 185
    TORRASQUEACGLUESCREENDUMMY = 186
    OVERSEERACGLUESCREENDUMMY = 187
    LURKERACGLUESCREENDUMMY = 188
    SPINECRAWLERACGLUESCREENDUMMY = 189
    SPORECRAWLERACGLUESCREENDUMMY = 190
    NYDUSNETWORKACGLUESCREENDUMMY = 191
    OMEGANETWORKACGLUESCREENDUMMY = 192
    ZERGLINGZAGARAACGLUESCREENDUMMY = 193
    SWARMLINGACGLUESCREENDUMMY = 194
    BANELINGACGLUESCREENDUMMY = 195
    SPLITTERLINGACGLUESCREENDUMMY = 196
    ABERRATIONACGLUESCREENDUMMY = 197
    SCOURGEACGLUESCREENDUMMY = 198
    CORRUPTORACGLUESCREENDUMMY = 199
    BILELAUNCHERACGLUESCREENDUMMY = 200
    SWARMQUEENACGLUESCREENDUMMY = 201
    ROACHACGLUESCREENDUMMY = 202
    ROACHVILEACGLUESCREENDUMMY = 203
    RAVAGERACGLUESCREENDUMMY = 204
    SWARMHOSTACGLUESCREENDUMMY = 205
    MUTALISKACGLUESCREENDUMMY = 206
    GUARDIANACGLUESCREENDUMMY = 207
    DEVOURERACGLUESCREENDUMMY = 208
    VIPERACGLUESCREENDUMMY = 209
    BRUTALISKACGLUESCREENDUMMY = 210
    LEVIATHANACGLUESCREENDUMMY = 211
    ZEALOTACGLUESCREENDUMMY = 212
    ZEALOTAIURACGLUESCREENDUMMY = 213
    DRAGOONACGLUESCREENDUMMY = 214
    HIGHTEMPLARACGLUESCREENDUMMY = 215
    ARCHONACGLUESCREENDUMMY = 216
    IMMORTALACGLUESCREENDUMMY = 217
    OBSERVERACGLUESCREENDUMMY = 218
    PHOENIXAIURACGLUESCREENDUMMY = 219
    REAVERACGLUESCREENDUMMY = 220
    TEMPESTACGLUESCREENDUMMY = 221
    PHOTONCANNONACGLUESCREENDUMMY = 222
    ZEALOTVORAZUNACGLUESCREENDUMMY = 223
    ZEALOTSHAKURASACGLUESCREENDUMMY = 224
    STALKERSHAKURASACGLUESCREENDUMMY = 225
    DARKTEMPLARSHAKURASACGLUESCREENDUMMY = 226
    CORSAIRACGLUESCREENDUMMY = 227
    VOIDRAYACGLUESCREENDUMMY = 228
    VOIDRAYSHAKURASACGLUESCREENDUMMY = 229
    ORACLEACGLUESCREENDUMMY = 230
    DARKARCHONACGLUESCREENDUMMY = 231
    DARKPYLONACGLUESCREENDUMMY = 232
    ZEALOTPURIFIERACGLUESCREENDUMMY = 233
    SENTRYPURIFIERACGLUESCREENDUMMY = 234
    IMMORTALKARAXACGLUESCREENDUMMY = 235
    COLOSSUSACGLUESCREENDUMMY = 236
    COLOSSUSPURIFIERACGLUESCREENDUMMY = 237
    PHOENIXPURIFIERACGLUESCREENDUMMY = 238
    CARRIERACGLUESCREENDUMMY = 239
    CARRIERAIURACGLUESCREENDUMMY = 240
    KHAYDARINMONOLITHACGLUESCREENDUMMY = 241
    SHIELDBATTERYACGLUESCREENDUMMY = 242
    ELITEMARINEACGLUESCREENDUMMY = 243
    MARAUDERCOMMANDOACGLUESCREENDUMMY = 244
    SPECOPSGHOSTACGLUESCREENDUMMY = 245
    HELLBATRANGERACGLUESCREENDUMMY = 246
    STRIKEGOLIATHACGLUESCREENDUMMY = 247
    HEAVYSIEGETANKACGLUESCREENDUMMY = 248
    RAIDLIBERATORACGLUESCREENDUMMY = 249
    RAVENTYPEIIACGLUESCREENDUMMY = 250
    COVERTBANSHEEACGLUESCREENDUMMY = 251
    RAILGUNTURRETACGLUESCREENDUMMY = 252
    BLACKOPSMISSILETURRETACGLUESCREENDUMMY = 253
    SUPPLICANTACGLUESCREENDUMMY = 254
    STALKERTALDARIMACGLUESCREENDUMMY = 255
    SENTRYTALDARIMACGLUESCREENDUMMY = 256
    HIGHTEMPLARTALDARIMACGLUESCREENDUMMY = 257
    IMMORTALTALDARIMACGLUESCREENDUMMY = 258
    COLOSSUSTALDARIMACGLUESCREENDUMMY = 259
    WARPPRISMTALDARIMACGLUESCREENDUMMY = 260
    PHOTONCANNONTALDARIMACGLUESCREENDUMMY = 261
    NEEDLESPINESWEAPON = 262
    CORRUPTIONWEAPON = 263
    INFESTEDTERRANSWEAPON = 264
    NEURALPARASITEWEAPON = 265
    POINTDEFENSEDRONERELEASEWEAPON = 266
    HUNTERSEEKERWEAPON = 267
    MULE = 268
    THORAAWEAPON = 269
    PUNISHERGRENADESLMWEAPON = 270
    VIKINGFIGHTERWEAPON = 271
    ATALASERBATTERYLMWEAPON = 272
    ATSLASERBATTERYLMWEAPON = 273
    LONGBOLTMISSILEWEAPON = 274
    D8CHARGEWEAPON = 275
    YAMATOWEAPON = 276
    IONCANNONSWEAPON = 277
    ACIDSALIVAWEAPON = 278
    SPINECRAWLERWEAPON = 279
    SPORECRAWLERWEAPON = 280
    GLAIVEWURMWEAPON = 281
    GLAIVEWURMM2WEAPON = 282
    GLAIVEWURMM3WEAPON = 283
    STALKERWEAPON = 284
    EMP2WEAPON = 285
    BACKLASHROCKETSLMWEAPON = 286
    PHOTONCANNONWEAPON = 287
    PARASITESPOREWEAPON = 288
    BROODLING = 289
    BROODLORDBWEAPON = 290
    AUTOTURRETRELEASEWEAPON = 291
    LARVARELEASEMISSILE = 292
    ACIDSPINESWEAPON = 293
    FRENZYWEAPON = 294
    CONTAMINATEWEAPON = 295
    BEACONRALLY = 296
    BEACONARMY = 297
    BEACONATTACK = 298
    BEACONDEFEND = 299
    BEACONHARASS = 300
    BEACONIDLE = 301
    BEACONAUTO = 302
    BEACONDETECT = 303
    BEACONSCOUT = 304
    BEACONCLAIM = 305
    BEACONEXPAND = 306
    BEACONCUSTOM1 = 307
    BEACONCUSTOM2 = 308
    BEACONCUSTOM3 = 309
    BEACONCUSTOM4 = 310
    ADEPT = 311
    ROCKS2X2NONCONJOINED = 312
    FUNGALGROWTHMISSILE = 313
    NEURALPARASITETENTACLEMISSILE = 314
    BEACON_PROTOSS = 315
    BEACON_PROTOSSSMALL = 316
    BEACON_TERRAN = 317
    BEACON_TERRANSMALL = 318
    BEACON_ZERG = 319
    BEACON_ZERGSMALL = 320
    LYOTE = 321
    CARRIONBIRD = 322
    KARAKMALE = 323
    KARAKFEMALE = 324
    URSADAKFEMALEEXOTIC = 325
    URSADAKMALE = 326
    URSADAKFEMALE = 327
    URSADAKCALF = 328
    URSADAKMALEEXOTIC = 329
    UTILITYBOT = 330
    COMMENTATORBOT1 = 331
    COMMENTATORBOT2 = 332
    COMMENTATORBOT3 = 333
    COMMENTATORBOT4 = 334
    SCANTIPEDE = 335
    DOG = 336
    SHEEP = 337
    COW = 338
    INFESTEDTERRANSEGGPLACEMENT = 339
    INFESTORTERRANSWEAPON = 340
    MINERALFIELD = 341
    VESPENEGEYSER = 342
    SPACEPLATFORMGEYSER = 343
    RICHVESPENEGEYSER = 344
    DESTRUCTIBLESEARCHLIGHT = 345
    DESTRUCTIBLEBULLHORNLIGHTS = 346
    DESTRUCTIBLESTREETLIGHT = 347
    DESTRUCTIBLESPACEPLATFORMSIGN = 348
    DESTRUCTIBLESTOREFRONTCITYPROPS = 349
    DESTRUCTIBLEBILLBOARDTALL = 350
    DESTRUCTIBLEBILLBOARDSCROLLINGTEXT = 351
    DESTRUCTIBLESPACEPLATFORMBARRIER = 352
    DESTRUCTIBLESIGNSDIRECTIONAL = 353
    DESTRUCTIBLESIGNSCONSTRUCTION = 354
    DESTRUCTIBLESIGNSFUNNY = 355
    DESTRUCTIBLESIGNSICONS = 356
    DESTRUCTIBLESIGNSWARNING = 357
    DESTRUCTIBLEGARAGE = 358
    DESTRUCTIBLEGARAGELARGE = 359
    DESTRUCTIBLETRAFFICSIGNAL = 360
    TRAFFICSIGNAL = 361
    BRAXISALPHADESTRUCTIBLE1X1 = 362
    BRAXISALPHADESTRUCTIBLE2X2 = 363
    DESTRUCTIBLEDEBRIS4X4 = 364
    DESTRUCTIBLEDEBRIS6X6 = 365
    DESTRUCTIBLEROCK2X4VERTICAL = 366
    DESTRUCTIBLEROCK2X4HORIZONTAL = 367
    DESTRUCTIBLEROCK2X6VERTICAL = 368
    DESTRUCTIBLEROCK2X6HORIZONTAL = 369
    DESTRUCTIBLEROCK4X4 = 370
    DESTRUCTIBLEROCK6X6 = 371
    DESTRUCTIBLERAMPDIAGONALHUGEULBR = 372
    DESTRUCTIBLERAMPDIAGONALHUGEBLUR = 373
    DESTRUCTIBLERAMPVERTICALHUGE = 374
    DESTRUCTIBLERAMPHORIZONTALHUGE = 375
    DESTRUCTIBLEDEBRISRAMPDIAGONALHUGEULBR = 376
    DESTRUCTIBLEDEBRISRAMPDIAGONALHUGEBLUR = 377
    OVERLORDGENERATECREEPKEYBIND = 378
    MENGSKSTATUEALONE = 379
    MENGSKSTATUE = 380
    WOLFSTATUE = 381
    GLOBESTATUE = 382
    WEAPON = 383
    GLAIVEWURMBOUNCEWEAPON = 384
    BROODLORDWEAPON = 385
    BROODLORDAWEAPON = 386
    CREEPBLOCKER1X1 = 387
    PERMANENTCREEPBLOCKER1X1 = 388
    PATHINGBLOCKER1X1 = 389
    PATHINGBLOCKER2X2 = 390
    AUTOTESTATTACKTARGETGROUND = 391
    AUTOTESTATTACKTARGETAIR = 392
    AUTOTESTATTACKER = 393
    HELPEREMITTERSELECTIONARROW = 394
    MULTIKILLOBJECT = 395
    SHAPEGOLFBALL = 396
    SHAPECONE = 397
    SHAPECUBE = 398
    SHAPECYLINDER = 399
    SHAPEDODECAHEDRON = 400
    SHAPEICOSAHEDRON = 401
    SHAPEOCTAHEDRON = 402
    SHAPEPYRAMID = 403
    SHAPEROUNDEDCUBE = 404
    SHAPESPHERE = 405
    SHAPETETRAHEDRON = 406
    SHAPETHICKTORUS = 407
    SHAPETHINTORUS = 408
    SHAPETORUS = 409
    SHAPE4POINTSTAR = 410
    SHAPE5POINTSTAR = 411
    SHAPE6POINTSTAR = 412
    SHAPE8POINTSTAR = 413
    SHAPEARROWPOINTER = 414
    SHAPEBOWL = 415
    SHAPEBOX = 416
    SHAPECAPSULE = 417
    SHAPECRESCENTMOON = 418
    SHAPEDECAHEDRON = 419
    SHAPEDIAMOND = 420
    SHAPEFOOTBALL = 421
    SHAPEGEMSTONE = 422
    SHAPEHEART = 423
    SHAPEJACK = 424
    SHAPEPLUSSIGN = 425
    SHAPESHAMROCK = 426
    SHAPESPADE = 427
    SHAPETUBE = 428
    SHAPEEGG = 429
    SHAPEYENSIGN = 430
    SHAPEX = 431
    SHAPEWATERMELON = 432
    SHAPEWONSIGN = 433
    SHAPETENNISBALL = 434
    SHAPESTRAWBERRY = 435
    SHAPESMILEYFACE = 436
    SHAPESOCCERBALL = 437
    SHAPERAINBOW = 438
    SHAPESADFACE = 439
    SHAPEPOUNDSIGN = 440
    SHAPEPEAR = 441
    SHAPEPINEAPPLE = 442
    SHAPEORANGE = 443
    SHAPEPEANUT = 444
    SHAPEO = 445
    SHAPELEMON = 446
    SHAPEMONEYBAG = 447
    SHAPEHORSESHOE = 448
    SHAPEHOCKEYSTICK = 449
    SHAPEHOCKEYPUCK = 450
    SHAPEHAND = 451
    SHAPEGOLFCLUB = 452
    SHAPEGRAPE = 453
    SHAPEEUROSIGN = 454
    SHAPEDOLLARSIGN = 455
    SHAPEBASKETBALL = 456
    SHAPECARROT = 457
    SHAPECHERRY = 458
    SHAPEBASEBALL = 459
    SHAPEBASEBALLBAT = 460
    SHAPEBANANA = 461
    SHAPEAPPLE = 462
    SHAPECASHLARGE = 463
    SHAPECASHMEDIUM = 464
    SHAPECASHSMALL = 465
    SHAPEFOOTBALLCOLORED = 466
    SHAPELEMONSMALL = 467
    SHAPEORANGESMALL = 468
    SHAPETREASURECHESTOPEN = 469
    SHAPETREASURECHESTCLOSED = 470
    SHAPEWATERMELONSMALL = 471
    UNBUILDABLEROCKSDESTRUCTIBLE = 472
    UNBUILDABLEBRICKSDESTRUCTIBLE = 473
    UNBUILDABLEPLATESDESTRUCTIBLE = 474
    DEBRIS2X2NONCONJOINED = 475
    ENEMYPATHINGBLOCKER1X1 = 476
    ENEMYPATHINGBLOCKER2X2 = 477
    ENEMYPATHINGBLOCKER4X4 = 478
    ENEMYPATHINGBLOCKER8X8 = 479
    ENEMYPATHINGBLOCKER16X16 = 480
    SCOPETEST = 481
    SENTRYACGLUESCREENDUMMY = 482
    MINERALFIELD750 = 483
    HELLIONTANK = 484
    COLLAPSIBLETERRANTOWERDEBRIS = 485
    DEBRISRAMPLEFT = 486
    DEBRISRAMPRIGHT = 487
    MOTHERSHIPCORE = 488
    LOCUSTMP = 489
    COLLAPSIBLEROCKTOWERDEBRIS = 490
    NYDUSCANALATTACKER = 491
    NYDUSCANALCREEPER = 492
    SWARMHOSTBURROWEDMP = 493
    SWARMHOSTMP = 494
    ORACLE = 495
    TEMPEST = 496
    WARHOUND = 497
    WIDOWMINE = 498
    VIPER = 499
    WIDOWMINEBURROWED = 500
    LURKERMPEGG = 501
    LURKERMP = 502
    LURKERMPBURROWED = 503
    LURKERDENMP = 504
    EXTENDINGBRIDGENEWIDE8OUT = 505
    EXTENDINGBRIDGENEWIDE8 = 506
    EXTENDINGBRIDGENWWIDE8OUT = 507
    EXTENDINGBRIDGENWWIDE8 = 508
    EXTENDINGBRIDGENEWIDE10OUT = 509
    EXTENDINGBRIDGENEWIDE10 = 510
    EXTENDINGBRIDGENWWIDE10OUT = 511
    EXTENDINGBRIDGENWWIDE10 = 512
    EXTENDINGBRIDGENEWIDE12OUT = 513
    EXTENDINGBRIDGENEWIDE12 = 514
    EXTENDINGBRIDGENWWIDE12OUT = 515
    EXTENDINGBRIDGENWWIDE12 = 516
    COLLAPSIBLEROCKTOWERDEBRISRAMPRIGHT = 517
    COLLAPSIBLEROCKTOWERDEBRISRAMPLEFT = 518
    XELNAGA_CAVERNS_DOORE = 519
    XELNAGA_CAVERNS_DOOREOPENED = 520
    XELNAGA_CAVERNS_DOORN = 521
    XELNAGA_CAVERNS_DOORNE = 522
    XELNAGA_CAVERNS_DOORNEOPENED = 523
    XELNAGA_CAVERNS_DOORNOPENED = 524
    XELNAGA_CAVERNS_DOORNW = 525
    XELNAGA_CAVERNS_DOORNWOPENED = 526
    XELNAGA_CAVERNS_DOORS = 527
    XELNAGA_CAVERNS_DOORSE = 528
    XELNAGA_CAVERNS_DOORSEOPENED = 529
    XELNAGA_CAVERNS_DOORSOPENED = 530
    XELNAGA_CAVERNS_DOORSW = 531
    XELNAGA_CAVERNS_DOORSWOPENED = 532
    XELNAGA_CAVERNS_DOORW = 533
    XELNAGA_CAVERNS_DOORWOPENED = 534
    XELNAGA_CAVERNS_FLOATING_BRIDGENE8OUT = 535
    XELNAGA_CAVERNS_FLOATING_BRIDGENE8 = 536
    XELNAGA_CAVERNS_FLOATING_BRIDGENW8OUT = 537
    XELNAGA_CAVERNS_FLOATING_BRIDGENW8 = 538
    XELNAGA_CAVERNS_FLOATING_BRIDGENE10OUT = 539
    XELNAGA_CAVERNS_FLOATING_BRIDGENE10 = 540
    XELNAGA_CAVERNS_FLOATING_BRIDGENW10OUT = 541
    XELNAGA_CAVERNS_FLOATING_BRIDGENW10 = 542
    XELNAGA_CAVERNS_FLOATING_BRIDGENE12OUT = 543
    XELNAGA_CAVERNS_FLOATING_BRIDGENE12 = 544
    XELNAGA_CAVERNS_FLOATING_BRIDGENW12OUT = 545
    XELNAGA_CAVERNS_FLOATING_BRIDGENW12 = 546
    XELNAGA_CAVERNS_FLOATING_BRIDGEH8OUT = 547
    XELNAGA_CAVERNS_FLOATING_BRIDGEH8 = 548
    XELNAGA_CAVERNS_FLOATING_BRIDGEV8OUT = 549
    XELNAGA_CAVERNS_FLOATING_BRIDGEV8 = 550
    XELNAGA_CAVERNS_FLOATING_BRIDGEH10OUT = 551
    XELNAGA_CAVERNS_FLOATING_BRIDGEH10 = 552
    XELNAGA_CAVERNS_FLOATING_BRIDGEV10OUT = 553
    XELNAGA_CAVERNS_FLOATING_BRIDGEV10 = 554
    XELNAGA_CAVERNS_FLOATING_BRIDGEH12OUT = 555
    XELNAGA_CAVERNS_FLOATING_BRIDGEH12 = 556
    XELNAGA_CAVERNS_FLOATING_BRIDGEV12OUT = 557
    XELNAGA_CAVERNS_FLOATING_BRIDGEV12 = 558
    COLLAPSIBLETERRANTOWERPUSHUNITRAMPLEFT = 559
    COLLAPSIBLETERRANTOWERPUSHUNITRAMPRIGHT = 560
    COLLAPSIBLEROCKTOWERPUSHUNIT = 561
    COLLAPSIBLETERRANTOWERPUSHUNIT = 562
    COLLAPSIBLEROCKTOWERPUSHUNITRAMPRIGHT = 563
    COLLAPSIBLEROCKTOWERPUSHUNITRAMPLEFT = 564
    DIGESTERCREEPSPRAYTARGETUNIT = 565
    DIGESTERCREEPSPRAYUNIT = 566
    NYDUSCANALATTACKERWEAPON = 567
    VIPERCONSUMESTRUCTUREWEAPON = 568
    RESOURCEBLOCKER = 569
    TEMPESTWEAPON = 570
    YOINKMISSILE = 571
    YOINKVIKINGAIRMISSILE = 572
    YOINKVIKINGGROUNDMISSILE = 573
    YOINKSIEGETANKMISSILE = 574
    WARHOUNDWEAPON = 575
    EYESTALKWEAPON = 576
    WIDOWMINEWEAPON = 577
    WIDOWMINEAIRWEAPON = 578
    MOTHERSHIPCOREWEAPONWEAPON = 579
    TORNADOMISSILEWEAPON = 580
    TORNADOMISSILEDUMMYWEAPON = 581
    TALONSMISSILEWEAPON = 582
    CREEPTUMORMISSILE = 583
    LOCUSTMPEGGAMISSILEWEAPON = 584
    LOCUSTMPEGGBMISSILEWEAPON = 585
    LOCUSTMPWEAPON = 586
    REPULSORCANNONWEAPON = 587
    COLLAPSIBLEROCKTOWERDIAGONAL = 588
    COLLAPSIBLETERRANTOWERDIAGONAL = 589
    COLLAPSIBLETERRANTOWERRAMPLEFT = 590
    COLLAPSIBLETERRANTOWERRAMPRIGHT = 591
    ICE2X2NONCONJOINED = 592
    ICEPROTOSSCRATES = 593
    PROTOSSCRATES = 594
    TOWERMINE = 595
    PICKUPPALLETGAS = 596
    PICKUPPALLETMINERALS = 597
    PICKUPSCRAPSALVAGE1X1 = 598
    PICKUPSCRAPSALVAGE2X2 = 599
    PICKUPSCRAPSALVAGE3X3 = 600
    ROUGHTERRAIN = 601
    UNBUILDABLEBRICKSSMALLUNIT = 602
    UNBUILDABLEPLATESSMALLUNIT = 603
    UNBUILDABLEPLATESUNIT = 604
    UNBUILDABLEROCKSSMALLUNIT = 605
    XELNAGAHEALINGSHRINE = 606
    INVISIBLETARGETDUMMY = 607
    PROTOSSVESPENEGEYSER = 608
    COLLAPSIBLEROCKTOWER = 609
    COLLAPSIBLETERRANTOWER = 610
    THORNLIZARD = 611
    CLEANINGBOT = 612
    DESTRUCTIBLEROCK6X6WEAK = 613
    PROTOSSSNAKESEGMENTDEMO = 614
    PHYSICSCAPSULE = 615
    PHYSICSCUBE = 616
    PHYSICSCYLINDER = 617
    PHYSICSKNOT = 618
    PHYSICSL = 619
    PHYSICSPRIMITIVES = 620
    PHYSICSSPHERE = 621
    PHYSICSSTAR = 622
    CREEPBLOCKER4X4 = 623
    DESTRUCTIBLECITYDEBRIS2X4VERTICAL = 624
    DESTRUCTIBLECITYDEBRIS2X4HORIZONTAL = 625
    DESTRUCTIBLECITYDEBRIS2X6VERTICAL = 626
    DESTRUCTIBLECITYDEBRIS2X6HORIZONTAL = 627
    DESTRUCTIBLECITYDEBRIS4X4 = 628
    DESTRUCTIBLECITYDEBRIS6X6 = 629
    DESTRUCTIBLECITYDEBRISHUGEDIAGONALBLUR = 630
    DESTRUCTIBLECITYDEBRISHUGEDIAGONALULBR = 631
    TESTZERG = 632
    PATHINGBLOCKERRADIUS1 = 633
    DESTRUCTIBLEROCKEX12X4VERTICAL = 634
    DESTRUCTIBLEROCKEX12X4HORIZONTAL = 635
    DESTRUCTIBLEROCKEX12X6VERTICAL = 636
    DESTRUCTIBLEROCKEX12X6HORIZONTAL = 637
    DESTRUCTIBLEROCKEX14X4 = 638
    DESTRUCTIBLEROCKEX16X6 = 639
    DESTRUCTIBLEROCKEX1DIAGONALHUGEULBR = 640
    DESTRUCTIBLEROCKEX1DIAGONALHUGEBLUR = 641
    DESTRUCTIBLEROCKEX1VERTICALHUGE = 642
    DESTRUCTIBLEROCKEX1HORIZONTALHUGE = 643
    DESTRUCTIBLEICE2X4VERTICAL = 644
    DESTRUCTIBLEICE2X4HORIZONTAL = 645
    DESTRUCTIBLEICE2X6VERTICAL = 646
    DESTRUCTIBLEICE2X6HORIZONTAL = 647
    DESTRUCTIBLEICE4X4 = 648
    DESTRUCTIBLEICE6X6 = 649
    DESTRUCTIBLEICEDIAGONALHUGEULBR = 650
    DESTRUCTIBLEICEDIAGONALHUGEBLUR = 651
    DESTRUCTIBLEICEVERTICALHUGE = 652
    DESTRUCTIBLEICEHORIZONTALHUGE = 653
    DESERTPLANETSEARCHLIGHT = 654
    DESERTPLANETSTREETLIGHT = 655
    UNBUILDABLEBRICKSUNIT = 656
    UNBUILDABLEROCKSUNIT = 657
    ZERUSDESTRUCTIBLEARCH = 658
    ARTOSILOPE = 659
    ANTEPLOTT = 660
    LABBOT = 661
    CRABEETLE = 662
    COLLAPSIBLEROCKTOWERRAMPRIGHT = 663
    COLLAPSIBLEROCKTOWERRAMPLEFT = 664
    LABMINERALFIELD = 665
    LABMINERALFIELD750 = 666
    SNOWREFINERY_TERRAN_EXTENDINGBRIDGENESHORT8OUT = 667
    SNOWREFINERY_TERRAN_EXTENDINGBRIDGENESHORT8 = 668
    SNOWREFINERY_TERRAN_EXTENDINGBRIDGENWSHORT8OUT = 669
    SNOWREFINERY_TERRAN_EXTENDINGBRIDGENWSHORT8 = 670
    TARSONIS_DOORN = 671
    TARSONIS_DOORNLOWERED = 672
    TARSONIS_DOORNE = 673
    TARSONIS_DOORNELOWERED = 674
    TARSONIS_DOORE = 675
    TARSONIS_DOORELOWERED = 676
    TARSONIS_DOORNW = 677
    TARSONIS_DOORNWLOWERED = 678
    COMPOUNDMANSION_DOORN = 679
    COMPOUNDMANSION_DOORNLOWERED = 680
    COMPOUNDMANSION_DOORNE = 681
    COMPOUNDMANSION_DOORNELOWERED = 682
    COMPOUNDMANSION_DOORE = 683
    COMPOUNDMANSION_DOORELOWERED = 684
    COMPOUNDMANSION_DOORNW = 685
    COMPOUNDMANSION_DOORNWLOWERED = 686
    RAVAGERCOCOON = 687
    RAVAGER = 688
    LIBERATOR = 689
    RAVAGERBURROWED = 690
    THORAP = 691
    CYCLONE = 692
    LOCUSTMPFLYING = 693
    DISRUPTOR = 694
    AIURLIGHTBRIDGENE8OUT = 695
    AIURLIGHTBRIDGENE8 = 696
    AIURLIGHTBRIDGENE10OUT = 697
    AIURLIGHTBRIDGENE10 = 698
    AIURLIGHTBRIDGENE12OUT = 699
    AIURLIGHTBRIDGENE12 = 700
    AIURLIGHTBRIDGENW8OUT = 701
    AIURLIGHTBRIDGENW8 = 702
    AIURLIGHTBRIDGENW10OUT = 703
    AIURLIGHTBRIDGENW10 = 704
    AIURLIGHTBRIDGENW12OUT = 705
    AIURLIGHTBRIDGENW12 = 706
    AIURTEMPLEBRIDGENE8OUT = 707
    AIURTEMPLEBRIDGENE10OUT = 708
    AIURTEMPLEBRIDGENE12OUT = 709
    AIURTEMPLEBRIDGENW8OUT = 710
    AIURTEMPLEBRIDGENW10OUT = 711
    AIURTEMPLEBRIDGENW12OUT = 712
    SHAKURASLIGHTBRIDGENE8OUT = 713
    SHAKURASLIGHTBRIDGENE8 = 714
    SHAKURASLIGHTBRIDGENE10OUT = 715
    SHAKURASLIGHTBRIDGENE10 = 716
    SHAKURASLIGHTBRIDGENE12OUT = 717
    SHAKURASLIGHTBRIDGENE12 = 718
    SHAKURASLIGHTBRIDGENW8OUT = 719
    SHAKURASLIGHTBRIDGENW8 = 720
    SHAKURASLIGHTBRIDGENW10OUT = 721
    SHAKURASLIGHTBRIDGENW10 = 722
    SHAKURASLIGHTBRIDGENW12OUT = 723
    SHAKURASLIGHTBRIDGENW12 = 724
    VOIDMPIMMORTALREVIVECORPSE = 725
    GUARDIANCOCOONMP = 726
    GUARDIANMP = 727
    DEVOURERCOCOONMP = 728
    DEVOURERMP = 729
    DEFILERMPBURROWED = 730
    DEFILERMP = 731
    ORACLESTASISTRAP = 732
    DISRUPTORPHASED = 733
    LIBERATORAG = 734
    AIURLIGHTBRIDGEABANDONEDNE8OUT = 735
    AIURLIGHTBRIDGEABANDONEDNE8 = 736
    AIURLIGHTBRIDGEABANDONEDNE10OUT = 737
    AIURLIGHTBRIDGEABANDONEDNE10 = 738
    AIURLIGHTBRIDGEABANDONEDNE12OUT = 739
    AIURLIGHTBRIDGEABANDONEDNE12 = 740
    AIURLIGHTBRIDGEABANDONEDNW8OUT = 741
    AIURLIGHTBRIDGEABANDONEDNW8 = 742
    AIURLIGHTBRIDGEABANDONEDNW10OUT = 743
    AIURLIGHTBRIDGEABANDONEDNW10 = 744
    AIURLIGHTBRIDGEABANDONEDNW12OUT = 745
    AIURLIGHTBRIDGEABANDONEDNW12 = 746
    COLLAPSIBLEPURIFIERTOWERDEBRIS = 747
    PORTCITY_BRIDGE_UNITNE8OUT = 748
    PORTCITY_BRIDGE_UNITNE8 = 749
    PORTCITY_BRIDGE_UNITSE8OUT = 750
    PORTCITY_BRIDGE_UNITSE8 = 751
    PORTCITY_BRIDGE_UNITNW8OUT = 752
    PORTCITY_BRIDGE_UNITNW8 = 753
    PORTCITY_BRIDGE_UNITSW8OUT = 754
    PORTCITY_BRIDGE_UNITSW8 = 755
    PORTCITY_BRIDGE_UNITNE10OUT = 756
    PORTCITY_BRIDGE_UNITNE10 = 757
    PORTCITY_BRIDGE_UNITSE10OUT = 758
    PORTCITY_BRIDGE_UNITSE10 = 759
    PORTCITY_BRIDGE_UNITNW10OUT = 760
    PORTCITY_BRIDGE_UNITNW10 = 761
    PORTCITY_BRIDGE_UNITSW10OUT = 762
    PORTCITY_BRIDGE_UNITSW10 = 763
    PORTCITY_BRIDGE_UNITNE12OUT = 764
    PORTCITY_BRIDGE_UNITNE12 = 765
    PORTCITY_BRIDGE_UNITSE12OUT = 766
    PORTCITY_BRIDGE_UNITSE12 = 767
    PORTCITY_BRIDGE_UNITNW12OUT = 768
    PORTCITY_BRIDGE_UNITNW12 = 769
    PORTCITY_BRIDGE_UNITSW12OUT = 770
    PORTCITY_BRIDGE_UNITSW12 = 771
    PORTCITY_BRIDGE_UNITN8OUT = 772
    PORTCITY_BRIDGE_UNITN8 = 773
    PORTCITY_BRIDGE_UNITS8OUT = 774
    PORTCITY_BRIDGE_UNITS8 = 775
    PORTCITY_BRIDGE_UNITE8OUT = 776
    PORTCITY_BRIDGE_UNITE8 = 777
    PORTCITY_BRIDGE_UNITW8OUT = 778
    PORTCITY_BRIDGE_UNITW8 = 779
    PORTCITY_BRIDGE_UNITN10OUT = 780
    PORTCITY_BRIDGE_UNITN10 = 781
    PORTCITY_BRIDGE_UNITS10OUT = 782
    PORTCITY_BRIDGE_UNITS10 = 783
    PORTCITY_BRIDGE_UNITE10OUT = 784
    PORTCITY_BRIDGE_UNITE10 = 785
    PORTCITY_BRIDGE_UNITW10OUT = 786
    PORTCITY_BRIDGE_UNITW10 = 787
    PORTCITY_BRIDGE_UNITN12OUT = 788
    PORTCITY_BRIDGE_UNITN12 = 789
    PORTCITY_BRIDGE_UNITS12OUT = 790
    PORTCITY_BRIDGE_UNITS12 = 791
    PORTCITY_BRIDGE_UNITE12OUT = 792
    PORTCITY_BRIDGE_UNITE12 = 793
    PORTCITY_BRIDGE_UNITW12OUT = 794
    PORTCITY_BRIDGE_UNITW12 = 795
    PURIFIERRICHMINERALFIELD = 796
    PURIFIERRICHMINERALFIELD750 = 797
    COLLAPSIBLEPURIFIERTOWERPUSHUNIT = 798
    LOCUSTMPPRECURSOR = 799
    RELEASEINTERCEPTORSBEACON = 800
    ADEPTPHASESHIFT = 801
    RAVAGERCORROSIVEBILEMISSILE = 802
    HYDRALISKIMPALEMISSILE = 803
    CYCLONEMISSILELARGEAIR = 804
    CYCLONEMISSILE = 805
    CYCLONEMISSILELARGE = 806
    THORAALANCE = 807
    ORACLEWEAPON = 808
    TEMPESTWEAPONGROUND = 809
    RAVAGERWEAPONMISSILE = 810
    SCOUTMPAIRWEAPONLEFT = 811
    SCOUTMPAIRWEAPONRIGHT = 812
    ARBITERMPWEAPONMISSILE = 813
    GUARDIANMPWEAPON = 814
    DEVOURERMPWEAPONMISSILE = 815
    DEFILERMPDARKSWARMWEAPON = 816
    QUEENMPENSNAREMISSILE = 817
    QUEENMPSPAWNBROODLINGSMISSILE = 818
    LIGHTNINGBOMBWEAPON = 819
    HERCPLACEMENT = 820
    GRAPPLEWEAPON = 821
    CAUSTICSPRAYMISSILE = 822
    PARASITICBOMBMISSILE = 823
    PARASITICBOMBDUMMY = 824
    ADEPTWEAPON = 825
    ADEPTUPGRADEWEAPON = 826
    LIBERATORMISSILE = 827
    LIBERATORDAMAGEMISSILE = 828
    LIBERATORAGMISSILE = 829
    KD8CHARGE = 830
    KD8CHARGEWEAPON = 831
    SLAYNELEMENTALGRABWEAPON = 832
    SLAYNELEMENTALGRABAIRUNIT = 833
    SLAYNELEMENTALGRABGROUNDUNIT = 834
    SLAYNELEMENTALWEAPON = 835
    DESTRUCTIBLEEXPEDITIONGATE6X6 = 836
    DESTRUCTIBLEZERGINFESTATION3X3 = 837
    HERC = 838
    MOOPY = 839
    REPLICANT = 840
    SEEKERMISSILE = 841
    AIURTEMPLEBRIDGEDESTRUCTIBLENE8OUT = 842
    AIURTEMPLEBRIDGEDESTRUCTIBLENE10OUT = 843
    AIURTEMPLEBRIDGEDESTRUCTIBLENE12OUT = 844
    AIURTEMPLEBRIDGEDESTRUCTIBLENW8OUT = 845
    AIURTEMPLEBRIDGEDESTRUCTIBLENW10OUT = 846
    AIURTEMPLEBRIDGEDESTRUCTIBLENW12OUT = 847
    AIURTEMPLEBRIDGEDESTRUCTIBLESW8OUT = 848
    AIURTEMPLEBRIDGEDESTRUCTIBLESW10OUT = 849
    AIURTEMPLEBRIDGEDESTRUCTIBLESW12OUT = 850
    AIURTEMPLEBRIDGEDESTRUCTIBLESE8OUT = 851
    AIURTEMPLEBRIDGEDESTRUCTIBLESE10OUT = 852
    AIURTEMPLEBRIDGEDESTRUCTIBLESE12OUT = 853
    FLYOVERUNIT = 854
    CORSAIRMP = 855
    SCOUTMP = 856
    ARBITERMP = 857
    SCOURGEMP = 858
    DEFILERMPPLAGUEWEAPON = 859
    QUEENMP = 860
    XELNAGADESTRUCTIBLERAMPBLOCKER6S = 861
    XELNAGADESTRUCTIBLERAMPBLOCKER6SE = 862
    XELNAGADESTRUCTIBLERAMPBLOCKER6E = 863
    XELNAGADESTRUCTIBLERAMPBLOCKER6NE = 864
    XELNAGADESTRUCTIBLERAMPBLOCKER6N = 865
    XELNAGADESTRUCTIBLERAMPBLOCKER6NW = 866
    XELNAGADESTRUCTIBLERAMPBLOCKER6W = 867
    XELNAGADESTRUCTIBLERAMPBLOCKER6SW = 868
    XELNAGADESTRUCTIBLERAMPBLOCKER8S = 869
    XELNAGADESTRUCTIBLERAMPBLOCKER8SE = 870
    XELNAGADESTRUCTIBLERAMPBLOCKER8E = 871
    XELNAGADESTRUCTIBLERAMPBLOCKER8NE = 872
    XELNAGADESTRUCTIBLERAMPBLOCKER8N = 873
    XELNAGADESTRUCTIBLERAMPBLOCKER8NW = 874
    XELNAGADESTRUCTIBLERAMPBLOCKER8W = 875
    XELNAGADESTRUCTIBLERAMPBLOCKER8SW = 876
    REPTILECRATE = 877
    SLAYNSWARMHOSTSPAWNFLYER = 878
    SLAYNELEMENTAL = 879
    PURIFIERVESPENEGEYSER = 880
    SHAKURASVESPENEGEYSER = 881
    COLLAPSIBLEPURIFIERTOWERDIAGONAL = 882
    CREEPONLYBLOCKER4X4 = 883
    PURIFIERMINERALFIELD = 884
    PURIFIERMINERALFIELD750 = 885
    BATTLESTATIONMINERALFIELD = 886
    BATTLESTATIONMINERALFIELD750 = 887
    BEACON_NOVA = 888
    BEACON_NOVASMALL = 889
    URSULA = 890
    ELSECARO_COLONIST_HUT = 891
    TRANSPORTOVERLORDCOCOON = 892
    OVERLORDTRANSPORT = 893
    PYLONOVERCHARGED = 894
    BYPASSARMORDRONE = 895
    ADEPTPIERCINGWEAPON = 896
    CORROSIVEPARASITEWEAPON = 897
    INFESTEDTERRAN = 898
    MERCCOMPOUND = 899
    SUPPLYDEPOTDROP = 900
    LURKERDEN = 901
    D8CHARGE = 902
    THORWRECKAGE = 903
    GOLIATH = 904
    TECHREACTOR = 905
    SS_POWERUPBOMB = 906
    SS_POWERUPHEALTH = 907
    SS_POWERUPSIDEMISSILES = 908
    SS_POWERUPSTRONGERMISSILES = 909
    LURKEREGG = 910
    LURKER = 911
    LURKERBURROWED = 912
    ARCHIVESEALED = 913
    INFESTEDCIVILIAN = 914
    FLAMINGBETTY = 915
    INFESTEDCIVILIANBURROWED = 916
    SELENDISINTERCEPTOR = 917
    SIEGEBREAKERSIEGED = 918
    SIEGEBREAKER = 919
    PERDITIONTURRETUNDERGROUND = 920
    PERDITIONTURRET = 921
    SENTRYGUNUNDERGROUND = 922
    SENTRYGUN = 923
    WARPIG = 924
    DEVILDOG = 925
    SPARTANCOMPANY = 926
    HAMMERSECURITY = 927
    HELSANGELFIGHTER = 928
    DUSKWING = 929
    DUKESREVENGE = 930
    ODINWRECKAGE = 931
    HERONUKE = 932
    KERRIGANCHARBURROWED = 933
    KERRIGANCHAR = 934
    SPIDERMINEBURROWED = 935
    SPIDERMINE = 936
    ZERATUL = 937
    URUN = 938
    MOHANDAR = 939
    SELENDIS = 940
    SCOUT = 941
    OMEGALISKBURROWED = 942
    OMEGALISK = 943
    INFESTEDABOMINATIONBURROWED = 944
    INFESTEDABOMINATION = 945
    HUNTERKILLERBURROWED = 946
    HUNTERKILLER = 947
    INFESTEDTERRANCAMPAIGNBURROWED = 948
    INFESTEDTERRANCAMPAIGN = 949
    CHECKSTATION = 950
    CHECKSTATIONDIAGONALBLUR = 951
    CHECKSTATIONDIAGONALULBR = 952
    CHECKSTATIONVERTICAL = 953
    CHECKSTATIONOPENED = 954
    CHECKSTATIONDIAGONALBLUROPENED = 955
    CHECKSTATIONDIAGONALULBROPENED = 956
    CHECKSTATIONVERTICALOPENED = 957
    BARRACKSTECHREACTOR = 958
    FACTORYTECHREACTOR = 959
    STARPORTTECHREACTOR = 960
    SPECTRENUKE = 961
    COLONISTSHIPFLYING = 962
    COLONISTSHIP = 963
    BIODOMECOMMANDFLYING = 964
    BIODOMECOMMAND = 965
    HERCULESLANDERFLYING = 966
    HERCULESLANDER = 967
    ZHAKULDASLIGHTBRIDGEOFF = 968
    ZHAKULDASLIGHTBRIDGE = 969
    ZHAKULDASLIBRARYUNITBURROWED = 970
    ZHAKULDASLIBRARYUNIT = 971
    XELNAGATEMPLEDOORBURROWED = 972
    XELNAGATEMPLEDOOR = 973
    XELNAGATEMPLEDOORURDLBURROWED = 974
    XELNAGATEMPLEDOORURDL = 975
    HELSANGELASSAULT = 976
    AUTOMATEDREFINERY = 977
    BATTLECRUISERHELIOSMORPH = 978
    HEALINGPOTIONTESTINSTANT = 979
    SPACEPLATFORMCLIFFDOOROPEN0 = 980
    SPACEPLATFORMCLIFFDOOR0 = 981
    SPACEPLATFORMCLIFFDOOROPEN1 = 982
    SPACEPLATFORMCLIFFDOOR1 = 983
    DESTRUCTIBLEGATEDIAGONALBLURLOWERED = 984
    DESTRUCTIBLEGATEDIAGONALULBRLOWERED = 985
    DESTRUCTIBLEGATESTRAIGHTHORIZONTALBFLOWERED = 986
    DESTRUCTIBLEGATESTRAIGHTHORIZONTALLOWERED = 987
    DESTRUCTIBLEGATESTRAIGHTVERTICALLFLOWERED = 988
    DESTRUCTIBLEGATESTRAIGHTVERTICALLOWERED = 989
    DESTRUCTIBLEGATEDIAGONALBLUR = 990
    DESTRUCTIBLEGATEDIAGONALULBR = 991
    DESTRUCTIBLEGATESTRAIGHTHORIZONTALBF = 992
    DESTRUCTIBLEGATESTRAIGHTHORIZONTAL = 993
    DESTRUCTIBLEGATESTRAIGHTVERTICALLF = 994
    DESTRUCTIBLEGATESTRAIGHTVERTICAL = 995
    METALGATEDIAGONALBLURLOWERED = 996
    METALGATEDIAGONALULBRLOWERED = 997
    METALGATESTRAIGHTHORIZONTALBFLOWERED = 998
    METALGATESTRAIGHTHORIZONTALLOWERED = 999
    METALGATESTRAIGHTVERTICALLFLOWERED = 1000
    METALGATESTRAIGHTVERTICALLOWERED = 1001
    METALGATEDIAGONALBLUR = 1002
    METALGATEDIAGONALULBR = 1003
    METALGATESTRAIGHTHORIZONTALBF = 1004
    METALGATESTRAIGHTHORIZONTAL = 1005
    METALGATESTRAIGHTVERTICALLF = 1006
    METALGATESTRAIGHTVERTICAL = 1007
    SECURITYGATEDIAGONALBLURLOWERED = 1008
    SECURITYGATEDIAGONALULBRLOWERED = 1009
    SECURITYGATESTRAIGHTHORIZONTALBFLOWERED = 1010
    SECURITYGATESTRAIGHTHORIZONTALLOWERED = 1011
    SECURITYGATESTRAIGHTVERTICALLFLOWERED = 1012
    SECURITYGATESTRAIGHTVERTICALLOWERED = 1013
    SECURITYGATEDIAGONALBLUR = 1014
    SECURITYGATEDIAGONALULBR = 1015
    SECURITYGATESTRAIGHTHORIZONTALBF = 1016
    SECURITYGATESTRAIGHTHORIZONTAL = 1017
    SECURITYGATESTRAIGHTVERTICALLF = 1018
    SECURITYGATESTRAIGHTVERTICAL = 1019
    TERRAZINENODEDEADTERRAN = 1020
    TERRAZINENODEHAPPYPROTOSS = 1021
    ZHAKULDASLIGHTBRIDGEOFFTOPRIGHT = 1022
    ZHAKULDASLIGHTBRIDGETOPRIGHT = 1023
    BATTLECRUISERHELIOS = 1024
    NUKESILONOVA = 1025
    ODIN = 1026
    PYGALISKCOCOON = 1027
    DEVOURERTISSUEDOODAD = 1028
    SS_BATTLECRUISERMISSILELAUNCHER = 1029
    SS_TERRATRONMISSILESPINNERMISSILE = 1030
    SS_TERRATRONSAW = 1031
    SS_BATTLECRUISERHUNTERSEEKERMISSILE = 1032
    SS_LEVIATHANBOMB = 1033
    DEVOURERTISSUEMISSILE = 1034
    SS_INTERCEPTOR = 1035
    SS_LEVIATHANBOMBMISSILE = 1036
    SS_LEVIATHANSPAWNBOMBMISSILE = 1037
    SS_FIGHTERMISSILELEFT = 1038
    SS_FIGHTERMISSILERIGHT = 1039
    SS_INTERCEPTORSPAWNMISSILE = 1040
    SS_CARRIERBOSSMISSILE = 1041
    SS_LEVIATHANTENTACLETARGET = 1042
    SS_LEVIATHANTENTACLEL2MISSILE = 1043
    SS_LEVIATHANTENTACLER1MISSILE = 1044
    SS_LEVIATHANTENTACLER2MISSILE = 1045
    SS_LEVIATHANTENTACLEL1MISSILE = 1046
    SS_TERRATRONMISSILE = 1047
    SS_WRAITHMISSILE = 1048
    SS_SCOURGEMISSILE = 1049
    SS_CORRUPTORMISSILE = 1050
    SS_SWARMGUARDIANMISSILE = 1051
    SS_STRONGMISSILE1 = 1052
    SS_STRONGMISSILE2 = 1053
    SS_FIGHTERDRONEMISSILE = 1054
    SS_PHOENIXMISSILE = 1055
    SS_SCOUTMISSILE = 1056
    SS_INTERCEPTORMISSILE = 1057
    SS_SCIENCEVESSELMISSILE = 1058
    SS_BATTLECRUISERMISSILE = 1059
    D8CLUSTERBOMBWEAPON = 1060
    D8CLUSTERBOMB = 1061
    BROODLORDEGG = 1062
    BROODLORDEGGMISSILE = 1063
    CIVILIANWEAPON = 1064
    BATTLECRUISERHELIOSALMWEAPON = 1065
    BATTLECRUISERLOKILMWEAPON = 1066
    BATTLECRUISERHELIOSGLMWEAPON = 1067
    BIOSTASISMISSILE = 1068
    INFESTEDVENTBROODLORDEGG = 1069
    INFESTEDVENTCORRUPTOREGG = 1070
    TENTACLEAMISSILE = 1071
    TENTACLEBMISSILE = 1072
    TENTACLECMISSILE = 1073
    TENTACLEDMISSILE = 1074
    MUTALISKEGG = 1075
    INFESTEDVENTMUTALISKEGG = 1076
    MUTALISKEGGMISSILE = 1077
    INFESTEDVENTEGGMISSILE = 1078
    SPORECANNONFIREMISSILE = 1079
    EXPERIMENTALPLASMAGUNWEAPON = 1080
    BRUTALISKWEAPON = 1081
    LOKIHURRICANEMISSILELEFT = 1082
    LOKIHURRICANEMISSILERIGHT = 1083
    ODINAAWEAPON = 1084
    DUSKWINGWEAPON = 1085
    KERRIGANWEAPON = 1086
    ULTRASONICPULSEWEAPON = 1087
    KERRIGANCHARWEAPON = 1088
    DEVASTATORMISSILEWEAPON = 1089
    SWANNWEAPON = 1090
    HAMMERSECURITYLMWEAPON = 1091
    CONSUMEDNAFEEDBACKWEAPON = 1092
    URUNWEAPONLEFT = 1093
    URUNWEAPONRIGHT = 1094
    HAILSTORMMISSILESWEAPON = 1095
    COLONYINFESTATIONWEAPON = 1096
    VOIDSEEKERPHASEMINEBLASTWEAPON = 1097
    VOIDSEEKERPHASEMINEBLASTSECONDARYWEAPON = 1098
    TOSSGRENADEWEAPON = 1099
    TYCHUSGRENADEWEAPON = 1100
    VILESTREAMWEAPON = 1101
    WRAITHAIRWEAPONRIGHT = 1102
    WRAITHAIRWEAPONLEFT = 1103
    WRAITHGROUNDWEAPON = 1104
    WEAPONHYBRIDD = 1105
    KARASSWEAPON = 1106
    HYBRIDCPLASMAWEAPON = 1107
    WARBOTBMISSILE = 1108
    LOKIYAMATOWEAPON = 1109
    HYPERIONYAMATOSPECIALWEAPON = 1110
    HYPERIONLMWEAPON = 1111
    HYPERIONALMWEAPON = 1112
    VULTUREWEAPON = 1113
    SCOUTAIRWEAPONLEFT = 1114
    SCOUTAIRWEAPONRIGHT = 1115
    HUNTERKILLERWEAPON = 1116
    GOLIATHAWEAPON = 1117
    SPARTANCOMPANYAWEAPON = 1118
    LEVIATHANSCOURGEMISSILE = 1119
    BIOPLASMIDDISCHARGEWEAPON = 1120
    VOIDSEEKERWEAPON = 1121
    HELSANGELFIGHTERWEAPON = 1122
    DRBATTLECRUISERALMWEAPON = 1123
    DRBATTLECRUISERGLMWEAPON = 1124
    HURRICANEMISSILERIGHT = 1125
    HURRICANEMISSILELEFT = 1126
    HYBRIDSINGULARITYFEEDBACKWEAPON = 1127
    DOMINIONKILLTEAMLMWEAPON = 1128
    ITEMGRENADESWEAPON = 1129
    ITEMGRAVITYBOMBSWEAPON = 1130
    TESTHEROTHROWMISSILE = 1131
    TESTHERODEBUGMISSILEABILITY1WEAPON = 1132
    TESTHERODEBUGMISSILEABILITY2WEAPON = 1133
    SPECTRE = 1134
    VULTURE = 1135
    LOKI = 1136
    WRAITH = 1137
    DOMINIONKILLTEAM = 1138
    FIREBAT = 1139
    DIAMONDBACK = 1140
    G4CHARGEWEAPON = 1141
    SS_BLACKEDGEBORDER = 1142
    DEVOURERTISSUESAMPLETUBE = 1143
    MONOLITH = 1144
    OBELISK = 1145
    ARCHIVE = 1146
    ARTIFACTVAULT = 1147
    AVERNUSGATECONTROL = 1148
    GATECONTROLUNIT = 1149
    BLIMPADS = 1150
    BLOCKER6X6 = 1151
    BLOCKER8X8 = 1152
    BLOCKER16X16 = 1153
    CARGOTRUCKUNITFLATBED = 1154
    CARGOTRUCKUNITTRAILER = 1155
    BLIMP = 1156
    CASTANARWINDOWLARGEDIAGONALULBRUNIT = 1157
    BLOCKER4X4 = 1158
    HOMELARGE = 1159
    HOMESMALL = 1160
    ELEVATORBLOCKER = 1161
    QUESTIONMARK = 1162
    NYDUSWORMLAVADEATH = 1163
    SS_BACKGROUNDSPACELARGE = 1164
    SS_BACKGROUNDSPACETERRAN00 = 1165
    SS_BACKGROUNDSPACETERRAN02 = 1166
    SS_BACKGROUNDSPACEZERG00 = 1167
    SS_BACKGROUNDSPACEZERG02 = 1168
    SS_CARRIERBOSS = 1169
    SS_BATTLECRUISER = 1170
    SS_TERRATRONMISSILESPINNERLAUNCHER = 1171
    SS_TERRATRONMISSILESPINNER = 1172
    SS_TERRATRONBEAMTARGET = 1173
    SS_LIGHTNINGPROJECTORFACERIGHT = 1174
    SS_SCOURGE = 1175
    SS_CORRUPTOR = 1176
    SS_TERRATRONMISSILELAUNCHER = 1177
    SS_LIGHTNINGPROJECTORFACELEFT = 1178
    SS_WRAITH = 1179
    SS_SWARMGUARDIAN = 1180
    SS_SCOUT = 1181
    SS_LEVIATHAN = 1182
    SS_SCIENCEVESSEL = 1183
    SS_TERRATRON = 1184
    SECRETDOCUMENTS = 1185
    PREDATOR = 1186
    DEFILERBONESAMPLE = 1187
    DEVOURERTISSUESAMPLE = 1188
    PROTOSSPSIELEMENTS = 1189
    TASSADAR = 1190
    SCIENCEFACILITY = 1191
    INFESTEDCOCOON = 1192
    FUSIONREACTOR = 1193
    BUBBACOMMERCIAL = 1194
    XELNAGAPRISONHEIGHT2 = 1195
    XELNAGAPRISON = 1196
    XELNAGAPRISONNORTH = 1197
    XELNAGAPRISONNORTHHEIGHT2 = 1198
    ZERGDROPPODCREEP = 1199
    IPISTOLAD = 1200
    L800ETC_AD = 1201
    NUKENOODLESCOMMERCIAL = 1202
    PSIOPSCOMMERCIAL = 1203
    SHIPALARM = 1204
    SPACEPLATFORMDESTRUCTIBLEJUMBOBLOCKER = 1205
    SPACEPLATFORMDESTRUCTIBLELARGEBLOCKER = 1206
    SPACEPLATFORMDESTRUCTIBLEMEDIUMBLOCKER = 1207
    SPACEPLATFORMDESTRUCTIBLESMALLBLOCKER = 1208
    TALDARIMMOTHERSHIP = 1209
    PLASMATORPEDOESWEAPON = 1210
    PSIDISRUPTOR = 1211
    HIVEMINDEMULATOR = 1212
    RAYNOR01 = 1213
    SCIENCEVESSEL = 1214
    SCOURGE = 1215
    SPACEPLATFORMREACTORPATHINGBLOCKER = 1216
    TAURENOUTHOUSE = 1217
    TYCHUSEJECTMISSILE = 1218
    FEEDERLING = 1219
    ULAANSMOKEBRIDGE = 1220
    TALDARIMPRISONCRYSTAL = 1221
    SPACEDIABLO = 1222
    MURLOCMARINE = 1223
    XELNAGAPRISONCONSOLE = 1224
    TALDARIMPRISON = 1225
    ADJUTANTCAPSULE = 1226
    XELNAGAVAULT = 1227
    HOLDINGPEN = 1228
    SCRAPHUGE = 1229
    PRISONERCIVILIAN = 1230
    BIODOMEHALFBUILT = 1231
    BIODOME = 1232
    DESTRUCTIBLEKORHALFLAG = 1233
    DESTRUCTIBLEKORHALPODIUM = 1234
    DESTRUCTIBLEKORHALTREE = 1235
    DESTRUCTIBLEKORHALFOLIAGE = 1236
    DESTRUCTIBLESANDBAGS = 1237
    CASTANARWINDOWLARGEDIAGONALBLURUNIT = 1238
    CARGOTRUCKUNITBARRELS = 1239
    SPORECANNON = 1240
    STETMANN = 1241
    BRIDGEBLOCKER4X12 = 1242
    CIVILIANSHIPWRECKED = 1243
    SWANN = 1244
    DRAKKENLASERDRILL = 1245
    MINDSIPHONRETURNWEAPON = 1246
    KERRIGANEGG = 1247
    CHRYSALISEGG = 1248
    PRISONERSPECTRE = 1249
    PRISONZEALOT = 1250
    SCRAPSALVAGE1X1 = 1251
    SCRAPSALVAGE2X2 = 1252
    SCRAPSALVAGE3X3 = 1253
    RAYNORCOMMANDO = 1254
    OVERMIND = 1255
    OVERMINDREMAINS = 1256
    INFESTEDMERCHAVEN = 1257
    MONLYTHARTIFACTFORCEFIELD = 1258
    MONLYTHFORCEFIELDSTATUE = 1259
    VIROPHAGE = 1260
    PSISHOCKWEAPON = 1261
    TYCHUSCOMMANDO = 1262
    BRUTALISK = 1263
    PYGALISK = 1264
    VALHALLABASEDESTRUCTIBLEDOORDEAD = 1265
    VALHALLABASEDESTRUCTIBLEDOOR = 1266
    VOIDSEEKER = 1267
    MINDSIPHONWEAPON = 1268
    WARBOT = 1269
    PLATFORMCONNECTOR = 1270
    ARTANIS = 1271
    TERRAZINECANISTER = 1272
    HERCULES = 1273
    MERCENARYFORTRESS = 1274
    RAYNOR = 1275
    ARTIFACTPIECE1 = 1276
    ARTIFACTPIECE2 = 1277
    ARTIFACTPIECE4 = 1278
    ARTIFACTPIECE3 = 1279
    ARTIFACTPIECE5 = 1280
    RIPFIELDGENERATOR = 1281
    RIPFIELDGENERATORSMALL = 1282
    XELNAGAWORLDSHIPVAULT = 1283
    TYCHUSCHAINGUN = 1284
    ARTIFACT = 1285
    CELLBLOCKB = 1286
    GHOSTLASERLINES = 1287
    MAINCELLBLOCK = 1288
    KERRIGAN = 1289
    DATACORE = 1290
    SPECIALOPSDROPSHIP = 1291
    TOSH = 1292
    CASTANARULTRALISKSHACKLEDUNIT = 1293
    KARASS = 1294
    INVISIBLEPYLON = 1295
    MAAR = 1296
    HYBRIDDESTROYER = 1297
    HYBRIDREAVER = 1298
    HYBRID = 1299
    TERRAZINENODE = 1300
    TRANSPORTTRUCK = 1301
    WALLOFFIRE = 1302
    WEAPONHYBRIDC = 1303
    XELNAGATEMPLE = 1304
    EXPLODINGBARRELLARGE = 1305
    SUPERWARPGATE = 1306
    TERRAZINETANK = 1307
    XELNAGASHRINE = 1308
    SMCAMERABRIDGE = 1309
    SMMARSARABARTYCHUSCAMERAS = 1310
    SMHYPERIONBRIDGESTAGE1HANSONCAMERAS = 1311
    SMHYPERIONBRIDGESTAGE1HORNERCAMERAS = 1312
    SMHYPERIONBRIDGESTAGE1TYCHUSCAMERAS = 1313
    SMHYPERIONBRIDGESTAGE1TOSHCAMERAS = 1314
    SMHYPERIONARMORYSTAGE1SWANNCAMERAS = 1315
    SMHYPERIONCANTINATOSHCAMERAS = 1316
    SMHYPERIONCANTINATYCHUSCAMERAS = 1317
    SMHYPERIONCANTINAYBARRACAMERAS = 1318
    SMHYPERIONLABADJUTANTCAMERAS = 1319
    SMHYPERIONLABCOWINCAMERAS = 1320
    SMHYPERIONLABHANSONCAMERAS = 1321
    SMHYPERIONBRIDGETRAYNOR03BRIEFINGCAMERA = 1322
    SMTESTCAMERA = 1323
    SMCAMERATERRAN01 = 1324
    SMCAMERATERRAN02A = 1325
    SMCAMERATERRAN02B = 1326
    SMCAMERATERRAN03 = 1327
    SMCAMERATERRAN04 = 1328
    SMCAMERATERRAN04A = 1329
    SMCAMERATERRAN04B = 1330
    SMCAMERATERRAN05 = 1331
    SMCAMERATERRAN06A = 1332
    SMCAMERATERRAN06B = 1333
    SMCAMERATERRAN06C = 1334
    SMCAMERATERRAN07 = 1335
    SMCAMERATERRAN08 = 1336
    SMCAMERATERRAN09 = 1337
    SMCAMERATERRAN10 = 1338
    SMCAMERATERRAN11 = 1339
    SMCAMERATERRAN12 = 1340
    SMCAMERATERRAN13 = 1341
    SMCAMERATERRAN14 = 1342
    SMCAMERATERRAN15 = 1343
    SMCAMERATERRAN16 = 1344
    SMCAMERATERRAN17 = 1345
    SMCAMERATERRAN20 = 1346
    SMFIRSTOFFICER = 1347
    SMHYPERIONBRIDGEBRIEFINGLEFT = 1348
    SMHYPERIONBRIDGEBRIEFINGRIGHT = 1349
    SMHYPERIONMEDLABBRIEFING = 1350
    SMHYPERIONMEDLABBRIEFINGCENTER = 1351
    SMHYPERIONMEDLABBRIEFINGLEFT = 1352
    SMHYPERIONMEDLABBRIEFINGRIGHT = 1353
    SMTOSHSHUTTLESET = 1354
    SMKERRIGANPHOTO = 1355
    SMTOSHSHUTTLESET2 = 1356
    SMMARSARABARJUKEBOXHS = 1357
    SMMARSARABARKERRIGANPHOTOHS = 1358
    SMVALERIANFLAGSHIPCORRIDORSSET = 1359
    SMVALERIANFLAGSHIPCORRIDORSSET2 = 1360
    SMVALERIANFLAGSHIPCORRIDORSSET3 = 1361
    SMVALERIANFLAGSHIPCORRIDORSSET4 = 1362
    SMVALERIANOBSERVATORYSET = 1363
    SMVALERIANOBSERVATORYSET2 = 1364
    SMVALERIANOBSERVATORYSET3 = 1365
    SMVALERIANOBSERVATORYPAINTINGHS = 1366
    SMCHARBATTLEZONEFLAG = 1367
    SMUNNSET = 1368
    SMTERRANREADYROOMSET = 1369
    SMCHARBATTLEZONESET = 1370
    SMCHARBATTLEZONESET2 = 1371
    SMCHARBATTLEZONESET3 = 1372
    SMCHARBATTLEZONESET4 = 1373
    SMCHARBATTLEZONESET5 = 1374
    SMCHARBATTLEZONEARTIFACTHS = 1375
    SMCHARBATTLEZONERADIOHS = 1376
    SMCHARBATTLEZONEDROPSHIPHS = 1377
    SMCHARBATTLEZONEBRIEFCASEHS = 1378
    SMCHARBATTLEZONEBRIEFINGSET = 1379
    SMCHARBATTLEZONEBRIEFINGSET2 = 1380
    SMCHARBATTLEZONEBRIEFINGSETLEFT = 1381
    SMCHARBATTLEZONEBRIEFINGSETRIGHT = 1382
    SMMARSARABARBADGEHS = 1383
    SMHYPERIONCANTINABADGEHS = 1384
    SMHYPERIONCANTINAPOSTER1HS = 1385
    SMHYPERIONCANTINAPOSTER2HS = 1386
    SMHYPERIONCANTINAPOSTER3HS = 1387
    SMHYPERIONCANTINAPOSTER4HS = 1388
    SMHYPERIONCANTINAPOSTER5HS = 1389
    SMFLY = 1390
    SMBRIDGEWINDOWSPACE = 1391
    SMBRIDGEPLANETSPACE = 1392
    SMBRIDGEPLANETSPACEASTEROIDS = 1393
    SMBRIDGEPLANETAGRIA = 1394
    SMBRIDGEPLANETAIUR = 1395
    SMBRIDGEPLANETAVERNUS = 1396
    SMBRIDGEPLANETBELSHIR = 1397
    SMBRIDGEPLANETCASTANAR = 1398
    SMBRIDGEPLANETCHAR = 1399
    SMBRIDGEPLANETHAVEN = 1400
    SMBRIDGEPLANETKORHAL = 1401
    SMBRIDGEPLANETMEINHOFF = 1402
    SMBRIDGEPLANETMONLYTH = 1403
    SMBRIDGEPLANETNEWFOLSOM = 1404
    SMBRIDGEPLANETPORTZION = 1405
    SMBRIDGEPLANETREDSTONE = 1406
    SMBRIDGEPLANETSHAKURAS = 1407
    SMBRIDGEPLANETTARSONIS = 1408
    SMBRIDGEPLANETTYPHON = 1409
    SMBRIDGEPLANETTYRADOR = 1410
    SMBRIDGEPLANETULAAN = 1411
    SMBRIDGEPLANETULNAR = 1412
    SMBRIDGEPLANETVALHALLA = 1413
    SMBRIDGEPLANETXIL = 1414
    SMBRIDGEPLANETZHAKULDAS = 1415
    SMMARSARAPLANET = 1416
    SMNOVA = 1417
    SMHAVENPLANET = 1418
    SMHYPERIONBRIDGEBRIEFING = 1419
    SMHYPERIONBRIDGEBRIEFINGCENTER = 1420
    SMCHARBATTLEFIELDENDPROPS = 1421
    SMCHARBATTLEZONETURRET = 1422
    SMTERRAN01FX = 1423
    SMTERRAN03FX = 1424
    SMTERRAN05FX = 1425
    SMTERRAN05FXMUTALISKS = 1426
    SMTERRAN05PROPS = 1427
    SMTERRAN06AFX = 1428
    SMTERRAN06BFX = 1429
    SMTERRAN06CFX = 1430
    SMTERRAN12FX = 1431
    SMTERRAN14FX = 1432
    SMTERRAN15FX = 1433
    SMTERRAN06APROPS = 1434
    SMTERRAN06BPROPS = 1435
    SMTERRAN07PROPS = 1436
    SMTERRAN07FX = 1437
    SMTERRAN08PROPS = 1438
    SMTERRAN09FX = 1439
    SMTERRAN09PROPS = 1440
    SMTERRAN11FX = 1441
    SMTERRAN11FXMISSILES = 1442
    SMTERRAN11FXEXPLOSIONS = 1443
    SMTERRAN11FXBLOOD = 1444
    SMTERRAN11FXDEBRIS = 1445
    SMTERRAN11FXDEBRIS1 = 1446
    SMTERRAN11FXDEBRIS2 = 1447
    SMTERRAN11PROPS = 1448
    SMTERRAN11PROPSBURROWROCKS = 1449
    SMTERRAN11PROPSRIFLESHELLS = 1450
    SMTERRAN12PROPS = 1451
    SMTERRAN13PROPS = 1452
    SMTERRAN14PROPS = 1453
    SMTERRAN15PROPS = 1454
    SMTERRAN16FX = 1455
    SMTERRAN16FXFLAK = 1456
    SMTERRAN17PROPS = 1457
    SMTERRAN17FX = 1458
    SMMARSARABARPROPS = 1459
    SMHYPERIONCORRIDORPROPS = 1460
    ZERATULCRYSTALCHARGE = 1461
    SMRAYNORHANDS = 1462
    SMPRESSROOMPROPS = 1463
    SMRAYNORGUN = 1464
    SMMARINERIFLE = 1465
    SMTOSHKNIFE = 1466
    SMTOSHSHUTTLEPROPS = 1467
    SMHYPERIONEXTERIOR = 1468
    SMHYPERIONEXTERIORLOW = 1469
    SMHYPERIONEXTERIORHOLOGRAM = 1470
    SMCHARCUTSCENES00 = 1471
    SMCHARCUTSCENES01 = 1472
    SMCHARCUTSCENES02 = 1473
    SMCHARCUTSCENES03 = 1474
    SMMARSARABARBRIEFINGSET = 1475
    SMMARSARABARBRIEFINGSET2 = 1476
    SMMARSARABARBRIEFINGSETLEFT = 1477
    SMMARSARABARBRIEFINGSETRIGHT = 1478
    SMMARSARABARBRIEFINGTVMAIN = 1479
    SMMARSARABARBRIEFINGTVMAIN2 = 1480
    SMMARSARABARBRIEFINGTVMAIN3 = 1481
    SMMARSARABARBRIEFINGTVPORTRAIT1 = 1482
    SMMARSARABARBRIEFINGTVPORTRAIT2 = 1483
    SMMARSARABARBRIEFINGTVPORTRAIT3 = 1484
    SMMARSARABARBRIEFINGTVPORTRAIT4 = 1485
    SMMARSARABARBRIEFINGTVPORTRAIT5 = 1486
    SMMARSARABARSET = 1487
    SMMARSARABARSET2 = 1488
    SMMARSARABARSTARMAPHS = 1489
    SMMARSARABARTVHS = 1490
    SMMARSARABARHYDRALISKSKULLHS = 1491
    SMMARSARABARCORKBOARDHS = 1492
    SMMARSARABARCORKBOARDBACKGROUND = 1493
    SMMARSARABARCORKBOARDITEM1HS = 1494
    SMMARSARABARCORKBOARDITEM2HS = 1495
    SMMARSARABARCORKBOARDITEM3HS = 1496
    SMMARSARABARCORKBOARDITEM4HS = 1497
    SMMARSARABARCORKBOARDITEM5HS = 1498
    SMMARSARABARCORKBOARDITEM6HS = 1499
    SMMARSARABARCORKBOARDITEM7HS = 1500
    SMMARSARABARCORKBOARDITEM8HS = 1501
    SMMARSARABARCORKBOARDITEM9HS = 1502
    SMMARSARABARBOTTLESHS = 1503
    SMVALERIANOBSERVATORYPROPS = 1504
    SMVALERIANOBSERVATORYSTARMAP = 1505
    SMBANSHEE = 1506
    SMVIKING = 1507
    SMARMORYBANSHEE = 1508
    SMARMORYDROPSHIP = 1509
    SMARMORYTANK = 1510
    SMARMORYVIKING = 1511
    SMARMORYSPIDERMINE = 1512
    SMARMORYGHOSTCRATE = 1513
    SMARMORYSPECTRECRATE = 1514
    SMARMORYBANSHEEPHCRATE = 1515
    SMARMORYDROPSHIPPHCRATE = 1516
    SMARMORYTANKPHCRATE = 1517
    SMARMORYVIKINGPHCRATE = 1518
    SMARMORYSPIDERMINEPHCRATE = 1519
    SMARMORYGHOSTCRATEPHCRATE = 1520
    SMARMORYSPECTRECRATEPHCRATE = 1521
    SMARMORYRIFLE = 1522
    SMDROPSHIP = 1523
    SMDROPSHIPBLUE = 1524
    SMHYPERIONARMORYVIKING = 1525
    SMCHARGATLINGGUN = 1526
    SMBOUNTYHUNTER = 1527
    SMCIVILIAN = 1528
    SMZERGEDHANSON = 1529
    SMLABASSISTANT = 1530
    SMHYPERIONARMORER = 1531
    SMUNNSCREEN = 1532
    NEWSARCTURUSINTERVIEWSET = 1533
    NEWSARCTURUSPRESSROOM = 1534
    SMDONNYVERMILLIONSET = 1535
    NEWSMEINHOFFREFUGEECENTER = 1536
    NEWSRAYNORLOGO = 1537
    NEWSTVEFFECT = 1538
    SMUNNCAMERA = 1539
    SMLEEKENOSET = 1540
    SMTVSTATIC = 1541
    SMDONNYVERMILLION = 1542
    SMDONNYVERMILLIONDEATH = 1543
    SMLEEKENO = 1544
    SMKATELOCKWELL = 1545
    SMMIKELIBERTY = 1546
    SMTERRANREADYROOMLEFTTV = 1547
    SMTERRANREADYROOMMAINTV = 1548
    SMTERRANREADYROOMRIGHTTV = 1549
    SMHYPERIONARMORYSTAGE1SET = 1550
    SMHYPERIONARMORYSTAGE1SET01 = 1551
    SMHYPERIONARMORYSTAGE1SET02 = 1552
    SMHYPERIONARMORYSTAGE1SET03 = 1553
    SMHYPERIONARMORYSPACELIGHTING = 1554
    SMHYPERIONARMORYSTAGE1TECHNOLOGYCONSOLEHS = 1555
    SMHYPERIONBRIDGESTAGE1BOW = 1556
    SMHYPERIONBRIDGESTAGE1SET = 1557
    SMHYPERIONBRIDGESTAGE1SET2 = 1558
    SMHYPERIONBRIDGESTAGE1SET3 = 1559
    SMHYPERIONBRIDGEHOLOMAP = 1560
    SMHYPERIONCANTINASTAGE1SET = 1561
    SMHYPERIONCANTINASTAGE1SET2 = 1562
    SMHYPERIONCANTINASTAGE1WALLPIECE = 1563
    SMHYPERIONBRIDGEPROPS = 1564
    SMHYPERIONCANTINAPROPS = 1565
    SMHYPERIONMEDLABPROPS = 1566
    SMHYPERIONMEDLABPROTOSSCRYOTUBE0HS = 1567
    SMHYPERIONMEDLABPROTOSSCRYOTUBE1HS = 1568
    SMHYPERIONMEDLABPROTOSSCRYOTUBE2HS = 1569
    SMHYPERIONMEDLABPROTOSSCRYOTUBE3HS = 1570
    SMHYPERIONMEDLABPROTOSSCRYOTUBE4HS = 1571
    SMHYPERIONMEDLABPROTOSSCRYOTUBE5HS = 1572
    SMHYPERIONMEDLABZERGCRYOTUBE0HS = 1573
    SMHYPERIONMEDLABZERGCRYOTUBE1HS = 1574
    SMHYPERIONMEDLABZERGCRYOTUBE2HS = 1575
    SMHYPERIONMEDLABZERGCRYOTUBE3HS = 1576
    SMHYPERIONMEDLABZERGCRYOTUBE4HS = 1577
    SMHYPERIONMEDLABZERGCRYOTUBE5HS = 1578
    SMHYPERIONMEDLABCRYOTUBEA = 1579
    SMHYPERIONMEDLABCRYOTUBEB = 1580
    SMHYPERIONCANTINASTAGE1EXITHS = 1581
    SMHYPERIONCANTINASTAGE1STAIRCASEHS = 1582
    SMHYPERIONCANTINASTAGE1TVHS = 1583
    SMHYPERIONCANTINASTAGE1ARCADEGAMEHS = 1584
    SMHYPERIONCANTINASTAGE1JUKEBOXHS = 1585
    SMHYPERIONCANTINASTAGE1CORKBOARDHS = 1586
    SMHYPERIONCANTINAPROGRESSFRAME = 1587
    SMHYPERIONCANTINAHYDRACLAWSHS = 1588
    SMHYPERIONCANTINAMERCCOMPUTERHS = 1589
    SMHYPERIONCANTINASTAGE1PROGRESS1HS = 1590
    SMHYPERIONCANTINASTAGE1PROGRESS2HS = 1591
    SMHYPERIONCANTINASTAGE1PROGRESS3HS = 1592
    SMHYPERIONCANTINASTAGE1PROGRESS4HS = 1593
    SMHYPERIONCANTINASTAGE1PROGRESS5HS = 1594
    SMHYPERIONCANTINASTAGE1PROGRESS6HS = 1595
    SMHYPERIONCORRIDORSET = 1596
    SMHYPERIONBRIDGESTAGE1BATTLEREPORTSHS = 1597
    SMHYPERIONBRIDGESTAGE1CENTERCONSOLEHS = 1598
    SMHYPERIONBRIDGESTAGE1BATTLECOMMANDHS = 1599
    SMHYPERIONBRIDGESTAGE1CANTINAHS = 1600
    SMHYPERIONBRIDGESTAGE1WINDOWHS = 1601
    SMHYPERIONMEDLABSTAGE1SET = 1602
    SMHYPERIONMEDLABSTAGE1SET2 = 1603
    SMHYPERIONMEDLABSTAGE1SETLIGHTS = 1604
    SMHYPERIONMEDLABSTAGE1CONSOLEHS = 1605
    SMHYPERIONMEDLABSTAGE1DOORHS = 1606
    SMHYPERIONMEDLABSTAGE1CRYSTALHS = 1607
    SMHYPERIONMEDLABSTAGE1ARTIFACTHS = 1608
    SMHYPERIONLABARTIFACTPART1HS = 1609
    SMHYPERIONLABARTIFACTPART2HS = 1610
    SMHYPERIONLABARTIFACTPART3HS = 1611
    SMHYPERIONLABARTIFACTPART4HS = 1612
    SMHYPERIONLABARTIFACTBASEHS = 1613
    SMSHADOWBOX = 1614
    SMCHARBATTLEZONESHADOWBOX = 1615
    SMCHARINTERACTIVESKYPARALLAX = 1616
    SMCHARINTERACTIVE02SKYPARALLAX = 1617
    SMRAYNORCOMMANDER = 1618
    SMADJUTANT = 1619
    SMADJUTANTHOLOGRAM = 1620
    SMMARAUDER = 1621
    SMFIREBAT = 1622
    SMMARAUDERPHCRATE = 1623
    SMFIREBATPHCRATE = 1624
    SMRAYNORMARINE = 1625
    SMMARINE01 = 1626
    SMMARINE02 = 1627
    SMMARINE02AOD = 1628
    SMMARINE03 = 1629
    SMMARINE04 = 1630
    SMCADE = 1631
    SMHALL = 1632
    SMBRALIK = 1633
    SMANNABELLE = 1634
    SMEARL = 1635
    SMKACHINSKY = 1636
    SMGENERICMALEGREASEMONKEY01 = 1637
    SMGENERICMALEGREASEMONKEY02 = 1638
    SMGENERICMALEOFFICER01 = 1639
    SMGENERICMALEOFFICER02 = 1640
    SMSTETMANN = 1641
    SMCOOPER = 1642
    SMHILL = 1643
    SMYBARRA = 1644
    SMVALERIANMENGSK = 1645
    SMARCTURUSMENGSK = 1646
    SMARCTURUSHOLOGRAM = 1647
    SMZERATUL = 1648
    SMHYDRALISK = 1649
    SMHYDRALISKDEAD = 1650
    SMMUTALISK = 1651
    SMZERGLING = 1652
    SCIENTIST = 1653
    MINERMALE = 1654
    CIVILIAN = 1655
    COLONIST = 1656
    CIVILIANFEMALE = 1657
    COLONISTFEMALE = 1658
    HUT = 1659
    COLONISTHUT = 1660
    INFESTABLEHUT = 1661
    INFESTABLECOLONISTHUT = 1662
    XELNAGASHRINEXIL = 1663
    PROTOSSRELIC = 1664
    PICKUPGRENADES = 1665
    PICKUPPLASMAGUN = 1666
    PICKUPPLASMAROUNDS = 1667
    PICKUPMEDICRECHARGE = 1668
    PICKUPMANARECHARGE = 1669
    PICKUPRESTORATIONCHARGE = 1670
    PICKUPCHRONORIFTDEVICE = 1671
    PICKUPCHRONORIFTCHARGE = 1672
    GASCANISTER = 1673
    GASCANISTERPROTOSS = 1674
    GASCANISTERZERG = 1675
    MINERALCRYSTAL = 1676
    PALLETGAS = 1677
    PALLETMINERALS = 1678
    NATURALGAS = 1679
    NATURALMINERALS = 1680
    NATURALMINERALSRED = 1681
    PICKUPHEALTH25 = 1682
    PICKUPHEALTH50 = 1683
    PICKUPHEALTH100 = 1684
    PICKUPHEALTHFULL = 1685
    PICKUPENERGY25 = 1686
    PICKUPENERGY50 = 1687
    PICKUPENERGY100 = 1688
    PICKUPENERGYFULL = 1689
    PICKUPMINES = 1690
    PICKUPPSISTORM = 1691
    CIVILIANCARSUNIT = 1692
    CRUISERBIKE = 1693
    TERRANBUGGY = 1694
    COLONISTVEHICLEUNIT = 1695
    COLONISTVEHICLEUNIT01 = 1696
    DUMPTRUCK = 1697
    TANKERTRUCK = 1698
    FLATBEDTRUCK = 1699
    COLONISTSHIPTHANSON02A = 1700
    PURIFIER = 1701
    INFESTEDARMORY = 1702
    INFESTEDBARRACKS = 1703
    INFESTEDBUNKER = 1704
    INFESTEDCC = 1705
    INFESTEDENGBAY = 1706
    INFESTEDFACTORY = 1707
    INFESTEDREFINERY = 1708
    INFESTEDSTARPORT = 1709
    INFESTEDMISSILETURRET = 1710
    LOGISTICSHEADQUARTERS = 1711
    INFESTEDSUPPLY = 1712
    TARSONISENGINE = 1713
    TARSONISENGINEFAST = 1714
    FREIGHTCAR = 1715
    CABOOSE = 1716
    HYPERION = 1717
    MENGSKHOLOGRAMBILLBOARD = 1718
    TRAYNOR01SIGNSDESTRUCTIBLE1 = 1719
    ABANDONEDBUILDING = 1720
    NOVA = 1721
    FOOD1000 = 1722
    PSIINDOCTRINATOR = 1723
    JORIUMSTOCKPILE = 1724
    ZERGDROPPOD = 1725
    TERRANDROPPOD = 1726
    COLONISTBIODOME = 1727
    COLONISTBIODOMEHALFBUILT = 1728
    INFESTABLEBIODOME = 1729
    INFESTABLECOLONISTBIODOME = 1730
    MEDIC = 1731
    VIKINGSKY_UNIT = 1732
    SS_FIGHTER = 1733
    SS_PHOENIX = 1734
    SS_CARRIER = 1735
    SS_BACKGROUNDZERG01 = 1736
    SS_BACKGROUNDSPACE00 = 1737
    SS_BACKGROUNDSPACE01 = 1738
    SS_BACKGROUNDSPACE02 = 1739
    SS_BACKGROUNDSPACEPROT00 = 1740
    SS_BACKGROUNDSPACEPROT01 = 1741
    SS_BACKGROUNDSPACEPROT02 = 1742
    SS_BACKGROUNDSPACEPROT03 = 1743
    SS_BACKGROUNDSPACEPROT04 = 1744
    SS_BACKGROUNDSPACEPROTOSSLARGE = 1745
    SS_BACKGROUNDSPACEZERGLARGE = 1746
    SS_BACKGROUNDSPACETERRANLARGE = 1747
    SS_BACKGROUNDSPACEZERG01 = 1748
    SS_BACKGROUNDSPACETERRAN01 = 1749
    BREACHINGCHARGE = 1750
    INFESTATIONSPIRE = 1751
    SPACEPLATFORMVENTSUNIT = 1752
    STONEZEALOT = 1753
    PRESERVERPRISON = 1754
    PORTJUNKER = 1755
    LEVIATHAN = 1756
    SWARMLING = 1757
    VALHALLADESTRUCTIBLEWALL = 1758
    NEWFOLSOMPRISONENTRANCE = 1759
    ODINBUILD = 1760
    NUKEPACK = 1761
    CHARDESTRUCTIBLEROCKCOVER = 1762
    CHARDESTRUCTIBLEROCKCOVERV = 1763
    CHARDESTRUCTIBLEROCKCOVERULDR = 1764
    CHARDESTRUCTIBLEROCKCOVERURDL = 1765
    MAARWARPINUNIT = 1766
    EGGPURPLE = 1767
    TRUCKFLATBEDUNIT = 1768
    TRUCKSEMIUNIT = 1769
    TRUCKUTILITYUNIT = 1770
    INFESTEDCOLONISTSHIP = 1771
    CASTANARDESTRUCTIBLEDEBRIS = 1772
    COLONISTTRANSPORT = 1773
    PRESERVERBASE = 1774
    PRESERVERA = 1775
    PRESERVERB = 1776
    PRESERVERC = 1777
    TAURENSPACEMARINE = 1778
    MARSARABRIDGEBLUR = 1779
    MARSARABRIDGEBRUL = 1780
    SHORTBRIDGEVERTICAL = 1781
    SHORTBRIDGEHORIZONTAL = 1782
    TESTHERO = 1783
    TESTSHOP = 1784
    HEALINGPOTIONTESTTARGET = 1785
    _4SLOTBAG = 1786
    _6SLOTBAG = 1787
    _8SLOTBAG = 1788
    _10SLOTBAG = 1789
    _12SLOTBAG = 1790
    _14SLOTBAG = 1791
    _16SLOTBAG = 1792
    _18SLOTBAG = 1793
    _20SLOTBAG = 1794
    _22SLOTBAG = 1795
    _24SLOTBAG = 1796
    REPULSERFIELD6 = 1797
    REPULSERFIELD8 = 1798
    REPULSERFIELD10 = 1799
    REPULSERFIELD12 = 1800
    DESTRUCTIBLEWALLCORNER45ULBL = 1801
    DESTRUCTIBLEWALLCORNER45ULUR = 1802
    DESTRUCTIBLEWALLCORNER45URBR = 1803
    DESTRUCTIBLEWALLCORNER45 = 1804
    DESTRUCTIBLEWALLCORNER45UR90L = 1805
    DESTRUCTIBLEWALLCORNER45UL90B = 1806
    DESTRUCTIBLEWALLCORNER45BL90R = 1807
    DESTRUCTIBLEWALLCORNER45BR90T = 1808
    DESTRUCTIBLEWALLCORNER90L45BR = 1809
    DESTRUCTIBLEWALLCORNER90T45BL = 1810
    DESTRUCTIBLEWALLCORNER90R45UL = 1811
    DESTRUCTIBLEWALLCORNER90B45UR = 1812
    DESTRUCTIBLEWALLCORNER90TR = 1813
    DESTRUCTIBLEWALLCORNER90BR = 1814
    DESTRUCTIBLEWALLCORNER90LB = 1815
    DESTRUCTIBLEWALLCORNER90LT = 1816
    DESTRUCTIBLEWALLDIAGONALBLUR = 1817
    DESTRUCTIBLEWALLDIAGONALBLURLF = 1818
    DESTRUCTIBLEWALLDIAGONALULBRLF = 1819
    DESTRUCTIBLEWALLDIAGONALULBR = 1820
    DESTRUCTIBLEWALLSTRAIGHTVERTICAL = 1821
    DESTRUCTIBLEWALLVERTICALLF = 1822
    DESTRUCTIBLEWALLSTRAIGHTHORIZONTAL = 1823
    DESTRUCTIBLEWALLSTRAIGHTHORIZONTALBF = 1824
    DEFENSEWALLE = 1825
    DEFENSEWALLS = 1826
    DEFENSEWALLW = 1827
    DEFENSEWALLN = 1828
    DEFENSEWALLNE = 1829
    DEFENSEWALLSW = 1830
    DEFENSEWALLNW = 1831
    DEFENSEWALLSE = 1832
    WRECKEDBATTLECRUISERHELIOSFINAL = 1833
    FIREWORKSBLUE = 1834
    FIREWORKSRED = 1835
    FIREWORKSYELLOW = 1836
    PURIFIERBLASTMARKUNIT = 1837
    ITEMGRAVITYBOMBS = 1838
    ITEMGRENADES = 1839
    ITEMMEDKIT = 1840
    ITEMMINES = 1841
    REAPERPLACEMENT = 1842
    QUEENZAGARAACGLUESCREENDUMMY = 1843
    OVERSEERZAGARAACGLUESCREENDUMMY = 1844
    STUKOVINFESTEDCIVILIANACGLUESCREENDUMMY = 1845
    STUKOVINFESTEDMARINEACGLUESCREENDUMMY = 1846
    STUKOVINFESTEDSIEGETANKACGLUESCREENDUMMY = 1847
    STUKOVINFESTEDDIAMONDBACKACGLUESCREENDUMMY = 1848
    STUKOVINFESTEDBANSHEEACGLUESCREENDUMMY = 1849
    SILIBERATORACGLUESCREENDUMMY = 1850
    STUKOVINFESTEDBUNKERACGLUESCREENDUMMY = 1851
    STUKOVINFESTEDMISSILETURRETACGLUESCREENDUMMY = 1852
    STUKOVBROODQUEENACGLUESCREENDUMMY = 1853
    ZEALOTFENIXACGLUESCREENDUMMY = 1854
    SENTRYFENIXACGLUESCREENDUMMY = 1855
    ADEPTFENIXACGLUESCREENDUMMY = 1856
    IMMORTALFENIXACGLUESCREENDUMMY = 1857
    COLOSSUSFENIXACGLUESCREENDUMMY = 1858
    DISRUPTORACGLUESCREENDUMMY = 1859
    OBSERVERFENIXACGLUESCREENDUMMY = 1860
    SCOUTACGLUESCREENDUMMY = 1861
    CARRIERFENIXACGLUESCREENDUMMY = 1862
    PHOTONCANNONFENIXACGLUESCREENDUMMY = 1863
    PRIMALZERGLINGACGLUESCREENDUMMY = 1864
    RAVASAURACGLUESCREENDUMMY = 1865
    PRIMALROACHACGLUESCREENDUMMY = 1866
    FIREROACHACGLUESCREENDUMMY = 1867
    PRIMALGUARDIANACGLUESCREENDUMMY = 1868
    PRIMALHYDRALISKACGLUESCREENDUMMY = 1869
    PRIMALMUTALISKACGLUESCREENDUMMY = 1870
    PRIMALIMPALERACGLUESCREENDUMMY = 1871
    PRIMALSWARMHOSTACGLUESCREENDUMMY = 1872
    CREEPERHOSTACGLUESCREENDUMMY = 1873
    PRIMALULTRALISKACGLUESCREENDUMMY = 1874
    TYRANNOZORACGLUESCREENDUMMY = 1875
    PRIMALWURMACGLUESCREENDUMMY = 1876
    HHREAPERACGLUESCREENDUMMY = 1877
    HHWIDOWMINEACGLUESCREENDUMMY = 1878
    HHHELLIONTANKACGLUESCREENDUMMY = 1879
    HHWRAITHACGLUESCREENDUMMY = 1880
    HHVIKINGACGLUESCREENDUMMY = 1881
    HHBATTLECRUISERACGLUESCREENDUMMY = 1882
    HHRAVENACGLUESCREENDUMMY = 1883
    HHBOMBERPLATFORMACGLUESCREENDUMMY = 1884
    HHMERCSTARPORTACGLUESCREENDUMMY = 1885
    HHMISSILETURRETACGLUESCREENDUMMY = 1886
    HIGHTEMPLARSKINPREVIEW = 1887
    WARPPRISMSKINPREVIEW = 1888
    SIEGETANKSKINPREVIEW = 1889
    LIBERATORSKINPREVIEW = 1890
    VIKINGSKINPREVIEW = 1891
    STUKOVINFESTEDTROOPERACGLUESCREENDUMMY = 1892
    XELNAGADESTRUCTIBLEBLOCKER6S = 1893
    XELNAGADESTRUCTIBLEBLOCKER6SE = 1894
    XELNAGADESTRUCTIBLEBLOCKER6E = 1895
    XELNAGADESTRUCTIBLEBLOCKER6NE = 1896
    XELNAGADESTRUCTIBLEBLOCKER6N = 1897
    XELNAGADESTRUCTIBLEBLOCKER6NW = 1898
    XELNAGADESTRUCTIBLEBLOCKER6W = 1899
    XELNAGADESTRUCTIBLEBLOCKER6SW = 1900
    XELNAGADESTRUCTIBLEBLOCKER8S = 1901
    XELNAGADESTRUCTIBLEBLOCKER8SE = 1902
    XELNAGADESTRUCTIBLEBLOCKER8E = 1903
    XELNAGADESTRUCTIBLEBLOCKER8NE = 1904
    XELNAGADESTRUCTIBLEBLOCKER8N = 1905
    XELNAGADESTRUCTIBLEBLOCKER8NW = 1906
    XELNAGADESTRUCTIBLEBLOCKER8W = 1907
    XELNAGADESTRUCTIBLEBLOCKER8SW = 1908
    SNOWGLAZESTARTERMP = 1909
    SHIELDBATTERY = 1910
    OBSERVERSIEGEMODE = 1911
    OVERSEERSIEGEMODE = 1912
    RAVENREPAIRDRONE = 1913
    HIGHTEMPLARWEAPONMISSILE = 1914
    CYCLONEMISSILELARGEAIRALTERNATIVE = 1915
    RAVENSCRAMBLERMISSILE = 1916
    RAVENREPAIRDRONERELEASEWEAPON = 1917
    RAVENSHREDDERMISSILEWEAPON = 1918
    INFESTEDACIDSPINESWEAPON = 1919
    INFESTORENSNAREATTACKMISSILE = 1920
    SNARE_PLACEHOLDER = 1921
    TYCHUSREAPERACGLUESCREENDUMMY = 1922
    TYCHUSFIREBATACGLUESCREENDUMMY = 1923
    TYCHUSSPECTREACGLUESCREENDUMMY = 1924
    TYCHUSMEDICACGLUESCREENDUMMY = 1925
    TYCHUSMARAUDERACGLUESCREENDUMMY = 1926
    TYCHUSWARHOUNDACGLUESCREENDUMMY = 1927
    TYCHUSHERCACGLUESCREENDUMMY = 1928
    TYCHUSGHOSTACGLUESCREENDUMMY = 1929
    TYCHUSSCVAUTOTURRETACGLUESCREENDUMMY = 1930
    ZERATULSTALKERACGLUESCREENDUMMY = 1931
    ZERATULSENTRYACGLUESCREENDUMMY = 1932
    ZERATULDARKTEMPLARACGLUESCREENDUMMY = 1933
    ZERATULIMMORTALACGLUESCREENDUMMY = 1934
    ZERATULOBSERVERACGLUESCREENDUMMY = 1935
    ZERATULDISRUPTORACGLUESCREENDUMMY = 1936
    ZERATULWARPPRISMACGLUESCREENDUMMY = 1937
    ZERATULPHOTONCANNONACGLUESCREENDUMMY = 1938
    RENEGADELONGBOLTMISSILEWEAPON = 1939
    VIKING = 1940
    RENEGADEMISSILETURRET = 1941
    PARASITICBOMBRELAYDUMMY = 1942
    PREVIEWBUNKERUPGRADED = 1943
    ASSIMILATORRICH = 1944
    EXTRACTORRICH = 1945
    INHIBITORZONESMALL = 1946
    INHIBITORZONEMEDIUM = 1947
    INHIBITORZONELARGE = 1948
    REFINERYRICH = 1949
    MINERALFIELD450 = 1950 class Renderer(object):

    def __init__(self, client, map_size, minimap_size) -> None:
        self._client = client

        self._window = None
        self._map_size = map_size
        self._map_image = None
        self._minimap_size = minimap_size
        self._minimap_image = None
        self._mouse_x, self._mouse_y = None, None
        self._text_supply = None
        self._text_vespene = None
        self._text_minerals = None
        self._text_score = None
        self._text_time = None

    async def render(self, observation):
        render_data = observation.observation.render_data

        map_size = render_data.map.size
        map_data = render_data.map.data
        minimap_size = render_data.minimap.size
        minimap_data = render_data.minimap.data

        map_width, map_height = map_size.x, map_size.y
        map_pitch = -map_width * 3

        minimap_width, minimap_height = minimap_size.x, minimap_size.y
        minimap_pitch = -minimap_width * 3

        if not self._window:
            from pyglet.window import Window
            from pyglet.image import ImageData
            from pyglet.text import Label
            self._window = Window(width=map_width, height=map_height)
            self._window.on_mouse_press = self._on_mouse_press
            self._window.on_mouse_release = self._on_mouse_release
            self._window.on_mouse_drag = self._on_mouse_drag
            self._map_image = ImageData(map_width, map_height, 'RGB', map_data, map_pitch)
            self._minimap_image = ImageData(minimap_width, minimap_height, 'RGB', minimap_data,
                                            minimap_pitch)
            self._text_supply = Label(
                '', font_name='Arial', font_size=16, anchor_x='right', anchor_y='top',
                x=self._map_size[0] - 10, y=self._map_size[1] - 10, color=(200, 200, 200, 255)
            )
            self._text_vespene = Label(
                '', font_name='Arial', font_size=16, anchor_x='right', anchor_y='top',
                x=self._map_size[0] - 130, y=self._map_size[1] - 10, color=(28, 160, 16, 255)
            )
            self._text_minerals = Label(
                '', font_name='Arial', font_size=16, anchor_x='right', anchor_y='top',
                x=self._map_size[0] - 200, y=self._map_size[1] - 10, color=(68, 140, 255, 255)
            )
            self._text_score = Label(
                '', font_name='Arial', font_size=16, anchor_x='left', anchor_y='top',
                x=10, y=self._map_size[1] - 10, color=(219, 30, 30, 255)
            )
            self._text_time = Label(
                '', font_name='Arial', font_size=16, anchor_x='right', anchor_y='bottom',
                x=self._minimap_size[0] - 10, y=self._minimap_size[1] + 10, color=(255, 255, 255, 255)
            )
        else:
            self._map_image.set_data('RGB', map_pitch, map_data)
            self._minimap_image.set_data('RGB', minimap_pitch, minimap_data)
            self._text_time.text = str(datetime.timedelta(seconds=(observation.observation.game_loop * 0.725) // 16))
            if observation.observation.HasField('player_common'):
                self._text_supply.text = "{} / {}".format(observation.observation.player_common.food_used,
                                                          observation.observation.player_common.food_cap)
                self._text_vespene.text = str(observation.observation.player_common.vespene)
                self._text_minerals.text = str(observation.observation.player_common.minerals)
            if observation.observation.HasField('score'):
                self._text_score.text = "{} score: {}".format(
                    score_pb._SCORE_SCORETYPE.values_by_number[observation.observation.score.score_type].name,
                    observation.observation.score.score
                )

        await self._update_window()

        if self._client.in_game and (not observation.player_result) and self._mouse_x and self._mouse_y:
            await self._client.move_camera_spatial(Point2((self._mouse_x, self._minimap_size[0] - self._mouse_y)))
            self._mouse_x, self._mouse_y = None, None

    async def _update_window(self):
        self._window.switch_to()
        self._window.dispatch_events()

        self._window.clear()

        self._map_image.blit(0, 0)
        self._minimap_image.blit(0, 0)
        self._text_time.draw()
        self._text_score.draw()
        self._text_minerals.draw()
        self._text_vespene.draw()
        self._text_supply.draw()

        self._window.flip()

    def _on_mouse_press(self, x, y, button, modifiers):
        if button != 1:  # 1: mouse.LEFT
            return
        if x > self._minimap_size[0] or y > self._minimap_size[1]:
            return
        self._mouse_x, self._mouse_y = x, y

    def _on_mouse_release(self, x, y, button, modifiers):
        if button != 1:  # 1: mouse.LEFT
            return
        if x > self._minimap_size[0] or y > self._minimap_size[1]:
            return
        self._mouse_x, self._mouse_y = x, y

    def _on_mouse_drag(self, x, y, dx, dy, buttons, modifiers):
        if not buttons & 1:  # 1: mouse.LEFT
            return
        if x > self._minimap_size[0] or y > self._minimap_size[1]:
            return
        self._mouse_x, self._mouse_y = x, y class Protocol:
    def __init__(self, ws):
        assert ws
        self._ws = ws
        self._status = None

    async def __request(self, request):
        logger.debug(f"Sending request: {request !r}")
        try:
            await self._ws.send_bytes(request.SerializeToString())
        except TypeError:
            raise ConnectionAlreadyClosed("Cannot send: Connection already closed.")
        logger.debug(f"Request sent")

        response = sc_pb.Response()
        try:
            response_bytes = await self._ws.receive_bytes()
        except TypeError:
            raise ConnectionAlreadyClosed("Cannot receive: Connection already closed.")
        except asyncio.CancelledError:
            # If request is sent, the response must be received before reraising cancel
            try:
                await self._ws.receive_bytes()
            except asyncio.CancelledError:
                log.critical("Requests must not be cancelled multiple times")
                sys.exit(2)
            raise

        response.ParseFromString(response_bytes)
        logger.debug(f"Response received")
        return response

    async def _execute(self, **kwargs):
        assert len(kwargs) == 1, "Only one request allowed"

        request = sc_pb.Request(**kwargs)

        response = await self.__request(request)

        new_status = Status(response.status)
        if new_status != self._status:
            logger.info(f"Client status changed to {new_status} (was {self._status})")
        self._status = new_status

        if response.error:
            logger.debug(f"Response contained an error: {response.error}")
            raise ProtocolError(f"{response.error}")

        return response

    async def ping(self):
        result = await self._execute(ping=sc_pb.RequestPing())
        return result

    async def quit(self):
        try:
            await self._execute(quit=sc_pb.RequestQuit())
        except ConnectionAlreadyClosed:
            pass class ProtocolError(Exception):
    @property
    def is_game_over_error(self) -> bool:
        return self.args[0] in [
            "['Game has already ended']",
            "['Not supported if game has already ended']",
        ] class GameInfo:
    def __init__(self, proto):
        # TODO: this might require an update during the game because placement grid and
        # playable grid are greyed out on minerals, start locations and ramps (debris)
        # but we do not want to call information in the fog of war
        self._proto = proto
        self.players: List[Player] = [Player.from_proto(p) for p in self._proto.player_info]
        self.map_name: str = self._proto.map_name
        self.local_map_path: str = self._proto.local_map_path
        self.map_size: Size = Size.from_proto(self._proto.start_raw.map_size)
        self.pathing_grid: PixelMap = PixelMap(self._proto.start_raw.pathing_grid)
        self.terrain_height: PixelMap = PixelMap(self._proto.start_raw.terrain_height)
        self.placement_grid: PixelMap = PixelMap(self._proto.start_raw.placement_grid)
        self.playable_area = Rect.from_proto(self._proto.start_raw.playable_area)
        self.map_ramps: List[Ramp] = None  # Filled later by BotAI._prepare_first_step
        self.player_races: Dict[int, "Race"] = {
            p.player_id: p.race_actual or p.race_requested for p in self._proto.player_info
        }
        self.start_locations: List[Point2] = [Point2.from_proto(sl) for sl in self._proto.start_raw.start_locations]
        self.player_start_location: Point2 = None  # Filled later by BotAI._prepare_first_step

    @property
    def map_center(self) -> Point2:
        return self.playable_area.center

    def _find_ramps(self) -> List[Ramp]:
        """Calculate (self.pathing_grid - self.placement_grid) (for sets) and then find ramps by comparing heights."""
        rampDict = {
            Point2((x, y)): self.pathing_grid[(x, y)] == 0 and self.placement_grid[(x, y)] == 0
            for x in range(self.pathing_grid.width)
            for y in range(self.pathing_grid.height)
        }

        rampPoints = {p for p in rampDict if rampDict[p]}  # filter only points part of ramp
        rampGroups = self._find_groups(rampPoints)
        return [Ramp(group, self) for group in rampGroups]

    def _find_groups(
        self, points: Set[Point2], minimum_points_per_group: int = 8, max_distance_between_points: int = 2
    ) -> List[Set[Point2]]:
        """ From a set/list of points, this function will try to group points together """
        """ Paint clusters of points in rectangular map using flood fill algorithm. """
        NOT_INTERESTED = -2
        NOT_COLORED_YET = -1
        currentColor: int = NOT_COLORED_YET
        picture: List[List[int]] = [
            [NOT_INTERESTED for j in range(self.pathing_grid.width)] for i in range(self.pathing_grid.height)
        ]

        def paint(pt: Point2) -> None:
            picture[pt.y][pt.x] = currentColor

        nearby: Set[Point2] = set()
        for dx in range(-max_distance_between_points, max_distance_between_points + 1):
            for dy in range(-max_distance_between_points, max_distance_between_points + 1):
                if abs(dx) + abs(dy) <= max_distance_between_points:
                    nearby.add(Point2((dx, dy)))

        for point in points:
            paint(point)

        remaining: Set[Point2] = set(points)
        queue: Deque[Point2] = deque()
        foundGroups: List[Set[Point2]] = []
        while remaining:
            currentGroup: Set[Point2] = set()
            if not queue:
                currentColor += 1
                start = remaining.pop()
                paint(start)
                queue.append(start)
                currentGroup.add(start)
            while queue:
                base: Point2 = queue.popleft()
                for offset in nearby:
                    px, py = base.x + offset.x, base.y + offset.y
                    if px < 0 or py < 0 or px >= self.pathing_grid.width or py >= self.pathing_grid.height:
                        continue
                    if picture[py][px] != NOT_COLORED_YET:
                        continue
                    point: Point2 = Point2((px, py))
                    remaining.remove(point)
                    paint(point)
                    queue.append(point)
                    currentGroup.add(point)
            if len(currentGroup) >= minimum_points_per_group:
                foundGroups.append(currentGroup)

        """ Returns groups of points as list
        [{p1, p2, p3}, {p4, p5, p6, p7, p8}]
        """
        return foundGroups class GameData:
    def __init__(self, data):
        ids = set(a.value for a in AbilityId if a.value != 0)
        self.abilities = {a.ability_id: AbilityData(self, a) for a in data.abilities if a.ability_id in ids}
        self.units = {u.unit_id: UnitTypeData(self, u) for u in data.units if u.available}
        self.upgrades = {u.upgrade_id: UpgradeData(self, u) for u in data.upgrades}
        self.unit_types: Dict[int, UnitTypeId] = {}

    @lru_cache(maxsize=256)
    def calculate_ability_cost(self, ability) -> "Cost":
        if isinstance(ability, AbilityId):
            ability = self.abilities[ability.value]
        elif isinstance(ability, UnitCommand):
            ability = self.abilities[ability.ability.value]

        assert isinstance(ability, AbilityData), f"C: {ability}"

        for unit in self.units.values():
            if unit.creation_ability is None:
                continue

            if not AbilityData.id_exists(unit.creation_ability.id.value):
                continue

            if unit.creation_ability.is_free_morph:
                continue

            if unit.creation_ability == ability:
                if unit.id == ZERGLING:
                    # HARD CODED: zerglings are generated in pairs
                    return Cost(
                        unit.cost.minerals * 2,
                        unit.cost.vespene * 2,
                        unit.cost.time
                    )
                # Correction for morphing units, e.g. orbital would return 550/0 instead of actual 150/0
                morph_cost = unit.morph_cost
                if morph_cost: # can be None
                    return morph_cost
                # Correction for zerg structures without morph: Extractor would return 75 instead of actual 25
                return unit.cost_zerg_corrected

        for upgrade in self.upgrades.values():
            if upgrade.research_ability == ability:
                return upgrade.cost

        return Cost(0, 0) class AbilityData:
    ability_ids: List[int] = []  # sorted list
    for ability_id in AbilityId:  # 1000 items Enum is slow
        ability_ids.append(ability_id.value)
    ability_ids.remove(0)
    ability_ids.sort()

    @classmethod
    def id_exists(cls, ability_id):
        assert isinstance(ability_id, int), f"Wrong type: {ability_id} is not int"
        if ability_id == 0:
            return False
        i = bisect_left(cls.ability_ids, ability_id)  # quick binary search
        return i != len(cls.ability_ids) and cls.ability_ids[i] == ability_id

    def __init__(self, game_data, proto):
        self._game_data = game_data
        self._proto = proto

        assert self.id != 0

    def __repr__(self) -> str:
        return f"AbilityData(name={self._proto.button_name})"

    @property
    def id(self) -> AbilityId:
        if self._proto.remaps_to_ability_id:
            return AbilityId(self._proto.remaps_to_ability_id)
        return AbilityId(self._proto.ability_id)

    @property
    def link_name(self) -> str:
        """ For Stimpack this returns 'BarracksTechLabResearch' """
        return self._proto.link_name

    @property
    def button_name(self) -> str:
        """ For Stimpack this returns 'Stimpack' """
        return self._proto.button_name

    @property
    def friendly_name(self) -> str:
        """ For Stimpack this returns 'Research Stimpack' """
        return self._proto.friendly_name

    @property
    def is_free_morph(self) -> bool:
        parts = split_camel_case(self._proto.link_name)
        for p in parts:
            if p in FREE_MORPH_ABILITY_CATEGORIES:
                return True
        return False

    @property
    def cost(self) -> "Cost":
        return self._game_data.calculate_ability_cost(self.id) def combine_actions(action_iter):
    for key, items in groupby(action_iter, key=lambda a: a.combining_tuple):
        ability, target, queue = key

        if target is None:
            cmd = raw_pb.ActionRawUnitCommand(
                ability_id=ability.value,
                unit_tags=list({u.unit.tag for u in items}),
                queue_command=queue
            )
        elif isinstance(target, Point2):
            cmd = raw_pb.ActionRawUnitCommand(
                ability_id=ability.value,
                unit_tags=list({u.unit.tag for u in items}),
                queue_command=queue,
                target_world_space_pos=common_pb.Point2D(x=target.x, y=target.y)
            )
        elif isinstance(target, Unit):
            cmd = raw_pb.ActionRawUnitCommand(
                ability_id=ability.value,
                unit_tags=[u.unit.tag for u in items],
                queue_command=queue,
                target_unit_tag=target.tag
            )
        else:
            raise RuntimeError(f"Must target an unit or a point or None, found '{target !r}'")

        yield raw_pb.ActionRaw(unit_command=cmd) class Point2(Pointlike):
    @classmethod
    def from_proto(cls, data):
        return cls((data.x, data.y))

    @property
    def x(self) -> Union[int, float]:
        return self[0]

    @property
    def y(self) -> Union[int, float]:
        return self[1]

    @property
    def to2(self) -> "Point2":
        return Point2(self[:2])

    @property
    def to3(self) -> "Point3":
        return Point3((*self, 0))

    def distance2_to(self, other: "Point2"):
        """Squared distance to a point."""
        assert isinstance(other, Point2)
        return (self[0] - other[0]) ** 2 + (self[1] - other[1]) ** 2

    def random_on_distance(self, distance):
        if isinstance(distance, (tuple, list)):  # interval
            distance = distance[0] + random.random() * (distance[1] - distance[0])

        assert distance > 0
        angle = random.random() * 2 * math.pi

        dx, dy = math.cos(angle), math.sin(angle)
        return Point2((self.x + dx * distance, self.y + dy * distance))

    def towards_with_random_angle(
        self,
        p: Union["Point2", "Point3"],
        distance: Union[int, float] = 1,
        max_difference: Union[int, float] = (math.pi / 4),
    ) -> "Point2":
        tx, ty = self.to2.towards(p.to2, 1)
        angle = math.atan2(ty - self.y, tx - self.x)
        angle = (angle - max_difference) + max_difference * 2 * random.random()
        return Point2((self.x + math.cos(angle) * distance, self.y + math.sin(angle) * distance))

    def circle_intersection(self, p: "Point2", r: Union[int, float]) -> Set["Point2"]:
        """ self is point1, p is point2, r is the radius for circles originating in both points
        Used in ramp finding """
        assert self != p
        distanceBetweenPoints = self.distance_to(p)
        assert r > distanceBetweenPoints / 2
        # remaining distance from center towards the intersection, using pythagoras
        remainingDistanceFromCenter = (r ** 2 - (distanceBetweenPoints / 2) ** 2) ** 0.5
        # center of both points
        offsetToCenter = Point2(((p.x - self.x) / 2, (p.y - self.y) / 2))
        center = self.offset(offsetToCenter)

        # stretch offset vector in the ratio of remaining distance from center to intersection
        vectorStretchFactor = remainingDistanceFromCenter / (distanceBetweenPoints / 2)
        v = offsetToCenter
        offsetToCenterStretched = Point2((v.x * vectorStretchFactor, v.y * vectorStretchFactor))

        # rotate vector by 90° and -90°
        vectorRotated1 = Point2((offsetToCenterStretched.y, -offsetToCenterStretched.x))
        vectorRotated2 = Point2((-offsetToCenterStretched.y, offsetToCenterStretched.x))
        intersect1 = center.offset(vectorRotated1)
        intersect2 = center.offset(vectorRotated2)
        return {intersect1, intersect2}

    @property
    def neighbors4(self) -> set:
        return {
            Point2((self.x - 1, self.y)),
            Point2((self.x + 1, self.y)),
            Point2((self.x, self.y - 1)),
            Point2((self.x, self.y + 1)),
        }

    @property
    def neighbors8(self) -> set:
        return self.neighbors4 | {
            Point2((self.x - 1, self.y - 1)),
            Point2((self.x - 1, self.y + 1)),
            Point2((self.x + 1, self.y - 1)),
            Point2((self.x + 1, self.y + 1)),
        }

    def negative_offset(self, other: "Point2") -> "Point2":
        return self.__class__((self.x - other.x, self.y - other.y))

    def __add__(self, other: "Point2") -> "Point2":
        return self.offset(other)

    def __sub__(self, other: "Point2") -> "Point2":
        return self.negative_offset(other)

    def __neg__(self) -> "Point2":
        return self.__class__(-a for a in self)

    def __abs__(self) -> Union[int, float]:
        return math.hypot(self.x, self.y)

    def __bool__(self) -> bool:
        return self.x != 0 or self.y != 0

    def __mul__(self, other: Union[int, float, "Point2"]) -> "Point2":
        if isinstance(other, self.__class__):
            return self.__class__((self.x * other.x, self.y * other.y))
        return self.__class__((self.x * other, self.y * other))

    def __rmul__(self, other: Union[int, float, "Point2"]) -> "Point2":
        return self.__mul__(other)

    def __truediv__(self, other: Union[int, float, "Point2"]) -> "Point2":
        if isinstance(other, self.__class__):
            return self.__class__((self.x / other.x, self.y / other.y))
        return self.__class__((self.x / other, self.y / other))

    def is_same_as(self, other: "Point2", dist=0.1) -> bool:
        return self._distance_squared(other) <= dist ** 2

    def direction_vector(self, other: "Point2") -> "Point2":
        """ Converts a vector to a direction that can face vertically, horizontally or diagonal or be zero, e.g. (0, 0), (1, -1), (1, 0) """
        return self.__class__((_sign(other.x - self.x), _sign(other.y - self.y)))

    def manhattan_distance(self, other: "Point2") -> Union[int, float]:
        return abs(other.x - self.x) + abs(other.y - self.y)

    @staticmethod
    def center(a: Union[Set["Point2"], List["Point2"]]) -> "Point2":
        """ Returns the central point for points in list """
        s = Point2((0, 0))
        for p in a:
            s += p
        return s / len(a) class Point3(Point2):
    @classmethod
    def from_proto(cls, data):
        return cls((data.x, data.y, data.z))

    @property
    def z(self) -> Union[int, float]:
        return self[2]

    @property
    def to3(self) -> "Point3":
        return Point3(self) class Unit(PassengerUnit):
    @property_immutable_cache
    def is_snapshot(self) -> bool:
        return self._proto.display_type == DisplayType.Snapshot.value

    @property_immutable_cache
    def is_visible(self) -> bool:
        return self._proto.display_type == DisplayType.Visible.value

    @property_immutable_cache
    def alliance(self) -> Alliance:
        return self._proto.alliance

    @property_immutable_cache
    def is_mine(self) -> bool:
        return self._proto.alliance == Alliance.Self.value

    @property_immutable_cache
    def is_enemy(self) -> bool:
        return self._proto.alliance == Alliance.Enemy.value

    @property_immutable_cache
    def owner_id(self) -> int:
        return self._proto.owner

    @property_immutable_cache
    def position(self) -> Point2:
        return Point2((self._proto.pos.x, self._proto.pos.y))

    @property_immutable_cache
    def position3d(self) -> Point3:
        """3d position of the unit."""
        return Point3.from_proto(self._proto.pos)

    def distance_to(self, p: Union["Unit", Point2, Point3], bot: "BotAI" = None) -> Union[int, float]:
        """ Using the 2d distance between self and p. To calculate the 3d distance,
        use unit.position3d.distance_to(p) """
        if bot and isinstance(p, Unit):
            index = bot.distances_tag_dict
            return (bot.unit_distances_dict[index[self.tag]][index[p.tag]]) ** 0.5
        return self.position.distance_to_point2(p.position)

    @property_immutable_cache
    def facing(self) -> Union[int, float]:
        """ Returns float in range [0,2p). 0 means in direction of x axis."""
        return self._proto.facing

    @property_immutable_cache
    def radius(self) -> Union[int, float]:
        """ Half of unit size. See https://liquipedia.net/starcraft2/Unit_Statistics_(Legacy_of_the_Void) """
        return self._proto.radius

    @property_immutable_cache
    def detect_range(self) -> Union[int, float]:
        return self._proto.detect_range

    @property_immutable_cache
    def radar_range(self) -> Union[int, float]:
        return self._proto.radar_range

    @property_immutable_cache
    def build_progress(self) -> Union[int, float]:
        """ Returns completion in range [0,1]."""
        return self._proto.build_progress

    @property_immutable_cache
    def is_ready(self) -> bool:
        return self.build_progress == 1

    @property_immutable_cache
    def cloak(self) -> CloakState:
        """ Returns cloak state.
        See https://github.com/Blizzard/s2client-api/blob/d9ba0a33d6ce9d233c2a4ee988360c188fbe9dbf/include/sc2api/sc2_unit.h#L95 """
        return self._proto.cloak

    @property_immutable_cache
    def is_cloaked(self) -> bool:
        return self._proto.cloak in {CloakState.Cloaked.value, CloakState.CloakedDetected.value}

    @property_immutable_cache
    def is_blip(self) -> bool:
        """ Detected by sensor tower. """
        return self._proto.is_blip

    @property_immutable_cache
    def is_powered(self) -> bool:
        """ Is powered by a pylon nearby. """
        return self._proto.is_powered

    @property_immutable_cache
    def is_burrowed(self) -> bool:
        return self._proto.is_burrowed

    @property_immutable_cache
    def is_flying(self) -> bool:
        return self._proto.is_flying

    @property_immutable_cache
    def is_psionic(self) -> bool:
        return Attribute.Psionic.value in self._type_data.attributes

    @property_immutable_cache
    def is_mineral_field(self) -> bool:
        return self._type_data.has_minerals

    @property_immutable_cache
    def is_vespene_geyser(self) -> bool:
        return self._type_data.has_vespene

    @property
    def tech_alias(self) -> Optional[List[UnitTypeId]]:
        """ Building tech equality, e.g. OrbitalCommand is the same as CommandCenter
        For Hive, this returns [UnitTypeId.Hatchery, UnitTypeId.Lair]
        For SCV, this returns None """
        return self._type_data.tech_alias

    @property_immutable_cache
    def unit_alias(self) -> Optional[UnitTypeId]:
        """ Building type equality, e.g. FlyingOrbitalCommand is the same as OrbitalCommand
        For flying OrbitalCommand, this returns UnitTypeId.OrbitalCommand
        For SCV, this returns None """
        return self._type_data.unit_alias

    @property_immutable_cache
    def mineral_contents(self) -> int:
        """ How many minerals a mineral field has left to mine """
        return self._proto.mineral_contents

    @property_immutable_cache
    def vespene_contents(self) -> int:
        """ How much gas is remaining in a geyser """
        return self._proto.vespene_contents

    @property_immutable_cache
    def has_vespene(self) -> bool:
        """ Checks if a geyser has any gas remaining (can't build extractors on empty geysers), useful for lategame """
        return bool(self._proto.vespene_contents)

    @property_immutable_cache
    def weapon_cooldown(self) -> Union[int, float]:
        """ Returns some time (more than game loops) until the unit can fire again,
        returns -1 for units that can't attack.
        Usage:
        if unit.weapon_cooldown == 0:
            await self.do(unit.attack(target))
        elif unit.weapon_cooldown < 0:
            await self.do(unit.move(closest_allied_unit_because_cant_attack))
        else:
            await self.do(unit.move(retreatPosition))
        """
        if self.can_attack:
            return self._proto.weapon_cooldown
        return -1

    @property_immutable_cache
    def has_cargo(self) -> bool:
        """ If this unit has units loaded """
        return bool(self._proto.cargo_space_taken)

    @property_immutable_cache
    def cargo_used(self) -> Union[float, int]:
        """ How much cargo space is used (some units take up more than 1 space) """
        return self._proto.cargo_space_taken

    @property_immutable_cache
    def cargo_max(self) -> Union[float, int]:
        """ How much cargo space is totally available - CC: 5, Bunker: 4, Medivac: 8
        and Bunker can only load infantry, CC only SCVs """
        return self._proto.cargo_space_max

    @property_mutable_cache
    def passengers(self) -> Set["PassengerUnit"]:
        """ Units inside a Bunker, CommandCenter, Nydus, Medivac, WarpPrism, Overlord """
        return {PassengerUnit(unit, self._game_data) for unit in self._proto.passengers}

    @property_mutable_cache
    def passengers_tags(self) -> Set[int]:
        return {unit.tag for unit in self._proto.passengers}

    def target_in_range(self, target: "Unit", bonus_distance: Union[int, float] = 0) -> bool:
        """ Includes the target's radius when calculating distance to target """
        if self.can_attack_ground and not target.is_flying:
            unit_attack_range = self.ground_range
        elif self.can_attack_air and (target.is_flying or target.type_id == UnitTypeId.COLOSSUS):
            unit_attack_range = self.air_range
        else:
            unit_attack_range = -1
        return (
            self.position._distance_squared(target.position)
            <= (self.radius + target.radius + unit_attack_range - bonus_distance) ** 2
        )

    @property_immutable_cache
    def is_carrying_minerals(self) -> bool:
        """ Checks if a worker or MULE is carrying (gold-)minerals. """
        return any(
            buff.value in self._proto.buff_ids
            for buff in {BuffId.CARRYMINERALFIELDMINERALS, BuffId.CARRYHIGHYIELDMINERALFIELDMINERALS}
        )

    @property_immutable_cache
    def is_carrying_vespene(self) -> bool:
        """ Checks if a worker is carrying vespene. """
        return any(
            buff.value in self._proto.buff_ids
            for buff in {
                BuffId.CARRYHARVESTABLEVESPENEGEYSERGAS,
                BuffId.CARRYHARVESTABLEVESPENEGEYSERGASPROTOSS,
                BuffId.CARRYHARVESTABLEVESPENEGEYSERGASZERG,
            }
        )

    @property_immutable_cache
    def is_selected(self) -> bool:
        return self._proto.is_selected

    @property_mutable_cache
    def orders(self) -> List["UnitOrder"]:
        return [UnitOrder.from_proto(o, self._game_data) for o in self._proto.orders]

    @property_immutable_cache
    def noqueue(self) -> bool:
        return not self.orders

    @property_immutable_cache
    def is_moving(self) -> bool:
        return self.orders and self.orders[0].ability.id is AbilityId.MOVE

    @property_immutable_cache
    def is_attacking(self) -> bool:
        return self.orders and self.orders[0].ability.id in {
            AbilityId.ATTACK,
            AbilityId.ATTACK_ATTACK,
            AbilityId.ATTACK_ATTACKTOWARDS,
            AbilityId.ATTACK_ATTACKBARRAGE,
            AbilityId.SCAN_MOVE,
        }

    @property_immutable_cache
    def is_patrolling(self) -> bool:
        """ Checks if a unit is patrolling. """
        return self.orders and self.orders[0].ability.id is AbilityId.PATROL

    @property_immutable_cache
    def is_gathering(self) -> bool:
        """ Checks if a unit is on its way to a mineral field / vespene geyser to mine. """
        return self.orders and self.orders[0].ability.id is AbilityId.HARVEST_GATHER

    @property_immutable_cache
    def is_returning(self) -> bool:
        """ Checks if a unit is returning from mineral field / vespene geyser to deliver resources to townhall. """
        return self.orders and self.orders[0].ability.id is AbilityId.HARVEST_RETURN

    @property_immutable_cache
    def is_collecting(self) -> bool:
        """ Combines the two properties above. """
        return self.orders and self.orders[0].ability.id in {AbilityId.HARVEST_GATHER, AbilityId.HARVEST_RETURN}

    @property_immutable_cache
    def is_constructing_scv(self) -> bool:
        """ Checks if the unit is an SCV that is currently building. """
        return self.orders and self.orders[0].ability.id in {
            AbilityId.TERRANBUILD_ARMORY,
            AbilityId.TERRANBUILD_BARRACKS,
            AbilityId.TERRANBUILD_BUNKER,
            AbilityId.TERRANBUILD_COMMANDCENTER,
            AbilityId.TERRANBUILD_ENGINEERINGBAY,
            AbilityId.TERRANBUILD_FACTORY,
            AbilityId.TERRANBUILD_FUSIONCORE,
            AbilityId.TERRANBUILD_GHOSTACADEMY,
            AbilityId.TERRANBUILD_MISSILETURRET,
            AbilityId.TERRANBUILD_REFINERY,
            AbilityId.TERRANBUILD_SENSORTOWER,
            AbilityId.TERRANBUILD_STARPORT,
            AbilityId.TERRANBUILD_SUPPLYDEPOT,
        }

    @property_immutable_cache
    def is_repairing(self) -> bool:
        return self.orders and self.orders[0].ability.id in {
            AbilityId.EFFECT_REPAIR,
            AbilityId.EFFECT_REPAIR_MULE,
            AbilityId.EFFECT_REPAIR_SCV,
        }

    @property_immutable_cache
    def order_target(self) -> Optional[Union[int, Point2]]:
        """ Returns the target tag (if it is a Unit) or Point2 (if it is a Position)
        from the first order, returns None if the unit is idle """
        if self.orders:
            if isinstance(self.orders[0].target, int):
                return self.orders[0].target
            else:
                return Point2.from_proto(self.orders[0].target)
        return None

    @property_immutable_cache
    def is_idle(self) -> bool:
        return not self.orders

    @property_immutable_cache
    def add_on_tag(self) -> int:
        return self._proto.add_on_tag

    @property_immutable_cache
    def add_on_land_position(self) -> Point2:
        """ If unit is addon (techlab or reactor), returns the position
        where a terran building has to land to connect to addon """
        return self.position.offset(Point2((-2.5, 0.5)))

    @property_immutable_cache
    def has_add_on(self) -> bool:
        return not self.add_on_tag

    @property_immutable_cache
    def assigned_harvesters(self) -> int:
        """ Number of workers currently gathering resources at a geyser or mining base."""
        return self._proto.assigned_harvesters

    @property_immutable_cache
    def ideal_harvesters(self) -> int:
        """ Returns 3 for geysers, 2*n for n mineral patches on that base."""
        return self._proto.ideal_harvesters

    @property_immutable_cache
    def surplus_harvesters(self) -> int:
        """ Returns a positive number if it has too many harvesters mining,
        a negative number if it has too few mining """
        return self._proto.assigned_harvesters - self._proto.ideal_harvesters

    def train(self, unit, *args, **kwargs):
        return self(self._game_data.units[unit.value].creation_ability.id, *args, **kwargs)

    def build(self, unit, *args, **kwargs):
        return self(self._game_data.units[unit.value].creation_ability.id, *args, **kwargs)

    def research(self, upgrade, *args, **kwargs):
        """ Requires UpgradeId to be passed instead of AbilityId """
        return self(self._game_data.upgrades[upgrade.value].research_ability.id, *args, **kwargs)

    def has_buff(self, buff):
        assert isinstance(buff, BuffId)
        return buff.value in self._proto.buff_ids

    def warp_in(self, unit, placement, *args, **kwargs):
        normal_creation_ability = self._game_data.units[unit.value].creation_ability.id
        return self(warpgate_abilities[normal_creation_ability], placement, *args, **kwargs)

    def attack(self, *args, **kwargs):
        """ Target can be a Unit or Point2 """
        return self(AbilityId.ATTACK, *args, **kwargs)

    def gather(self, *args, **kwargs):
        """ Target can be a mineral patch or geyser """
        return self(AbilityId.HARVEST_GATHER, *args, **kwargs)

    def return_resource(self, *args, **kwargs):
        """ Does not need a target """
        return self(AbilityId.HARVEST_RETURN, *args, **kwargs)

    def move(self, *args, **kwargs):
        """ Target can be a Unit (to follow that unit) or Point2 """
        return self(AbilityId.MOVE, *args, **kwargs)

    def scan_move(self, *args, **kwargs):
        """ TODO: What does this actually do? """
        return self(AbilityId.SCAN_MOVE, *args, **kwargs)

    def hold_position(self, *args, **kwargs):
        return self(AbilityId.HOLDPOSITION, *args, **kwargs)

    def stop(self, *args, **kwargs):
        return self(AbilityId.STOP, *args, **kwargs)

    def patrol(self, *args, **kwargs):
        return self(AbilityId.PATROL, *args, **kwargs)

    def repair(self, *args, **kwargs):
        return self(AbilityId.EFFECT_REPAIR, *args, **kwargs)

    def __hash__(self):
        return hash(self.tag)

    def __call__(self, ability, *args, **kwargs):
        return unit_command.UnitCommand(ability, self, *args, **kwargs) class Units(list):
    """A collection for units. Makes it easy to select units by selectors."""

    @classmethod
    def from_proto(cls, units, game_data):
        return cls((Unit(u, game_data) for u in units), game_data)

    def __init__(self, units, game_data):
        super().__init__(units)
        self.game_data = game_data

    def __call__(self, *args, **kwargs):
        return UnitSelection(self, *args, **kwargs)

    def select(self, *args, **kwargs):
        return UnitSelection(self, *args, **kwargs)

    def copy(self):
        return self.subgroup(self)

    def __or__(self, other: "Units") -> "Units":
        if self is None:
            return other
        if other is None:
            return self
        tags = {unit.tag for unit in self}
        units = self + [unit for unit in other if unit.tag not in tags]
        return Units(units, self.game_data)

    def __and__(self, other: "Units") -> "Units":
        if self is None:
            return other
        if other is None:
            return self
        tags = {unit.tag for unit in self}
        units = [unit for unit in other if unit.tag in tags]
        return Units(units, self.game_data)

    def __sub__(self, other: "Units") -> "Units":
        if self is None:
            return Units([], self.game_data)
        if other is None:
            return self
        tags = {unit.tag for unit in other}
        units = [unit for unit in self if unit.tag not in tags]
        return Units(units, self.game_data)

    def __hash__(self):
        return hash(unit.tag for unit in self)

    @property
    def amount(self) -> int:
        return len(self)

    @property
    def empty(self) -> bool:
        return not bool(self)

    @property
    def exists(self) -> bool:
        return bool(self)

    def find_by_tag(self, tag) -> Optional[Unit]:
        for unit in self:
            if unit.tag == tag:
                return unit
        return None

    def by_tag(self, tag):
        unit = self.find_by_tag(tag)
        if unit is None:
            raise KeyError("Unit not found")
        return unit

    @property
    def first(self) -> Unit:
        assert self
        return self[0]

    def take(self, n: int, require_all: bool = True) -> "Units":
        assert (not require_all) or len(self) >= n
        return self[:n]

    @property
    def random(self) -> Unit:
        assert self.exists
        return random.choice(self)

    def random_or(self, other: any) -> Unit:
        if self.exists:
            return random.choice(self)
        else:
            return other

    def random_group_of(self, n):
        # TODO allow n > amount with n = min(n,amount)?
        assert 0 <= n <= self.amount
        if n == 0:
            return self.subgroup([])
        elif self.amount == n:
            return self
        else:
            return self.subgroup(random.sample(self, n))

    def in_attack_range_of(self, unit: Unit, bonus_distance: Union[int, float] = 0) -> "Units":
        """ Filters units that are in attack range of the unit in parameter """
        return self.filter(lambda x: unit.target_in_range(x, bonus_distance=bonus_distance))

    def closest_distance_to(self, position: Union[Unit, Point2, Point3]) -> Union[int, float]:
        """ Returns the distance between the closest unit from this group to the target unit """
        assert self.exists
        if isinstance(position, Unit):
            position = position.position
        return position.distance_to_closest(
            [u.position for u in self]
        )  # Note: list comprehension creation is 0-5% faster than set comprehension

    def furthest_distance_to(self, position: Union[Unit, Point2, Point3]) -> Union[int, float]:
        """ Returns the distance between the furthest unit from this group to the target unit """
        assert self.exists
        if isinstance(position, Unit):
            position = position.position
        return position.distance_to_furthest([u.position for u in self])

    def closest_to(self, position: Union[Unit, Point2, Point3]) -> Unit:
        assert self.exists
        if isinstance(position, Unit):
            position = position.position
        return position.closest(self)

    def furthest_to(self, position: Union[Unit, Point2, Point3]) -> Unit:
        assert self.exists
        if isinstance(position, Unit):
            position = position.position
        return position.furthest(self)

    def closer_than(self, distance: Union[int, float], position: Union[Unit, Point2, Point3]) -> "Units":
        if isinstance(position, Unit):
            position = position.position
        distance_squared = distance ** 2
        return self.filter(lambda unit: unit.position._distance_squared(position.to2) < distance_squared)

    def further_than(self, distance: Union[int, float], position: Union[Unit, Point2, Point3]) -> "Units":
        if isinstance(position, Unit):
            position = position.position
        distance_squared = distance ** 2
        return self.filter(lambda unit: unit.position._distance_squared(position.to2) > distance_squared)

    def subgroup(self, units):
        return Units(list(units), self.game_data)

    def filter(self, pred: callable) -> "Units":
        return self.subgroup(filter(pred, self))

    def sorted(self, keyfn: callable, reverse: bool = False) -> "Units":
        if len(self) in {0, 1}:
            return self
        return self.subgroup(sorted(self, key=keyfn, reverse=reverse))

    def sorted_by_distance_to(self, position: Union[Unit, Point2], reverse: bool = False) -> "Units":
        """ This function should be a bit faster than using units.sorted(keyfn=lambda u: u.distance_to(position)) """
        if len(self) in [0, 1]:
            return self
        position = position.position
        return self.sorted(keyfn=lambda unit: unit.position._distance_squared(position), reverse=reverse)

    def tags_in(self, other: Union[Set[int], List[int], Dict[int, Any]]) -> "Units":
        """ Filters all units that have their tags in the 'other' set/list/dict """
        # example: self.units(QUEEN).tags_in(self.queen_tags_assigned_to_do_injects)
        if isinstance(other, list):
            other = set(other)
        return self.filter(lambda unit: unit.tag in other)

    def tags_not_in(self, other: Union[Set[int], List[int], Dict[int, Any]]) -> "Units":
        """ Filters all units that have their tags not in the 'other' set/list/dict """
        # example: self.units(QUEEN).tags_not_in(self.queen_tags_assigned_to_do_injects)
        if isinstance(other, list):
            other = set(other)
        return self.filter(lambda unit: unit.tag not in other)

    def of_type(self, other: Union[UnitTypeId, Set[UnitTypeId], List[UnitTypeId], Dict[UnitTypeId, Any]]) -> "Units":
        """ Filters all units that are of a specific type """
        # example: self.units.of_type([ZERGLING, ROACH, HYDRALISK, BROODLORD])
        if isinstance(other, UnitTypeId):
            other = {other}
        if isinstance(other, list):
            other = set(other)
        return self.filter(lambda unit: unit.type_id in other)

    def exclude_type(
        self, other: Union[UnitTypeId, Set[UnitTypeId], List[UnitTypeId], Dict[UnitTypeId, Any]]
    ) -> "Units":
        """ Filters all units that are not of a specific type """
        # example: self.known_enemy_units.exclude_type([OVERLORD])
        if isinstance(other, UnitTypeId):
            other = {other}
        if isinstance(other, list):
            other = set(other)
        return self.filter(lambda unit: unit.type_id not in other)

    def same_tech(self, other: Union[UnitTypeId, Set[UnitTypeId], List[UnitTypeId], Dict[UnitTypeId, Any]]) -> "Units":
        """ Usage:
        'self.units.same_tech(UnitTypeId.COMMANDCENTER)' or 'self.units.same_tech(UnitTypeId.ORBITALCOMMAND)'
        returns all CommandCenter, CommandCenterFlying, OrbitalCommand, OrbitalCommandFlying, PlanetaryFortress
        This also works with a set/list/dict parameter, e.g. 'self.units.same_tech({UnitTypeId.COMMANDCENTER, UnitTypeId.SUPPLYDEPOT})'
        Untested: This should return the equivalents for Hatchery, WarpPrism, Observer, Overseer, SupplyDepot and others
        """
        if isinstance(other, UnitTypeId):
            other = {other}
        tech_alias_types = set(other)
        for unitType in other:
            tech_alias = self.game_data.units[unitType.value].tech_alias
            if tech_alias:
                for same in tech_alias:
                    tech_alias_types.add(same)
        return self.filter(
            lambda unit: unit.type_id in tech_alias_types
            or unit._type_data.tech_alias is not None
            and any(same in tech_alias_types for same in unit._type_data.tech_alias)
        )

    def same_unit(self, other: Union[UnitTypeId, Set[UnitTypeId], List[UnitTypeId], Dict[UnitTypeId, Any]]) -> "Units":
        """ Usage:
        'self.units.same_tech(UnitTypeId.COMMANDCENTER)'
        returns CommandCenter and CommandCenterFlying,
        'self.units.same_tech(UnitTypeId.ORBITALCOMMAND)'
        returns OrbitalCommand and OrbitalCommandFlying
        This also works with a set/list/dict parameter, e.g. 'self.units.same_tech({UnitTypeId.COMMANDCENTER, UnitTypeId.SUPPLYDEPOT})'
        Untested: This should return the equivalents for WarpPrism, Observer, Overseer, SupplyDepot and others
        """
        if isinstance(other, UnitTypeId):
            other = {other}
        unit_alias_types = set(other)
        for unitType in other:
            unit_alias = self.game_data.units[unitType.value].unit_alias
            if unit_alias:
                unit_alias_types.add(unit_alias)
        return self.filter(
            lambda unit: unit.type_id in unit_alias_types
            or unit._type_data.unit_alias is not None
            and unit._type_data.unit_alias in unit_alias_types
        )

    @property
    def center(self) -> Point2:
        """ Returns the central point of all units in this list """
        assert self
        pos = Point2(
            (
                sum([unit.position.x for unit in self]) / self.amount,
                sum([unit.position.y for unit in self]) / self.amount,
            )
        )
        return pos

    @property
    def selected(self) -> "Units":
        return self.filter(lambda unit: unit.is_selected)

    @property
    def tags(self) -> Set[int]:
        return {unit.tag for unit in self}

    @property
    def ready(self) -> "Units":
        return self.filter(lambda unit: unit.is_ready)

    @property
    def not_ready(self) -> "Units":
        return self.filter(lambda unit: not unit.is_ready)

    @property
    def noqueue(self) -> "Units":
        return self.filter(lambda unit: unit.noqueue)

    @property
    def idle(self) -> "Units":
        return self.filter(lambda unit: unit.is_idle)

    @property
    def owned(self) -> "Units":
        return self.filter(lambda unit: unit.is_mine)

    @property
    def enemy(self) -> "Units":
        return self.filter(lambda unit: unit.is_enemy)

    @property
    def flying(self) -> "Units":
        return self.filter(lambda unit: unit.is_flying)

    @property
    def not_flying(self) -> "Units":
        return self.filter(lambda unit: not unit.is_flying)

    @property
    def structure(self) -> "Units":
        return self.filter(lambda unit: unit.is_structure)

    @property
    def not_structure(self) -> "Units":
        return self.filter(lambda unit: not unit.is_structure)

    @property
    def gathering(self) -> "Units":
        return self.filter(lambda unit: unit.is_gathering)

    @property
    def returning(self) -> "Units":
        return self.filter(lambda unit: unit.is_returning)

    @property
    def collecting(self) -> "Units":
        return self.filter(lambda unit: unit.is_collecting)

    @property
    def visible(self) -> "Units":
        return self.filter(lambda unit: unit.is_visible)

    @property
    def mineral_field(self) -> "Units":
        return self.filter(lambda unit: unit.is_mineral_field)

    @property
    def vespene_geyser(self) -> "Units":
        return self.filter(lambda unit: unit.is_vespene_geyser)

    @property
    def prefer_idle(self) -> "Units":
        return self.sorted(lambda unit: unit.is_idle, reverse=True)

    def prefer_close_to(self, p: Union[Unit, Point2, Point3]) -> "Units":
        # TODO redundant?
        return self.sorted_by_distance_to(p)
from s2clientprotocol import (
    sc2api_pb2 as sc_pb,
    common_pb2 as common_pb,
    query_pb2 as query_pb,
    debug_pb2 as debug_pb,
    raw_pb2 as raw_pb,
)
from sc2.ids.ability_id import AbilityId
from sc2.ids.unit_typeid import UnitTypeId
from sc2.renderer import Renderer
from .protocol import Protocol, ProtocolError
from .game_info import GameInfo
from .game_data import GameData, AbilityData
from .data import Status, Result
from .data import Race, ActionResult, ChatChannel
from .action import combine_actions
from .position import Point2, Point3
from .unit import Unit
from .units import Units
from typing import List, Dict, Set, Tuple, Any, Optional, Union  # mypy type checking
        from s2clientprotocol import spatial_pb2 as spatial_pb
import logging


logger = logging.getLogger(__name__)



class Client(Protocol):
    def __init__(self, ws):
        super().__init__(ws)
        self.game_step = 8
        self._player_id = None
        self._game_result = None
        self._debug_texts = []
        self._debug_lines = []
        self._debug_boxes = []
        self._debug_spheres = []

        self._renderer = None

    @property
    def in_game(self):
        return self._status == Status.in_game

    async def join_game(self, name=None, race=None, observed_player_id=None, portconfig=None, rgb_render_config=None):
        ifopts = sc_pb.InterfaceOptions(raw=True, score=True)

        if rgb_render_config:
            assert isinstance(rgb_render_config, dict)
            assert 'window_size' in rgb_render_config and 'minimap_size' in rgb_render_config
            window_size = rgb_render_config['window_size']
            minimap_size = rgb_render_config['minimap_size']
            self._renderer = Renderer(self, window_size, minimap_size)
            map_width, map_height = window_size
            minimap_width, minimap_height = minimap_size

            ifopts.render.resolution.x = map_width
            ifopts.render.resolution.y = map_height
            ifopts.render.minimap_resolution.x = minimap_width
            ifopts.render.minimap_resolution.y = minimap_height

        if race is None:
            assert isinstance(observed_player_id, int)
            # join as observer
            req = sc_pb.RequestJoinGame(observed_player_id=observed_player_id, options=ifopts)
        else:
            assert isinstance(race, Race)
            req = sc_pb.RequestJoinGame(race=race.value, options=ifopts)

        if portconfig:
            req.shared_port = portconfig.shared
            req.server_ports.game_port = portconfig.server[0]
            req.server_ports.base_port = portconfig.server[1]

            for ppc in portconfig.players:
                p = req.client_ports.add()
                p.game_port = ppc[0]
                p.base_port = ppc[1]

        if name is not None:
            assert isinstance(name, str)
            req.player_name = name

        result = await self._execute(join_game=req)
        self._game_result = None
        self._player_id = result.join_game.player_id
        return result.join_game.player_id

    async def leave(self):
        """ You can use 'await self._client.leave()' to surrender midst game. """
        is_resign = self._game_result is None

        if is_resign:
            # For all clients that can leave, result of leaving the game either
            # loss, or the client will ignore the result
            self._game_result = {self._player_id: Result.Defeat}

        try:
            await self._execute(leave_game=sc_pb.RequestLeaveGame())
        except ProtocolError:
            if is_resign:
                raise

    async def debug_leave(self):
        await self._execute(debug=sc_pb.RequestDebug(debug=[debug_pb.DebugCommand(end_game=debug_pb.DebugEndGame())]))

    async def save_replay(self, path):
        logger.debug(f"Requesting replay from server")
        result = await self._execute(save_replay=sc_pb.RequestSaveReplay())
        with open(path, "wb") as f:
            f.write(result.save_replay.data)
        logger.info(f"Saved replay to {path}")

    async def observation(self):
        result = await self._execute(observation=sc_pb.RequestObservation())
        assert result.HasField("observation")

        if not self.in_game or result.observation.player_result:
            # Sometimes game ends one step before results are available
            if not result.observation.player_result:
                result = await self._execute(observation=sc_pb.RequestObservation())
                assert result.observation.player_result

            player_id_to_result = {}
            for pr in result.observation.player_result:
                player_id_to_result[pr.player_id] = Result(pr.result)
            self._game_result = player_id_to_result

        # if render_data is available, then RGB rendering was requested
        if self._renderer and result.observation.observation.HasField('render_data'):
            await self._renderer.render(result.observation)

        return result

    async def step(self):
        """ EXPERIMENTAL: Change self._client.game_step during the step function to increase or decrease steps per second """
        result = await self._execute(step=sc_pb.RequestStep(count=self.game_step))
        return result

    async def get_game_data(self) -> GameData:
        result = await self._execute(data=sc_pb.RequestData(ability_id=True, unit_type_id=True, upgrade_id=True))

        return GameData(result.data)