Skip to content

Commit 4b70c5b

Browse files
committed
initial commit
0 parents  commit 4b70c5b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

96 files changed

+36232
-0
lines changed

.gitignore

+409
Large diffs are not rendered by default.

.gitmodules

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[submodule "CTranslate2"]
2+
path = "externals/CTranslate2"
3+
url = https://github.com/OpenNMT/CTranslate2.git
4+
5+
[submodule "Tokenizer"]
6+
path = "externals/Tokenizer"
7+
url = https://github.com/OpenNMT/Tokenizer.git

LICENSE

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
MIT License
2+
3+
Copyright (c) 2023 NM
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.
22+
23+
------------------------------------------------------------------------------
24+
Portions of this software are Copyright (c) 2018- SYSTRAN. and/or
25+
Copyright (c) 2019- The OpenNMT Authors.
26+
------------------------------------------------------------------------------
27+
Copyright (c) 2018- SYSTRAN.
28+
Copyright (c) 2019- The OpenNMT Authors.
29+
30+
Permission is hereby granted, free of charge, to any person obtaining a copy
31+
of this software and associated documentation files (the "Software"), to deal
32+
in the Software without restriction, including without limitation the rights
33+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
34+
copies of the Software, and to permit persons to whom the Software is
35+
furnished to do so, subject to the following conditions:
36+
37+
The above copyright notice and this permission notice shall be included in all
38+
copies or substantial portions of the Software.
39+
40+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
41+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
42+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
43+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
44+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
45+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
46+
SOFTWARE.

