<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/75811>75811</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
【MLIR】`mlir-opt --convert-parallel-loops-to-gpu` crashes with nested `scf.parallel` and `arith.constant`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
mlir
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
lemolatoon
</td>
</tr>
</table>
<pre>
## environment
```
$ uname -a
Linux DESKTOP-U0MPLSL 5.15.123.1-microsoft-standard-WSL2 #1 SMP Mon Aug 7 19:01:48 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
$ mlir-opt --version
LLVM (http://llvm.org/):
LLVM version 16.0.6
Optimized build with assertions.
```
## How to reproduce crash
### tmp3.mlir
```
module {
func.func @main() {
%alloc = memref.alloc() : memref<1x1xf64>
%alloc_1 = memref.alloc() : memref<1x1xf64>
%alloc_2 = memref.alloc() : memref<1x1xf64>
%c0_6 = arith.constant 0 : index
%c1 = arith.constant 1 : index
%c1_7 = arith.constant 1 : index
scf.parallel (%arg0) = (%c0_6) to (%c1) step (%c1_7) {
%c0_8 = arith.constant 0 : index
%c1_9 = arith.constant 1 : index
%c1_10 = arith.constant 1 : index
scf.parallel (%arg1) = (%c0_8) to (%c1_9) step (%c1_10) {
%0 = memref.load %alloc_2[%arg0, %arg1] : memref<1x1xf64>
%1 = memref.load %alloc_1[%arg0, %arg1] : memref<1x1xf64>
%2 = arith.addf %0, %1 : f64
memref.store %2, %alloc[%arg0, %arg1] : memref<1x1xf64>
scf.yield
} {mapping = [#gpu.loop_dim_map<processor = thread_x, map = (d0) -> (d0), bound = (d0) -> (d0)>]}
scf.yield
} {mapping = [#gpu.loop_dim_map<processor = block_x, map = (d0) -> (d0), bound = (d0) -> (d0)>]}
memref.dealloc %alloc_2 : memref<1x1xf64>
memref.dealloc %alloc_1 : memref<1x1xf64>
memref.dealloc %alloc : memref<1x1xf64>
return
}
}
```
### reproduce command
```
$ mlir-opt -convert-parallel-loops-to-gpu tmp3.mlir
```
### output
```
tmp3.mlir:12:16: error: 'arith.constant' op operation destroyed but still has uses
%c1_10 = arith.constant 1 : index
^
tmp3.mlir:12:16: note: see current operation: %0 = "arith.constant"() {value = 1 : index} : () -> index
tmp3.mlir:13:7: note: - use: %16 = "affine.apply"(%arg3, <<UNKNOWN SSA VALUE>>, <<UNKNOWN SSA VALUE>>) {map = affine_map<(d0)[s0, s1] -> (d0 * s0 + s1)>} : (index, index, index) -> index
scf.parallel (%arg1) = (%c0_8) to (%c1_9) step (%c1_10) {
^
LLVM ERROR: operation destroyed but still has uses
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: ../llvm-project/build/bin/mlir-opt -convert-parallel-loops-to-gpu tmp3.mlir
#0 0x0000563a466ed417 backtrace (../llvm-project/build/bin/mlir-opt+0x7f85417)
#1 0x0000563a46931945 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/lemolatoon/workspace/compiler/llvm-project/llvm/lib/Support/Unix/Signals.inc:567:13
#2 0x0000563a4692b421 llvm::sys::RunSignalHandlers() /home/lemolatoon/workspace/compiler/llvm-project/llvm/lib/Support/Signals.cpp:0:5
#3 0x0000563a46933d6d SignalHandler(int) /home/lemolatoon/workspace/compiler/llvm-project/llvm/lib/Support/Unix/Signals.inc:0:3
#4 0x00007f4e0c9cb420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
#5 0x00007f4e0c3ac00b raise /build/glibc-BHL3KM/glibc-2.31/signal/../sysdeps/unix/sysv/linux/raise.c:51:1
#6 0x00007f4e0c38b859 abort /build/glibc-BHL3KM/glibc-2.31/stdlib/abort.c:81:7
#7 0x0000563a467a16cf llvm::report_fatal_error(llvm::Twine const&, bool) /home/lemolatoon/workspace/compiler/llvm-project/llvm/lib/Support/ErrorHandling.cpp:123:5
#8 0x0000563a467a10ab (../llvm-project/build/bin/mlir-opt+0x80390ab)
#9 0x0000563a4bc88bbf mlir::Operation::~Operation() /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/IR/Operation.cpp:147:5
#10 0x0000563a4bc8b25a destroy /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/IR/Operation.cpp:170:3
#11 0x0000563a4bc8b25a llvm::ilist_traits<mlir::Operation>::deleteNode(mlir::Operation*) /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/IR/Operation.cpp:370:7
#12 0x0000563a4bab7ddc erase /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/ilist.h:270:5
#13 0x0000563a4bab7ddc pop_back /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/ilist.h:321:25
#14 0x0000563a4bab7ddc clear /home/lemolatoon/workspace/compiler/llvm-project/mlir/include/mlir/IR/Block.h:42:18
#15 0x0000563a4bab7ddc mlir::Block::~Block() /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/IR/Block.cpp:21:3
#16 0x0000563a4bcc3a71 deleteNode /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/ilist.h:42:39
#17 0x0000563a4bcc3a71 erase /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/ilist.h:269:5
#18 0x0000563a4bcc3a71 erase /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/ilist.h:306:15
#19 0x0000563a4bcc3a71 clear /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/ilist.h:310:18
#20 0x0000563a4bcc3a71 ~iplist_impl /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/ilist.h:211:20
#21 0x0000563a4bcc3a71 mlir::Region::~Region() /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/IR/Region.cpp:20:1
#22 0x0000563a4bc888ed mlir::Operation::~Operation() /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/IR/Operation.cpp:159:21
#23 0x0000563a4bca0043 destroy /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/IR/Operation.cpp:170:3
#24 0x0000563a4bca0043 deleteNode /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/IR/Operation.cpp:370:7
#25 0x0000563a4bca0043 llvm::iplist_impl<llvm::simple_ilist<mlir::Operation>, llvm::ilist_traits<mlir::Operation>>::erase(llvm::ilist_iterator<llvm::ilist_detail::node_options<mlir::Operation, true, false, void>, false, false>) /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/ilist.h:269:5
#26 0x0000563a4b931a0c mlir::detail::ConversionPatternRewriterImpl::applyRewrites() /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:1110:19
#27 0x0000563a4b951461 (anonymous namespace)::OperationConverter::convertOperations(llvm::ArrayRef<mlir::Operation*>, llvm::function_ref<void (mlir::Diagnostic&)>) /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:2474:9
#28 0x0000563a4b951be5 applyPartialConversion /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:3360:22
#29 0x0000563a4b951be5 mlir::applyPartialConversion(mlir::Operation*, mlir::ConversionTarget&, mlir::FrozenRewritePatternSet const&, llvm::DenseSet<mlir::Operation*, llvm::DenseMapInfo<mlir::Operation*, void>>*) /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Transforms/Utils/DialectConversion.cpp:3366:10
#30 0x0000563a4aad2891 (anonymous namespace)::ParallelLoopToGpuPass::runOnOperation() /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Conversion/SCFToGPU/SCFToGPUPass.cpp:62:16
#31 0x0000563a4b85b5ed getInt /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/PointerIntPair.h:62:57
#32 0x0000563a4b85b5ed mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Pass/Pass.cpp:471:54
#33 0x0000563a4b85ce54 failed /home/lemolatoon/workspace/compiler/llvm-project/mlir/include/mlir/Support/LogicalResult.h:44:33
#34 0x0000563a4b85ce54 failed /home/lemolatoon/workspace/compiler/llvm-project/mlir/include/mlir/Support/LogicalResult.h:72:58
#35 0x0000563a4b85ce54 mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Pass/Pass.cpp:534:9
#36 0x0000563a4b864298 runPasses /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Pass/Pass.cpp:839:10
#37 0x0000563a4b864298 mlir::PassManager::run(mlir::Operation*) /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Pass/Pass.cpp:819:60
#38 0x0000563a4b84f822 failed /home/lemolatoon/workspace/compiler/llvm-project/mlir/include/mlir/Support/LogicalResult.h:44:33
#39 0x0000563a4b84f822 failed /home/lemolatoon/workspace/compiler/llvm-project/mlir/include/mlir/Support/LogicalResult.h:72:58
#40 0x0000563a4b84f822 performActions(llvm::raw_ostream&, bool, bool, std::shared_ptr<llvm::SourceMgr> const&, mlir::MLIRContext*, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, bool, bool) /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:91:7
#41 0x0000563a4b84ed06 processBuffer /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:139:12
#42 0x0000563a4b84ed06 operator() /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:181:12
#43 0x0000563a4b84ed06 mlir::LogicalResult llvm::function_ref<mlir::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>::callback_fn<mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, mlir::DialectRegistry&, bool, bool, bool, bool, bool, bool, bool)::$_0>(long, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:45:12
#44 0x0000563a4ba180a6 ~unique_ptr /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/unique_ptr.h:360:6
#45 0x0000563a4ba180a6 operator() /home/lemolatoon/workspace/compiler/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:68:5
#46 0x0000563a4ba180a6 mlir::splitAndProcessBuffer(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<mlir::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>, llvm::raw_ostream&, bool, bool) /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Support/ToolUtilities.cpp:28:12
#47 0x0000563a4b84985d mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<mlir::LogicalResult (mlir::PassManager&)>, mlir::DialectRegistry&, bool, bool, bool, bool, bool, bool, bool) /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:0:10
#48 0x0000563a4b84a661 MlirOptMain /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:209:10
#49 0x0000563a4b84a661 mlir::MlirOptMain(int, char**, llvm::StringRef, mlir::DialectRegistry&, bool) /home/lemolatoon/workspace/compiler/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:306:14
#50 0x0000563a467741a6 succeeded /home/lemolatoon/workspace/compiler/llvm-project/mlir/include/mlir/Support/LogicalResult.h:41:35
#51 0x0000563a467741a6 asMainReturnCode /home/lemolatoon/workspace/compiler/llvm-project/mlir/include/mlir/Tools/mlir-opt/MlirOptMain.h:97:12
#52 0x0000563a467741a6 main /home/lemolatoon/workspace/compiler/llvm-project/mlir/tools/mlir-opt/mlir-opt.cpp:249:10
#53 0x00007f4e0c38d083 __libc_start_main /build/glibc-BHL3KM/glibc-2.31/csu/../csu/libc-start.c:342:3
#54 0x0000563a466aa06e _start (../llvm-project/build/bin/mlir-opt+0x7f4206e)
fish: Job 1, 'LLVM_SYMBOLIZER_PATH=$(which ll…' terminated by signal SIGABRT (Abort)
```
# expected behavior
Successfully finish running `mlir-opt` and the mlir source will be converted.
I would like to know how to avoid this crash.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsW0lv47iX_zTMhbAhkVoPOTiO3Z3ppGPESf8xczEoibY5JZMakqok_0N_9gEpyVqsVKWqsvQAUyhEEs3l9_b3KIooxXac0nPgXwD_8oyUei_keU4PIidaCH6WiOz5HCAMEIaUf2VS8APlGjiXwJmBwKn_V4_IgyUnBwonpGq5Zrx8gpeL9R_3t6vJg3Ozul5fQ3_q-lMX4ak7ObBUCiW2eqI04RmR2eRf62sEAcIuXN-s4I3gcFbuYAjdGOCZ4wI88yL4cD-HyEEYPkXBJvAGl9_-fABoaRdvkR1yJiei0HAy-UqlYoLXGK__uoEARXutC4BnAC0BWub518NUyJ19MgtXfSG0vevx0A2mzjRofrotNDuwf9MMJiXLM_jI9B4SpajUTHA1HedZjc8y-HfxCLWAkhZSZGVKYSqJ2ne7mF76UOCpoWZ0woPIypxCEF40uLYlT6fmDwSecyCMAxQBFHe7QAiQT_JcpBDgS3igB0m3U9vQdMazuhngufvkPm0DD-DF6QQb99enQL8yRepsAjueSKb301Rwo1oaOnY04xl96vd3x3q7L_behK_ur9LttCCS5DnNoSXBJ3LnVJRc1i0Gr2nRomlwzaPStDg2bMITgTW0Rq-mtcEfvxp_M8J1fmDIONHuCdHRgOhNfEq264zQbVE5XRXJBck62mOcWcPpOWzW9y-_rz715O7Lk7u_PDnq8JJk2dZSU89VsdQM7I2qkSgtJLVTNEtb0_glQEZaz4zmWU_q4aVh-oEUBeO7SmxmFbwrymkuRLHJ2GFzIAXA80KKlColpO2m95KSbPNkoBxI0Ug8s3KcALw4PpkeiSh59q0-eAH8SxBeDvVrgPjn8Sa5SL-8I9xachmtnWvXw31HOi8NdX966PcHSqpLyZvnIyXtzcvBy0SmTuAShwPh2YtpQhuMU8G_UqknjcuYGHmpiRaTXVHC7wS7dmlR6qIcT0vaKfDMReZPYBhBpRSmCQIU9j0bQCEUBRQFlcSEbphRpaV4tpFdQ6VZnsM9UbBUVP2itzz-A_7im3C50NRcFaUwLaWkXLcIKzJqpwgQGtKD2pD_leQltf26iMLKXdTdrFZ3oPYgYYBnYRfRxPChRuAGRwjbLeN0Sooif24AGNeErZfCc4DnD3_-8eftv_6E6_UM_jW7flgYXcSLV3SIa3OvGG1Xqs37aIv-hbIOUVlf2NopBGgGlblcmN8qq23Jr6hGczi8OeXKhwa9o3rYBHRxd3d7ZxD_iI6urhez9QKqMjkwDQlMyp2xWCG1QWTSX3XMf3dM78tkmopDnQzXl0khxX_TVAO0ZEqVVAG0hIRnkPE0LzMK9b7OWmFC0i9akpTWie9ak_QLzMpDcUynnWlF3EqKnSQHSOSuNNWFwQGn09M1bWJtriaJXb7WiQx8iCkuHOg8OY7j-AEmXhDQzHPDFrGRxeuXB-jCeQq3ke-5Jk1rF3F7i8TYjT0fWmbiGcAz9ayqm5VkXFv23JvVAYraTpI8boTSkpIDQEGlj9rqB1ruxYEakMdqDaDlo5BfVGFnWabiULCcylNCGomyBKDluiyMEgC0fODsyTSwHSe5mjKeAjzzg7Ay-yNdqE8XSjzkjtF1V_Jqqt8Jz3IqVeOF3gF6gzktjHo5BncLGA8EgbMggz1o1vI_lq8GY4epXo0x3HrUSeM08ZADNxtJbda3kbpyEPXcVaE7yU2JO9nxsvqhqNKvqRJTx2ql63nI6emk31sGk9RxEigJU0bpjwq-y1mSTi5-v8Z_3Bwf0RS7AC2VpQKgpbUQ9awyWhg3UFZEqmf11aIxxTda2qmnVo9M6e62SII-kiiJ_BiSRFhKX4dEZxU37Ci7SOTa6HRcJOxJPiRukG47qlq5v82WaJJvqoSga3z3j4ybXIYrXRtfIkT-XlqyMOtbfWR8Vyuyi3BflaMhQQ5JfsJdRQ6OHZL0VCPuTp2kUZQkW1hHfYBnt51kA-DZ3-3zG1i1XaZhydUdQMvj9A0nvLDlhHGuzgBugnzSRMF3BxN2rNeAccfAtIrEcqb0RkvCTGybjzJ1UbVkNKea_ikyEwfGOqLZB3AbWwLDlsCez09IEmZZCqkkld_4ZVuo04e2YXZ5b5oN36Z7gGcodPrix2OAClFsTBT_GEwYGW-DOqC8MVBpTol8E4G1iOoGK7sLU8NaQJ4tF6IWjz-Gp1UqO7I25-r-XUy5AlgplmVZx3CCvuGkmIQubG3gYwRp-YbjFlU4huojtT2I-9oefTIg7Jgi1O0giscQvYGqvxqR6_SVHTljiP5mhfW97FDkHyQ713qFdocCuWPAWiu8o7s2qtYP72KH1dyNITptOmZAomH0j2j2D4r-flw5jyPevv9PieN4-LPCP_LGwbyNF_vxaI38MTyddKS1CYDnncrNtNCN1eWX0xQ0__HMpk5urMfqpdjVeKZNZyF7aKqfMqoJy6sWLjK6EYV9nfbCYmgOtSypuW5JruzNV8GyGvixrbqp95I-w6WjfuSLsUucbmzu0j232xuKCb4iWlPJ7-ijNDy7shI0Xew-W938JnV2T-vuJeFqK-TBFHoPmuXmeslITlPdgmusw61ccxtPUT-exr7rBa6pWggX_PkgSgU5OdAaVDyQabWApjVj6r2e48-qp08zKcnznd3gfiF5HmrwtuSp-W1TbYsbZYG91PuSkR0XSrPUFoHxW2jNz3MXeaEH8KzD3GjI3IT60OrDikjNSN7O8VmgMQ6MSiDUoo7HULdMH8f_jZJo3hncDrgnckeb4r3tsJTi37Sxotqm1lT3Sv1WQy4pV3RNX3KJ1eqD7jekuOJb8c0hjV8y-vTGRd2PSsdmd23K0t8fJSRDUfxdg13Vm6_XQhT34reiXBFV7wTKkt_y90sZugqyXM-X9-K31UPn1gCpaQ3qNypHSvvJWeQnPs3gjuorrt8zMKwE48aBc70iTNoIYaH5bRTv77M20MYjxG1xL24LQ-csI4WNpDXfeyZjJTK0lpftaMZJ_qyYuiGc7AyNzQbYHJbcnhzK3mQ7uifMCuOyIzMvNBm177WcwQPOpNT34JawnGbvU2i3u3TXYsdSkt9RVeZ19ehZG2rRef8kdKHVqrZMwv4Yuh_VqhUraM74cI_KdD0qS_DmatYdZJa64kpL-8ZIyJNZ-x06tUuDfUUk5dp46cbvv7ETPtVkH_djN-4ngVHgoTiChr9EKareFUuE44HTD8fA9BnaiGjUu7zfHuUIenscsHMOoL8znkTeNkLon-MT4n8SuqFP8JwxdAWVJoOYpadZ9ulbycZgm6vSWV1T7omk2abQ_eJuLUqZ0pudBHjRS7tadbq5vrqbC67pkz7JsQZJezuoRyw8CX5d5xTXpUAf-ptmYULYxKt99bK8yZm8LfQNYU32Fbu92t0bJCQezZwA1qeWLsrtlr7NXvIPIHQrT9Em7x4aw1idRbCv0D6Bja599dcFicdAvqQpP6NaRx0vOfufkp7o-A09CPlcyaxnExndkjLXm2qH6OUxx-MwL1tefNxbSUmeJyT9stnyHuwOq75jw59Bz1sacq9kN5XOHd0xpeXzCz7qdde6ugHI2zh2oSgXfPdZ_DqR_3sWKev762UtH5IvnrQkqopu_sDUBu-93MghAfy7ZYsBWSp5fBddva22xr1L0_HzDK7bdBz8acGmAF3Y_1XnhOn6IEK9bPWiwG49tBWf54-BfUvn9XNMDaLe_qAXjMFsVVwVOdMznq26keGTnNL_QZf5zR7vmRO0eZkJaw-a5Uwz2qS1KBpY1iAn9-LI7-4B_L9z_0Xn_tFpitOvubxh1UKCwIWdYR-NDzmDqtAbVi4W4UsaWJfp6Z5UBfkgbV9ryfjujm5fL9EPl1D9qrvdbfL7h0XD0HNJAFWZppRmn1Jc2jMUbajw3TGARBmi7uyJ_vlbvYQ8wfkdlhq4cdj3aT4ag3t4K2XXp4ia2-MrlIGO-3hwFjFzIgw3m5wl6UZpIvWmgfeac4mpKptcpbq1P9p57CFFXJ03aZf3-qeRCXECCquFf-oosoecgB7P9m2ZMmKA_yES6FbfCIXX13_dbNb_eXNxe331X4u7zWp2_zvAlwB5AEWPe5buYZ6DBQKRA2YBQCHUVB4YJ5pmMHmG1SFQuL76bXZxd29AzhKrrvG3PxSB9KmgqZ2E7slXJuoz2WtjTUptyzx_hlvGmdpDWXJuP-cJnCN9gWNPm-s9te4DKruNAB9ZnsPEHtW0rwqzaW9d-_cKPooyz2DOvlCoBfzCxSPcV19cEvvWT--Zqg6vT8-yc5zFOCZn9NwNHRS7KET-2f48TRKSRiSgJKB-FEU0pGlKAoIJStwEBWfsHDkIu8iNXN-NPH-K_JSEkbMNUj-JHNcDnkMPhOXT5hvTM3uS_jz0I9c9y0lCc2W_x0Wo0mgE_MszeW4VICl3CnhOzpRW7QSa6ZyegwU24oqdm-uru-bB7XAPTr59UN5w15JPVfXxKqfKiAoETvf7hkYIIHAG35kEzlkp8_Of_5TA8uB_AwAA___ze5Nh">