forked from um/kgg-dec
inital commit
This commit is contained in:
commit
2a462c2eff
5
.clang-format
Normal file
5
.clang-format
Normal file
@ -0,0 +1,5 @@
|
||||
BasedOnStyle: Chromium
|
||||
IndentWidth: 4
|
||||
TabWidth: 4
|
||||
InsertNewlineAtEOF: true
|
||||
ColumnLimit: 120
|
14
.editorconfig
Normal file
14
.editorconfig
Normal file
@ -0,0 +1,14 @@
|
||||
# EditorConfig is awesome: https://EditorConfig.org
|
||||
|
||||
# top-most EditorConfig file
|
||||
root = true
|
||||
|
||||
# Unix-style newlines with a newline ending every file
|
||||
[*]
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
|
||||
[*.{json,yml,md}]
|
||||
indent_size = 2
|
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
build/
|
||||
.cache/
|
||||
cmake-build-*
|
8
.idea/.gitignore
vendored
Normal file
8
.idea/.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
134
.idea/codeStyles/Project.xml
Normal file
134
.idea/codeStyles/Project.xml
Normal file
@ -0,0 +1,134 @@
|
||||
<component name="ProjectCodeStyleConfiguration">
|
||||
<code_scheme name="Project" version="173">
|
||||
<option name="LINE_SEPARATOR" value=" " />
|
||||
<RiderCodeStyleSettings>
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppClangFormat/EnableClangFormatSupport/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/EditorConfig/EnableClangFormatSupport/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_BINARY_EXPRESSIONS_CHAIN/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_CALLS_CHAIN/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXPRESSION/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_FOR_STMT/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTIPLE_DECLARATION/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_TERNARY/@EntryValue" value="ALIGN_ALL" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_CLASS_DEFINITION/@EntryValue" value="1" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_DECLARATIONS/@EntryValue" value="2" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_CODE/@EntryValue" value="2" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_USER_LINEBREAKS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CASE_FROM_SWITCH/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_COMMENT/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INT_ALIGN_EQ/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SIMPLE_BLOCK_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_PARAMS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_SEMICOLON/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_SEMICOLON/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_UNARY_OPERATOR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_ARRAY_ACCESS_BRACKETS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_METHOD_PARENTHESES/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPECIAL_ELSE_IF_TREATMENT/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_BINARY_OPSIGN/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_TERNARY_OPSIGNS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TYPE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/OTHER_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CASE_BLOCK_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DECLARATION/@EntryValue" value="1" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DEFINITION/@EntryValue" value="1" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_WHILE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_ELSE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_CATCH_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_INDENTATION/@EntryValue" value="All" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_ARGUMENT/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXTENDS_LIST/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_PARAMETER/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_ARGUMENT/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_PARAMETER/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_DECLARATIONS/@EntryValue" value="0" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_ACCESS_SPECIFIERS_FROM_CLASS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CLASS_MEMBERS_FROM_ACCESS_SPECIFIERS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/LINE_BREAK_AFTER_COLON_IN_MEMBER_INITIALIZER_LISTS/@EntryValue" value="ON_SINGLE_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/MEMBER_INITIALIZER_LIST_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_NAMESPACE_DEFINITIONS_ON_SAME_LINE/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_COLON/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_COLON/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_METHOD/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_NESTED_DECLARATOR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_METHOD/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_METHOD/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_METHOD/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BETWEEN_CLOSING_ANGLE_BRACKETS_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_DECLARATION_PARENTHESES/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_BLOCKS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_RPAR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_RPAR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_ARGUMENTS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_PARAMETERS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BREAK_TEMPLATE_DECLARATION/@EntryValue" value="LINE_BREAK" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/FREE_BLOCK_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INVOCABLE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ANONYMOUS_METHOD_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INITIALIZER_BRACES/@EntryValue" value="END_OF_LINE_NO_SPACE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_STYLE/@EntryValue" value="Space" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_SIZE/@EntryValue" value="4" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CONTINUOUS_LINE_INDENT/@EntryValue" value="Double" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TAB_WIDTH/@EntryValue" value="4" type="int" />
|
||||
</RiderCodeStyleSettings>
|
||||
<clangFormatSettings>
|
||||
<option name="ENABLED" value="true" />
|
||||
</clangFormatSettings>
|
||||
<codeStyleSettings language="AsciiDoc">
|
||||
<indentOptions>
|
||||
<option name="INDENT_SIZE" value="2" />
|
||||
<option name="TAB_SIZE" value="2" />
|
||||
</indentOptions>
|
||||
</codeStyleSettings>
|
||||
<codeStyleSettings language="HTML">
|
||||
<indentOptions>
|
||||
<option name="INDENT_SIZE" value="2" />
|
||||
<option name="CONTINUATION_INDENT_SIZE" value="4" />
|
||||
<option name="TAB_SIZE" value="2" />
|
||||
</indentOptions>
|
||||
</codeStyleSettings>
|
||||
<codeStyleSettings language="JavaScript">
|
||||
<indentOptions>
|
||||
<option name="INDENT_SIZE" value="2" />
|
||||
<option name="CONTINUATION_INDENT_SIZE" value="2" />
|
||||
<option name="TAB_SIZE" value="2" />
|
||||
</indentOptions>
|
||||
</codeStyleSettings>
|
||||
<codeStyleSettings language="TypeScript">
|
||||
<indentOptions>
|
||||
<option name="INDENT_SIZE" value="2" />
|
||||
<option name="CONTINUATION_INDENT_SIZE" value="2" />
|
||||
<option name="TAB_SIZE" value="2" />
|
||||
</indentOptions>
|
||||
</codeStyleSettings>
|
||||
</code_scheme>
|
||||
</component>
|
5
.idea/codeStyles/codeStyleConfig.xml
Normal file
5
.idea/codeStyles/codeStyleConfig.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<component name="ProjectCodeStyleConfiguration">
|
||||
<state>
|
||||
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
|
||||
</state>
|
||||
</component>
|
341
.idea/editor.xml
Normal file
341
.idea/editor.xml
Normal file
@ -0,0 +1,341 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="BackendCodeEditorSettings">
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppClangFormat/EnableClangFormatSupport/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/EditorConfig/EnableClangFormatSupport/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_BINARY_EXPRESSIONS_CHAIN/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_CALLS_CHAIN/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXPRESSION/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_FOR_STMT/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTIPLE_DECLARATION/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_TERNARY/@EntryValue" value="ALIGN_ALL" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_CLASS_DEFINITION/@EntryValue" value="1" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_DECLARATIONS/@EntryValue" value="2" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_CODE/@EntryValue" value="2" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_USER_LINEBREAKS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CASE_FROM_SWITCH/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_COMMENT/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INT_ALIGN_EQ/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SIMPLE_BLOCK_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_PARAMS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_SEMICOLON/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_SEMICOLON/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_UNARY_OPERATOR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_ARRAY_ACCESS_BRACKETS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_METHOD_PARENTHESES/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPECIAL_ELSE_IF_TREATMENT/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_BINARY_OPSIGN/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_TERNARY_OPSIGNS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TYPE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/OTHER_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CASE_BLOCK_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DECLARATION/@EntryValue" value="1" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DEFINITION/@EntryValue" value="1" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_WHILE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_ELSE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_CATCH_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_INDENTATION/@EntryValue" value="All" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_ARGUMENT/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXTENDS_LIST/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_PARAMETER/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_ARGUMENT/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_PARAMETER/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_DECLARATIONS/@EntryValue" value="0" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_ACCESS_SPECIFIERS_FROM_CLASS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CLASS_MEMBERS_FROM_ACCESS_SPECIFIERS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/LINE_BREAK_AFTER_COLON_IN_MEMBER_INITIALIZER_LISTS/@EntryValue" value="ON_SINGLE_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/MEMBER_INITIALIZER_LIST_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_NAMESPACE_DEFINITIONS_ON_SAME_LINE/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_COLON/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_COLON/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_METHOD/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_NESTED_DECLARATOR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_METHOD/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_METHOD/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_METHOD/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BETWEEN_CLOSING_ANGLE_BRACKETS_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_DECLARATION_PARENTHESES/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_BLOCKS/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_RPAR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_RPAR/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_ARGUMENTS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_PARAMETERS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BREAK_TEMPLATE_DECLARATION/@EntryValue" value="LINE_BREAK" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/FREE_BLOCK_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INVOCABLE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ANONYMOUS_METHOD_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INITIALIZER_BRACES/@EntryValue" value="END_OF_LINE_NO_SPACE" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_STYLE/@EntryValue" value="Space" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_SIZE/@EntryValue" value="4" type="int" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CONTINUOUS_LINE_INDENT/@EntryValue" value="Double" type="string" />
|
||||
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TAB_WIDTH/@EntryValue" value="4" type="int" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSmartPointerVsMakeFunction/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCStyleCast/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionalStyleCast/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReinterpretCastFromVoidPtr/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConvertingConstructor/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConversionOperator/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDiscardedPostfixOperatorResult/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstValueFunctionReturnType/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeConst/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeStatic/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMayBeConst/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConst/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVariableCanBeMadeConstexpr/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConstPtrOrRef/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPassValueParameterByConstReference/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppThrowExpressionCanBeReplacedWithRethrow/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroConstantCanBeReplacedWithNullptr/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCompileTimeConstantCanBeReplacedWithBooleanConstant/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIfCanBeReplacedByConstexprIf/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IfStdIsConstantEvaluatedCanBeReplaced/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StdIsConstantEvaluatedWillAlwaysEvaluateToConstant/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConstevalIfIsAlwaysConstant/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassCanBeFinal/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStructuredBinding/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseTypeTraitAlias/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAlgorithmWithCount/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseRangeAlgorithm/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseElementsView/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStdSize/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForLoopCanBeReplacedWithWhile/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppJoinDeclarationAndAssignment/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceTieWithStructuredBinding/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceMemsetWithZeroInitialization/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAssociativeContains/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseEraseAlgorithm/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseFamiliarTemplateSyntaxForGenericLambdas/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScope/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScopeInitStatement/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantNamespaceDefinition/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineFunctionDefinitionInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineVariableDefinitionInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionIsNotImplemented/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrivateSpecialMemberFunctionIsNotImplemented/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHiddenFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHidingFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPolymorphicClassWithNonVirtualPublicDestructor/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractClassWithoutSpecifier/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompleteSwitchStatement/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultCaseNotHandledInSwitchStatement/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyErroneousEmptyStatements/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExpressionWithoutSideEffects/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNoDiscardExpression/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionResultShouldBeUsed/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingKeywordThrow/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTypeWithoutTypenameKeyword/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTemplateWithoutTemplateKeyword/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppImplicitDefaultConstructorNotAvailable/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeedsConstructorBecauseOfUninitializedMember/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedNonStaticDataMember/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRangeBasedForIncompatibleReference/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroValuedExpressionUsedAsNullPointer/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUnintendedObjectSlicing/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUninitializedMember/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorDisambiguatedAsFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionInFinalClass/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMustBePublicVirtualToImplementInterface/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationSpecifierWithoutDeclarators/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEmptyDeclaration/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesLocal/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesUncapturedLocal/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMismatchedClassTags/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUsingResultOfAssignmentAsCondition/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIntegralToPointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerToIntegralConversion/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompatiblePointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerConversionDropsQualifiers/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStringLiteralToCharPointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExceptionSafeResourceAcquisition/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionCallInsideCtor/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractVirtualFunctionCallInCtor/@EntryIndexedValue" value="ERROR" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInvalidLineContinuation/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfBadFormat/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfRiskyFormat/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfMissedArg/@EntryIndexedValue" value="ERROR" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfExtraArg/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatBadCode/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatLegacyCode/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatMixedArgs/@EntryIndexedValue" value="ERROR" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooFewArgs/@EntryIndexedValue" value="ERROR" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooManyArgs/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedEntity/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingIncludeGuard/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenSyntaxError/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUnresolvedReference/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUndocumentedParameter/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeletingVoidPointer/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBooleanIncrementExpression/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedRegisterStorageClassSpecifier/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIdenticalOperandsInBinaryExpression/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEqualOperandsInBinaryExpression/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedefinitionOfDefaultArgumentInOverrideFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnamedNamespaceInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNamesMismatch/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultedSpecialMemberFunctionIsImplicitlyDeleted/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNodiscardFunctionWithoutReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantComplexityInComparison/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractFinalClass/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSpecialFunctionWithoutNoexceptSpecification/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnsignedZeroComparison/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterLiteral/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterWideLiteral/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantQualifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantAccessSpecifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAccessSpecifierWithNoDeclarations/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTypenameKeyword/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateKeyword/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeyword/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeywordInsideCompoundStatement/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantControlFlowJump/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyStatement/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyDeclaration/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantParentheses/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantLambdaParameterList/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantCastExpression/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHeaderHasBeenAlreadyIncluded/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateArgumentsCanBeDeduced/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateArguments/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticSpecifierOnAnonymousNamespaceMember/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnMemberAllocationFunction/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnThreadLocalLocalVariable/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassAccessSpecifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantInlineSpecifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConstSpecifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBooleanExpressionArgument/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantVoidArgumentList/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantMemberInitializer/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassInitializer/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstParameterInDeclaration/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVolatileParameterInDeclaration/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalFunctionInFinalClass/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalNonOverridingVirtualFunction/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElaboratedTypeSpecifier/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantDereferencingAndTakingAddress/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConditionalExpression/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConditionalExpressionCanBeSimplified/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantExportKeyword/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantZeroInitializerInAggregateInitialization/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUserDefinedLiteralSuffixDoesNotStartWithUnderscore/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassIsIncomplete/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterShadowing/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMutableSpecifierOnReferenceMember/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultInitializationWithNoUserConstructor/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExplicitSpecializationInNonNamespaceScope/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnionMemberOfReferenceType/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedDependentBaseClass/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderIsNotIncluded/@EntryIndexedValue" value="ERROR" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderNotFound/@EntryIndexedValue" value="ERROR" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCoroutineCallResolveError/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAwaiterTypeIsNotClass/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppOutParameterMustBeWritten/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWarningDirective/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticAssertFailure/@EntryIndexedValue" value="ERROR" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEvaluationFailure/@EntryIndexedValue" value="ERROR" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTypeAliasNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConceptNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnumeratorNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLambdaCaptureNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableWithNonTrivialDtorIsNeverUsed/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNeverUsed/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterNeverUsed/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityAssignedButNoRead/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityUsedOnlyInUnevaluatedContext/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppObjectMemberMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSomeObjectMembersMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorUsedBeforeInitialization/@EntryIndexedValue" value="ERROR" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnusedIncludeDirective/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNotAllPathsReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CDeclarationWithImplicitIntType/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionDoesntReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReturnNoValueInNonVoidFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCVQualifierCanNotBeAppliedToReference/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDereferenceOperatorLimitExceeded/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForwardEnumDeclarationWithoutUnderlyingType/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaRegionDirective/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaEndRegionDirective/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticDataMemberInUnnamedStruct/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultIsUsedAsIdentifier/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLongFloat/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtReinterpretCastFromNullptr/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtBindingRValueToLvalueReference/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtAddressOfClassRValue/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtDoubleUserConversionInCopyInit/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtCopyElisionInCopyInitDeclarator/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtNotInitializedStaticConstLocalVar/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRemoveRedundantBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceIfStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceForStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceWhileStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceDoStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongIncludesOrder/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongSlashesInIncludeDirective/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceNestedNamespacesStyle/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceTypeAliasCodeStyle/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceFunctionDeclarationStyle/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberInitializersOrder/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingFunctionStyle/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingDestructorStyle/@EntryIndexedValue" value="SUGGESTION" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAuto/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAutoForNumeric/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersPlacement/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersOrder/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnecessaryWhitespace/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTabsAreDisallowed/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantConditions/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANullDereference/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANotInitializedField/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALoopConditionNotUpdated/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFADeletedPointer/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAMemoryLeak/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInvalidatedMemory/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesScope/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesFunction/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantParameter/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantFunctionResult/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAArrayIndexOutOfBounds/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableCode/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableFunctionCall/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAEndlessLoop/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInfiniteRecursion/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnusedValue/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreadVariable/@EntryIndexedValue" value="WARNING" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFATimeOver/@EntryIndexedValue" value="HINT" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInconsistentNaming/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StringLiteralTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CommentTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IdentifierTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
|
||||
</component>
|
||||
</project>
|
2
.idea/kgg-dec.iml
Normal file
2
.idea/kgg-dec.iml
Normal file
@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module classpath="CMake" type="CPP_MODULE" version="4" />
|
13
.idea/misc.xml
Normal file
13
.idea/misc.xml
Normal file
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="BackendCodeEditorMiscSettings">
|
||||
<option name="/Default/RiderDebugger/RiderRestoreDecompile/RestoreDecompileSetting/@EntryValue" value="false" type="bool" />
|
||||
<option name="/Default/Housekeeping/GlobalSettingsUpgraded/IsUpgraded/@EntryValue" value="true" type="bool" />
|
||||
<option name="/Default/Housekeeping/FeatureSuggestion/FeatureSuggestionManager/DisabledSuggesters/=SwitchToGoToActionSuggester/@EntryIndexedValue" value="true" type="bool" />
|
||||
<option name="/Default/Environment/Hierarchy/GeneratedFilesCacheKey/Timestamp/@EntryValue" value="15" type="long" />
|
||||
</component>
|
||||
<component name="CMakePythonSetting">
|
||||
<option name="pythonIntegrationState" value="YES" />
|
||||
</component>
|
||||
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
|
||||
</project>
|
8
.idea/modules.xml
Normal file
8
.idea/modules.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/kgg-dec.iml" filepath="$PROJECT_DIR$/.idea/kgg-dec.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
6
.idea/vcs.xml
Normal file
6
.idea/vcs.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
37
CMakeLists.txt
Normal file
37
CMakeLists.txt
Normal file
@ -0,0 +1,37 @@
|
||||
cmake_minimum_required(VERSION 3.10)
|
||||
|
||||
project(kgg-dec LANGUAGES CXX)
|
||||
|
||||
include(CheckIPOSupported)
|
||||
check_ipo_supported(RESULT lto_supported OUTPUT error)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 20)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
add_executable(kgg-dec
|
||||
src/main.cpp
|
||||
src/common/base64.cpp
|
||||
src/infra/infra.cpp
|
||||
src/tc_tea/tc_tea.cpp
|
||||
src/qmc2/ekey.cpp
|
||||
src/qmc2/qmc2_factory.cpp
|
||||
src/qmc2/qmc2_map.cpp
|
||||
src/qmc2/qmc2_rc4.cpp
|
||||
)
|
||||
|
||||
target_include_directories(kgg-dec
|
||||
PRIVATE
|
||||
src/common
|
||||
src/tc_tea
|
||||
)
|
||||
|
||||
target_link_libraries(kgg-dec PRIVATE shell32 ole32)
|
||||
|
||||
if (lto_supported)
|
||||
set_property(TARGET kgg-dec PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
|
||||
endif()
|
||||
|
||||
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s -fdata-sections -ffunction-sections -flto -fmerge-all-constants -fno-exceptions -fno-rtti")
|
||||
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -s -Wl,--gc-sections -flto")
|
||||
endif()
|
67
CMakePresets.json
Normal file
67
CMakePresets.json
Normal file
@ -0,0 +1,67 @@
|
||||
{
|
||||
"version": 3,
|
||||
"cmakeMinimumRequired": {
|
||||
"major": 3,
|
||||
"minor": 19,
|
||||
"patch": 0
|
||||
},
|
||||
"configurePresets": [
|
||||
{
|
||||
"name": "default",
|
||||
"hidden": true,
|
||||
"generator": "Ninja",
|
||||
"cacheVariables": {
|
||||
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "mingw",
|
||||
"inherits": "default",
|
||||
"description": "Configure for MinGW",
|
||||
"generator": "Ninja",
|
||||
"binaryDir": "${sourceDir}/build/mingw",
|
||||
"cacheVariables": {
|
||||
"CMAKE_SYSTEM_NAME": "Windows",
|
||||
"CMAKE_C_COMPILER": "i686-w64-mingw32-gcc-win32",
|
||||
"CMAKE_CXX_COMPILER": "i686-w64-mingw32-g++-win32",
|
||||
"CMAKE_FIND_LIBRARY_SUFFIXES": ".a",
|
||||
"BUILD_SHARED_LIBS": "OFF",
|
||||
"CMAKE_EXE_LINKER_FLAGS": "-static -static-libgcc -static-libstdc++ -lucrt"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "vs",
|
||||
"inherits": "default",
|
||||
"description": "Configure for Visual Studio",
|
||||
"generator": "Visual Studio 17 2022",
|
||||
"binaryDir": "${sourceDir}/build/vs2022",
|
||||
"architecture": "Win32"
|
||||
}
|
||||
],
|
||||
"buildPresets": [
|
||||
{
|
||||
"name": "mingw-debug",
|
||||
"configurePreset": "mingw",
|
||||
"description": "Build using MinGW (Debug)",
|
||||
"configuration": "Debug"
|
||||
},
|
||||
{
|
||||
"name": "mingw-release",
|
||||
"configurePreset": "mingw",
|
||||
"description": "Build using MinGW (Release)",
|
||||
"configuration": "Release"
|
||||
},
|
||||
{
|
||||
"name": "vs-debug",
|
||||
"configurePreset": "vs",
|
||||
"description": "Build using VS (Debug)",
|
||||
"configuration": "Debug"
|
||||
},
|
||||
{
|
||||
"name": "vs-release",
|
||||
"configurePreset": "vs",
|
||||
"description": "Build using VS (Release)",
|
||||
"configuration": "Release"
|
||||
}
|
||||
]
|
||||
}
|
44
Jenkinsfile
vendored
Normal file
44
Jenkinsfile
vendored
Normal file
@ -0,0 +1,44 @@
|
||||
properties([
|
||||
buildDiscarder(
|
||||
logRotator(
|
||||
artifactDaysToKeepStr: '',
|
||||
artifactNumToKeepStr: '',
|
||||
daysToKeepStr: '',
|
||||
numToKeepStr: '3'
|
||||
)
|
||||
)
|
||||
])
|
||||
|
||||
pipeline {
|
||||
options { timestamps () }
|
||||
agent {
|
||||
label 'vs2022 && windows'
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Build') {
|
||||
steps {
|
||||
bat '''
|
||||
cmake --preset vs -DCMAKE_BUILD_TYPE=Release
|
||||
cmake --build --preset vs-release --config Release
|
||||
copy /y README.MD .\\build\\vs2022\\Release\\
|
||||
copy /y Usage*.txt .\\build\\vs2022\\Release\\
|
||||
'''
|
||||
}
|
||||
}
|
||||
|
||||
stage('Archive') {
|
||||
steps {
|
||||
bat '''
|
||||
7za a -tzip -mtm- build/kgg-dec.zip .\\build\\vs2022\\Release\\*
|
||||
'''
|
||||
}
|
||||
|
||||
post {
|
||||
success {
|
||||
archiveArtifacts 'build/*.zip'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
22
README.MD
Normal file
22
README.MD
Normal file
@ -0,0 +1,22 @@
|
||||
# kgg-dec
|
||||
|
||||
Kugou `kgg` decryption tool.
|
||||
|
||||
## Build
|
||||
|
||||
Build in Windows with CMake + Visual Studio 2022
|
||||
|
||||
```cmd
|
||||
cmake --preset vs -DCMAKE_BUILD_TYPE=Release
|
||||
cmake --build --preset vs-release --config Release
|
||||
copy /y README.MD .\\build\\vs2022\\
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
1. Copy `infra.dll` from KuGou installation directory to where `kgg-dec.exe` is located.
|
||||
2. Invoke exe with path to the directory containing kgg file.
|
||||
|
||||
```shell
|
||||
kgg-dec.exe .
|
||||
```
|
18
Usage.zh.txt
Normal file
18
Usage.zh.txt
Normal file
@ -0,0 +1,18 @@
|
||||
# KGG 解密工具 by LSR
|
||||
|
||||
项目地址:https://git.unlock-music.dev/um/kgg-dec
|
||||
|
||||
使用方法 (命令行):
|
||||
|
||||
1. 从酷狗安装目录拷贝 `infra.dll` 文件到 `kgg-dec.exe` 的目录。
|
||||
2. 启动 `kgg-dec.exe`,其中第一个参数为含有 `*.kgg` 文件的目录。
|
||||
|
||||
或者:
|
||||
|
||||
1. 将 `kgg-dec.exe` 与 `infra.dll` 拷贝到 KGG 所在目录。
|
||||
2. 双击 `kgg-dec.exe`,开始解密当前目录。
|
||||
|
||||
错误排查:
|
||||
|
||||
1. 需要至少播放一次 KGG 文件,并确保酷狗能正常播放。
|
||||
2. 文件后缀名嗅探代码只支持:`ogg` / `flac`,其他格式默认回退到 `mp3`。
|
89
src/common/base64.cpp
Normal file
89
src/common/base64.cpp
Normal file
@ -0,0 +1,89 @@
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <vector>
|
||||
|
||||
constexpr static auto kBase64Table = ([]() {
|
||||
const char* table_str =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
"abcdefghijklmnopqrstuvwxyz"
|
||||
"0123456789"
|
||||
"+/";
|
||||
std::array<uint8_t, 64> table{};
|
||||
for (auto& item : table) {
|
||||
item = *table_str++;
|
||||
}
|
||||
return table;
|
||||
})();
|
||||
|
||||
// NOLINTBEGIN(*-magic-numbers)
|
||||
|
||||
constexpr static auto kBase64ReverseTable = ([]() {
|
||||
std::array<uint8_t, 256> reverse_table{};
|
||||
|
||||
for (size_t i = 0; i < kBase64Table.size(); i++) {
|
||||
reverse_table[kBase64Table[i]] = static_cast<uint8_t>(i);
|
||||
}
|
||||
|
||||
// url-safe varient
|
||||
reverse_table['-'] = 62;
|
||||
reverse_table['_'] = 63;
|
||||
|
||||
return reverse_table;
|
||||
})();
|
||||
|
||||
inline size_t b64_decode_buffer_len(size_t len) {
|
||||
// Every 4 bytes in, it will yield 3 bytes output
|
||||
return (len + 3) / 4 * 3;
|
||||
}
|
||||
|
||||
inline size_t b64_decode(uint8_t* output, const uint8_t* input, size_t input_len) {
|
||||
auto* p_out = output;
|
||||
size_t total_decoded = 0;
|
||||
|
||||
auto decode_block = [&p_out](const uint8_t* p_in) {
|
||||
// NOLINTBEGIN(*-identifier-length)
|
||||
uint8_t a{kBase64ReverseTable[p_in[0]]};
|
||||
uint8_t b{kBase64ReverseTable[p_in[1]]};
|
||||
uint8_t c{kBase64ReverseTable[p_in[2]]};
|
||||
uint8_t d{kBase64ReverseTable[p_in[3]]};
|
||||
// NOLINTEND(*-identifier-length)
|
||||
|
||||
*p_out++ = (a << 2) | (b >> 4);
|
||||
*p_out++ = (b << 4) | (c >> 2);
|
||||
*p_out++ = (c << 6) | (d >> 0);
|
||||
|
||||
if (p_in[2] == '=') {
|
||||
p_out -= 2;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (p_in[3] == '=') {
|
||||
p_out -= 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
for (const auto* p_input_end = input + input_len - 4; input <= p_input_end; input += 4) {
|
||||
if (decode_block(input)) {
|
||||
return p_out - output;
|
||||
}
|
||||
}
|
||||
|
||||
input_len %= 4;
|
||||
if (input_len != 0) {
|
||||
std::array<uint8_t, 4> buffer{0, '=', '=', '='};
|
||||
std::copy_n(input, input_len, buffer.begin());
|
||||
decode_block(buffer.data());
|
||||
}
|
||||
return p_out - output;
|
||||
}
|
||||
|
||||
std::vector<uint8_t> b64_decode(const uint8_t* input, size_t len) {
|
||||
std::vector<uint8_t> result(b64_decode_buffer_len(len));
|
||||
result.resize(b64_decode(result.data(), input, len));
|
||||
return result;
|
||||
}
|
7
src/common/base64.h
Normal file
7
src/common/base64.h
Normal file
@ -0,0 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <vector>
|
||||
|
||||
std::vector<uint8_t> b64_decode(const uint8_t *input, size_t len);
|
50
src/common/endian_helper.h
Normal file
50
src/common/endian_helper.h
Normal file
@ -0,0 +1,50 @@
|
||||
#pragma once
|
||||
|
||||
#include <bit>
|
||||
#include <cstdint>
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#define bswap_u16 _byteswap_ushort
|
||||
#define bswap_u32 _byteswap_ulong
|
||||
#define bswap_u64 _byteswap_uint64
|
||||
#else
|
||||
#define bswap_u16 __builtin_bswap16
|
||||
#define bswap_u32 __builtin_bswap32
|
||||
#define bswap_u64 __builtin_bswap64
|
||||
#endif
|
||||
|
||||
namespace Endian {
|
||||
|
||||
inline uint64_t be_u64_read(const uint8_t* p) {
|
||||
if constexpr (std::endian::native == std::endian::big) {
|
||||
return *reinterpret_cast<const uint64_t*>(p);
|
||||
} else {
|
||||
return bswap_u64(*reinterpret_cast<const uint64_t*>(p));
|
||||
}
|
||||
}
|
||||
|
||||
inline void be_u64_write(uint8_t* p, uint64_t value) {
|
||||
if constexpr (std::endian::native == std::endian::big) {
|
||||
*reinterpret_cast<uint64_t*>(p) = value;
|
||||
} else {
|
||||
*reinterpret_cast<uint64_t*>(p) = bswap_u64(value);
|
||||
}
|
||||
}
|
||||
|
||||
inline uint32_t be_u32_read(const uint8_t* p) {
|
||||
if constexpr (std::endian::native == std::endian::big) {
|
||||
return *reinterpret_cast<const uint32_t*>(p);
|
||||
} else {
|
||||
return bswap_u32(*reinterpret_cast<const uint32_t*>(p));
|
||||
}
|
||||
}
|
||||
|
||||
inline void be_u32_write(uint8_t* p, uint32_t value) {
|
||||
if constexpr (std::endian::native == std::endian::big) {
|
||||
*reinterpret_cast<uint32_t*>(p) = value;
|
||||
} else {
|
||||
*reinterpret_cast<uint32_t*>(p) = bswap_u32(value);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Endian
|
99
src/infra/infra.cpp
Normal file
99
src/infra/infra.cpp
Normal file
@ -0,0 +1,99 @@
|
||||
#include "infra.h"
|
||||
#include "sqlite_error.h"
|
||||
#include "sqlite_fn.h"
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
namespace Infra {
|
||||
|
||||
HMODULE g_mod_infra_dll;
|
||||
sqlite3_open_v2_t sqlite3_open_v2;
|
||||
sqlite3_key_t sqlite3_key;
|
||||
sqlite3_prepare_v2_t sqlite3_prepare_v2;
|
||||
sqlite3_step_t sqlite3_step;
|
||||
sqlite3_column_text_t sqlite3_column_text;
|
||||
sqlite3_close_v2_t sqlite3_close_v2;
|
||||
sqlite3_finalize_t sqlite3_finalize;
|
||||
|
||||
bool g_init_sqlite_ok = []() {
|
||||
g_mod_infra_dll = LoadLibraryA("infra.dll");
|
||||
if (g_mod_infra_dll == nullptr) {
|
||||
return false;
|
||||
}
|
||||
|
||||
sqlite3_open_v2 = reinterpret_cast<sqlite3_open_v2_t>(GetProcAddress(g_mod_infra_dll, "sqlite3_open_v2"));
|
||||
sqlite3_key = reinterpret_cast<sqlite3_key_t>(GetProcAddress(g_mod_infra_dll, "sqlite3_key"));
|
||||
sqlite3_prepare_v2 = reinterpret_cast<sqlite3_prepare_v2_t>(GetProcAddress(g_mod_infra_dll, "sqlite3_prepare_v2"));
|
||||
sqlite3_step = reinterpret_cast<sqlite3_step_t>(GetProcAddress(g_mod_infra_dll, "sqlite3_step"));
|
||||
sqlite3_column_text =
|
||||
reinterpret_cast<sqlite3_column_text_t>(GetProcAddress(g_mod_infra_dll, "sqlite3_column_text"));
|
||||
sqlite3_close_v2 = reinterpret_cast<sqlite3_close_v2_t>(GetProcAddress(g_mod_infra_dll, "sqlite3_close_v2"));
|
||||
sqlite3_finalize = reinterpret_cast<sqlite3_finalize_t>(GetProcAddress(g_mod_infra_dll, "sqlite3_finalize"));
|
||||
|
||||
return sqlite3_open_v2 && sqlite3_key && sqlite3_prepare_v2 && sqlite3_step && sqlite3_column_text &&
|
||||
sqlite3_close_v2 && sqlite3_finalize;
|
||||
}();
|
||||
|
||||
SQLite::SQLite(const std::filesystem::path& db_path) {
|
||||
ok_ = false;
|
||||
int rc{-1};
|
||||
if (!g_init_sqlite_ok) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto db_path_u8 = db_path.generic_u8string();
|
||||
rc = sqlite3_open_v2(reinterpret_cast<const char*>(db_path_u8.c_str()), &db_, SQLITE_OPEN_READONLY, nullptr);
|
||||
if (rc != SQLITE_OK) {
|
||||
return;
|
||||
}
|
||||
|
||||
rc = sqlite3_key(db_, "7777B48756BA491BB4CEE771A3E2727E", 0x20);
|
||||
if (rc != SQLITE_OK) {
|
||||
return;
|
||||
}
|
||||
|
||||
ok_ = true;
|
||||
}
|
||||
|
||||
kgm_ekey_db_t SQLite::dump_ekey(int& error) {
|
||||
if (ok_ == false) {
|
||||
error = SQLITE_ERROR;
|
||||
return {};
|
||||
}
|
||||
|
||||
int rc{-1};
|
||||
sqlite3_stmt* stmt{nullptr};
|
||||
|
||||
rc = sqlite3_prepare_v2(db_,
|
||||
"select EncryptionKeyId, EncryptionKey from ShareFileItems"
|
||||
" where EncryptionKey != ''",
|
||||
-1, &stmt, nullptr);
|
||||
if (rc != SQLITE_OK) {
|
||||
error = rc;
|
||||
return {};
|
||||
}
|
||||
|
||||
kgm_ekey_db_t result{};
|
||||
while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
|
||||
const auto* ekey_id = reinterpret_cast<const char*>(sqlite3_column_text(stmt, 0));
|
||||
const auto* ekey = reinterpret_cast<const char*>(sqlite3_column_text(stmt, 1));
|
||||
result[ekey_id] = ekey;
|
||||
}
|
||||
|
||||
if (rc != SQLITE_DONE) {
|
||||
error = rc;
|
||||
}
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
error = 0;
|
||||
return result;
|
||||
}
|
||||
|
||||
SQLite::~SQLite() {
|
||||
if (db_ != nullptr) {
|
||||
sqlite3_close_v2(db_);
|
||||
db_ = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Infra
|
26
src/infra/infra.h
Normal file
26
src/infra/infra.h
Normal file
@ -0,0 +1,26 @@
|
||||
#pragma once
|
||||
|
||||
#include <filesystem>
|
||||
#include <unordered_map>
|
||||
|
||||
#include "sqlite_base.h"
|
||||
|
||||
namespace Infra {
|
||||
|
||||
typedef std::unordered_map<std::string, std::string> kgm_ekey_db_t;
|
||||
extern bool g_init_sqlite_ok;
|
||||
|
||||
class SQLite {
|
||||
public:
|
||||
explicit SQLite(const std::filesystem::path& db_path);
|
||||
~SQLite();
|
||||
|
||||
[[nodiscard]] bool is_ok() const { return ok_; }
|
||||
kgm_ekey_db_t dump_ekey(int& error);
|
||||
|
||||
private:
|
||||
bool ok_ = false;
|
||||
sqlite3* db_{nullptr};
|
||||
};
|
||||
|
||||
} // namespace Infra
|
9
src/infra/sqlite_base.h
Normal file
9
src/infra/sqlite_base.h
Normal file
@ -0,0 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
// SQLite
|
||||
#define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */
|
||||
#define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */
|
||||
#define SQLITE_OPEN_CREATE 0x00000004 /* Ok for sqlite3_open_v2() */
|
||||
|
||||
typedef struct sqlite3 sqlite3;
|
||||
typedef struct sqlite3_stmt sqlite3_stmt;
|
99
src/infra/sqlite_error.h
Normal file
99
src/infra/sqlite_error.h
Normal file
@ -0,0 +1,99 @@
|
||||
#pragma once
|
||||
|
||||
#define SQLITE_OK (0)
|
||||
|
||||
/* beginning-of-error-codes */
|
||||
#define SQLITE_ERROR 1 /* Generic error */
|
||||
#define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */
|
||||
#define SQLITE_PERM 3 /* Access permission denied */
|
||||
#define SQLITE_ABORT 4 /* Callback routine requested an abort */
|
||||
#define SQLITE_BUSY 5 /* The database file is locked */
|
||||
#define SQLITE_LOCKED 6 /* A table in the database is locked */
|
||||
#define SQLITE_NOMEM 7 /* A malloc() failed */
|
||||
#define SQLITE_READONLY 8 /* Attempt to write a readonly database */
|
||||
#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/
|
||||
#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */
|
||||
#define SQLITE_CORRUPT 11 /* The database disk image is malformed */
|
||||
#define SQLITE_NOTFOUND 12 /* Unknown opcode in sqlite3_file_control() */
|
||||
#define SQLITE_FULL 13 /* Insertion failed because database is full */
|
||||
#define SQLITE_CANTOPEN 14 /* Unable to open the database file */
|
||||
#define SQLITE_PROTOCOL 15 /* Database lock protocol error */
|
||||
#define SQLITE_EMPTY 16 /* Internal use only */
|
||||
#define SQLITE_SCHEMA 17 /* The database schema changed */
|
||||
#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */
|
||||
#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */
|
||||
#define SQLITE_MISMATCH 20 /* Data type mismatch */
|
||||
#define SQLITE_MISUSE 21 /* Library used incorrectly */
|
||||
#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */
|
||||
#define SQLITE_AUTH 23 /* Authorization denied */
|
||||
#define SQLITE_FORMAT 24 /* Not used */
|
||||
#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */
|
||||
#define SQLITE_NOTADB 26 /* File opened that is not a database file */
|
||||
#define SQLITE_NOTICE 27 /* Notifications from sqlite3_log() */
|
||||
#define SQLITE_WARNING 28 /* Warnings from sqlite3_log() */
|
||||
#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */
|
||||
#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */
|
||||
/* end-of-error-codes */
|
||||
|
||||
inline const char* sqlite_get_error(int rc) {
|
||||
switch (rc) {
|
||||
case SQLITE_ERROR:
|
||||
return "SQLITE_ERROR: Generic error";
|
||||
case SQLITE_INTERNAL:
|
||||
return "SQLITE_INTERNAL: Internal logic error in SQLite";
|
||||
case SQLITE_PERM:
|
||||
return "SQLITE_PERM: Access permission denied";
|
||||
case SQLITE_ABORT:
|
||||
return "SQLITE_ABORT: Callback routine requested an abort";
|
||||
case SQLITE_BUSY:
|
||||
return "SQLITE_BUSY: The database file is locked";
|
||||
case SQLITE_LOCKED:
|
||||
return "SQLITE_LOCKED: A table in the database is locked";
|
||||
case SQLITE_NOMEM:
|
||||
return "SQLITE_NOMEM: A malloc() failed";
|
||||
case SQLITE_READONLY:
|
||||
return "SQLITE_READONLY: Attempt to write a readonly database";
|
||||
case SQLITE_INTERRUPT:
|
||||
return "SQLITE_INTERRUPT: Operation terminated by sqlite3_interrupt()";
|
||||
case SQLITE_IOERR:
|
||||
return "SQLITE_IOERR: Some kind of disk I/O error occurred";
|
||||
case SQLITE_CORRUPT:
|
||||
return "SQLITE_CORRUPT: The database disk image is malformed";
|
||||
case SQLITE_NOTFOUND:
|
||||
return "SQLITE_NOTFOUND: Unknown opcode in sqlite3_file_control()";
|
||||
case SQLITE_FULL:
|
||||
return "SQLITE_FULL: Insertion failed because database is full";
|
||||
case SQLITE_CANTOPEN:
|
||||
return "SQLITE_CANTOPEN: Unable to open the database file";
|
||||
case SQLITE_PROTOCOL:
|
||||
return "SQLITE_PROTOCOL: Database lock protocol error";
|
||||
case SQLITE_EMPTY:
|
||||
return "SQLITE_EMPTY: Internal use only";
|
||||
case SQLITE_SCHEMA:
|
||||
return "SQLITE_SCHEMA: The database schema changed";
|
||||
case SQLITE_TOOBIG:
|
||||
return "SQLITE_TOOBIG: String or BLOB exceeds size limit";
|
||||
case SQLITE_CONSTRAINT:
|
||||
return "SQLITE_CONSTRAINT: Abort due to constraint violation";
|
||||
case SQLITE_MISMATCH:
|
||||
return "SQLITE_MISMATCH: Data type mismatch";
|
||||
case SQLITE_MISUSE:
|
||||
return "SQLITE_MISUSE: Library used incorrectly";
|
||||
case SQLITE_NOLFS:
|
||||
return "SQLITE_NOLFS: Uses OS features not supported on host";
|
||||
case SQLITE_AUTH:
|
||||
return "SQLITE_AUTH: Authorization denied";
|
||||
case SQLITE_FORMAT:
|
||||
return "SQLITE_FORMAT: Not used";
|
||||
case SQLITE_RANGE:
|
||||
return "SQLITE_RANGE: 2nd parameter to sqlite3_bind out of range";
|
||||
case SQLITE_NOTADB:
|
||||
return "SQLITE_NOTADB: File opened that is not a database file";
|
||||
case SQLITE_NOTICE:
|
||||
return "SQLITE_NOTICE: Notifications from sqlite3_log()";
|
||||
case SQLITE_WARNING:
|
||||
return "SQLITE_WARNING: Warnings from sqlite3_log()";
|
||||
default:
|
||||
return "<unknown>";
|
||||
}
|
||||
}
|
71
src/infra/sqlite_fn.h
Normal file
71
src/infra/sqlite_fn.h
Normal file
@ -0,0 +1,71 @@
|
||||
#pragma once
|
||||
|
||||
#include "sqlite_base.h"
|
||||
|
||||
/**
|
||||
* @brief Opens a SQLite database file with extended options.
|
||||
*
|
||||
* @param filename The name of the database file to be opened (UTF-8 encoded).
|
||||
* @param ppDb A pointer to a pointer that will receive the SQLite database
|
||||
* handle upon successful opening.
|
||||
* @param flags Flags that control the behavior of the database connection.
|
||||
* @param zVfs The name of the VFS (Virtual File System) module to use.
|
||||
* If NULL, the default VFS is used.
|
||||
* @return Returns SQLITE_OK on success or an error code on failure.
|
||||
*/
|
||||
typedef int (*sqlite3_open_v2_t)(const char* filename, sqlite3** ppDb, int flags, const char* zVfs);
|
||||
|
||||
/**
|
||||
* @brief Compiles an SQL statement into a prepared statement.
|
||||
*
|
||||
* @param db Database handle.
|
||||
* @param zSql SQL statement, UTF-8 encoded.
|
||||
* @param n Maximum length of zSql in bytes.
|
||||
* @param ppStmt OUT: Statement handle.
|
||||
* @param pzTail OUT: Pointer to unused portion of zSql.
|
||||
* @return Returns SQLITE_OK on success or an error code on failure.
|
||||
*/
|
||||
typedef int (*sqlite3_prepare_v2_t)(sqlite3* db, const char* zSql, int n, sqlite3_stmt** ppStmt, const char** pzTail);
|
||||
|
||||
/**
|
||||
* @brief Evaluates a prepared statement.
|
||||
*
|
||||
* @param stmt Prepared statement.
|
||||
* @return Returns SQLITE_ROW, SQLITE_DONE, or an error code.
|
||||
*/
|
||||
typedef int (*sqlite3_step_t)(sqlite3_stmt* stmt);
|
||||
|
||||
/**
|
||||
* @brief Returns the text value of a column in the current row of a result set.
|
||||
*
|
||||
* @param stmt Prepared statement.
|
||||
* @param iCol Column index.
|
||||
* @return Text value of the column.
|
||||
*/
|
||||
typedef const unsigned char* (*sqlite3_column_text_t)(sqlite3_stmt* stmt, int iCol);
|
||||
|
||||
/**
|
||||
* @brief Destroys a prepared statement object.
|
||||
*
|
||||
* @param stmt Prepared statement.
|
||||
* @return Returns SQLITE_OK on success or an error code on failure.
|
||||
*/
|
||||
typedef int (*sqlite3_finalize_t)(sqlite3_stmt* stmt);
|
||||
|
||||
/**
|
||||
* @brief Closes a database connection and invalidates all prepared statements.
|
||||
*
|
||||
* @param db Database handle.
|
||||
* @return Returns SQLITE_OK on success or an error code on failure.
|
||||
*/
|
||||
typedef int (*sqlite3_close_v2_t)(sqlite3* db);
|
||||
|
||||
/**
|
||||
* @brief Sets the encryption key for a database.
|
||||
*
|
||||
* @param db Database to be keyed.
|
||||
* @param pKey The key.
|
||||
* @param nKey The length of the key in bytes.
|
||||
* @return Returns SQLITE_OK on success or an error code on failure.
|
||||
*/
|
||||
typedef int (*sqlite3_key_t)(sqlite3* db, const void* pKey, int nKey);
|
145
src/main.cpp
Normal file
145
src/main.cpp
Normal file
@ -0,0 +1,145 @@
|
||||
// clang-format off
|
||||
#include <windows.h>
|
||||
#include <shlobj.h>
|
||||
#include <initguid.h>
|
||||
#include <knownfolders.h>
|
||||
// clang-format on
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <filesystem>
|
||||
#include <fstream>
|
||||
#include <span>
|
||||
|
||||
#include "infra/infra.h"
|
||||
#include "infra/sqlite_error.h"
|
||||
#include "qmc2/qmc2.h"
|
||||
|
||||
using Infra::kgm_ekey_db_t;
|
||||
|
||||
constexpr std::array<uint8_t, 16> kMagicHeader{0x7C, 0xD5, 0x32, 0xEB, 0x86, 0x02, 0x7F, 0x4B,
|
||||
0xA8, 0xAF, 0xA6, 0x8E, 0x0F, 0xFF, 0x99, 0x14};
|
||||
|
||||
void DecryptKGG(const kgm_ekey_db_t& ekey_db, const std::filesystem::path& kgg_file) {
|
||||
auto kgg_fname = kgg_file.filename().wstring();
|
||||
fwprintf(stderr, L"[INFO] reading %s...\n", kgg_fname.c_str());
|
||||
|
||||
std::ifstream ifs_kgg(kgg_file, std::ios::binary);
|
||||
char header[0x100]{};
|
||||
ifs_kgg.read(header, sizeof(ifs_kgg));
|
||||
if (std::equal(kMagicHeader.cbegin(), kMagicHeader.cend(), header)) {
|
||||
fprintf(stderr, "[WARN] invalid kgg header, skip.\n");
|
||||
return;
|
||||
}
|
||||
uint32_t offset_to_audio = *reinterpret_cast<uint32_t*>(&header[0x10]);
|
||||
uint32_t encrypt_mode = *reinterpret_cast<uint32_t*>(&header[0x14]);
|
||||
if (encrypt_mode != 5) {
|
||||
fprintf(stderr, "[WARN] invalid enc_version (expect=0x05, got 0x%02x), skip.\n", encrypt_mode);
|
||||
return;
|
||||
}
|
||||
uint32_t audio_hash_len = *reinterpret_cast<uint32_t*>(&header[0x44]);
|
||||
if (audio_hash_len != 0x20) {
|
||||
fprintf(stderr, "[WARN] audio hash length invalid (expect=0x20, got 0x%02x), skip.\n", audio_hash_len);
|
||||
return;
|
||||
}
|
||||
std::string audio_hash(&header[0x48], &header[0x48 + audio_hash_len]);
|
||||
std::string ekey{};
|
||||
if (auto it = ekey_db.find(audio_hash); it != ekey_db.end()) {
|
||||
ekey = it->second;
|
||||
} else {
|
||||
fprintf(stderr, "[WARN] ekey not found, skip.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
auto qmc2 = QMC2::Create(ekey);
|
||||
if (!qmc2) {
|
||||
fprintf(stderr, "[WARN] create qmc2 failed, skip.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ifs_kgg.seekg(offset_to_audio, std::ios::beg);
|
||||
std::vector<uint8_t> buffer(1024 * 1024);
|
||||
ifs_kgg.read(reinterpret_cast<char*>(buffer.data()), buffer.size());
|
||||
auto n = static_cast<size_t>(ifs_kgg.gcount());
|
||||
qmc2->Decrypt(std::span(buffer.begin(), n), 0);
|
||||
|
||||
auto decrypted_path = kgg_file;
|
||||
auto magic = std::span(buffer.cbegin(), 4);
|
||||
if (std::equal(magic.begin(), magic.end(), "fLaC")) {
|
||||
decrypted_path.replace_filename(decrypted_path.stem().wstring() + L"_kgg-dec.flac");
|
||||
} else if (std::equal(magic.begin(), magic.end(), "OggS")) {
|
||||
decrypted_path.replace_filename(decrypted_path.stem().wstring() + L"_kgg-dec.ogg");
|
||||
} else {
|
||||
decrypted_path.replace_filename(decrypted_path.stem().wstring() + L"_kgg-dec.mp3");
|
||||
}
|
||||
if (exists(decrypted_path)) {
|
||||
fprintf(stderr, "[WARN] output file '%s' exists, skip.\n", decrypted_path.filename().string().c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
std::ofstream ofs_decrypted(decrypted_path, std::ios::binary);
|
||||
ofs_decrypted.write(reinterpret_cast<char*>(buffer.data()), n);
|
||||
size_t offset{n};
|
||||
while (!ifs_kgg.eof()) {
|
||||
ifs_kgg.read(reinterpret_cast<char*>(buffer.data()), buffer.size());
|
||||
n = static_cast<size_t>(ifs_kgg.gcount());
|
||||
qmc2->Decrypt(std::span(buffer.begin(), n), offset);
|
||||
ofs_decrypted.write(reinterpret_cast<char*>(buffer.data()), n);
|
||||
offset += n;
|
||||
}
|
||||
|
||||
auto decrypted_fname = decrypted_path.filename().wstring();
|
||||
fwprintf(stderr, L"[INFO] OK! kgg --> %s\n", decrypted_fname.c_str());
|
||||
}
|
||||
|
||||
void WalkFileOrDir(const kgm_ekey_db_t& ekey_db, const std::filesystem::path& input_path) {
|
||||
if (is_directory(input_path)) {
|
||||
for (auto const& dir_entry : std::filesystem::directory_iterator{input_path}) {
|
||||
DecryptKGG(ekey_db, dir_entry.path());
|
||||
}
|
||||
} else if (is_regular_file(input_path)) {
|
||||
DecryptKGG(ekey_db, input_path);
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
SetConsoleOutputCP(CP_UTF8);
|
||||
setlocale(LC_ALL, ".UTF8");
|
||||
|
||||
fputs("kgg-dec v0.1 by LSR\n", stderr);
|
||||
fputs("Usage: kgg-dec [kgg-dir=.]\n\n", stderr);
|
||||
PWSTR pAppDirPath{};
|
||||
SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, nullptr, &pAppDirPath);
|
||||
std::filesystem::path kgmPath{pAppDirPath};
|
||||
CoTaskMemFree(pAppDirPath);
|
||||
kgmPath = kgmPath / L"Kugou8" / L"KGMusicV3.db";
|
||||
|
||||
int error{-1};
|
||||
Infra::SQLite db{kgmPath};
|
||||
if (!db.is_ok()) {
|
||||
fprintf(stderr, "[ERR ] db init error: is infra.dll ok?\n");
|
||||
return 1;
|
||||
}
|
||||
auto ekey_db = db.dump_ekey(error);
|
||||
if (error != 0) {
|
||||
fprintf(stderr, "[ERR ] dump ekey failed %d (%s)", error, sqlite_get_error(error));
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifdef _DEBUG
|
||||
printf("ekey_db:\n");
|
||||
for (auto& [a, b] : ekey_db) {
|
||||
printf("%s --> %s\n", a.c_str(), b.c_str());
|
||||
}
|
||||
#endif
|
||||
|
||||
int argc;
|
||||
wchar_t** argv = CommandLineToArgvW(GetCommandLineW(), &argc);
|
||||
|
||||
std::filesystem::path input_dir{(argc < 2) ? L"." : argv[1]};
|
||||
input_dir = absolute(input_dir);
|
||||
WalkFileOrDir(ekey_db, input_dir);
|
||||
|
||||
return 0;
|
||||
}
|
69
src/qmc2/ekey.cpp
Normal file
69
src/qmc2/ekey.cpp
Normal file
@ -0,0 +1,69 @@
|
||||
#include "ekey.h"
|
||||
#include "base64.h"
|
||||
#include "tc_tea.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <string>
|
||||
#include <array>
|
||||
#include <vector>
|
||||
|
||||
const static std::string kEKeyV2Prefix = "UVFNdXNpYyBFbmNWMixLZXk6";
|
||||
const static std::array<uint8_t, 16> kEKeyV2Key1{
|
||||
0x33, 0x38, 0x36, 0x5A, 0x4A, 0x59, 0x21, 0x40,
|
||||
0x23, 0x2A, 0x24, 0x25, 0x5E, 0x26, 0x29, 0x28,
|
||||
};
|
||||
const static std::array<uint8_t, 16> kEKeyV2Key2{
|
||||
0x2A, 0x2A, 0x23, 0x21, 0x28, 0x23, 0x24, 0x25,
|
||||
0x26, 0x5E, 0x61, 0x31, 0x63, 0x5A, 0x2C, 0x54,
|
||||
};
|
||||
|
||||
template <typename T> std::span<T> ss2span(std::string_view sv) {
|
||||
auto *data = reinterpret_cast<const T *>(sv.data());
|
||||
return std::span<T>(const_cast<T *>(data), sv.size());
|
||||
}
|
||||
|
||||
template <typename T> std::string_view span2ss(std::span<T> span) {
|
||||
return std::string_view(reinterpret_cast<char *>(span.data()), span.size());
|
||||
}
|
||||
|
||||
void remove_trailing_zeros(std::vector<uint8_t> &vec) {
|
||||
auto it = std::find_if(vec.rbegin(), vec.rend(),
|
||||
[](uint8_t value) { return value != 0; });
|
||||
vec.erase(it.base(), vec.end());
|
||||
}
|
||||
|
||||
std::vector<uint8_t> decrypt_ekey_v1(std::string_view ekey) {
|
||||
std::vector<uint8_t> result =
|
||||
b64_decode(reinterpret_cast<const uint8_t *>(ekey.data()), ekey.size());
|
||||
remove_trailing_zeros(result);
|
||||
|
||||
uint32_t tea_key[4] = {
|
||||
0x69005600 | static_cast<uint32_t>(result[0] << 16) | (result[1]),
|
||||
0x46003800 | static_cast<uint32_t>(result[2] << 16) | (result[3]),
|
||||
0x2b002000 | static_cast<uint32_t>(result[4] << 16) | (result[5]),
|
||||
0x15000b00 | static_cast<uint32_t>(result[6] << 16) | (result[7]),
|
||||
};
|
||||
auto decrypted = tc_tea_cbc_decrypt(std::span(result).subspan(8), tea_key);
|
||||
if (decrypted.empty()) {
|
||||
return {};
|
||||
}
|
||||
result.resize(8);
|
||||
result.insert(result.end(), decrypted.begin(), decrypted.end());
|
||||
return result;
|
||||
}
|
||||
|
||||
std::vector<uint8_t> decrypt_ekey_v2(std::string_view ekey) {
|
||||
std::vector<uint8_t> result;
|
||||
result = tc_tea_cbc_decrypt(ss2span<uint8_t>(ekey), kEKeyV2Key1.data());
|
||||
result = tc_tea_cbc_decrypt(std::span(result), kEKeyV2Key2.data());
|
||||
return decrypt_ekey_v1(span2ss(std::span(result)));
|
||||
}
|
||||
|
||||
std::vector<uint8_t> decrypt_ekey(std::string_view ekey) {
|
||||
if (ekey.starts_with(kEKeyV2Prefix)) {
|
||||
ekey.remove_prefix(kEKeyV2Prefix.size());
|
||||
return decrypt_ekey_v2(ekey);
|
||||
}
|
||||
|
||||
return decrypt_ekey_v1(ekey);
|
||||
}
|
6
src/qmc2/ekey.h
Normal file
6
src/qmc2/ekey.h
Normal file
@ -0,0 +1,6 @@
|
||||
#pragma once
|
||||
#include <cstdint>
|
||||
#include <string_view>
|
||||
#include <vector>
|
||||
|
||||
std::vector<uint8_t> decrypt_ekey(std::string_view ekey);
|
54
src/qmc2/qmc2.h
Normal file
54
src/qmc2/qmc2.h
Normal file
@ -0,0 +1,54 @@
|
||||
#pragma once
|
||||
|
||||
#include <array>
|
||||
#include <cstdint>
|
||||
#include <memory>
|
||||
#include <span>
|
||||
#include <string_view>
|
||||
#include <vector>
|
||||
|
||||
namespace QMC2 {
|
||||
|
||||
class QMC2_Base {
|
||||
public:
|
||||
QMC2_Base(){};
|
||||
virtual ~QMC2_Base() = default;
|
||||
|
||||
virtual void Decrypt(std::span<uint8_t> data, size_t offset) = 0;
|
||||
};
|
||||
|
||||
constexpr size_t kMapIndexOffset = 71214;
|
||||
constexpr size_t kMapKeySize = 128;
|
||||
|
||||
class QMC2_MAP : public QMC2_Base {
|
||||
public:
|
||||
explicit QMC2_MAP(std::span<uint8_t> key);
|
||||
|
||||
void Decrypt(std::span<uint8_t> data, size_t offset) override;
|
||||
|
||||
private:
|
||||
std::array<uint8_t, kMapKeySize> key_{};
|
||||
};
|
||||
|
||||
constexpr size_t kFirstSegmentSize = 0x0080;
|
||||
constexpr size_t kOtherSegmentSize = 0x1400;
|
||||
constexpr size_t kRC4StreamSize = kOtherSegmentSize + 512;
|
||||
|
||||
class QMC2_RC4 : public QMC2_Base {
|
||||
public:
|
||||
explicit QMC2_RC4(std::span<uint8_t> key);
|
||||
|
||||
void Decrypt(std::span<uint8_t> data, size_t offset) override;
|
||||
|
||||
private:
|
||||
std::vector<uint8_t> key_{};
|
||||
double hash_{0};
|
||||
std::array<uint8_t, kRC4StreamSize> key_stream_{};
|
||||
|
||||
size_t DecryptFirstSegment(std::span<uint8_t> data, size_t offset);
|
||||
size_t DecryptOtherSegment(std::span<uint8_t> data, size_t offset);
|
||||
};
|
||||
|
||||
std::unique_ptr<QMC2_Base> Create(std::string_view ekey);
|
||||
|
||||
} // namespace QMC2
|
20
src/qmc2/qmc2_factory.cpp
Normal file
20
src/qmc2/qmc2_factory.cpp
Normal file
@ -0,0 +1,20 @@
|
||||
#include "ekey.h"
|
||||
#include "qmc2.h"
|
||||
|
||||
namespace QMC2 {
|
||||
|
||||
std::unique_ptr<QMC2_Base> Create(std::string_view ekey) {
|
||||
auto key = decrypt_ekey(ekey);
|
||||
auto key_len = key.size();
|
||||
if (key_len == 0) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (key_len < 300) {
|
||||
return std::make_unique<QMC2_MAP>(std::span(key));
|
||||
} else {
|
||||
return std::make_unique<QMC2_RC4>(std::span(key));
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace QMC2
|
24
src/qmc2/qmc2_map.cpp
Normal file
24
src/qmc2/qmc2_map.cpp
Normal file
@ -0,0 +1,24 @@
|
||||
#include "qmc2.h"
|
||||
|
||||
namespace QMC2 {
|
||||
|
||||
constexpr size_t kMapOffsetBoundary = 0x7FFF;
|
||||
|
||||
QMC2_MAP::QMC2_MAP(std::span<uint8_t> key) {
|
||||
auto n = key.size();
|
||||
for (size_t i = 0; i < kMapKeySize; i++) {
|
||||
size_t j = (i * i + kMapIndexOffset) % n;
|
||||
const auto shift = (j + 4) % 8;
|
||||
key_[i] = (key[j] << shift) | (key[j] >> shift);
|
||||
}
|
||||
}
|
||||
|
||||
void QMC2_MAP::Decrypt(std::span<uint8_t> data, size_t offset) {
|
||||
for (auto& it : data) {
|
||||
size_t idx = (offset <= kMapOffsetBoundary) ? offset : (offset % kMapOffsetBoundary);
|
||||
it ^= key_[idx % key_.size()];
|
||||
offset++;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace QMC2
|
127
src/qmc2/qmc2_rc4.cpp
Normal file
127
src/qmc2/qmc2_rc4.cpp
Normal file
@ -0,0 +1,127 @@
|
||||
#include <cstdint>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#include "qmc2.h"
|
||||
|
||||
namespace QMC2 {
|
||||
|
||||
inline double hash(const uint8_t* key, size_t len) {
|
||||
uint32_t hash = {1};
|
||||
const uint8_t* end = key + len;
|
||||
for (; key < end; ++key) {
|
||||
if (*key == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Overflow check.
|
||||
uint32_t next_hash = hash * (uint32_t)(*key);
|
||||
if (next_hash <= hash) {
|
||||
break;
|
||||
}
|
||||
hash = next_hash;
|
||||
}
|
||||
return (double)hash;
|
||||
}
|
||||
|
||||
class RC4 {
|
||||
public:
|
||||
inline RC4(const uint8_t* key, size_t key_len) {
|
||||
state_.resize(key_len);
|
||||
for (size_t i = 0; i < key_len; i++) {
|
||||
state_[i] = static_cast<uint8_t>(i);
|
||||
}
|
||||
|
||||
for (size_t i = 0, j = 0; i < key_len; i++) {
|
||||
j = (j + state_[i] + key[i]) % key_len;
|
||||
std::swap(state_[i], state_[j]);
|
||||
}
|
||||
|
||||
state_len_ = key_len;
|
||||
}
|
||||
|
||||
inline void Derive(std::span<uint8_t> buffer) {
|
||||
size_t i = i_;
|
||||
size_t j = j_;
|
||||
uint8_t* s = state_.data();
|
||||
const size_t n = state_len_;
|
||||
|
||||
for (auto& it : buffer) {
|
||||
i = (i + 1) % n;
|
||||
j = (j + (size_t)s[i]) % n;
|
||||
std::swap(s[i], s[j]);
|
||||
|
||||
const size_t final_idx = (s[i] + s[j]) % n;
|
||||
it ^= s[final_idx];
|
||||
}
|
||||
|
||||
i_ = i;
|
||||
j_ = j;
|
||||
}
|
||||
|
||||
private:
|
||||
std::vector<uint8_t> state_{};
|
||||
size_t state_len_{0};
|
||||
size_t i_{0};
|
||||
size_t j_{0};
|
||||
};
|
||||
|
||||
inline size_t get_segment_key(double key_hash, size_t segment_id, uint8_t seed) {
|
||||
if (seed == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
double result = key_hash / (double)(seed * (segment_id + 1)) * 100.0;
|
||||
return (size_t)result;
|
||||
}
|
||||
|
||||
QMC2_RC4::QMC2_RC4(std::span<uint8_t> key) {
|
||||
hash_ = hash(key.data(), key.size());
|
||||
key_ = std::vector(key.begin(), key.end());
|
||||
|
||||
RC4 rc4(key.data(), key.size());
|
||||
rc4.Derive(std::span<uint8_t>(key_stream_));
|
||||
}
|
||||
|
||||
void QMC2_RC4::Decrypt(std::span<uint8_t> data, size_t offset) {
|
||||
if (offset < kFirstSegmentSize) {
|
||||
const auto n = DecryptFirstSegment(data, offset);
|
||||
offset += n;
|
||||
data = data.subspan(n);
|
||||
}
|
||||
|
||||
while (!data.empty()) {
|
||||
const auto n = DecryptOtherSegment(data, offset);
|
||||
offset += n;
|
||||
data = data.subspan(n);
|
||||
}
|
||||
}
|
||||
|
||||
size_t QMC2_RC4::DecryptFirstSegment(std::span<uint8_t> data, size_t offset) {
|
||||
const uint8_t* key = key_.data();
|
||||
const size_t n = this->key_.size();
|
||||
|
||||
size_t process_len = std::min(data.size(), kFirstSegmentSize - offset);
|
||||
for (auto& it : data.subspan(0, process_len)) {
|
||||
const auto idx = get_segment_key(hash_, offset, key[offset % n]) % n;
|
||||
it ^= key[idx];
|
||||
offset++;
|
||||
}
|
||||
return process_len;
|
||||
}
|
||||
|
||||
size_t QMC2_RC4::DecryptOtherSegment(std::span<uint8_t> data, size_t offset) {
|
||||
const size_t n = this->key_.size();
|
||||
|
||||
size_t segment_idx = offset / kOtherSegmentSize;
|
||||
size_t segment_offset = offset % kOtherSegmentSize;
|
||||
|
||||
size_t skip_len = get_segment_key(hash_, segment_idx, key_[segment_idx % n]) & 0x1FF;
|
||||
size_t process_len = std::min(data.size(), kOtherSegmentSize - segment_offset);
|
||||
const uint8_t* rc4_stream = &key_stream_[skip_len + segment_offset];
|
||||
for (auto& it : data.subspan(0, process_len)) {
|
||||
it ^= *rc4_stream++;
|
||||
}
|
||||
return process_len;
|
||||
}
|
||||
|
||||
} // namespace QMC2
|
70
src/tc_tea/tc_tea.cpp
Normal file
70
src/tc_tea/tc_tea.cpp
Normal file
@ -0,0 +1,70 @@
|
||||
#include "tc_tea.h"
|
||||
|
||||
#include "endian_helper.h"
|
||||
#include "tea_ecb.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstdint>
|
||||
|
||||
constexpr size_t kTeaBlockSize = 8;
|
||||
constexpr size_t kFixedSaltLen = 2;
|
||||
constexpr size_t kZeroPadLen = 7;
|
||||
|
||||
inline void decrypt_round(uint8_t *p_plain, const uint8_t *p_cipher,
|
||||
uint64_t *iv1, uint64_t *iv2, const uint32_t *key) {
|
||||
uint64_t iv1_next = Endian::be_u64_read(p_cipher);
|
||||
uint64_t iv2_next = tc_tea_ecb_decrypt(iv1_next ^ *iv2, key);
|
||||
uint64_t plain = iv2_next ^ *iv1;
|
||||
*iv1 = iv1_next;
|
||||
*iv2 = iv2_next;
|
||||
Endian::be_u64_write(p_plain, plain);
|
||||
}
|
||||
|
||||
std::vector<uint8_t> tc_tea_cbc_decrypt(std::span<uint8_t> cipher,
|
||||
const uint32_t *key) {
|
||||
// It needs to have at least 2 blocks long, due to the nature of the padding
|
||||
// scheme used.
|
||||
if (cipher.size() % kTeaBlockSize != 0 || cipher.size() < kTeaBlockSize * 2) {
|
||||
return {};
|
||||
}
|
||||
|
||||
uint64_t iv1 = 0;
|
||||
uint64_t iv2 = 0;
|
||||
uint8_t header[kTeaBlockSize * 2];
|
||||
const uint8_t *in_cipher = cipher.data();
|
||||
decrypt_round(header, in_cipher, &iv1, &iv2, key);
|
||||
in_cipher += kTeaBlockSize;
|
||||
decrypt_round(header + kTeaBlockSize, in_cipher, &iv1, &iv2, key);
|
||||
in_cipher += kTeaBlockSize;
|
||||
|
||||
size_t hdr_skip_len = 1 + (header[0] & 7) + kFixedSaltLen;
|
||||
size_t real_plain_len = cipher.size() - hdr_skip_len - kZeroPadLen;
|
||||
std::vector<uint8_t> result(real_plain_len);
|
||||
|
||||
auto p_output = result.data();
|
||||
|
||||
// copy first block of plain text
|
||||
size_t copy_len = std::min(sizeof(header) - hdr_skip_len, real_plain_len);
|
||||
std::copy_n(header + hdr_skip_len, real_plain_len, p_output);
|
||||
p_output += copy_len;
|
||||
|
||||
if (real_plain_len != copy_len) {
|
||||
// Decrypt the rest of the blocks
|
||||
for (size_t i = cipher.size() - kTeaBlockSize * 3; i != 0;
|
||||
i -= kTeaBlockSize) {
|
||||
decrypt_round(p_output, in_cipher, &iv1, &iv2, key);
|
||||
in_cipher += kTeaBlockSize;
|
||||
p_output += kTeaBlockSize;
|
||||
}
|
||||
|
||||
decrypt_round(header + kTeaBlockSize, in_cipher, &iv1, &iv2, key);
|
||||
p_output[0] = header[kTeaBlockSize];
|
||||
}
|
||||
// Validate zero padding
|
||||
auto verify = Endian::be_u64_read(header + kTeaBlockSize) << 8;
|
||||
if (verify != 0) {
|
||||
result.resize(0);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
19
src/tc_tea/tc_tea.h
Normal file
19
src/tc_tea/tc_tea.h
Normal file
@ -0,0 +1,19 @@
|
||||
#pragma once
|
||||
|
||||
#include "endian_helper.h"
|
||||
|
||||
#include <cstdint>
|
||||
#include <span>
|
||||
#include <vector>
|
||||
|
||||
std::vector<uint8_t> tc_tea_cbc_decrypt(std::span<uint8_t> cipher,
|
||||
const uint32_t *key);
|
||||
|
||||
inline std::vector<uint8_t> tc_tea_cbc_decrypt(std::span<uint8_t> cipher,
|
||||
const uint8_t *key) {
|
||||
uint32_t key_u32[4];
|
||||
for (int i = 0; i < 4; i++) {
|
||||
key_u32[i] = Endian::be_u32_read(key + i * 4);
|
||||
}
|
||||
return tc_tea_cbc_decrypt(cipher, key_u32);
|
||||
}
|
40
src/tc_tea/tea_ecb.h
Normal file
40
src/tc_tea/tea_ecb.h
Normal file
@ -0,0 +1,40 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
|
||||
constexpr size_t TEA_ROUNDS = (16);
|
||||
constexpr uint32_t TEA_ROUND_DELTA = (0x9e3779b9);
|
||||
constexpr uint32_t TEA_EXPECTED_SUM = (static_cast<uint32_t>(TEA_ROUNDS * TEA_ROUND_DELTA));
|
||||
|
||||
inline uint32_t tc_tea_single_round(uint32_t value, uint32_t sum, uint32_t key1, uint32_t key2) {
|
||||
return ((value << 4) + key1) ^ (value + sum) ^ ((value >> 5) + key2);
|
||||
}
|
||||
|
||||
inline uint64_t tc_tea_ecb_decrypt(uint64_t value, const uint32_t* key) {
|
||||
uint32_t y = (uint32_t)(value >> 32);
|
||||
uint32_t z = (uint32_t)(value);
|
||||
uint32_t sum = {TEA_EXPECTED_SUM};
|
||||
|
||||
for (size_t i = 0; i < TEA_ROUNDS; i++) {
|
||||
z -= tc_tea_single_round(y, sum, key[2], key[3]);
|
||||
y -= tc_tea_single_round(z, sum, key[0], key[1]);
|
||||
sum -= TEA_ROUND_DELTA;
|
||||
}
|
||||
|
||||
return ((uint64_t)(y) << 32) | (uint64_t)(z);
|
||||
}
|
||||
|
||||
inline uint64_t tc_tea_ecb_encrypt(uint64_t value, const uint32_t* key) {
|
||||
uint32_t y = (uint32_t)(value >> 32);
|
||||
uint32_t z = (uint32_t)(value);
|
||||
uint32_t sum = {0};
|
||||
|
||||
for (size_t i = 0; i < TEA_ROUNDS; i++) {
|
||||
sum += TEA_ROUND_DELTA;
|
||||
y += tc_tea_single_round(z, sum, key[0], key[1]);
|
||||
z += tc_tea_single_round(y, sum, key[2], key[3]);
|
||||
}
|
||||
|
||||
return ((uint64_t)(y) << 32) | (uint64_t)(z);
|
||||
}
|
Loading…
Reference in New Issue
Block a user