README.md

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# CTranslate2Test
2+
Quick implementation/experimentation with OpenNMT's CTranslate2 library, primarily meant to just serve as an example of the core setup that is required.
3+
4+
## Compiling
5+
### Prerequisites
6+
* [CUDA Developer Toolkit v11.0](https://developer.nvidia.com/cuda-toolkit)
7+
* [NVIDIA cuDNN for CUDA v11.0](https://developer.nvidia.com/cudnn)
8+
* [ICU Libraries](https://github.com/unicode-org/icu/tree/main)
9+
* A transformer model; for this project, the [CTranslate quickstart model](https://opennmt.net/CTranslate2/quickstart.html) is recommended.
10+
11+
Ensure you have extracted cuDNN within your CUDA Developer Toolkit installation and that such libraries are within the system PATH, then:
12+
`git clone --recursive "https://github.com/NM-20/CTranslate2Test.git"`
13+
The [converted](https://opennmt.net/CTranslate2/conversion.html) model should be placed within a directory named "res" in the `TranslateTest` project.
14+
15+
Compile the libraries within `externals`, ensuring that CTranslate2 is compiled with the following settings:
16+
`-G "Visual Studio 16 2019" -DOPENMP_RUNTIME=COMP -DWITH_CUDA=ON -DWITH_CUDNN=ON -DWITH_MKL=OFF`
17+
18+
From there, you may proceed with building the `TranslateTest` project in VS 2022.

TranslationTest.cpp

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#include <onmt/Tokenizer.h>
2+
#include <ctranslate2/translator.h>
3+
4+
using namespace std;
5+
6+
onmt::Tokenizer mTokenizer("sentencepiece.model");
7+
// TODO: Look into why CPU usage results in an error
8+
ctranslate2::Translator mTranslator("ende_ctranslate2/", ctranslate2::Device::CUDA);
9+
10+
int main()
11+
{
12+
std::vector<std::string> tokens;
13+
mTokenizer.tokenize("Hello World!", tokens);
14+
15+
const std::vector<ctranslate2::TranslationResult> results = mTranslator.translate_batch({ tokens });
16+
17+
std::cout << mTokenizer.detokenize(results[0].output()) << std::endl;
18+
19+
// Expected output: Hallo Welt!
20+
return 0;
21+
}

TranslationTest.vcxproj

+256
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,256 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<ItemGroup Label="ProjectConfigurations">
4+
<ProjectConfiguration Include="Debug|Win32">
5+
<Configuration>Debug</Configuration>
6+
<Platform>Win32</Platform>
7+
</ProjectConfiguration>
8+
<ProjectConfiguration Include="Release|Win32">
9+
<Configuration>Release</Configuration>
10+
<Platform>Win32</Platform>
11+
</ProjectConfiguration>
12+
<ProjectConfiguration Include="Debug|x64">
13+
<Configuration>Debug</Configuration>
14+
<Platform>x64</Platform>
15+
</ProjectConfiguration>
16+
<ProjectConfiguration Include="Release|x64">
17+
<Configuration>Release</Configuration>
18+
<Platform>x64</Platform>
19+
</ProjectConfiguration>
20+
</ItemGroup>
21+
<PropertyGroup Label="Globals">
22+
<VCProjectVersion>16.0</VCProjectVersion>
23+
<Keyword>Win32Proj</Keyword>
24+
<ProjectGuid>{8ac5f861-f6b5-46d7-9ac2-0578bdc1361d}</ProjectGuid>
25+
<RootNamespace>TranslationTest</RootNamespace>
26+
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
27+
</PropertyGroup>
28+
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
29+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
30+
<ConfigurationType>Application</ConfigurationType>
31+
<UseDebugLibraries>true</UseDebugLibraries>
32+
<PlatformToolset>v143</PlatformToolset>
33+
<CharacterSet>Unicode</CharacterSet>
34+
</PropertyGroup>
35+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
36+
<ConfigurationType>Application</ConfigurationType>
37+
<UseDebugLibraries>false</UseDebugLibraries>
38+
<PlatformToolset>v143</PlatformToolset>
39+
<WholeProgramOptimization>true</WholeProgramOptimization>
40+
<CharacterSet>Unicode</CharacterSet>
41+
</PropertyGroup>
42+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
43+
<ConfigurationType>Application</ConfigurationType>
44+
<UseDebugLibraries>true</UseDebugLibraries>
45+
<PlatformToolset>v143</PlatformToolset>
46+
<CharacterSet>Unicode</CharacterSet>
47+
</PropertyGroup>
48+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
49+
<ConfigurationType>Application</ConfigurationType>
50+
<UseDebugLibraries>false</UseDebugLibraries>
51+
<PlatformToolset>v143</PlatformToolset>
52+
<WholeProgramOptimization>true</WholeProgramOptimization>
53+
<CharacterSet>Unicode</CharacterSet>
54+
</PropertyGroup>
55+
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
56+
<ImportGroup Label="ExtensionSettings">
57+
</ImportGroup>
58+
<ImportGroup Label="Shared">
59+
</ImportGroup>
60+
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
61+
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
62+
</ImportGroup>
63+
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
64+
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
65+
</ImportGroup>
66+
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
67+
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
68+
</ImportGroup>
69+
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
70+
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
71+
</ImportGroup>
72+
<PropertyGroup Label="UserMacros" />
73+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
74+
<OutDir>bin\$(Configuration)\</OutDir>
75+
<IntDir>$(BaseIntermediateOutputPath)$(Platform)\$(Configuration)\</IntDir>
76+
<IncludePath>$(ProjectDir);$(ProjectDir)include;$(IncludePath)</IncludePath>
77+
<LibraryPath>$(ProjectDir)lib\$(Platform);$(IntDir);$(LibraryPath)</LibraryPath>
78+
</PropertyGroup>
79+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
80+
<OutDir>bin\$(Configuration)\</OutDir>
81+
<IntDir>$(BaseIntermediateOutputPath)$(Platform)\$(Configuration)\</IntDir>
82+
<IncludePath>$(ProjectDir);$(ProjectDir)include;$(IncludePath)</IncludePath>
83+
<LibraryPath>$(ProjectDir)lib\$(Platform);$(IntDir);$(LibraryPath)</LibraryPath>
84+
</PropertyGroup>
85+
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
86+
<ClCompile>
87+
<WarningLevel>Level3</WarningLevel>
88+
<SDLCheck>true</SDLCheck>
89+
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
90+
<ConformanceMode>true</ConformanceMode>
91+
</ClCompile>
92+
<Link>
93+
<SubSystem>Console</SubSystem>
94+
<GenerateDebugInformation>true</GenerateDebugInformation>
95+
</Link>
96+
</ItemDefinitionGroup>
97+
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
98+
<ClCompile>
99+
<WarningLevel>Level3</WarningLevel>
100+
<FunctionLevelLinking>true</FunctionLevelLinking>
101+
<IntrinsicFunctions>true</IntrinsicFunctions>
102+
<SDLCheck>true</SDLCheck>
103+
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
104+
<ConformanceMode>true</ConformanceMode>
105+
</ClCompile>
106+
<Link>
107+
<SubSystem>Console</SubSystem>
108+
<EnableCOMDATFolding>true</EnableCOMDATFolding>
109+
<OptimizeReferences>true</OptimizeReferences>
110+
<GenerateDebugInformation>true</GenerateDebugInformation>
111+
</Link>
112+
</ItemDefinitionGroup>
113+
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
114+
<ClCompile>
115+
<WarningLevel>Level3</WarningLevel>
116+
<SDLCheck>true</SDLCheck>
117+
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
118+
<ConformanceMode>true</ConformanceMode>
119+
<LanguageStandard>stdcpp20</LanguageStandard>
120+
<MultiProcessorCompilation>true</MultiProcessorCompilation>
121+
</ClCompile>
122+
<Link>
123+
<SubSystem>Console</SubSystem>
124+
<GenerateDebugInformation>true</GenerateDebugInformation>
125+
<AdditionalLibraryDirectories>$(ProjectDir)externals\CTranslate2\build\$(Configuration)\;$(ProjectDir)externals\Tokenizer\build\$(Configuration)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
126+
<AdditionalDependencies>ctranslate2.lib;OpenNMTTokenizer.lib;%(AdditionalDependencies)</AdditionalDependencies>
127+
</Link>
128+
<PreBuildEvent>
129+
<Command>xcopy "$(ProjectDir)externals\CTranslate2\build\$(Configuration)\ctranslate2.dll" "bin\$(Configuration)\" /y
130+
xcopy "$(ProjectDir)externals\Tokenizer\build\$(Configuration)\OpenNMTTokenizer.dll" "bin\$(Configuration)\" /y
131+
xcopy "$(ProjectDir)res\" "bin\$(Configuration)\" /s /y</Command>
132+
</PreBuildEvent>
133+
</ItemDefinitionGroup>
134+
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
135+
<ClCompile>
136+
<WarningLevel>Level3</WarningLevel>
137+
<FunctionLevelLinking>true</FunctionLevelLinking>
138+
<IntrinsicFunctions>true</IntrinsicFunctions>
139+
<SDLCheck>true</SDLCheck>
140+
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
141+
<ConformanceMode>true</ConformanceMode>
142+
<MultiProcessorCompilation>true</MultiProcessorCompilation>
143+
<LanguageStandard>stdcpp20</LanguageStandard>
144+
</ClCompile>
145+
<Link>
146+
<SubSystem>Console</SubSystem>
147+
<EnableCOMDATFolding>true</EnableCOMDATFolding>
148+
<OptimizeReferences>true</OptimizeReferences>
149+
<GenerateDebugInformation>true</GenerateDebugInformation>
150+
<AdditionalLibraryDirectories>$(ProjectDir)externals\CTranslate2\build\$(Configuration)\;$(ProjectDir)externals\Tokenizer\build\$(Configuration)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
151+
<AdditionalDependencies>ctranslate2.lib;OpenNMTTokenizer.lib;%(AdditionalDependencies)</AdditionalDependencies>
152+
</Link>
153+
<PreBuildEvent>
154+
<Command>xcopy "$(ProjectDir)externals\CTranslate2\build\$(Configuration)\ctranslate2.dll" "bin\$(Configuration)\" /y
155+
xcopy "$(ProjectDir)externals\Tokenizer\build\$(Configuration)\OpenNMTTokenizer.dll" "bin\$(Configuration)\" /y
156+
xcopy "$(ProjectDir)res\" "bin\$(Configuration)\" /s /y</Command>
157+
</PreBuildEvent>
158+
</ItemDefinitionGroup>
159+
<ItemGroup>
160+
<ClCompile Include="TranslationTest.cpp" />
161+
</ItemGroup>
162+
<ItemGroup>
163+
<ClInclude Include="include\ctranslate2\allocator.h" />
164+
<ClInclude Include="include\ctranslate2\batch_reader.h" />
165+
<ClInclude Include="include\ctranslate2\buffered_translation_wrapper.h" />
166+
<ClInclude Include="include\ctranslate2\decoding.h" />
167+
<ClInclude Include="include\ctranslate2\decoding_utils.h" />
168+
<ClInclude Include="include\ctranslate2\devices.h" />
169+
<ClInclude Include="include\ctranslate2\generation.h" />
170+
<ClInclude Include="include\ctranslate2\generator.h" />
171+
<ClInclude Include="include\ctranslate2\layers\attention.h" />
172+
<ClInclude Include="include\ctranslate2\layers\common.h" />
173+
<ClInclude Include="include\ctranslate2\layers\decoder.h" />
174+
<ClInclude Include="include\ctranslate2\layers\encoder.h" />
175+
<ClInclude Include="include\ctranslate2\layers\layers.h" />
176+
<ClInclude Include="include\ctranslate2\layers\transformer.h" />
177+
<ClInclude Include="include\ctranslate2\layers\whisper.h" />
178+
<ClInclude Include="include\ctranslate2\logging.h" />
179+
<ClInclude Include="include\ctranslate2\models\language_model.h" />
180+
<ClInclude Include="include\ctranslate2\models\model.h" />
181+
<ClInclude Include="include\ctranslate2\models\model_factory.h" />
182+
<ClInclude Include="include\ctranslate2\models\model_reader.h" />
183+
<ClInclude Include="include\ctranslate2\models\sequence_to_sequence.h" />
184+
<ClInclude Include="include\ctranslate2\models\transformer.h" />
185+
<ClInclude Include="include\ctranslate2\models\whisper.h" />
186+
<ClInclude Include="include\ctranslate2\ops\activation.h" />
187+
<ClInclude Include="include\ctranslate2\ops\add.h" />
188+
<ClInclude Include="include\ctranslate2\ops\bias_add.h" />
189+
<ClInclude Include="include\ctranslate2\ops\concat.h" />
190+
<ClInclude Include="include\ctranslate2\ops\conv1d.h" />
191+
<ClInclude Include="include\ctranslate2\ops\cos.h" />
192+
<ClInclude Include="include\ctranslate2\ops\dequantize.h" />
193+
<ClInclude Include="include\ctranslate2\ops\gather.h" />
194+
<ClInclude Include="include\ctranslate2\ops\gelu.h" />
195+
<ClInclude Include="include\ctranslate2\ops\gemm.h" />
196+
<ClInclude Include="include\ctranslate2\ops\gumbel_max.h" />
197+
<ClInclude Include="include\ctranslate2\ops\identity.h" />
198+
<ClInclude Include="include\ctranslate2\ops\layer_norm.h" />
199+
<ClInclude Include="include\ctranslate2\ops\log.h" />
200+
<ClInclude Include="include\ctranslate2\ops\matmul.h" />
201+
<ClInclude Include="include\ctranslate2\ops\mean.h" />
202+
<ClInclude Include="include\ctranslate2\ops\min_max.h" />
203+
<ClInclude Include="include\ctranslate2\ops\mul.h" />
204+
<ClInclude Include="include\ctranslate2\ops\multinomial.h" />
205+
<ClInclude Include="include\ctranslate2\ops\op.h" />
206+
<ClInclude Include="include\ctranslate2\ops\ops.h" />
207+
<ClInclude Include="include\ctranslate2\ops\quantize.h" />
208+
<ClInclude Include="include\ctranslate2\ops\relu.h" />
209+
<ClInclude Include="include\ctranslate2\ops\reshape.h" />
210+
<ClInclude Include="include\ctranslate2\ops\rms_norm.h" />
211+
<ClInclude Include="include\ctranslate2\ops\sin.h" />
212+
<ClInclude Include="include\ctranslate2\ops\softmax.h" />
213+
<ClInclude Include="include\ctranslate2\ops\split.h" />
214+
<ClInclude Include="include\ctranslate2\ops\squeeze.h" />
215+
<ClInclude Include="include\ctranslate2\ops\sub.h" />
216+
<ClInclude Include="include\ctranslate2\ops\swish.h" />
217+
<ClInclude Include="include\ctranslate2\ops\tanh.h" />
218+
<ClInclude Include="include\ctranslate2\ops\tile.h" />
219+
<ClInclude Include="include\ctranslate2\ops\topk.h" />
220+
<ClInclude Include="include\ctranslate2\ops\transpose.h" />
221+
<ClInclude Include="include\ctranslate2\ops\unsqueeze.h" />
222+
<ClInclude Include="include\ctranslate2\padder.h" />
223+
<ClInclude Include="include\ctranslate2\primitives.h" />
224+
<ClInclude Include="include\ctranslate2\profiler.h" />
225+
<ClInclude Include="include\ctranslate2\random.h" />
226+
<ClInclude Include="include\ctranslate2\replica_pool.h" />
227+
<ClInclude Include="include\ctranslate2\sampling.h" />
228+
<ClInclude Include="include\ctranslate2\scoring.h" />
229+
<ClInclude Include="include\ctranslate2\storage_view.h" />
230+
<ClInclude Include="include\ctranslate2\thread_pool.h" />
231+
<ClInclude Include="include\ctranslate2\translation.h" />
232+
<ClInclude Include="include\ctranslate2\translator.h" />
233+
<ClInclude Include="include\ctranslate2\types.h" />
234+
<ClInclude Include="include\ctranslate2\utils.h" />
235+
<ClInclude Include="include\ctranslate2\vocabulary.h" />
236+
<ClInclude Include="include\ctranslate2\vocabulary_map.h" />
237+
<ClInclude Include="include\half_float\half.hpp" />
238+
<ClInclude Include="include\nlohmann\json.hpp" />
239+
<ClInclude Include="include\onmt\BPE.h" />
240+
<ClInclude Include="include\onmt\BPELearner.h" />
241+
<ClInclude Include="include\onmt\ITokenizer.h" />
242+
<ClInclude Include="include\onmt\opennmttokenizer_export.h" />
243+
<ClInclude Include="include\onmt\SentencePiece.h" />
244+
<ClInclude Include="include\onmt\SentencePieceLearner.h" />
245+
<ClInclude Include="include\onmt\SPMLearner.h" />
246+
<ClInclude Include="include\onmt\SubwordEncoder.h" />
247+
<ClInclude Include="include\onmt\SubwordLearner.h" />
248+
<ClInclude Include="include\onmt\Token.h" />
249+
<ClInclude Include="include\onmt\Tokenizer.h" />
250+
<ClInclude Include="include\onmt\unicode\Unicode.h" />
251+
<ClInclude Include="include\onmt\Vocab.h" />
252+
</ItemGroup>
253+
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
254+
<ImportGroup Label="ExtensionTargets">
255+
</ImportGroup>
256+
</Project>

0 commit comments

Comments
 (0)