From 6192da28092478ff44691dfcfcb1694c5f1e2b25 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sat, 11 Jun 2022 22:02:12 +0200 Subject: [PATCH] Choo Choo, Part V - Player can press ctrl to honk when a whistle is present - Stations now remember the name of briefly disassembled trains --- src/generated/resources/.cache/cache | 34 ++++----- .../resources/assets/create/lang/en_us.json | 4 +- .../assets/create/lang/unfinished/de_de.json | 4 +- .../assets/create/lang/unfinished/es_cl.json | 4 +- .../assets/create/lang/unfinished/es_es.json | 4 +- .../assets/create/lang/unfinished/fr_fr.json | 4 +- .../assets/create/lang/unfinished/it_it.json | 4 +- .../assets/create/lang/unfinished/ja_jp.json | 4 +- .../assets/create/lang/unfinished/ko_kr.json | 4 +- .../assets/create/lang/unfinished/nl_nl.json | 4 +- .../assets/create/lang/unfinished/pl_pl.json | 4 +- .../assets/create/lang/unfinished/pt_br.json | 4 +- .../assets/create/lang/unfinished/pt_pt.json | 4 +- .../assets/create/lang/unfinished/ro_ro.json | 4 +- .../assets/create/lang/unfinished/ru_ru.json | 4 +- .../assets/create/lang/unfinished/zh_cn.json | 4 +- .../assets/create/lang/unfinished/zh_tw.json | 4 +- .../resources/assets/create/sounds.json | 53 +++++++++---- .../com/simibubi/create/AllSoundEvents.java | 31 ++++++-- .../interaction/controls/HonkPacket.java | 72 ++++++++++++++++++ .../interaction/controls/TrainHUD.java | 26 ++++++- .../trains/entity/ArrivalSoundQueue.java | 28 ++++++- .../trains/entity/CarriageSounds.java | 57 ++++++++++++-- .../logistics/trains/entity/Train.java | 35 ++++++++- .../edgePoint/station/StationEditPacket.java | 13 ++-- .../edgePoint/station/StationTileEntity.java | 8 ++ .../foundation/networking/AllPackets.java | 3 + .../create/sounds/whistle_train_high.ogg | Bin 10939 -> 0 bytes .../create/sounds/whistle_train_manual.ogg | Bin 0 -> 27086 bytes .../sounds/whistle_train_manual_end.ogg | Bin 0 -> 12878 bytes .../sounds/whistle_train_manual_low.ogg | Bin 0 -> 11201 bytes .../sounds/whistle_train_manual_low_end.ogg | Bin 0 -> 10674 bytes 32 files changed, 334 insertions(+), 90 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/HonkPacket.java delete mode 100644 src/main/resources/assets/create/sounds/whistle_train_high.ogg create mode 100644 src/main/resources/assets/create/sounds/whistle_train_manual.ogg create mode 100644 src/main/resources/assets/create/sounds/whistle_train_manual_end.ogg create mode 100644 src/main/resources/assets/create/sounds/whistle_train_manual_low.ogg create mode 100644 src/main/resources/assets/create/sounds/whistle_train_manual_low_end.ogg diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index b8d6ded11..42757e23a 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -554,22 +554,22 @@ bf2b0310500213ff853c748c236eb5d01f61658e assets/create/blockstates/yellow_toolbo 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 50f7862ded2d9a955c259a12685906a9ec9ad97a assets/create/lang/en_ud.json -a768ce262b1d113b915306b93805121e6d6f3934 assets/create/lang/en_us.json -c2f79787186fc4ac21c5b357c642e1ab04443411 assets/create/lang/unfinished/de_de.json -abdf065efd476eea939956f2b7d59d9b10df1280 assets/create/lang/unfinished/es_cl.json -1971ba8276f31d0e8af81089a15888038197e858 assets/create/lang/unfinished/es_es.json -ea67e13386220b980c0a0245410c2e3d2c845d35 assets/create/lang/unfinished/fr_fr.json -38c181d840e33f6a277876b6cf4db95a2ef15262 assets/create/lang/unfinished/it_it.json -7e54413e3920b0f4ffc2363d5c521735a177e295 assets/create/lang/unfinished/ja_jp.json -4d3696fa3de235b23d1b29a05a56c495ff11930c assets/create/lang/unfinished/ko_kr.json -7f0e6420fc7685523795aca3c87a12df7029e0cc assets/create/lang/unfinished/nl_nl.json -fb286ebb45b6e191c9357085df2fb21061bed70b assets/create/lang/unfinished/pl_pl.json -269439ab8d7277eb445f76f52342a3b7b72f812c assets/create/lang/unfinished/pt_br.json -6bddc9fc7ae5186747521496d21d0226cc23b01b assets/create/lang/unfinished/pt_pt.json -f7704e9e3200b614c60410feca6c83742d42177d assets/create/lang/unfinished/ro_ro.json -c445375f72f9205d119741c4784e9383020bde10 assets/create/lang/unfinished/ru_ru.json -8986740c8eec44cfe805f7cb242232105369f8fa assets/create/lang/unfinished/zh_cn.json -5c4f08c71c49ab13e9b17e2c1106e5a575448cfc assets/create/lang/unfinished/zh_tw.json +8781f68634fbabc8b16488bc9ab5e8c7b9f95194 assets/create/lang/en_us.json +b2cc029708321d9ab6090a4d933860bb4cb7b9f8 assets/create/lang/unfinished/de_de.json +65eeef03fa6735e9abbdb8c6cc2a69cd230a4bae assets/create/lang/unfinished/es_cl.json +b7480756a55d376d4e6a8e60f75789a426fc7f0b assets/create/lang/unfinished/es_es.json +5aa1154bc42ef79c5540223ce4eed19970b37d1e assets/create/lang/unfinished/fr_fr.json +e92b1d5555aacd0d6d12e3d1d10da6dd639e271a assets/create/lang/unfinished/it_it.json +94248494016943eb7f03438221c17fee36defd2c assets/create/lang/unfinished/ja_jp.json +16f4bad7bbaeeab54fa70fbcaaa7e98fc1c0e8e7 assets/create/lang/unfinished/ko_kr.json +5431e9d8417e0a066c5506864046161724e0ae1a assets/create/lang/unfinished/nl_nl.json +eedae972227343a05fdfaafb48bddc6ce5628096 assets/create/lang/unfinished/pl_pl.json +6930870015be01fd5d6b006d048b54d229735dcb assets/create/lang/unfinished/pt_br.json +611a886f8e9bdd8e0f217524c699bd4c2c0b6e3c assets/create/lang/unfinished/pt_pt.json +4d2c08851e80892498b979152302338a5b772766 assets/create/lang/unfinished/ro_ro.json +174b95e8c244fe79c5567fb00cd121dc113a7ede assets/create/lang/unfinished/ru_ru.json +619673460cf89e46cb8d58703ee58212f519fb91 assets/create/lang/unfinished/zh_cn.json +a1e1bb7a55ddd9bbef58c7cef4058ea9b8aba5b8 assets/create/lang/unfinished/zh_tw.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json 3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -2195,7 +2195,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 866fbb0ce2878a73e0440d1caf6534c8bd7c384f assets/create/models/item/zinc_ingot.json a80fb25a0b655e76be986b5b49fcb0f03461a1ab assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json -40db9034dcb721eb07630d8a300f899dedd6e2f3 assets/create/sounds.json +de7cdf8d734a067af32883e9d86a10e0542a0f5b assets/create/sounds.json 0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json 613e64b44bed959da899fdd54c1cacb227fb33f2 data/create/advancements/andesite_alloy.json 81885c6bfb85792c88aaa7c9b70f58832945d31f data/create/advancements/andesite_casing.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 09232eff6..9c79ab877 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1637,12 +1637,12 @@ "create.subtitle.contraption_disassemble": "Contraption stops", "create.subtitle.peculiar_bell_use": "Peculiar Bell tolls", "create.subtitle.worldshaper_place": "Worldshaper zaps", + "create.subtitle.whistle_train_manual": "Train honks", "create.subtitle.steam": "Steam noises", "create.subtitle.saw_activate_stone": "Mechanical Saw activates", "create.subtitle.schematicannon_finish": "Schematicannon dings", "create.subtitle.crafter_craft": "Crafter crafts", "create.subtitle.wrench_remove": "Component breaks", - "create.subtitle.train2": "Bogey wheels rumble", "create.subtitle.train3": "Bogey wheels rumble muffled", "create.subtitle.whistle": "Whistling", "create.subtitle.cogs": "Cogwheels rumble", @@ -1670,10 +1670,10 @@ "create.subtitle.potato_hit": "Vegetable impacts", "create.subtitle.saw_activate_wood": "Mechanical Saw activates", "create.subtitle.whistle_high": "High whistling", + "create.subtitle.whistle_train_manual_low": "Train honks", "create.subtitle.whistle_train": "Whistling", "create.subtitle.haunted_bell_convert": "Haunted Bell awakens", "create.subtitle.train": "Bogey wheels rumble", - "create.subtitle.whistle_train_high": "High whistling", "create.subtitle.deny": "Declining boop", "create.subtitle.controller_click": "Controller clicks", "create.subtitle.whistle_low": "Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index 8401af1ae..4b2b42b53 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1638,12 +1638,12 @@ "create.subtitle.contraption_disassemble": "Apparat stoppt", "create.subtitle.peculiar_bell_use": "Eigenartige Glockenschläge", "create.subtitle.worldshaper_place": "Geländeformer zippt", + "create.subtitle.whistle_train_manual": "UNLOCALIZED: Train honks", "create.subtitle.steam": "UNLOCALIZED: Steam noises", "create.subtitle.saw_activate_stone": "Mechanische Säge wird aktiviert", "create.subtitle.schematicannon_finish": "Bauplankanone endet", "create.subtitle.crafter_craft": "Hersteller stellt her", "create.subtitle.wrench_remove": "Teil entfernt", - "create.subtitle.train2": "UNLOCALIZED: Bogey wheels rumble", "create.subtitle.train3": "UNLOCALIZED: Bogey wheels rumble muffled", "create.subtitle.whistle": "UNLOCALIZED: Whistling", "create.subtitle.cogs": "Zahnräder rattern", @@ -1671,10 +1671,10 @@ "create.subtitle.potato_hit": "Gemüse schlägt ein", "create.subtitle.saw_activate_wood": "Mechanische Säge wird aktiviert", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_manual_low": "UNLOCALIZED: Train honks", "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "Spukglocke erwacht", "create.subtitle.train": "UNLOCALIZED: Bogey wheels rumble", - "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", "create.subtitle.deny": "Ablehnendes boop", "create.subtitle.controller_click": "Kontroller klickt", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_cl.json b/src/generated/resources/assets/create/lang/unfinished/es_cl.json index 1675e3069..ef5bf7fed 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_cl.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_cl.json @@ -1638,12 +1638,12 @@ "create.subtitle.contraption_disassemble": "Contrapción se detiene", "create.subtitle.peculiar_bell_use": "Campana Peculiar tañe", "create.subtitle.worldshaper_place": "El Forma Mundos zapea", + "create.subtitle.whistle_train_manual": "UNLOCALIZED: Train honks", "create.subtitle.steam": "UNLOCALIZED: Steam noises", "create.subtitle.saw_activate_stone": "Sierra Mecánica se activa", "create.subtitle.schematicannon_finish": "Esquemacañón campanea", "create.subtitle.crafter_craft": "Crafteador craftea", "create.subtitle.wrench_remove": "Componente se rompe", - "create.subtitle.train2": "UNLOCALIZED: Bogey wheels rumble", "create.subtitle.train3": "UNLOCALIZED: Bogey wheels rumble muffled", "create.subtitle.whistle": "UNLOCALIZED: Whistling", "create.subtitle.cogs": "Engranajes suenan", @@ -1671,10 +1671,10 @@ "create.subtitle.potato_hit": "Impactos vegetales", "create.subtitle.saw_activate_wood": "Sierra Mecánica se activa", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_manual_low": "UNLOCALIZED: Train honks", "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "Campana Embrujada despierta", "create.subtitle.train": "UNLOCALIZED: Bogey wheels rumble", - "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", "create.subtitle.deny": "Boop denegante", "create.subtitle.controller_click": "Controlador cliquea", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index 1b69a5800..20f1ee466 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1638,12 +1638,12 @@ "create.subtitle.contraption_disassemble": "Artefacto animado se para", "create.subtitle.peculiar_bell_use": "Campana peculiar suena", "create.subtitle.worldshaper_place": "Moldeador de mundos coloca bloques", + "create.subtitle.whistle_train_manual": "UNLOCALIZED: Train honks", "create.subtitle.steam": "UNLOCALIZED: Steam noises", "create.subtitle.saw_activate_stone": "Sierra mecánica activada", "create.subtitle.schematicannon_finish": "Esquematicañón suena", "create.subtitle.crafter_craft": "Ensamblador mecánico acaba", "create.subtitle.wrench_remove": "Componente se rompe", - "create.subtitle.train2": "UNLOCALIZED: Bogey wheels rumble", "create.subtitle.train3": "UNLOCALIZED: Bogey wheels rumble muffled", "create.subtitle.whistle": "UNLOCALIZED: Whistling", "create.subtitle.cogs": "Engranajes retumban", @@ -1671,10 +1671,10 @@ "create.subtitle.potato_hit": "Impacto de vegetal", "create.subtitle.saw_activate_wood": "Sierra mecánica activada", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_manual_low": "UNLOCALIZED: Train honks", "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "Campana maldita se despierta", "create.subtitle.train": "UNLOCALIZED: Bogey wheels rumble", - "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", "create.subtitle.deny": "Pitido denegante", "create.subtitle.controller_click": "", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index d00d4dac3..4ceb57588 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1638,12 +1638,12 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.peculiar_bell_use": "UNLOCALIZED: Peculiar Bell tolls", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", + "create.subtitle.whistle_train_manual": "UNLOCALIZED: Train honks", "create.subtitle.steam": "UNLOCALIZED: Steam noises", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.schematicannon_finish": "Fin de schémacanon", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", - "create.subtitle.train2": "UNLOCALIZED: Bogey wheels rumble", "create.subtitle.train3": "UNLOCALIZED: Bogey wheels rumble muffled", "create.subtitle.whistle": "UNLOCALIZED: Whistling", "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", @@ -1671,10 +1671,10 @@ "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_manual_low": "UNLOCALIZED: Train honks", "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "UNLOCALIZED: Haunted Bell awakens", "create.subtitle.train": "UNLOCALIZED: Bogey wheels rumble", - "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 41729b010..d52a71820 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1638,12 +1638,12 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.peculiar_bell_use": "UNLOCALIZED: Peculiar Bell tolls", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", + "create.subtitle.whistle_train_manual": "UNLOCALIZED: Train honks", "create.subtitle.steam": "UNLOCALIZED: Steam noises", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.schematicannon_finish": "Finiture cannoneschematico", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", - "create.subtitle.train2": "UNLOCALIZED: Bogey wheels rumble", "create.subtitle.train3": "UNLOCALIZED: Bogey wheels rumble muffled", "create.subtitle.whistle": "UNLOCALIZED: Whistling", "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", @@ -1671,10 +1671,10 @@ "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_manual_low": "UNLOCALIZED: Train honks", "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "UNLOCALIZED: Haunted Bell awakens", "create.subtitle.train": "UNLOCALIZED: Bogey wheels rumble", - "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index f64862f52..9e7298373 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1638,12 +1638,12 @@ "create.subtitle.contraption_disassemble": "からくりが止まる", "create.subtitle.peculiar_bell_use": "風変わりな鐘が鳴る", "create.subtitle.worldshaper_place": "ワールドシェーパーが設置する", + "create.subtitle.whistle_train_manual": "UNLOCALIZED: Train honks", "create.subtitle.steam": "UNLOCALIZED: Steam noises", "create.subtitle.saw_activate_stone": "メカニカルソーが動作する", "create.subtitle.schematicannon_finish": "概略図砲が作業を終える", "create.subtitle.crafter_craft": "メカニカルクラフターがクラフトする", "create.subtitle.wrench_remove": "機械を壊す", - "create.subtitle.train2": "UNLOCALIZED: Bogey wheels rumble", "create.subtitle.train3": "UNLOCALIZED: Bogey wheels rumble muffled", "create.subtitle.whistle": "UNLOCALIZED: Whistling", "create.subtitle.cogs": "歯車がゴロゴロと鳴る", @@ -1671,10 +1671,10 @@ "create.subtitle.potato_hit": "野菜の衝撃", "create.subtitle.saw_activate_wood": "メカニカルソーが動作する", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_manual_low": "UNLOCALIZED: Train honks", "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "憑りつかれた鐘が目覚める", "create.subtitle.train": "UNLOCALIZED: Bogey wheels rumble", - "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", "create.subtitle.deny": "失敗音", "create.subtitle.controller_click": "コントローラーのカチカチ音", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index c906a6c84..a7f2f7863 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1638,12 +1638,12 @@ "create.subtitle.contraption_disassemble": "구조물이 멈춤", "create.subtitle.peculiar_bell_use": "황동 종이 울림", "create.subtitle.worldshaper_place": "세계편집기가 쏨", + "create.subtitle.whistle_train_manual": "UNLOCALIZED: Train honks", "create.subtitle.steam": "UNLOCALIZED: Steam noises", "create.subtitle.saw_activate_stone": "톱이 작동함", "create.subtitle.schematicannon_finish": "청사진 대포가 끝남", "create.subtitle.crafter_craft": "조합기가 조합함", "create.subtitle.wrench_remove": "장치가 부숴짐", - "create.subtitle.train2": "UNLOCALIZED: Bogey wheels rumble", "create.subtitle.train3": "UNLOCALIZED: Bogey wheels rumble muffled", "create.subtitle.whistle": "UNLOCALIZED: Whistling", "create.subtitle.cogs": "톱니바퀴가 돌아감", @@ -1671,10 +1671,10 @@ "create.subtitle.potato_hit": "채소가 부딫힘", "create.subtitle.saw_activate_wood": "톱이 작동함", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_manual_low": "UNLOCALIZED: Train honks", "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "종에 귀신이 들림", "create.subtitle.train": "UNLOCALIZED: Bogey wheels rumble", - "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", "create.subtitle.deny": "취소음", "create.subtitle.controller_click": "조작기를 누름", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index b4290ab40..b680a7627 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1638,12 +1638,12 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.peculiar_bell_use": "UNLOCALIZED: Peculiar Bell tolls", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", + "create.subtitle.whistle_train_manual": "UNLOCALIZED: Train honks", "create.subtitle.steam": "UNLOCALIZED: Steam noises", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", - "create.subtitle.train2": "UNLOCALIZED: Bogey wheels rumble", "create.subtitle.train3": "UNLOCALIZED: Bogey wheels rumble muffled", "create.subtitle.whistle": "UNLOCALIZED: Whistling", "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", @@ -1671,10 +1671,10 @@ "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_manual_low": "UNLOCALIZED: Train honks", "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "UNLOCALIZED: Haunted Bell awakens", "create.subtitle.train": "UNLOCALIZED: Bogey wheels rumble", - "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json index bbddb92ca..e5b26fd5b 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json +++ b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json @@ -1638,12 +1638,12 @@ "create.subtitle.contraption_disassemble": "Maszyna staje", "create.subtitle.peculiar_bell_use": "Dziwny dzwon dzwoni", "create.subtitle.worldshaper_place": "Kształter strzela", + "create.subtitle.whistle_train_manual": "UNLOCALIZED: Train honks", "create.subtitle.steam": "UNLOCALIZED: Steam noises", "create.subtitle.saw_activate_stone": "Mechaniczna piła aktywuje się", "create.subtitle.schematicannon_finish": "Schematoarmata skończyła", "create.subtitle.crafter_craft": "Mechaniczny stół rzemieślniczy konstruuje", "create.subtitle.wrench_remove": "Komponent niszczy się", - "create.subtitle.train2": "UNLOCALIZED: Bogey wheels rumble", "create.subtitle.train3": "UNLOCALIZED: Bogey wheels rumble muffled", "create.subtitle.whistle": "UNLOCALIZED: Whistling", "create.subtitle.cogs": "Koła zębate terkoczą", @@ -1671,10 +1671,10 @@ "create.subtitle.potato_hit": "Warzywo ląduje", "create.subtitle.saw_activate_wood": "Mechaniczna piła aktywuje się", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_manual_low": "UNLOCALIZED: Train honks", "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "Nawiedzony dzwon budzi się", "create.subtitle.train": "UNLOCALIZED: Bogey wheels rumble", - "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", "create.subtitle.deny": "Dźwięk odmowy", "create.subtitle.controller_click": "Sterownik klika", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 918c4f4c0..fe4dd7929 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1638,12 +1638,12 @@ "create.subtitle.contraption_disassemble": "Engenhoca para", "create.subtitle.peculiar_bell_use": "Sino peculiar toca", "create.subtitle.worldshaper_place": "Zaps do terraformador", + "create.subtitle.whistle_train_manual": "UNLOCALIZED: Train honks", "create.subtitle.steam": "UNLOCALIZED: Steam noises", "create.subtitle.saw_activate_stone": "Serra mecânica ativa", "create.subtitle.schematicannon_finish": "Ding do canhão de esquema", "create.subtitle.crafter_craft": "Fabricador fábrica", "create.subtitle.wrench_remove": "Componente quebra", - "create.subtitle.train2": "UNLOCALIZED: Bogey wheels rumble", "create.subtitle.train3": "UNLOCALIZED: Bogey wheels rumble muffled", "create.subtitle.whistle": "UNLOCALIZED: Whistling", "create.subtitle.cogs": "tremer da rodas dentadas", @@ -1671,10 +1671,10 @@ "create.subtitle.potato_hit": "Impacto vegetal", "create.subtitle.saw_activate_wood": "Serra mecânica ativa", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_manual_low": "UNLOCALIZED: Train honks", "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "Sino assombrado acorda", "create.subtitle.train": "UNLOCALIZED: Bogey wheels rumble", - "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", "create.subtitle.deny": "Boop de negação", "create.subtitle.controller_click": "Clicks do controle", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_pt.json b/src/generated/resources/assets/create/lang/unfinished/pt_pt.json index b655f06e6..27558de65 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_pt.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_pt.json @@ -1638,12 +1638,12 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.peculiar_bell_use": "UNLOCALIZED: Peculiar Bell tolls", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", + "create.subtitle.whistle_train_manual": "UNLOCALIZED: Train honks", "create.subtitle.steam": "UNLOCALIZED: Steam noises", "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", - "create.subtitle.train2": "UNLOCALIZED: Bogey wheels rumble", "create.subtitle.train3": "UNLOCALIZED: Bogey wheels rumble muffled", "create.subtitle.whistle": "UNLOCALIZED: Whistling", "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", @@ -1671,10 +1671,10 @@ "create.subtitle.potato_hit": "UNLOCALIZED: Vegetable impacts", "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_manual_low": "UNLOCALIZED: Train honks", "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "UNLOCALIZED: Haunted Bell awakens", "create.subtitle.train": "UNLOCALIZED: Bogey wheels rumble", - "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/ro_ro.json b/src/generated/resources/assets/create/lang/unfinished/ro_ro.json index 2ac5b8760..089d13bc1 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ro_ro.json +++ b/src/generated/resources/assets/create/lang/unfinished/ro_ro.json @@ -1638,12 +1638,12 @@ "create.subtitle.contraption_disassemble": "Invenție se oprește", "create.subtitle.peculiar_bell_use": "Clopot Ciudat bate", "create.subtitle.worldshaper_place": "Modelator de Lume face zap", + "create.subtitle.whistle_train_manual": "UNLOCALIZED: Train honks", "create.subtitle.steam": "UNLOCALIZED: Steam noises", "create.subtitle.saw_activate_stone": "Ferăstrău Mecanic se activează", "create.subtitle.schematicannon_finish": "Tun de Schemă face ding", "create.subtitle.crafter_craft": "Meșter lucrează", "create.subtitle.wrench_remove": "Component se sparge", - "create.subtitle.train2": "UNLOCALIZED: Bogey wheels rumble", "create.subtitle.train3": "UNLOCALIZED: Bogey wheels rumble muffled", "create.subtitle.whistle": "UNLOCALIZED: Whistling", "create.subtitle.cogs": "Roți Dințate vuie", @@ -1671,10 +1671,10 @@ "create.subtitle.potato_hit": "Impact de legumă", "create.subtitle.saw_activate_wood": "Ferăstrău Mecanic se activează", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_manual_low": "UNLOCALIZED: Train honks", "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "Clopot Bântuit se trezețte", "create.subtitle.train": "UNLOCALIZED: Bogey wheels rumble", - "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", "create.subtitle.deny": "Boop de refuz", "create.subtitle.controller_click": "Controlor clickuiește", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 06c3786c7..aa29c797a 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1638,12 +1638,12 @@ "create.subtitle.contraption_disassemble": "Штуковина останавливается", "create.subtitle.peculiar_bell_use": "Особенный колокол звонит", "create.subtitle.worldshaper_place": "Ручной редактор мира делает «Зап»", + "create.subtitle.whistle_train_manual": "UNLOCALIZED: Train honks", "create.subtitle.steam": "UNLOCALIZED: Steam noises", "create.subtitle.saw_activate_stone": "Активируется механическая пила", "create.subtitle.schematicannon_finish": "Схематичная пушка закончила работу", "create.subtitle.crafter_craft": "Крафтер создаёт", "create.subtitle.wrench_remove": "Компонент ломается", - "create.subtitle.train2": "UNLOCALIZED: Bogey wheels rumble", "create.subtitle.train3": "UNLOCALIZED: Bogey wheels rumble muffled", "create.subtitle.whistle": "UNLOCALIZED: Whistling", "create.subtitle.cogs": "Шестерни грохочут", @@ -1671,10 +1671,10 @@ "create.subtitle.potato_hit": "Овощ врезается", "create.subtitle.saw_activate_wood": "Активируется механическая пила", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_manual_low": "UNLOCALIZED: Train honks", "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "Призрачный колокол пробуждается", "create.subtitle.train": "UNLOCALIZED: Bogey wheels rumble", - "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", "create.subtitle.deny": "Отрицательный «Буп»", "create.subtitle.controller_click": "Клики контроллера", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index b026da709..77005cb5d 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1638,12 +1638,12 @@ "create.subtitle.contraption_disassemble": "结构:停止移动", "create.subtitle.peculiar_bell_use": "奇异钟:鸣响", "create.subtitle.worldshaper_place": "环境塑型器:放置方块", + "create.subtitle.whistle_train_manual": "UNLOCALIZED: Train honks", "create.subtitle.steam": "UNLOCALIZED: Steam noises", "create.subtitle.saw_activate_stone": "动力锯:切割", "create.subtitle.schematicannon_finish": "蓝图加农炮:叮", "create.subtitle.crafter_craft": "动力合成器:合成中", "create.subtitle.wrench_remove": "组件:被破坏", - "create.subtitle.train2": "UNLOCALIZED: Bogey wheels rumble", "create.subtitle.train3": "UNLOCALIZED: Bogey wheels rumble muffled", "create.subtitle.whistle": "UNLOCALIZED: Whistling", "create.subtitle.cogs": "齿轮:嘎吱作响", @@ -1671,10 +1671,10 @@ "create.subtitle.potato_hit": "土豆:击中", "create.subtitle.saw_activate_wood": "动力锯:切割", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_manual_low": "UNLOCALIZED: Train honks", "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "奇异钟:转化", "create.subtitle.train": "UNLOCALIZED: Bogey wheels rumble", - "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", "create.subtitle.deny": "提示声:出错", "create.subtitle.controller_click": "遥控器:按下按钮", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index 0042da3d5..43bf068e8 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1638,12 +1638,12 @@ "create.subtitle.contraption_disassemble": "結構停止", "create.subtitle.peculiar_bell_use": "黃銅鐘聲", "create.subtitle.worldshaper_place": "地形塑造器發射聲", + "create.subtitle.whistle_train_manual": "UNLOCALIZED: Train honks", "create.subtitle.steam": "UNLOCALIZED: Steam noises", "create.subtitle.saw_activate_stone": "機械鋸子聲", "create.subtitle.schematicannon_finish": "藍圖大炮完成任務", "create.subtitle.crafter_craft": "機械合成器合成聲", "create.subtitle.wrench_remove": "零件移除聲", - "create.subtitle.train2": "UNLOCALIZED: Bogey wheels rumble", "create.subtitle.train3": "UNLOCALIZED: Bogey wheels rumble muffled", "create.subtitle.whistle": "UNLOCALIZED: Whistling", "create.subtitle.cogs": "齒輪隆隆聲", @@ -1671,10 +1671,10 @@ "create.subtitle.potato_hit": "食物撞擊聲", "create.subtitle.saw_activate_wood": "機械鋸子運作聲", "create.subtitle.whistle_high": "UNLOCALIZED: High whistling", + "create.subtitle.whistle_train_manual_low": "UNLOCALIZED: Train honks", "create.subtitle.whistle_train": "UNLOCALIZED: Whistling", "create.subtitle.haunted_bell_convert": "靈魂鐘轉化聲", "create.subtitle.train": "UNLOCALIZED: Bogey wheels rumble", - "create.subtitle.whistle_train_high": "UNLOCALIZED: High whistling", "create.subtitle.deny": "UNLOCALIZED: Declining boop", "create.subtitle.controller_click": "遙控器按鍵聲", "create.subtitle.whistle_low": "UNLOCALIZED: Low whistling", diff --git a/src/generated/resources/assets/create/sounds.json b/src/generated/resources/assets/create/sounds.json index b5cb0b9d9..1ac3fd7f1 100644 --- a/src/generated/resources/assets/create/sounds.json +++ b/src/generated/resources/assets/create/sounds.json @@ -14,8 +14,7 @@ "name": "create:chiff", "type": "file" } - ], - "subtitle": "create.subtitle.chiff" + ] }, "cogs": { "sounds": [ @@ -416,8 +415,7 @@ "type": "file", "attenuation_distance": 128 } - ], - "subtitle": "create.subtitle.train2" + ] }, "train3": { "sounds": [ @@ -468,15 +466,6 @@ ], "subtitle": "create.subtitle.whistle_train" }, - "whistle_train_high": { - "sounds": [ - { - "name": "create:whistle_train_high", - "type": "file" - } - ], - "subtitle": "create.subtitle.whistle_train_high" - }, "whistle_train_low": { "sounds": [ { @@ -486,6 +475,44 @@ ], "subtitle": "create.subtitle.whistle_train_low" }, + "whistle_train_manual": { + "sounds": [ + { + "name": "create:whistle_train_manual", + "type": "file", + "attenuation_distance": 64 + } + ], + "subtitle": "create.subtitle.whistle_train_manual" + }, + "whistle_train_manual_end": { + "sounds": [ + { + "name": "create:whistle_train_manual_end", + "type": "file", + "attenuation_distance": 64 + } + ] + }, + "whistle_train_manual_low": { + "sounds": [ + { + "name": "create:whistle_train_manual_low", + "type": "file", + "attenuation_distance": 64 + } + ], + "subtitle": "create.subtitle.whistle_train_manual_low" + }, + "whistle_train_manual_low_end": { + "sounds": [ + { + "name": "create:whistle_train_manual_low_end", + "type": "file", + "attenuation_distance": 64 + } + ] + }, "worldshaper_place": { "sounds": [ { diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index c6b37e479..3835bf89e 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -248,7 +248,7 @@ public class AllSoundEvents { .attenuationDistance(128) .build(), - TRAIN2 = create("train2").subtitle("Bogey wheels rumble") + TRAIN2 = create("train2").noSubtitle() .category(SoundSource.NEUTRAL) .attenuationDistance(128) .build(), @@ -258,11 +258,7 @@ public class AllSoundEvents { .attenuationDistance(16) .build(), - WHISTLE_TRAIN_HIGH = create("whistle_train_high").subtitle("High whistling") - .category(SoundSource.RECORDS) - .build(), - - WHISTLE_TRAIN_MEDIUM = create("whistle_train").subtitle("Whistling") + WHISTLE_TRAIN = create("whistle_train").subtitle("Whistling") .category(SoundSource.RECORDS) .build(), @@ -270,6 +266,26 @@ public class AllSoundEvents { .category(SoundSource.RECORDS) .build(), + WHISTLE_TRAIN_MANUAL = create("whistle_train_manual").subtitle("Train honks") + .category(SoundSource.NEUTRAL) + .attenuationDistance(64) + .build(), + + WHISTLE_TRAIN_MANUAL_LOW = create("whistle_train_manual_low").subtitle("Train honks") + .category(SoundSource.NEUTRAL) + .attenuationDistance(64) + .build(), + + WHISTLE_TRAIN_MANUAL_END = create("whistle_train_manual_end").noSubtitle() + .category(SoundSource.NEUTRAL) + .attenuationDistance(64) + .build(), + + WHISTLE_TRAIN_MANUAL_LOW_END = create("whistle_train_manual_low_end").noSubtitle() + .category(SoundSource.NEUTRAL) + .attenuationDistance(64) + .build(), + WHISTLE_CHIFF = create("chiff").noSubtitle() .category(SoundSource.RECORDS) .build(), @@ -640,7 +656,8 @@ public class AllSoundEvents { } entry.add("sounds", list); - entry.addProperty("subtitle", getSubtitleKey()); + if (hasSubtitle()) + entry.addProperty("subtitle", getSubtitleKey()); json.add(id.getPath(), entry); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/HonkPacket.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/HonkPacket.java new file mode 100644 index 000000000..d2ad3c094 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/HonkPacket.java @@ -0,0 +1,72 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.interaction.controls; + +import java.util.UUID; +import java.util.function.Supplier; + +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.trains.entity.Train; +import com.simibubi.create.foundation.networking.AllPackets; +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.network.NetworkEvent.Context; +import net.minecraftforge.network.PacketDistributor; + +public class HonkPacket extends SimplePacketBase { + + UUID trainId; + boolean isHonk; + + public HonkPacket() {} + + public HonkPacket(Train train, boolean isHonk) { + trainId = train.id; + this.isHonk = isHonk; + } + + public HonkPacket(FriendlyByteBuf buffer) { + trainId = buffer.readUUID(); + isHonk = buffer.readBoolean(); + } + + @Override + public void write(FriendlyByteBuf buffer) { + buffer.writeUUID(trainId); + buffer.writeBoolean(isHonk); + } + + @Override + public void handle(Supplier context) { + Context c = context.get(); + c.enqueueWork(() -> { + ServerPlayer sender = c.getSender(); + boolean clientSide = sender == null; + Train train = Create.RAILWAYS.sided(clientSide ? null : sender.level).trains.get(trainId); + if (train == null) + return; + + if (clientSide) { + if (isHonk) + train.honkTicks = train.honkTicks == 0 ? 20 : 13; + else + train.honkTicks = train.honkTicks > 5 ? 6 : 0; + } else + AllPackets.channel.send(PacketDistributor.ALL.noArg(), new HonkPacket(train, isHonk)); + + }); + c.setPacketHandled(true); + } + + public static class Serverbound extends HonkPacket { + + public Serverbound(FriendlyByteBuf buffer) { + super(buffer); + } + + public Serverbound(Train train, boolean isHonk) { + super(train, isHonk); + } + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/TrainHUD.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/TrainHUD.java index 9efff2dae..2f2c3889c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/TrainHUD.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/interaction/controls/TrainHUD.java @@ -8,6 +8,7 @@ import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.ControlsUtil; import com.simibubi.create.foundation.utility.animation.LerpedFloat; import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; @@ -34,11 +35,14 @@ public class TrainHUD { static Double editedThrottle = null; static int hudPacketCooldown = 5; + static int honkPacketCooldown = 5; public static Component currentPrompt; public static boolean currentPromptShadow; public static int promptKeepAlive = 0; + static boolean usedToHonk; + public static void tick() { if (promptKeepAlive > 0) promptKeepAlive--; @@ -63,6 +67,20 @@ public class TrainHUD { displayedThrottle.chase(editedThrottle != null ? editedThrottle : train.throttle, .75f, Chaser.EXP); displayedThrottle.tickChaser(); + boolean isSprintKeyPressed = ControlsUtil.isActuallyPressed(Minecraft.getInstance().options.keySprint); + + if (isSprintKeyPressed && honkPacketCooldown-- <= 0) { + AllPackets.channel.sendToServer(new HonkPacket.Serverbound(train, true)); + honkPacketCooldown = 5; + usedToHonk = true; + } + + if (!isSprintKeyPressed && usedToHonk) { + AllPackets.channel.sendToServer(new HonkPacket.Serverbound(train, false)); + honkPacketCooldown = 0; + usedToHonk = false; + } + if (editedThrottle == null) return; if (Mth.equal(editedThrottle, train.throttle)) { @@ -71,10 +89,10 @@ public class TrainHUD { return; } - if (hudPacketCooldown-- > 0) - return; - AllPackets.channel.sendToServer(new TrainHUDUpdatePacket.Serverbound(train, editedThrottle)); - hudPacketCooldown = 5; + if (hudPacketCooldown-- <= 0) { + AllPackets.channel.sendToServer(new TrainHUDUpdatePacket.Serverbound(train, editedThrottle)); + hudPacketCooldown = 5; + } } private static Carriage getCarriage() { diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/ArrivalSoundQueue.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/ArrivalSoundQueue.java index 9797adadb..f96bace94 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/ArrivalSoundQueue.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/ArrivalSoundQueue.java @@ -13,6 +13,7 @@ import com.simibubi.create.content.contraptions.components.steam.whistle.Whistle import com.simibubi.create.content.contraptions.components.steam.whistle.WhistleBlock.WhistleSize; import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.Pair; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -59,6 +60,31 @@ public class ArrivalSoundQueue { return backwards ? tick > min : tick < max; } + public Pair getFirstWhistle(CarriageContraptionEntity entity) { + Integer firstTick = firstTick(); + Integer lastTick = lastTick(); + if (firstTick == null || lastTick == null || firstTick > lastTick) + return null; + for (int i = firstTick; i <= lastTick; i++) { + if (!sources.containsKey(i - offset)) + continue; + Contraption contraption = entity.getContraption(); + for (BlockPos blockPos : sources.get(i - offset)) { + StructureBlockInfo info = contraption.getBlocks() + .get(blockPos); + if (info == null) + continue; + BlockState state = info.state; + if (state.getBlock() instanceof WhistleBlock && info.nbt != null) { + int pitch = info.nbt.getInt("Pitch"); + WhistleSize size = state.getValue(WhistleBlock.SIZE); + return Pair.of(size == WhistleSize.LARGE, (size == WhistleSize.SMALL ? 12 : 0) - pitch); + } + } + } + return null; + } + public void serialize(CompoundTag tagIn) { CompoundTag tag = new CompoundTag(); tag.putInt("Offset", offset); @@ -117,7 +143,7 @@ public class ArrivalSoundQueue { WhistleSize size = state.getValue(WhistleBlock.SIZE); float f = (float) Math.pow(2, ((size == WhistleSize.SMALL ? 12 : 0) - pitch) / 12.0); playSimple(entity, - (size == WhistleSize.LARGE ? AllSoundEvents.WHISTLE_TRAIN_LOW : AllSoundEvents.WHISTLE_TRAIN_MEDIUM) + (size == WhistleSize.LARGE ? AllSoundEvents.WHISTLE_TRAIN_LOW : AllSoundEvents.WHISTLE_TRAIN) .getMainEvent(), 1, f); // playSimple(entity, AllSoundEvents.WHISTLE_CHIFF.getMainEvent(), .75f, diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java index 4c072d045..518c5f23c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.logistics.trains.entity; import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.AllSoundEvents.SoundEntry; import com.simibubi.create.content.logistics.trains.entity.Carriage.DimensionalCarriageEntity; import com.simibubi.create.foundation.utility.animation.LerpedFloat; import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; @@ -26,6 +27,7 @@ public class CarriageSounds { LoopingSound minecartEsqueSound; LoopingSound sharedWheelSound; LoopingSound sharedWheelSoundSeated; + LoopingSound sharedHonkSound; boolean arrived; @@ -115,7 +117,7 @@ public class CarriageSounds { volume = Math.min(volume, distanceFactor.getValue() / 800); float pitch = Mth.clamp(speedFactor.getValue() * 2 + .25f, .75f, 1.95f) - pitchModifier; - float pitch2 = Mth.clamp(speedFactor.getValue() * 2, 0.75f, 1.25f) - pitchModifier; +// float pitch2 = Mth.clamp(speedFactor.getValue() * 2, 0.75f, 1.25f) - pitchModifier; minecartEsqueSound.setPitch(pitch * 1.5f); @@ -132,17 +134,54 @@ public class CarriageSounds { if (mainEntity.sounds == null) mainEntity.sounds = new CarriageSounds(mainEntity); mainEntity.sounds.submitSharedSoundVolume(soundLocation, volume); - if (carriage != entity.getCarriage()) + if (carriage != entity.getCarriage()) { finalizeSharedVolume(0); + return; + } + break; + } + +// finalizeSharedVolume(volume); +// minecartEsqueSound.setLocation(soundLocation); +// sharedWheelSound.setPitch(pitch2); +// sharedWheelSound.setLocation(soundLocation); +// sharedWheelSoundSeated.setPitch(pitch2); +// sharedWheelSoundSeated.setLocation(soundLocation); + + if (train.honkTicks == 0) { + if (sharedHonkSound != null) { + sharedHonkSound.stopSound(); + sharedHonkSound = null; + } return; } - finalizeSharedVolume(volume); - minecartEsqueSound.setLocation(soundLocation); - sharedWheelSound.setPitch(pitch2); - sharedWheelSound.setLocation(soundLocation); - sharedWheelSoundSeated.setPitch(pitch2); - sharedWheelSoundSeated.setLocation(soundLocation); + train.honkTicks--; + train.determineHonk(entity.level); + + if (train.lowHonk == null) + return; + + boolean low = train.lowHonk; + float honkPitch = (float) Math.pow(2, train.honkPitch / 12.0); + + SoundEntry endSound = + !low ? AllSoundEvents.WHISTLE_TRAIN_MANUAL_END : AllSoundEvents.WHISTLE_TRAIN_MANUAL_LOW_END; + SoundEntry continuousSound = + !low ? AllSoundEvents.WHISTLE_TRAIN_MANUAL : AllSoundEvents.WHISTLE_TRAIN_MANUAL_LOW; + + if (train.honkTicks == 5) + endSound.playAt(mc.level, soundLocation, 1, honkPitch, false); + if (train.honkTicks == 19) + endSound.playAt(mc.level, soundLocation, .5f, honkPitch, false); + + sharedHonkSound = playIfMissing(mc, sharedHonkSound, continuousSound.getMainEvent()); + sharedHonkSound.setLocation(soundLocation); + float fadeout = Mth.clamp((3 - train.honkTicks) / 3f, 0, 1); + float fadein = Mth.clamp((train.honkTicks - 17) / 3f, 0, 1); + sharedHonkSound.setVolume(1 - fadeout - fadein); + sharedHonkSound.setPitch(honkPitch); + } private LoopingSound playIfMissing(Minecraft mc, LoopingSound loopingSound, SoundEvent sound) { @@ -193,6 +232,8 @@ public class CarriageSounds { sharedWheelSound.stopSound(); if (sharedWheelSoundSeated != null) sharedWheelSoundSeated.stopSound(); + if (sharedHonkSound != null) + sharedHonkSound.stopSound(); } class LoopingSound extends AbstractTickableSoundInstance { diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java index 686c14ab1..e229e0a78 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java @@ -39,6 +39,7 @@ import com.simibubi.create.content.logistics.trains.management.edgePoint.signal. import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalBoundary; import com.simibubi.create.content.logistics.trains.management.edgePoint.signal.SignalEdgeGroup; import com.simibubi.create.content.logistics.trains.management.edgePoint.station.GlobalStation; +import com.simibubi.create.content.logistics.trains.management.edgePoint.station.StationTileEntity; import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleRuntime; import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleRuntime.State; import com.simibubi.create.foundation.config.AllConfigs; @@ -77,7 +78,7 @@ public class Train { public double speed = 0; public double targetSpeed = 0; public Double speedBeforeStall = null; - + public double throttle = 1; public boolean honk = false; @@ -114,6 +115,10 @@ public class Train { public boolean derailed; public int fuelTicks; + public int honkTicks; + + public Boolean lowHonk; + public int honkPitch; int tickOffset; double[] stress; @@ -675,12 +680,15 @@ public class Train { int offset = 1; boolean backwards = currentlyBackwards; + Level level = null; + for (int i = 0; i < carriages.size(); i++) { Carriage carriage = carriages.get(backwards ? carriages.size() - i - 1 : i); CarriageContraptionEntity entity = carriage.anyAvailableEntity(); if (entity == null) return false; + level = entity.level; if (entity.getContraption() instanceof CarriageContraption cc) cc.returnStorageForDisassembly(carriage.storage); @@ -695,8 +703,12 @@ public class Train { } GlobalStation currentStation = getCurrentStation(); - if (currentStation != null) + if (currentStation != null) { currentStation.cancelReservation(this); + BlockPos tilePos = currentStation.getTilePos(); + if (level.getBlockEntity(tilePos) instanceof StationTileEntity ste) + ste.lastDisassembledTrainName = name.copy(); + } Create.RAILWAYS.removeTrain(id); AllPackets.channel.send(PacketDistributor.ALL.noArg(), new TrainPacket(this, false)); @@ -1143,4 +1155,23 @@ public class Train { return train; } + public void determineHonk(Level level) { + if (lowHonk != null) + return; + for (int index = 0; index < carriages.size(); index++) { + Carriage carriage = carriages.get(index); + DimensionalCarriageEntity dimensional = carriage.getDimensionalIfPresent(level.dimension()); + if (dimensional == null) + return; + CarriageContraptionEntity entity = dimensional.entity.get(); + if (entity == null || !(entity.getContraption() instanceof CarriageContraption otherCC)) + break; + Pair first = otherCC.soundQueue.getFirstWhistle(entity); + if (first != null) { + lowHonk = first.getFirst(); + honkPitch = first.getSecond(); + } + } + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationEditPacket.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationEditPacket.java index f596d3e8b..e1ec084c7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationEditPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationEditPacket.java @@ -110,27 +110,28 @@ public class StationEditPacket extends TileEntityConfigurationPacket type, BlockPos pos, BlockState state) { super(type, pos, state); @@ -608,6 +611,11 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable Train train = new Train(UUID.randomUUID(), playerUUID, graph, carriages, spacing, contraptions.stream() .anyMatch(CarriageContraption::hasBackwardControls)); + + if (lastDisassembledTrainName != null) { + train.name = lastDisassembledTrainName; + lastDisassembledTrainName = null; + } for (int i = 0; i < contraptions.size(); i++) carriages.get(i) diff --git a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java index a8528275f..d3e5da736 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java +++ b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java @@ -18,6 +18,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.glu import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueSelectionPacket; import com.simibubi.create.content.contraptions.components.structureMovement.interaction.controls.ControlsInputPacket; import com.simibubi.create.content.contraptions.components.structureMovement.interaction.controls.ControlsStopControllingPacket; +import com.simibubi.create.content.contraptions.components.structureMovement.interaction.controls.HonkPacket; import com.simibubi.create.content.contraptions.components.structureMovement.interaction.controls.TrainHUDUpdatePacket; import com.simibubi.create.content.contraptions.components.structureMovement.sync.ClientMotionPacket; import com.simibubi.create.content.contraptions.components.structureMovement.sync.ContraptionFluidPacket; @@ -140,6 +141,7 @@ public enum AllPackets { GLUE_REMOVED(SuperGlueRemovalPacket.class, SuperGlueRemovalPacket::new, PLAY_TO_SERVER), TRAIN_COLLISION(TrainCollisionPacket.class, TrainCollisionPacket::new, PLAY_TO_SERVER), C_TRAIN_HUD(TrainHUDUpdatePacket.Serverbound.class, TrainHUDUpdatePacket.Serverbound::new, PLAY_TO_SERVER), + C_TRAIN_HONK(HonkPacket.Serverbound.class, HonkPacket.Serverbound::new, PLAY_TO_SERVER), // Server to Client SYMMETRY_EFFECT(SymmetryEffectPacket.class, SymmetryEffectPacket::new, PLAY_TO_CLIENT), @@ -172,6 +174,7 @@ public enum AllPackets { S_CONFIGURE_TRAIN(TrainEditReturnPacket.class, TrainEditReturnPacket::new, PLAY_TO_CLIENT), CONTROLS_ABORT(ControlsStopControllingPacket.class, ControlsStopControllingPacket::new, PLAY_TO_CLIENT), S_TRAIN_HUD(TrainHUDUpdatePacket.class, TrainHUDUpdatePacket::new, PLAY_TO_CLIENT), + S_TRAIN_HONK(HonkPacket.class, HonkPacket::new, PLAY_TO_CLIENT), S_TRAIN_PROMPT(TrainPromptPacket.class, TrainPromptPacket::new, PLAY_TO_CLIENT), ; diff --git a/src/main/resources/assets/create/sounds/whistle_train_high.ogg b/src/main/resources/assets/create/sounds/whistle_train_high.ogg deleted file mode 100644 index fca7997610c768f651e0db9eae03b33caf87e606..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10939 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 X%}_;y{nGG$u0n3tJ&s>6%UJ*bf)i7$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/sounds/whistle_train_manual_end.ogg b/src/main/resources/assets/create/sounds/whistle_train_manual_end.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1938399d9d806bc586eff812b58bc920f0f51e86 GIT binary patch literal 12878 zcmaia2UHYKv+pc9gXAbn5|$u2i6B9cT|i`Ek&NV=gGzFVqLPzjNsDC38ALJ&NX}7m zHh_qTyaE5;{l0hKJNM4%?bFlMUDZ|ftDc(P(X_GA2C#sCt}4mDjUqL!Dadt*w~M>E zoyTPt3Vjqwl_81ZJ>^J z=DJtxp>U{(kcg0wq>vbt2We&LWnt%R166kRwsUuJcCvEzgk1`O;Qr+SQ&iH000dx< zusXC0Jsg7q015zj#0evdw}!(o3E4bPlM_@gTU|mgk`rEZ(OX0acmJz`idoVC01klW zA&ko1fZGpA+t71Ixo1h+-Isa`#eb=_EKS&ce8a*yzdGN+c?iZuK&p=mfCiFRWecT7 zURLJeY+>|Z^_%4t7Xb2^L^^X%Z-596Ky77oKlzUuKt9Yg=6F^s$ov zV{9dppJJ__Wc9xndD~uIKpwPZj~jE38>cdov&Wqu|H{I>0O(VB zB!8E?*gX%i9*^5#x#xMeFF}3qNS*v&PPlYC0LTk7ceye5f!06@jJbE zacPnN`3k(k3#bTNhINuXnm{zh?8+=?kS%>SffC7IN#KC+>@{fWaO(F#X|mMytU~Iv zu@5hF(zqK6lhdv|=s3i%3i=Y(pVF0;GMwr$1Sd(w{B1p@Ov5iN90mIrHq*(v8O*?O zcB85Ig)@5KT>atHje-Vhu=OG#jk~5n=P$p1U{Pq2KJ-C)1)T9>HqD`d&=_o;TBaWi z5?=QGclgMIelwe<@6HH<`bXiJQ?uo>#b5V~CX3G!?uF%DkBm}56b3&)GH_!&gRV4( z0ze4G6^j2=T|xOTiu2-L^7ivo4TyZ?zpP3+hHmYacTgyi2!kl*7Y9)sS+kMpQ6{bG zfT@`@;KL*!5irc(hytAowTw}~W4H>Euw?gs*jq3v{?l<^I6qxu8TpU$=_|7qB^Ovm zLeSxtCb z&D2^M*7@t#{u3~N!)9s9>pvprGDO&=qgGYpaQ+=RSv*mnrJ^|Cah&>bH=ZWhyhtrf z$=oi?A^LBTWBc-L^2@j3FE_)ZcwQvgy+|!;$Z_m1+im<`%YQ}AJ$Fv9fRUr@&iNma z(+o zyv~e7NWV?j9+DhQV=7T>P)uA)2lbH(HKBu=qt!swa%oU$XdLOFsFYDOsIeps zRE^UoF{>FJ)B-JPqSk7THsE2B*OI7)K6pC`QoW{<{7omFjFbOir9pkgN&+=iE3V~< z(n4A3>!9?#t@KY&4=4TAK&rOJ3=IlZi<&uhLM8dHc%qCSTFsoG^l1YOr$SeL_^;4k za-N#-0;y(`R%UfxOFVX|cJ?_1MX5YRMTJGRPDN# zYFR;1C4W&7e{p5WSrPwkZ9!3EX@6yTT3PXK?ICdo|8ApeQCV4W<=!Q=v2?fFZMRX# zFCX?Xzj&vyu(8p3x6y5&)`>Z{Xs4C;V|#gj<>79lV6_*U7RqZO!Fcr{sE3p3<4nVo z&`Kwn_oZk3AcN7L(w|(I8^CE*&P-rm_jkTKW>QfYn^bV6MWty)#k-Zxd>tjbidrat z<3y_^Nn?FF=OxJ~!>P!eqMb(GkFB5};rVVC<|ZL#<2ebCkWpDm>~GO~LiovHuG{VG z*6I(h+;=2|J<%XGAeY#n>X*-E$3qO=@il-Y%#o1#$)UCybhdtm2Rn;0!~@hWsRZkdTUeRkJbc;VAxN+@R!Ah8p;U z@Q7|W)&+MRG&UfQCbY`B+(ItHRv{cY1h=DbACTrHR2-1zE_7E{guze)3Itp=L((u< z*Q7K77lu}iSD;JR0R{uL5CHRztFXn>c+mwRBGo4Z?t)R=4F&fdJO&JX@GyNIwFLz` zh92|_hS~zOExiYsA}@o*kOB`Zv$UOp$;FTn6~88juDn3Pq3r=6l(}V1-E- zy(AzJ+fc9%hVi^4Bp`_ZfY%kwh|0ArJ%VDhz&#TSczU^KBBb%N6I5W`(1bW7C=OJq z(47RdU6<}9A;Dk|3PQtC+?xV~Rkwi>qO?oTp^ObPX)`5*!8_0AL;$ zA1KFWQkLMRC*&2gyix)U1C97b*aQg}06i2&A>4CXlb^p~jz_>jHKKO#T^c-svU zq&Jx_t8|a3ek=(&cM%|}E-}Iu0=nUEUr5Y<^-I&7tzM`&qgSRjNuN)mJtJh4He z?j<$e1K_JAlmHN-U=t0Lhfve^f`USDU_e%R+pw?^4$c~-2oVWUPl(5;9X3D_(n}H> zu17*iRTP+Gehbhuden=LCW(x!enq?`(uQk1?*$Ek;;@BxL8xQU!BoyqK9g$Je;~Z2 zj3N8`CJX_t13(-pl$||QI*KfsJcc6nS{!9ORRRcK09b~g$pJJcZg_aObyRN0DmLd` z%aFXzH5{%h@?}Lp@b^^(=c@hpOy@^t*LcjW?k}&H$vd$K;FHf` ze%A|{&;>4^%P1G=Pkt-Fbn;FeJAXf9M{jm1M!Wjh5`K((RvJPn4P?Cf^(W{cG|LF^ z1_*&xtNDIZdsEuui^?O-lU7z1a_I2p2t?Ds!r&$&9_Y>R&kOQ9y8zBTD3DR@X*XQ>5rR!^uYJ% zNc!V2XV~Jqm^ig{eX;w(JW4M~DLuKA)NT5yA6Mz@-}(J`(&u1NJv$ePy^Ehl&8cvA zqyM+y10TpQ-j+P{<6Um|AV3UUEVX64_b0Vhq4^DgnL}vlWE`5qsmJw5Ov?@r{qcT& z#8?w|@Q)v+zFV5p;fW@lAAH@r3L1|WSSp*{B9me;8HX*Nk7!To`mwAsjyV$6-Qu7Z zf{aHJGlB1RZr`%U??+LB~3ZXgF;;Y(9yR<#+pTLFGhGea6@z7fO$P zi%(P062h1sfc3>Kw6BjBWgY`%mXtXrE~5fRiTs9yhUQ7e$$(39CzSd3c@LJ44;&y8 z=zEC)u;e7x@FVhC@E6#r0z6fGSUG<@dN$OEWjj~xWmRHL2)MZ&HMP~u2cOw4y%**4 z6R?#XBn;sG>Zv4ogWSd=`_PY$M^iF3&S2fAd_syy?5&aI@$`YW3rfF~Ww^Ez7ASWf z$D=uMx-wG|n%6r}x4Opfo@BeR4KGCPN&nP+I@D7Ql~=6)CI!xcRMRz;9i6Km45}=`A`U)})}L^C`#=iZFEh=!)5wxj+aoU}K7u z1Twt`Hsg$Se(2%12MAHBr%X^RpR+_X*mb2dZvR2SxzMm3xFXZQ+B@dc8u6x3rYk=d!s*D_cuyi$=I+iaBS z6O4~vN0OyKB%gTk16TU{_R*rD=gO3cN@y5K*OWmyQQn}Yu{+e|ElKN1O&?E9xoElBV+HB{sEue@bKQFRw+F z79UXtpDiAh>saGo%*M-JyF1NfpaKdzg9DH?uUEwoZ+99$7g%)0)%FxMwyW;uI%Hr+ zY&H{6nmeC08K~=Ypc_il#2pC|a_VUtDayT%fOY2^I>OmhUmn}}XQf1`c;osc%%^`% zNGGL4oWuz~H!498SKM}%mD9p)yj9fo>EB$~Y^Exk}YC8v?!;B=@0|~6nN79qtQ<(!F zQzq+D>ie1x+h2t2(ur+*9%Rz1H>X<`_DLS9zZxCi=!HkPB2+~TBGcc!k5@y@m;3XL z8ZnLfIo~g%;fLDJhhGpsIN@_VCz9qYtY(d&;FUFSY&-YtjFTPJC4E2I$EYsU-9JI^ zq+ocx;j0A#hFdU?W8@PMBoY|$E)?UnRfTz?92{Oot?;F)_bKNWR-x$DBAi*9Alvhh zWSqvY=be5erKtvKxj7{sQ`kFNkk+sPGSN3pT<7>9gE!{S0{QojC&=V?AEHcttPf+M z1J@Ty_T$G#qVMb$Pnj4cAGd{WrEu+++t`GjyH0VSh@@JXwGjd&v$CE3znKdQm*VY{ zsseuMdml9Bcg)`Le&$-`)76woD%nWM)y2YRZh~fsd>aFd3`(GOZzTkB$f?z z-dV_NZYOJ_Q(lC zwKw1Y8p{LFMRrW8mN02Mo(HW=2B`xa21fptPjg>=_>IWZf00$ufBi(NlP}d_|K_a` z-it@MK|J@oL}^#p9ToLt%eS%Gk1Ae6p)2fZjbr z(ymDME*i%P?w-m-ADt?TZE6vt6|SE=hM48!tf@i`2dKKWSpXN=a$ zQ6`y_7Y6T+3Ciem$tJc>fK@h+hvY~2^5Oi+dpXjwr-^tSN-j~14Ii+%-y2sD6(G8} zD*drl)*dd^iM-ScC>yDxOvI(7W5I(dLkH2xBg!`Q)v z)UO9z4^P;rv!7>{-jw`N7W`e=`8B2FJ2zlh(45`>NG_&p?d(SBc20oJGu(HhB*>o) zX_0Q^(zp?7cVBb;)ZXc{SLJMx0pjahUJ4gl9tmf^E&dZ>|FC?rwd&s6?3b}wq={@J z2G&Zi1l)1_pA)}}GKy@8mf)NSn3l}#bS2$S4aN$sb$OBBpD3Oe&?&jdnPoBV^SD#D zDPq|d@nwhtTb$~d-4KuS_)Q4#r<-~Dfsv-+H~gaXf@I%uCzFB&MXaAAOg)^uGsOv5 zFGAb`^elg>|4F-e`bf7mP(YVKZ@c;E^g~iHlc+rfkJ1vt;emkd^Q0-d2UN0OICq*| z`ZIzwd`cH|OJ2nvy8p0dX*u`wyx6tc+&Cp5xE(ak4tH&r%ABB|*UFXWkMi|kb)-n` zsN3s3J7G|46-mS1d@R2ri#sctxm6MBk(DtaeRe;$bE!lkCeY*;;fHj_)6J*>*3qXj zEjAsCYVss+QJJg~kZp9TL(kZONP$&co!_k`AOC?3iRV^>PkWE{PLH(j*;yAU zzQ#nj>~EEbk-p?P^lx|i!Q-p7JbyDPOXHy^OKbmZF}K5hDZ_ifsr^`Wj7I3q4x{fg zMij{`Yae5M;fTXM^=Haw7~Ne@+0mNaS$6Jlo8Ez_!NSvRDmKw*ojbRO6U;ifOIEb1 zS_hmya%O1bnq!YbXVNrNUhdsqG8m5&JM|z7B5;_M!9#!LwX?kx>hBZfH8g7J za=bf=36u~Px49uMI+#CiopF1~BIo5RMmnv>EFZ-6e-9c};g-Km<(%ed-#`g|nu6wY zPH@jOYHU}W{NkUCiy$qWTJW`1tBvf%H+emcPl@;;M`~|mulnry&k%7_HNNJ7IwKBF z7wUqu-sAml(+q?$k-w_sk z(Ua5St4t(|nfdk&Ydk(BEpjOeE%{TIZ5Sq#kx<`=M}1RjgOnW6Z~Nm$ zTpeyztEK3Q7s2Bh*)JomZ)~H9TUu|7@Xv*hKXDVq!EqiH^Kcg`{E|-S>pq2G3&cB! zzg_qp>NtH7i?yYEpOfpj))jTz2DisL)u|<}U@FFI?kMRKiJZY9e}PE#IH#`3!HkI+P}z{Gnc54^BrrEZg4~Iep=^seKBVJ zBQv(f<~UO>p@-D!B{T~WJd>nDEkj$)q!UVi%c%x)i* z6+!Ai{4(ubcFFKti{+K|<{#Ct)8}z^8Aox;R&U7R4Aa>_RHn0qjfX(;$MVwfhF1dA zxh-2!7Y$V!H@7pK^DhRh24cKT`*MO5hUo^H@zYKzdUYwe_B)OgUr{fGK3Gp;T1JFz z-dc3uOV$jfX7|Fnu^6|(L`j#L;aO za$HcM+KmFAa{BR7B~6Z3mo}JbBj^{sYg6d^N}I7nQfaZ; zw~`IbveX1PN>yt#!#s{2?ow$SYKhqR+7)qTrqAVk)YfRK7F=~m9D9~nJ>Syk?=TXI zwatz|hM!UQP)KtNg>bG|lVsZha#Ey~dsDj{rCaPFJ*)s4Z{acAC8E_PWa%CRT|ANT zZTsYdHq)YkH$0P3nyVE+V7Km4do6mxQK7CDu2vux3{g-eMsoA=GE%W z6MJ6o@xEL$zs%@$mCdNg+`AC(ME*(6mYVNkDU$Vm$k88di7$46k!0<1^Nz6uFVv2~ z&ndnGH@NrqsLPj^f?s+$L+8#Ch?xa5f>Ue^(tw=hrHN~fH{V~&{3S^`fHk4ftw1wB zwqP(B6!y*1hpt3t4XT7`rmbOn)VWP?Ncry2pHfMKu&}c<`Soy3*%ai_RcaJ zt5P4Df(KDNmciR^5Z}f^A34QI4$w3Pud}30(eJUVji27DWtfT5eXr`lgIj01MP*!| zywJgCHrg&Rhq^f8dz*j^pZ08`Nplz-du$4`W^9~_A8~%(Ltfdv@t6#m`}JdD5=uTt z$Kb-OVS9yEz%a^)m+Lq>q+TZ(5dvjMr3QKNrryBqk z!IKA)#e0LKl^(U%hC9B%Sqe&s*H=xS1FE+jAbA1aaZ)y;xBzYui;pWw`+2fc%jAy@ zfi=NMGsj}jJ6d>(D(hAC$r`-X>eZ{euU%$SU3x1KSZzcM{v9X=6OokI)ex&jD%XH# zh*_Sd#AbnuS`}v+TbKDytkdsD@GAUjg6rCGEExB#Y#S{H%3=aOuQ5873PxMp&7iqe zRY7DLvAXa(zy*n)_z><89m-S1u_1Q&x=&9x)rg|2@kZdYr_Q&lzEFFL%Ww@=xup_) zdEPU$FGrX=-53#$_@EBgfV5Bo|C~>x{`-6a8*D<&yNsyTcUGro7q^!d#>PfwCO=J% zj1C3R4U*zN_3Xs==?#=qy{kQRx=Vt^Q$9um&Cq4&2)y}9Uf74<9x3wc)gP0gnpAog zL6f#+eb32RMZDg+hkcZj2~vavciv^DVdv+B4c$m}BS=*ogA48KN>u1KMF~RqrcxB| z@x=m+4mQCCiRXRc{Kh)0ZcNLvEqR7_-#+DV=AW@r=YSi^iq@z8pu0W(7#I-qd$r6_ z-#VxDl=m|+nxQj&4NAi_BVn^HbQ3e7)InIhR8T2%?@!NbTjHTI6Q-eyk>Tq&HUiby z=*Q8!zeuaj49RgwY-3nmNCEUG45VNQXvH5S3w+zDJ%+93`5I7XZPQp!+UJF+>R}J- z!V`~wlSo+uqY$+*m5~@T(Y@I&`+#%zeg8M3O79Yki-H3AkmQ6PSXixtaZYMZR-W7p zlW!SFZ6udhEyeR>Z=ULwO28QRxN&~rSF0n zQBzb?S=oVn-qnHXzdnC$xD|LS?s|MlZPsh&C!OKF@=?E!4(Ps=q}q6ev9(LJPstI@ zRrp5kn5!Ar;=%0hynfLz|G-IY{6eqsRziDgelIfUwsn_i+Pu!53tP}}GhR%ZbE7f< zTvr_=UEVLdptv*qvH$aFu;_>H5p|9?IDvABHqQB4t^PU%VxesGgkJ?y6%nm==Gpi` zOS(gH$;-5-%Fcd`1NZ3$lwmGo@hZp|UW(|RH=GhC&$?c9$thJkaY=a0{Tx#nOplb0 zGb7XcKFbJ?VQrBU(yT-|J;$K$-P#&W81!9CAQ_C^FI6n`Y(Jh!V58W~FNsH!9Ijf_ zTh|hw=T79ds#J@)b+@k{1igaY zMta%gb*hsl$MTu@VD@AoU&1-lsbosS1e@i1nx!~68_>$R#S)(#R>ELewQ<(PzND`E}Z`O%5vLpmul z%3`jkiGLFBG=A}I&f4;r%e*{RTwdiypsT<}rsN=b4`D#Ub>b&K0g)Sbyj0Y&w`j|8 zY|nLzs9FiX@d(knBouaYkqQd-ag7|Bgoe-~rlTJ!ncW&>+|wS;sXmtTAvDdSyU}UR zx>%6R6MbJv?@eZvHtMK06HZ~HbzFhW2xhRBo55u=dX9)02-A)Qm_EV_Zlz73^JcWU!f5)XZONzcG!NQHr_01Tk-AqJ+ z3@J3BcE`|;!6kS9r2I80`NLuw_k}H)md8d-m|M4bezVdCLVVu^uZ?JB%1a;V#0P4!$Gw{|t-krgX3(Ve(;^RsyZ3RX_gJq! zo?5ga#h;n@&AOlSWBF@`7Zl~(^(q4jv{e!%*P_-LXvB0N`Z#%|?NX;%F$G>FNP2gt2C#Mt<_?zc?37&Gz$!0$&|wR1(^Zxm$r9e2>Y;f#|K*zWpF zlrA}#9h?~&p6M1FR`d0t>d>{|Z(m4?Qh%9$WXC>b#;KIQbM4FipX++vCmF;&dAI^! zUKX<_-x230ZBUc9d9?6^I(1v+e$L<`UfZXe4v3kbt8yt!r{i=8%yWfO&R;JY)%x>1 z?@wNgGvT54_vB-KEMb%C&B^*T=>p%LT`Ag1H@H5tXpwjO0jd`wM=x}kg;@I@h||Uh zyr;X5pinY?t&DcR#>j*}Uo)vDajR5g%280ts^&pJaLkM^!Oj)$BRH&129U~~KJP`TD&79L4YfAczX@IXPJb3U+wEwkJe9@Onb7T43;QoIwWcLG*m9$)KR?kQOXBy<-p+eIA(3u^D+zc5E)f0{arU;R8xPU4x|FA!X)&P^ez9Ok+s8d4m_`obD7 zYv3_74g+pW5X3_06Z4^Vd(5o9)+C0ehdHQ;Q?u=yjl3jrT1NMc_*Zp|P4-!=!_({N zjBpakAX2%v17yK7Fm}rimR~pRB^W>BUpK_=tmZYKiDTMEZyg`~968?pET5b?>*url zEx&3{Bisr+r&aNIcp$XBUPPQ<%hjo*nzPYBsn1s1%N7nEtUadm$v=TBXcR5nsit}3 zR6238QcvuK*)_gPw&_%&jt5aaQC~pr9VIn;AJW|KSrZb-E~i0h&GJ#Gai|NYmQ+6a zrspN;vKp|9gw;GvPVC+Nd|H(DmEQzQyGhXX{F;0Rf#AmIHP6MFYI>rA?$z$%H!{jZ zl%lSN4A@IIM1VgM0~;&TW`M2SLr1+%>Rq~sU(xlBj$;-a3^ks@aNza4SUyH`U%wxQ zuWRi?I$tmR>}})bo*G3@cDva}WUi0O^P$XUv9J1s$ytAJ`}9K|zu!A0puxvJJ;$m4 z=3dUV+rTjKOKA~%1+R^=Rb}A05GkHm!OHjWXTr_EtbOsfb~`gT(bHc#e`?`=6}~=8 zsT#9R72Zo3tYzBWwy84=969}xzbywzXpipI%w?Q;hqkl{lP85Iak-xs@IE3W7uep% zTi+G!eQ5VM+O9zTkk&j^g~tK@t+73HVIcPU9cEJB7Dp*TIgSSPT=^Ml5*^z_7W@Q* zLjBVs8HViI97`AZ!!+?zys`TRW$v@MdyzjK0=Rb*WzLOkm2+G{9jmSw=Z3X?0ROR%9!5s1n=GI3~BW zcJR&(c}={DKcL3FHh53=z6NiFpRHUx^V|2kbhDqZma29`cPAM+$o(uHSC#n0bdLJo z$;U1e`=l83UWqekpzRNs_szjq4{kl4+su4c^MKeR!{p@L+%0zcnLnZFO&KIrbt?|q z>q)+A>BdcY7g`iB^s!9}_2GS1NO$lDK|yjgG})pGiB5tdkQMfG1rKiX7Rz>wp-l`P zK^Mve>-Ut+A9!jwRUeOVp$)NXc~{x@M7&hLG^KcLl*dEI?!$W}kN2Mfh^$9KyFRQc zH=Tb_VJca|fPaqF-}r@EDRIy5$cFGU1sGfBiJ6Q(A{bQvzKh*qeRFEbBxKFMD)fGW zS)y#q88P{0QIt7bZgKd?k33d1xokmjeyMZ89sz=luy%%ag~);Y?sRF(N8z1Kb76v@ z;BBr|SOg_>-^9(aGRm#FpSg1HnG{x=VxQ^M*7H>?><~*iAX8;PUyK-HS>SDhF)IXg zFp*1i;dzggR@i2ptN7o^E>-zI6MT1lGjhP*ZS2><7n!FwHLcD*iN-ICTS~?o5B@q= zMr5U1CjI1C6Snp5RS@X0+E{W(nvLabTHko+a3`$t?H+E8Z=|(MRo2L_lU*_~DjBKT zUdG!j7VW|fZ84{t360;Pmf@r~f_qp;w96@4pON8YQSs;!dzp4W`p`QbLN~V}xz|H5 zuWi#NInn$`d#<>lB5yZ|zN@)a3hzOphwWkO1cd3~C{D_I6< zGS`?lXqY`03pJ26!{i7x^H)26KD_pBz3%(f*63Y%3NgL>2jeA1)kLwpcbbwMdLIO3 z0=^kGity4!@Y-`}<_OG%=9cO(bud;5NGF9_eQT0~us7{`eCn_*+!S2u&Z;GARjC#x z6OpIPmR*vh)xzE?w!^4A8M4SO>vV1Ni<`AtUCs5>{IwA0 zfIzZhQR0TJ>Cwb|GD7@iczW{Ez4*ra6h0aun42;LEfb6isdVm=xJZ&h*+nW~Ek|mq zQ7SYtqjbmS?DVeBm!r-{)iOTKJh-=lCW=|%UpZ`AhEKnY(omfK7@qbldDIRk*>{~y zIq1eku3@h$t3aHD*nLD2sohgXH)cwUWxjmReWTqqGfwj;VZVMdI)s;hY4(874@6zH z(Ead7B9;Z&Lz@Em#a@q$AU6^j&8GG8^|&VDHl`0&1Vu$mY9uL_$ltq*?T=`r)jGP7 zY2L7=SZ^s16)1Qr{MOg*)yy_cy%N$bc878k9(ax4Hp2Z2m3d|iwB(w|{%P=cF^X>t zN7y?#cG)9$(x1L&Q2AQu%Ii1uAn=EcPDsXMmjf4#W2l^Ukh$MrTS2uE+d|F@JF^ND zDj<(>nfq$QTUYFN%Ea@wwiJc>G~bPHVt@j?&P3Vn2*)BF zSQM|mrXEj5Iec^9V5AH0!FI9%OGX6|eUY5s*4}X)-Q+;?*%*3&hj|L}z--4st-ZC*{o<`Xw8@+Xs_95eo-5 zWCS0(;GOr@_1fFCe5PC6)J%ANnhZSFuZ`3dwGh*k&Z2z-UypS0;kAAhwbg?My%%bD zoByMf#nP0yiNct{iP$w4i)8uAaBikt1V8=4gukmu@um){eS+rf>%aTCll`wW) z@rIk^Z-ZkyD%2WMfcR`uVn0ZxRl4)9#d_#$Z5ji9w`-y%kpK?1-k+yQ4Zr<_{84o6 zjBoB?0YyJj{MLVz=a?k03QIR(H~ga7SWG_=Y#(#0$ivDyJ&!XxIDotEP3b8SX$oR2 zorsm-LQ;+WyGGJ&YO`@9-!(f@SnhY3!|yw_4j?3a%IgP`63AtUl_GECySquct+gFP zoOUXbbWh*7x!~0=RL{!`PrN^10Nz;^4jKviR^c{0A`&C0#bW^$t$rW!m>NNtph74r z_F(W!lzFVS?`zo#o4+h8w&mSuw@hWnf4o*s3X%wX+n4lUOg0sr_0x_dp9%|Dp0j9K ilf6!U_At6?(jHCp2&Y`{x7f?Lc0&GX6i`&h_y%#zh>J) zE<(Ir+%4=pPP-tAW&aHEft)q!A@@#a{?~On^OOQJ8}NcE{`tSI9^$`@#6h~govW?z zJ$DS(cn7Ox6r%HA6-?ZU z830HC3_oQ|-l~fIAkv1FFUCC^X{T|c5Jn!MwSc5-JGf%$Tu@Ws;5-QDrJyw+1waGI zDszW2p-(G|=iFheVD*gCy_>r*!<|Z?C_9)+v>WzRO>`qaQA28@C@)58lfPzIo?578 z6s3k3*R!l>CNuH(7(}jR{8Le$=>Y@RB2UI<1(l~bW&a#rkm?Sy`l}WUz<_E3cjK8< zs+jt!I0r^}?tK;1Vw4yWyQ8h6t_xmXCilIqC%wHUy#owVLyhVK4C+ITrb11QLd{vj z{wd!B=8sOxnd&eIkbN1Myadm^#Gd;JnM)iJRz?I^otgwjnQ#f7kf&1c(7wVhz1Ft0 z)~T;ru&<>s|ED}ONVfjpi>z(803Zw6vdfLL%Z=v_ny1TMko?TT z-2muQS+rn>yZBuX@h*>BV7cq5*n?FY_@+kxFDIP39ROqzoE>hQJ)kwvLSya{_dTR1 zJ=7;bQ=D4lf4+jw@B%8r{o-M=J%&Oo&iu?Q7?3S%4ut~EUrFGA=Q+zT+%Rr`07-{i z$u4F}A8QTQN#|=QPE9}apyMFh66i~KZ(2uo+Az*zP=yAE|J!=RkWOA+JPP))t!2=4 zvYCV9>_&0q#nbxWT!UfUYEc6d*b2v{^AQ?!{_^_=7R3)T23wJf;EeDO=?)E)CSdD_ zRmSH5%G1984j)<2Z{}01oiBo60WoA2Oxy+Bi5ER%=@PRM-SGU2(J@M>;-{KuHa@&( z@R{Z?00@Deq4;0b8I=E`I6ommpqKwuzi6M}X;s!fD797D4ppE*fG8G}08t!GSk3gP zKq@=n2@{4_@mMqpj{h4`pi^O1adKpAXF(E{>fQ@41f$|V9ruN2=-h>o|0qLyoLUUL zU>Ok=(iW4})zQ80?PQSRHB%RAGUYWt88AN?ZF)ZJzXR*PA_oA2Cgdz8u@+H?u8gM| z@|1ra{IAGyW9o|M?1|@5t>#f56&&~~es5oVgz=7+xVkp8$q2L87>l*Gq{*0s^_Z^p zxVQCmt+i2IfI;m)0rNL(<|n=WBXUkdUiqRlxFL}nv@k!SwAlqs7 z7ts97ifT`zd9TO7Xxj>mRaS0LfZHAkpalRJL^t9ctNWlzPqyM9g7O8n8_9=H994k} zC9{gbc?%dUmooB3ReJKVtf~<&@)<0{%fU$iIryW_8IEIy$T9(d1r3@C9*RW|!dK(a zy@(Y~GzwXmp*@JCxDe8dAbar?3deJ555l`RL;B@bGM*00@qWbZ1!9b!&Om8P(Ol>F6@v(Ph>h zOIFt4cL>>OZX1na)^A>Q2^5 zXnE>t=~^4;=o)xi8yxB0p9oL|soLt(%(}X@y3+?vy2$~Hp1LOYt*4K44Ojw=CPNnw z0~T3NIZuvzfmHJeYx6p_3?`}0-tMTI2()F6dnk?N1^>8xv z$uv3&t#-Qkru=6w$YAt4a>#|V0i5>AnFH+W+`oF;{6-Ak1_!RRq&&T(bgSC=YJ1t1 zyq0c&Ns{&abrXa0&hyt}j3%RVOEwz?`dUCih}ljT&etNGCNq*C;YD>hb%15}5#^A> zOsCsVsii}&yq7eTU9liGAg9=1?3K;ozDk6-0RhOk*O;`S0v#|C96O38&%tY=9CEM|XosqT_ZB;_d=`|Q5O&nizPR(f zVbnQGsOVb0)u0L`zUGtwvRcc|r;|tF^O;mpLVEomkn=|6l#BBjv{i};AS--6iz*6H z%Vgw?nBW9wEu zRYhQNa7L`MqwLC0g%@|Q7{!3XwH+i1ChSiMMo!WbI1g0$#Cvo!NU(Hj9>@9Z{!4QU zd!fz=i}F+90#!)~pzzfXhEYiDs0GL>0UZU-Fmh}tNVW$FICLao^@E3_#Nm6xvQrtV z;1j|lw&6ez+;uR-fGmd6I{S1BISpI6=jcHdJE(g-Ni0@Dc`* zaCpZAl7bh{qADQNq2~aHgIWlIdB<7UlBtJxK&WU9C;>$35jnCVh+g87`|Fjk)vT+rWr#Eiy* z1`!7H)Daap7ovvZD-HrJTJ8lx0pHPYXkT74B}-8rIw7jc3qs*x`MXrZs{pVKE@=B~ zAK?Y!$N^c_JWwvu25QldT;~)AcSg<-I)ToNr*!fZ%-}M>XH`EEtf2BB0nGPuo`Mw~ zJ9P!g?3^ZdDB8D#Ih@--*e;Ta^DFC5pj3>zp3=wC-f(p!l1WD>0niS~~udq^JJ9{g0ge-`V^B z)G~4?2O;;L6(IYDiX8Yu&Y^er2ArK*@Ki@A9hm5~r-CacyATovU(XK#-IJq$Lh|#1 zD1pO4_<#|OHAJO(pwR-n_~g^Am!|@Y_kwRd| zp}<>AVUXm=?+40!h}T>0kl83LrhpiN=z710}IZs z07kjeEi5VjRolqInXkFQWLy5s+NTEtH0X=$Q?zg^qCixgVuU*cbi?1ikhuTqgG#Oa zg%${?wZG%An(}ARqR0XJ;1@uU@t?JL!4~D;1nvxsAq-$DhXpzR?ZYyFGS1RFEcz6Y zplMDCXHY$BQF5P}>ufOh-?^u`AP7<7(_Q%TI!|8jB}ehaHeyZNZWMr_0RXot`z`oH zH>@KgBv~~i&K+tYd=4Ffyjx|h%+|p=jz!>^w9yXh85U7m_g+|{5bb4HJrsX@@Thwk z!Mh(kTEZv*5h%AJFan z?@1T}Tm*mwTG*vaIAjc6EPWg_{#*h>A|n=rF90k+F!TV1hxGaL=MQ7@+LwrV6s*03W~o+6_T^|-;=Ve(O>fEN%>TaFKP8MyU1~8(;wcugPLmCWnu58 z^B3*1dT0EJOZNQllAr}y=&jZOi%$k_-kUW81gQnNg5z^H3@0@#-o^eRxg{`7q5N?x zOWaWKdLbRum?U_CvL%N4Raxd?A9sPnk?ZE87R{Wi^R98vo(C0hk{s9Rl4sf}DC8K@ zoB+(SOSi@gyfEPAyPis^@=~+J)iGSoX?XTTxnj@ zE*rA8GFNTWe0aUbV05qIn5uKGBrv~)?;CPz#vyx3TgF__mEP=jwpg2$!#T3lphrEP z)A~b|;!x8?c?;5$RO@Mn*PR7Lmqfl11DbbwKgL*EgXnojW41BbNEvC`W0h8l8p`6| zD)5!$D9?{MFTD42-;fjECZnQW^jS6rQv=V{gj~(kdU>nci(`9Kve8?O<&md}@R>q4(*X+lm#9 z7}sN2evHY{#vH~ip98o68K5QHt5-rwQbD4^e2N~Br5)yQkOD);8i4*jOm$Vs@=H(+ zXr3aRymdUhX1~iPW-D~Q{5Ky|?Y+zN59)cZ6j5RRd-qR_tvm;6Uhmu5{Y*CTQJ;f( z?-GqUU2%<^VGoSG@`K(rh;8=6g}K%Ocvz;NuPl1917aU2v8@7qrquu8hp{ga+ohVm z%;Txqo0pyQyA?*St^QKKH6QwLvFSdc+SD+&=B zuV1X$&}S}SvK0h|6(?^=(l&FE>0K^;bCmLWs#`S6Ey$L2_qyJPz>o`KO&&VcP|s3P z-*Zyl@p{GFANupR@M|X?6W6A_Hm}kwI%_H)@6l5_Q9tQ6t{^hKjh;Vb`j!ec+C{kc zkG}Cb7HFhu^t52(U?}Qp+;MIs0{B%Neg=?N6%>$rJ>Jx{rd8w)D@`^!_aHoJ^QzO# zuo@(u_BZ%`fO&j>2DSkZsiT3%Ut)yit+=F$`Wlx%`)@Y(DXq!`7g{(QD=FvB-MPZq zdtjZTDtuL^JgPj~x5CqX;nr+q*=pswH#Bn@=UuwS(cvg&K)269%1Db^*ck9H*ym9t ztvLbMKISg%Kfa{2f1Jj4m!a4Z4wtC45DW?4P2?W5P7jyKPtE#Y33!%qlqnRpDTEh_3UF^qRFT}ie4qg*hm5k zrr4UkHP$*Fo7em70kHyL#6I-!A_yV-}b}ULb8B4Z35!ogOfLJ8k43*N776!)0 z`gW7^v8Fs7&4gm=@aMG|r$o^54eQs`deQ#U$2y zAQD@n>jDI+;-X#Zzf4v{8=X&AdPNcuX>vOWi zC#?A1`0j{_6g>M3!!HO>fFb+VWB^B_1$ts zVcEMiBJ)TO%PGpgd)j&1y+b*L8SH*5(*YiQ=V`l)kg8GbirPuu0By}aK~m#JLqwcx zMaADlH%VGvcO~ri2C3;sqoqOdA>oy3?s`phn1d$bi_z=$&&J1Y-o_=X-N$R!NQO)` zvt+JA1NbfuwN!3WOoyxa@BWHt4xH)bAlHx#GHe`w8Pn>e5N}IzZX~}HL-Ki6I+Fj# zf~Sd-rrP88xwmN?c8IbmZhaZ9?>rC`__h-%&xF;Y-nQ=4Od(YY&cnr!fBgQg_uL$- z&WBdzAg<%W-IEozieKG5uw+WsQc7(=kAh0yujWGfZE06VT7Spwwdk=7WY0sA(jPU? zhUt0r9)2T~FtKhb8!t-1>l(Ks<=VWkHfFCDD73=3n2OczMhtn%QWoZ%Gsh?!Ycjq`u8>K3JJ;-Cp$&Ip z)a8Ba+cMPq6s0p%Isk}c{9;;*0qi$ZMl#Q;rUo4!MXm7m zc-vWQIgkTw+DdOGn;r-R2apZAjEj~jh9{HmbB{4CZHGACkN{4eC$&np7$l$=D6~O9 zWHb4v>W$LGWdm|CY;QNG$H>~=`2Bcpqq3{bu{-)$H9lA>!P!{_=~2R>p#NYfKJa+Q zcYa7v@90^hom+x369;1Jmi$LavE=VF1C7!?zin(Xk0&TeOfQstlKSp^^`o$0S_l;y zUU<@5_K|?5cz|1X^B72ga0I+V;iJMvJR~l9|FF0LR6@Q^BQnU|PJB(&KG?Y}{uW&p zO-g!Y9mwj)BL-|s+kgc-GX8w;O&OPi@~CR1s>M!3%FV!H#Jb=t;?uVR=~xBhfz;qjaYeK0 z^2}O$LGO*cH1YWOC$CFbAMR&&Oi>R+c|7;|D94ghbo~MTFv99F*A8~06`IU0sy+iz!V@*%Z3poA_-7~OijErfovW%yKN@L+YNKDYfd{IhM`DH*lL6` z*WA{#L<1Ur6vl>Kijr~eouEH5yyH-4c-3J$YUR?!bvdKLCN*s)RUCPwNXHhBU+57h zy!KZ>XxA`GjICF+x9WJiQ`x+t;n3r&{NX1}>NgX-w}8Onq+Utfz3kt_#D4&Q>FpFDTwJ8*lI(MXG>G7%T>|jZ zS?XxfGSDF+gW(6k`Ic?0QDQhOeMgW$5;vLBbmPGLM{fl4^-ulAzlV!>pmkTCo5keS zD5Tjm=t;mJeqz-Qm-bz(uxLs^8o(h)xZwSLSV|+3Z?TlUVxn zj6$=)Eqyhc)ATBX#9;b{$-Dz$isxC}`7GdSMY=J4bE_BIG|9y4Osl3Fg${&AB#{_} z;@z~P=uew?YQex)LpdcroXfRD`%C zD%h(w9d+4yi>s5}?r5k>jy$sKWPOJQ5gRe7(V~d6XX{P+<#wb;Ezn#*P9|}&zqa#* zUXg))8qxI2s-d>VJtE)|KupUK?>jO~?>#bWKcLq|{IMbF@Unw#1d2%{OvcePtBdlg z5}5rGm0S?BjTIycNoAzL)X&ToPafT4%HEula_KM0XPGEnFUjC#L(5>z_3k&tZrbMZ z=JG1zUS98@$J(Qp5OFk)w#kbQi{G6*{X1?H?Hh;pe|4UNwdE*gIIxIz(fcvf4$lSA z*)OrBMlLgSPMHTb2MbsJjx$nZiJR1oW&Cc$tPFleq$30^zRVJTO=7aH=9|dm%j`>J1M=Fh*{F&c~@fR;giw%G1dJLe^Aor?=uqr z#(dw|kVN%&WARv*meuNtME89;%$3dV^NyrG2mDzIBYY;=S44uI`=kF%`MsLrY`NJ; zZpHjQTy($#VAi}90-h;dn?oVC9(RZC`e@P|;|`P<3LpLIceL&zhR75rrQLlbX+6UD z1S|4=_-@wyd+XaVzLV5GJ(zQVYz!Mv(!N%3@N@;6Gh-#fFtlCxVU>5&!Q9KQY`bYy z<=ghK+6Dg;3awn4Urfi|RE?4Qk5KZ#(d_+c;fRc#eeS8>1m7P`SL&(oQw zZ!necb!IIu#a>G+WH@JTP)h3lqm#`Q0hwv)j)Tx_@~WglB@2F+yESz@G}-}r>dTUL zZVVO{C_JT!D; z^Ut;T4avuOAtBFT>aTjs<^vf@H)Iv(M=vf>&FWqb;@l(c>m;djyJ6}Q|1N&(2sfbJ zpPP_>O!CwyD^p%dIfg2w#NjsoOWE>;cSOa*mP%W)f8LXo;M;<*lta_90wwdi)a%3b zq)jT6jGBI#^`z5X{!Z!Dq9>)Xty}*2>w84110b}jps@CFHC2G_|r`FIlY zqDtCO%{As{q`=vW1`_?Of4^uT2AiFe%4Q4&1^I==wS-E1eo<9%V_j8~f=q+gA|cwT zO6!CibE-;byJs1dHjs=4j9cDcFgJMi)mq3&7w+bIi0H0os)7V!2GZ|k4#bmReQr;+`jnOIoS0&2}VNSF>%rVl4k*} zBp{Q<+ zc>g*c4b-#K8-4TAc>aa-cisNcoNVn;)n1>U*FvI{7)G8>o5W}MyeLo+Z*un#v(52% zO)go*(r-5AB%UVS82>FPWpC#o3dt50=ZevJCyjPky;HpA6?fNkXZ_w0c{1?5txNnW z{Q6vLz)kKP#~M1|Vp>wGM}!k1?gSzF9oBL(@5i`IMpclwsfs6l+mBIfW7jiOzTS5A z{044g?MJ7ussC&gGIjfX0r?}7LcYq&)@*qjQ*gZx@4cS}m65=|PRKue;rPZstnHj% zFhM{+l#tkdqDf$AJH*qGBVT&qE_3`^zBQI)Z+!9N1D%ORa5(%*jlMyCzO$kIB1DFh=G)K(4x z-OC>4@4hN7#6qx1%tStN9^^3pZl*qA`D1md(VjZ2QR>0D=0u5!lco*LZpGrm%%4>$ zFnzJX$I+B8Vn(Z(l`oiNKY9WzGYo8`IZ&nW$w+O$ojWdw?>P|p*pEiIZ{R#`(Z6sl zKYGEuM@J2qeI}yIR5HiKZ|kjVL|fO%XdhGr$Kcf=AH$>HNwnA%d@`F-xV^t2oiw~B z0k!3mpv(oo8{`AobdzikX5Lm98`wAgT=_{JP0&g)J!s$D_oG+r_yOGHa(3{SBoei6 z#I`ska>VC4s0lTMnTBqMkZ(=Usl3NOX7{-4b;bPFTEn(;Mt06sPJ1fhyF@O;K|+7* zDc41D?&mYvuaLJ^!FMtR{y4lO0W$gNq`St$ucv>p`=wDY~cCefW z#t-%48xZ02z*{A6QX}9)3C-iXERf(^+JIDMgf=9>qDLRcd2+NAk&!<4Fi|NFX2Hf{ zUcmDBQdD|ZjXVdl;^S?PvD>d(CF0*1-i(!;ve45O(ta`-$+8k;FY1V|sLD%u;@M?V z@=bj08gcs4@a;M5gH7M(mC=IoX6ZudYuTIg9`%s$i(lltjm0C&pt}6vgWxTL(-GTa z&Jj^G0@L`JdRAb~_T;{}F4U3!K{)fQ5TA>n?z*St7kU7SA*v)bE9-@^a9_Y6fdWA4 z=UpwT$i1?bR5H=BN#%U4p20q?-n_avebvc{^s?|rPgAYBpX1aw=Gqlv$9LofNfVK! zel~7}T|e7;AH6qr`R0q%dfZ$_30>Y&P7XVmkh8S0zS;PLYOVc73k&53lb2M_fAuF( z7;!E<7c-JFuzNW!87|!U?EX~gfKN6nBiXZ#z!z-5QH=E5_zRy=Q@p%OA|;ra{i-eZ zPZ&O-?tDw%_-Ek-Wwua0@lI+%E5HOx1@oNBY>ua4(@ockdA}a}JXsG?r=Pj9@y`G0 z7*7~^63>=tqH9aEntHOWisI;~*DFkK%x*)Itd*zU)HJPAZiNlq=A?eB5=E5bwani- zgT$--2_JHa=6)x7}1=a_Ae73ytK#{8=~g;A@MrGwJs8S#IZF$Up`GizOtfiu?spjzNj_Zdm!RG z6#cb%m<*GbqQ=ERHuT=g)t6_vq|*<0&@etBjbLFJy-i>}2A{LyYF#KBO$ZRe57hj! zPa)%+Z~C108|7ckT1ux9ar3_BaxBFe$URY zKdb1!(_D7Z!ieacE zgJpbg{Q`h!B?F9p8BpjSFYi6?Th-XQCA^;+#9RByGQ-ELi0&Pl&wpyWCofieSAe4B zJ8K}b%@s^q+P<6l^|BpYJ+s3HQz~dd)q9zrN~jxz4Mvtt~MA1S`Yb2m@M*LZ|)2uB$8j zAP)myFqGKNQpM?6zXfBeObt>Q5LgX_^RajmkWK0F2-DKYz5183eRJQaE-tMf-THx1 zF%IOWt*m=|&3HR^=E`7a&&zs>E46>ZBA0laAh2gaZIJ(4FU#*7}9cS@=f% z{h8Jd3{t^mFy*3}Oj^>kYL%oDo`S|tWXPqHJR7*r93#gB>!u_FtmK!L*PQ!9>k+=k zs7sxXcN_8w=SIE0?#pt_E&qHOEBY={`6lv;-e_>;s%Xx<5z21kiO1a!lNokTVKnQ zd7E4xTIJ3<`FZlsx9EP+r6og`*a(P&hq6@CX`|OJ5nnHzkSja^Fm+I%#*&wf;u|9! zz#Ya(3LA_~LMykhJLb|CJ_}OnEdP2Zx3VH|=;TjChEWbgeSs2CW?J1@UCLFosaE}@ zI=P$oc>RiYJHs_LHr|K>#frV%W?P&NY2(uLQNdUYr2mlNiJpe+Nr$e@z0tuChFRU8 za-DlTg-H3?M^iQ*&y|i`;cD}slslGWZSf*%rEks?`|KTWJ;bSD_%M;xyXvRNj6ix4 zK`fC(Caq(Fu=7Yvo43SliVMiDhF}OpML4T$IVp@89VQmkSxk<`2I%>qA66*s`_rhEFyw;KfdL($~IwxY3OJX{#Cl zhm4AP>w{x!1H(ySygkh?vzzlI*;EvhtnFpY1GO|d`PVsd0?%HxTiaC554VW=NEu|9 zJmyWD__FcFGdCukMla$~=n-q}a=xilupMHixs$z=v?!P6WUQ4x>>5`EPs3BrOo3oF zyRupeK9WDh5&F~EddN%P6T>Gr?SbyXLNT*G*T_$oDX71Y0M)*>d-BvuHCeX5hmBK_ zH0O;x?Au7TNsTN7*PfZPEW}b?vrQ!bN(9jaPVx8ubqo;yVT1(fMoylNSMGQ_ zz+IiJ4bIrZ)!OB6ujMjY$E}K(eYF zVT|b0&N`AK90qm~Y~KAGCE4Co0;PE&RAT+`Pz|xIqDNX%Tcw5ZQrr9ucG)4YK;9797BWY62=rjB2%v zL$z!p6Wn(`3F$CMOo%J#>S^kOho70Dzula_-<*Gtae5f0CCIoX3^N~Qb`)j>3;(-) z3tBlkZD*>(AwV9NWZFAK0VhkrTgd`qTzDlBV0&s3IAt;?BDqkl*xtF?DXYn`qRDNj zPH3nOdUgruT$0n>0C`TC#s5#UH%_zr-P1lq|l+R=q#`{)R=FdG=_Rdv722gOCn(E@|~^}}LALZ@A2T+O%I&{R1`$9kOYY0xW@HdpK3`} z7kuNai6A}&jY8o6L=@;$xNV{w8S`0?gr|ECB1*uh_^0FcxyR14PyC~e9kA)p^MGwa zOjuX^mcE|8p}(8)W51>5Ftd5TmARmmxj2i9;r|V+e@6}g1`X~kCR40qMftOXx+yC1B9XTrA++YJEN6DM}ACc23 z%BBEDQ=O3J=RZ2$ng9*zt90?74gi48M5y{%9??My&!8n{(8Bt9xBlmd0jV=c%_$^k z*i-;u1^_P5$vC=b??id`TSgS3>)fRIl4SWWVYm`Hai}CUr*EPh->sHp$sXwERWv`7 zqDE*O&-HjXb$79;+WQ+6VA>-AbN~P=+AsPN<~^!5kf%5*N|}?=FUg00G^vIVPJ@Xf zc#7$5-eng~stpvSz|^C2is)^ks=!46Irur3Kc2`0k!1t`Ybcru5tf1;MXV>H2Swkr zp;3}0*}9{W6zsS`QL>y+Is~3gcNEdbh8vc9pB*|b#}5GTP6+ss=SSKq0d#!8swel@ zBcwVbk2-_W7^B@BgXUZ+as(-%qo+T_pg*IhzjQ%UzlleaK~wXKo<4(;K9l}bnx=lE z+ZfVrK~MkH1^t;OyQK@khG~8);+n?b=`2X~n@bC_m~}Ht|C^O2;~A@K`g2VZI==ck z`gX>8`o{it#z*>wvq9=0RabL?NngK7f8nc}ep=8QUwtz}yM-ft;|sxuw0EvYXs6Ayyt=xgZugYhR<%R$+G!KH zUyK+kuGnrXYio1gY4aLxa$_qj-|i3?>aH2A+uLco+Th2bqwn`B#q6CSsE3J37i80aL^4}nY_-LVe*;2Go z&KxPz0tC2Tyjp+uBYKo0B4rXyo{!f?x#XwJqFri>r>#H0i!Pv?gi|I>oXZH)Cb8#j z=)^XPY)927@eQX0kkv+B5sf?wU&N@65;hnHfm}E#r&?A-ud7zp2(rQ#T~J4fHZfw{ zMQ7Q-6-D$IH3WfC*G-s^$wh#JtOibnpUHTio&vJU2u((zs#25D!`Y8cS%t=<)DTU{ zC=GB|C{%42+Qe0KHXH3K0qzQ9m5g!~CYWF}8vW=@&YkV5s?os3xrzV^=fT6&QMHX1 zT--(1Sx`<@r^3s6FJR(9;kqso#k0<*1dQ9Q*-Rf))$BAn4kXyPJ)g<^Ywus0TRRIA zX05AEg$vZCCWFG)7foU%QzorJR>|mCa0SM-wK&ZgBxIsv8rK(nTqO>tO)5`isDpP1 zpM=)024L2~5(BbWO1r$%6mlB2a*^m!H77dnVMzf>`C&=EGH(re1VVpUj)JFgR1$&c zot32E!Cz1p5biZ_K_Eaagu%MwENsa%qk17!)W(#6A{fO4IGA_HnDMaCaaa+f4IL*Q z2KoihXam|7=0hVdz-%)r$B)2iqXZCPbSO0*JXq;cv4QoR>v)P08@QoAdBhTG4HXTC z`|61aoX2UP_{tuF7OnCFp@8olHgT?Mn3tuf3Y!&E=K-N$U-dHGL=XUW!42)6kDIvvV7Y;(hRl=VRgcZR=0aev&|27qeK~4XPq|y@74quE5)CxT$%pt)W-GiB0c@j=|5`r|5We)(+J~I z1w!th9U%LHiX8Y&&T61?1Hp1m=u}5K8nDpoNe6dK#*Pa|Y!=}__v9;}B>8zjlpqiw ze87lKF+pYcpwR+6__Wj1F>Qhp26>b7;Ahd!pcE+ze8cpqsChY61b)^eMi>k^6nJVK zD-n(cFX^4Pt`serM1%1Ov#A6F$ixNQx{ENPan?Gv5wt&;A!e;(BxX&{0jutw09Lie zD?GKRzI$Tz%-0-Xu`PdQ?b8PXH0X=GQ?zg>qCixgVuS++y5Y|pF7e-UbW$6CpalYI z;E3{10e1#Q96eadrGT9O%%#wSGS14o6!a+~LDQTP z&Y*fWqU1O=*V)A!f7YJXf*?eRPqQ%BCU@Z=rz`SJH?g*3KMKG?0l;hCc?U7u5AV&! zrK#f*z3Hs4oJU7Xs?^%4GWWt}Qbh5Lx@ecpZ0lH^J2^He(Vof_0~CK!$fS2=qyI4Y zXbGnPMCdrgAId@)Vf~;W90>x*tLYpUH6ZLCXI}Yw2v?Bc}L8xXp1X)xkkcs zMn3H*DE>UEkerSGJSoeX{2`w{DW8hrlu3L8gRq6XEN!T7?|#-+U(?aj)BAj&t-ZZ> z5NNYo{>kr=3D8(l{$UmA`2O|^58&9z4&1gk-G7%Iy2UcV9+iY8Ukae|q`*31l2kz} z$v$hTuD0mDB&Z^N+08u+ z+t+OmGdd)asdRzi>vugB?Rx*pYp0QI`H4)@5|NvRYSXj4@|k+kBgl6!hs+qr>W0-F zPh8WO*@;?yb!XfEx|$npn7vcVE5^4L`~qP+Z|1)U2t98;xA6B4v%)GGtc=RoX3L6vC#l3|2ky)(P z1G9mygHJisUmQKZ?ullWtQcWGjFNu1T~(&Le~wdWZs^T((m|_=J>Ydj(PsKhTJ}@} z5$Hzf?cir+RHhJE-?cq86}eSWVo%$YiJv3uibVx4cJ~fryOz0fFEih=NQ^5sy4|4> z`Uux^w=X_kNz;Z+-fKxUP4YmvKBs;iX-wZ`z{qqls*vdM($zqEZpzBa^#)7&KK!FA zN?J5rnB>IDlDF&4x#H(JGjA2%?9^>(2Rixk476~B*Z}9y8?B#j6DO(HXRU7sOK@2U zgqhR7E-9KV%+A81diy(Nz?U7RO_T6JIE52g=XA5rc_G@7gtFPMuZf-FFpo$IIBO0J z6YM9+8@YBhpH>Gx2^bo!#g$4oz;eDlG>9wrDp*sxQVIy%=4k7QxDkEVB|icZ*;V z5K5M|J!w^$NC`^2b;)PCz+E&Ex9sRe3i@3C(u2R47(>1>7q5Av})qAqC3H)_<)Ae7d}Y|2D36V%k!l zrVq<*>_{HE&QjOwwGc@D#5!8=(PrcZKlHVAPkfB<{(*_#)?Zt$U$rBF$dku>j|UA> zd;?ZK_$#&NdMNNks=H?X(BQ92R-h_vnEohzlOoYilerl|pq}X16Tn*1b&}jre1EQ` zVBi_wMGdRRTQk+MleuocBx7k#z#>oz0xKV`wk|Z-a#1>Q?Sx9hk z+n*++Z!f8N0Ze3V&3xK62P|FRtm;4IM6RtWWlp`hwoKt6D~j1@7|B{NFxA!Dq3IZa zUfbSyb1+%uX|QSe(l$p%LE}Vui3)I(h&?~o*BLw zw-Wr)J0LVo&#SqJEacEbNxX3$oi$Mlb9R$AyiUPtkU#0cq5?^yXO`D+yDBZg%=Gu1?pFUF&Q!#nAqB(xR(7G=^j8m2IM#j+xFQs&uKl z$!yZQX756MwajI+ulpKWKl*OO2~SRFoK+Tv4Bf>k15=;lcER)jL}zQUW4QtBUdBF+ zfvg*oEr$yZN5NS(&KC@|T@HTsG5||mDr_=`QzXj$hFh-4!B{=*mCVeL*}S?vC-Cra zM*zV3q9xEoWICe2e9!}t@$7wdlUPIHK&T2MCi928?VT*%fkAcYq76~nC|Rp5y#UvN z0G_M7hvVL#pj{z02vUiVXF8jsWH&>a!sJQS?mJ6qhNQ*A3~ujL@@mXzQgyo3UAar& ztVa5NEu)|7n_Ag#^*IVt)Az1Giu*;tQPZdSX-VUoogmhc%jYb7VC2Tc;op*~ExGZpC3G^z-rS0BJrZk2nf$UQWwyFb8^pR1GDqaS#!)|JLaOY ztr_xLX|xHm1%LSKnhaT{hHwSsIE_NScoOvRT(MR&l^W-TN3;g2Y|%DrF8Y91hQ)vY zv^Zfpv2nfr_NS7il9%6#v`#LR$-N!5v-!v&9Hsk{=inys5$ef4U`ZsU=o(r{=&r&P znwyv}DQ)ElL0V&Hy#SR~KT9uSIPjVRzw9?#E&9G(4}5y$(-kj&oT}h7hUC?N$J(eiCf4xBJ0p(M-Hx zF`??q=W@ILshr9D-3F=$=PzSWemW-%ofbJxhgnh`gb70+YK#C^U$8-V#Y4*RYetf*M!c-H; zmQIq^%gD9y`MF%YkniAt%fIu+NCduDTCZ*uaW`953#?Cr06 za9Q8-G8+G_YU2M*?$%Ks(o#Ihfgz-<^%Yu}_@R|am zi~+ugeNCO@bER1bi^Ar(caq4KU9QZKG*9_@{^Q!^1y?Nw!<{5dtNk)7lO^=rlGCrL zR6H|qn`LHS@E4W*S0#HVEtzzgnP}iEB~WugR$9%TR~FH8q)Ns8wfq?89t?B2Kk;p~ zFOp4jGG#o)Zj_e9|t;%5*%Q$l2sGVj% zOB>y>mqWxEKm=I2VSSVBM>xef=q1#;ia#y7m-gsn#7_{bV+KWh7_ZRb zp(_4ajX8E3zk9MraV-n*vDtmasw`5eYueRZhqv4vRKOJ9FHloQb@MI~=#bzdjhCe9 z+GON>!fe6xt#*olP9kDQbf`9tBqfa(zO5N@W(CY8l?J7KdKmHbB4gkk0s>nS-5TP= z<5ZC$LnJm3x;-; zvjXJez60ej_nfP7!EV2D5U6|%&tDip52Ip z#f~Xb4FNB7fS@p!Z{uGgoG)KR@=$ZDwfUpp(JS8GHX9xJnAHg@5wQ817w6w87IUS} zW$@?L-iy%hW#gT0*=7UX#XEf-%;R$qz>>={RI{5*mBz2T2g%zV#x5)qLmgT`UNW=8 zP$D2KloFBo%%q6F(1aWa{>Gi6zJm#6;Y$oVo|XYRZ$Pm7Ml-fa2#(@3gk`p11<@C$ z>4!I}7cy*LIY<~t8P{nLZM@@kKgi1%WM@D65JsRoN`eHz7;h-fTTQ}uFuS$ds^u1~vO z=&L=;n`TLkdJleWJxI8Rvj~Frjy!GZZWCxQbG?jzP?(~l?~~AP5F)l-VAA6}(%KZj zCGl=3WYNQOWbz6;uz;wQx}K)M2F zZx2W;l1||V0H<#ch{11;l#B0ZrpLyHM+XQ4LoYgNqaY`xxb;iQ;hzBUALrYDAJ|f= zb~YH6JzjIFw{+uFt-j|oGZI$Y7JK@~pJ35jCA4JqnKzgOQ; z&69Iim!ozP_x%JHF73W`Q05uq0{$dVY zqKNyIwITdd=+)vU^C;2XXZ%0DGm;M3#_IJLqklzDK-=ag<-*W_xhnVkc}WW05mr}+ z-JXwkl8C99FA>T=8H+|V)B+W=S|ky|!n?09D=5qF+9$2ItG%CGj2SEHzd!D>`aa_l zk%BhQo#JN#TT`2E*ZG2#aE^F+o%|!Q`AO%EDCyQ^!H`$I^jxETUHEqNxo6QB9Ue#2 zA-RXZk@shsLg}xcCxdxjI^Cc3ZhR=<%61c1L4vJ9-;@?z$)1tW{OSIpPV9XOi6_b0 za16`&W%SbQ5%LwJ=edbkQX6wrt%+(kinqqm2gZO5;MtuR?)TRRPE_;`Brt*``&*TzZvjEVKBmP63jJZ|tP)RCFjtB9bEOIY7+KiR3dx#S-;mMXpUScxF9 zfEF{m_Mus;40=4o&2${xL}e^Z#e?bC)p%k)MDxCPXADX=dUbb;w*v-iz7NchsyC9J z@Z5Z(|2)BryGNKuZiCVK$43=yL33-_H^B};9rR3jEo4tg%`EJbOB)oOWF-8%@fYth zVIplv?W;B439jh5VQ(cxFg{n2ZhqMMLE9+g17f=-*^cc66_zqrrQxN2ak$eUMEvL_ zEyuhN6UChhYKdXRiuAY3%hi~=i%%nt1=VBk$Z)$|o^L&#%G@ejA@Jjih)e^x{; z`CArUaY;HTv?qK_t9{@ph}!g__m_$s7jlO;JUD!2-DZw!#oRaMZb-YrF6SGuUH|sd zkV@#Iu#RYU%HsJICXn?#)m0l`VbJ_Nj$l8@5O z;s<2UbTU>T-_`V6zS5I<)HLZ75B_-lgq2Mdqu{eG^TI?srviAb!u_6E3|~6!b#3QS z;AWzTLDm|29Xqa38#rq{sGy>y5_<33*6#CzF=vnOHkr^_Ru#jAp?8Hlj!OZ%r33PA zZ>MLph4^Fi4fw=c%H|cJF+*;@i}*rcADAGA>W}%!rppw?4~PupI{J&Jq~p7iKJj%=QuUnN-_8SYE)Ir^ zcYnPi)YQBVG5wS)-l#2Vr^1Z z70YKim#@|gc@yczj}edKg+-5B<}P;=pD61s@Nfo{t|i8gq4nBj;Mu(Id4}VsHEK=! zpJfMs*$jX6%H4s zy`_JpxOzqrW`~S(eYt=cdxW?ybNleQI}o(@Vt9yJp{yKIdn8vtKXb`t=Ywvb5Sno{!g?Vc3s>6-Ra<562)ki4NCw5^H&+C&E zQ^>EUk;R#4uPsdEr(4<(y_SIXGP}x>n%L||F49R$B^Il__wG(EvVkA`IR5&9{1fY* zg$15{d9G=WHbO39l6Fw7K-2E^h3+ngpu2NkW8KW=dOV~2mmP=wOxmbhKXr5%S{$#! z)uXzA`=7OvlkE56L>8BTBd5AouyvmGB33yTp}IINSYxMWhJVX3mtT(C%TN{}BH$*e z-E4RwhsP6>eeu6sIZgtbQgR+I8Rpp}^?gdmeGD-6a;7TLZ<%i*o4ft%{0Y@^P9tp% zB-c*wt?)b<$8W5ETbSCX8ilWG4FhHTM!K@Ue;)lFStq~zL1>-l@bY)7&wI=7Q(pzP z9M~0K*1EMM_EELs!99cG&M#g+II2XoB(~xOAJ-2F+az4LXh(35YG9gmb1MIoRH9u+ zQl@_a%2iIpGq3yWDa+CIMln$q<2jQ|HremzGy&DELpvP!lSBJ({_Z|Yx25oPF_OP5 z6`y^mH0?U1FuPm*L5jbHoaa%RvpZ_17G0QPd^CBO_G;E0{Hs@oovHhVv>34!w5Nqe ziTvHB;ajJwbfOz$#;-@K_Y!Y7TX%?ws;RN;-F(`8*C<)(*@yYJhR`SQ`vxuth1zM- z>FZ0A4+RvBk4{Zd^d!M zunvXH{9Pvt{QS4uB~G-?GdkQe{BCG6mIuJEmJL}LJQ-U21qE`=Ayh@ZS3=$vm2#J8 x!AjLHdPA3;X9$eRh9Ak1H{TVPNuIN~dL